Нужна однострочная оболочка adb su push & pull для доступа к данным из пакетного файла Windows.

Я написал пакетный файл для Windows, который заменяет рекламу экрана блокировки Amazon изображениями пользователей на рутированном Kindle Fire HD 7 ", 2013 (kfsowi). Только что узнал, что испортил команды adb, потому что я запускал "adb insecure", поэтому получал доступ su, не записывая его. в команды adb.

Что мне нужно: для запуска в пакетном файле мне нужны однострочные команды adb shell su для извлечения/передачи /dataна это устройство. (Или я мог бы использовать adb -d shell su -c "mount -o remount rw, /dataв одной строке, за которой следует вытягивание или нажатие)

Я исправил команду ls следующим образом:

  • это работало с adb insecure:adb ls "/data/securedStorageLocation"
  • что мне нужно было:adb shell su -c "ls ./data/securedStorageLocation"

Теперь мне нужно то же самое для тянуть и толкать. Эта проблема:

  • С adb insecure это работает нормально:adb pull "/data/securedStorageLocation" "C:/destination"
  • Без adb insecure я получаю:remote object '/data/securedStorageLocation/' does not exist

Выше происходит, даже если я сначала запускаю:adb -d shell su -c "mount -o remount rw, /data

Может ли кто-нибудь сказать мне, как сделать pull и push с помощью adb shell и su?

РЕДАКТИРОВАТЬ: adb rootкоманда не получает root на этом устройстве

Чтобы использовать adb pushили adb pullв корневом режиме, демон adb на устройстве должен работать в корневом режиме (что и делает ADBInsecure).
@Izzy Как я могу войти в режим root без adb insecure, если команда >adb root< не работает? Я хочу распространять это. Есть ли другой способ нажать и вытащить каталог? спасибо
Я не знаю (всегда использовал «ADB Insecure», так как я тоже не мог приступить adb rootк работе). Может стоит отдельного вопроса?

Ответы (6)

Ну, вам нужно выполнить несколько команд, так как я не верю, что это сработает в одной.

Вам нужно сделать:

  1. adb shell
  2. su
  3. cd /data/path/of/file
  4. cp /data/path/of/file/copyme /data/local/tmp
  5. chown shell.shell /data/local/tmp/copyme
  6. exit
  7. exit
  8. adb pull /data/local/tmp/copyme /destination/copyme

Это работает для меня каждый раз.

что такое shell.shell
@Remario linux.die.net/man/1/chown - это означает owner.group. Когда вы копируете файл с помощью SU, владельцем и группой будет root.root . Команда adb pull запускается как shell.shell и не сможет извлечь файл из временного расположения. Изменение его перед выполнением pull позволит вам получить разрешение.
не забудьте удалить /data/local/tmp/copymeокончательно (после тянуть)

Спасибо за это обсуждение. Это привело меня к решению, которое достаточно хорошо сработало для меня при резервном копировании моего телефона, который не будет монтировать его внутренний ext4, прежде чем я сделаю что-то радикальное, пытаясь это исправить (очевидно, для этого нужны права root).

Обратите внимание, что adb shellобычно настраивается текстовый терминал (поэтому можно преобразовывать отдельные символы конца строки в CRLF, искажая двоичные данные, такие как изображения разделов или архивы TAR). Хотя вы можете обойти это в версиях adb для Unix/Linux (например, добавить stty rawв свою команду с оболочкой) или использовать более новый adb с exec-outпараметром, в Windows он по-прежнему записывает CRLF в свой вывод. Ловкий трюк заключается в том, чтобы передавать данные через кодирование и декодирование base64 (двоичные файлы доступны для Windows в массовом порядке). Также обратите внимание, что ошибки или подробные сообщения, напечатанные stderrв оболочке, в конечном итоге попадают stdoutв adb shellпрограмму в хост-системе, поэтому вы хотите отказаться от них после неизбежных первоначальных экспериментов.

Вот оно:

adb shell "su -c 'cat /dev/block/mmcblk0p25 | base64' 2>/dev/null" | base64 -d > p25

Windows может легко написать сценарий, чтобы охватить все разделы (можно просмотреть список с помощью ls -la /dev/block/и / или с помощью cat /proc/diskstatsили cat /proc/partitions), например:

for /L %P in (1,1,25) do ..\platform-tools\adb shell "su -c 'cat /dev/block/mmcblk0p%P | base64' 2>/dev/null" | base64 -d > s3-mmcblk0p%P.img

(Обратите внимание на использование %%Pв пакетных файлах CMD или %Pв интерактивной оболочке).

Не забывайте, что есть также mmcblk0boot[01]разделы, и что mmcblk0общий содержит все эти разделы в оболочке GPT, как и любой другой жесткий диск или имитатор одного :)

Чтобы оценить размеры отдельных разделов, вы можете посмотреть на вывод:

fdisk -u -l /dev/block/mmcblk0*

К сожалению, мне не удалось быстро и легко tar cf - mmcblkp0*получить содержимое раздела, поэтому я мог передать его, например, 7z x -siи получить данные в виде нескольких файлов в переносимом однострочном формате.

Для tarнекоторых файлов вы можете:

adb shell "su -c 'cd /mnt/data && tar czf - ./ | base64' 2>/dev/null" | base64 -d > s3-mmcblk0p25-userdata.tar.gz

ОБНОВЛЕНО: Найдены еще несколько приемов для передачи бинарных данных.

Надеюсь, это поможет кому-то еще, Джим Климов

base64 не идеальное решение. Для небольших файлов это работает нормально, но для больших файлов время передачи увеличивается на треть!
Конечно, из-за этого он не идеален, но учитывая, что для целей восстановления хвататься за любую соломинку, которая может помочь, достаточно хорошо... ну... :) В любом случае, если я отправлю целый раздел на экспорт вот так, Мне все равно, займет ли это час или полтора часа, если он надежно выполняет свою работу. Кроме того, если, как задокументировали некоторые другие, вариант adb.exe для Windows фактически всегда выводит текст, разделенный CRLF, кажется, что мы мало что можем сделать, кроме как злоупотреблять им с инкапсуляцией, удобной для ASCII. С другой стороны , adb exec-outможет быть решение, но по какой-то причине у меня не сработало.
мойsudo adb shell su 0 -c 'dd if=/dev/block/mmcblk0 | base64 2>/dev/null' | base64 -d >./mmcblk0.img 2>/dev/null
Но что произойдет, если мы не будем использовать base64?!
Как отмечалось выше, могут возникнуть проблемы с отправкой двоичного файла в виде открытого текста между Linux (Android) и Windows (adb). Вам может не понадобиться инкапсуляция, если обе стороны согласны с окончаниями строк.
adb root; adb push /local/file /distant/root/owner/file

«adb root» перезапустит adbd как root, после чего ваш толчок будет принят

Не обязательно он будет однострочным, но можно попробовать сделать следующие действия:

  • (с оболочкой adb, su) Скопируйте файлы во временное доступное место на вашем устройстве (например /sdcard, или на внешнюю SD-карту)
  • (с помощью adb pull) Скопируйте эти файлы из временного местоположения на свой компьютер.
  • Удалить временную копию

Возможный недостаток: между первым и последним шагом вредоносное приложение, если вы его «используете», может прочитать и/или изменить файлы во временном общедоступном каталоге. На практике это очень маловероятно.

Я использую приведенный ниже пакетный скрипт ( extract-db-from-emulator.bat), чтобы вывести локальную базу данных на хост:

@@echo off
SET adb_path="%USERPROFILE%\AppData\Local\Android\sdk\platform-tools\"
SET application_id="com.example.myapp"
SET root_access_filepath="/data/user/0/%application_id%/databases/local.db"
SET pullable_filepath="/mnt/sdcard/DCIM/local.db"
SET host_directory="%USERPROFILE%\Desktop"
SET root_command="su 0 cp"
%adb_path%adb.exe shell "%root_command% %root_access_filepath% %pullable_filepath%"
%adb_path%adb.exe pull %pullable_filepath% %host_directory%

Я вижу ошибку с

adb shell "su -c '<your command>'"

su: неверный uid/gid '-c'

Решение есть в линуксе

adb shell su 0 '<your command>'
добавить -cперед командой, например:sudo adb shell su 0 -c 'whoami'