adb shell dd if=/dev/block/mmcblk0p7 > backup.bin
работает для резервного копирования раздела телефона Android на компьютер, но когда я хочу восстановить с помощью
резервная копия кота.bin | Оболочка adb dd =/dev/block/mmcblk0p7
это не сработало. оболочка продолжает ожидать ввода вместо немедленной записи в цель, как я ожидал.
Что-то не так с командой?
Можно ли перенести файл на телефон Android с помощью только оболочки adb и внутренних команд на лету (без предварительной загрузки файла резервной копии на телефон)?
Я нашел еще одну проблему, которую создает оболочка adb (дополнительный 0x0D) https://stackoverflow.com/questions/11689511/transferring-binary-data-over-adb-shell-ie-fast-file-transfer-using-tar
Кажется, команда оболочки adb переводит LF в CRLF:
Таким образом, adb shell cat для локального компьютера кажется не таким уж хорошим. Но я все еще хочу знать, как обращаться напрямую к удаленной оболочке.
Решение push to sdcard неприменимо при восстановлении раздела данных на телефоне без поддержки внешнего хранилища.
Это будет работать в Linux:
adb shell dd if=/dev/block/mmcblk0p7|sed 's/\r$//' > backup.bin
В MacOS это тоже можно заставить работать, вам просто нужно сделать это с помощью Perl:
adb shell dd if=/dev/block/mmcblk0p7|perl -pe 's/\x0D\x0A/\x0A/g' > backup.bin
Предположим, что файл находится на вашем компьютере, но вы хотите восстановить его на своем устройстве:
adb push /usr/local/backup/backup.bin /sdcard/backup.bin
adb shell dd if=/sdcard/backup.bin of=/dev/block/mmcblk0p7
должен к трюку. Объяснение: Первая команда копирует backup.bin
файл на вашу SDCard, а во второй строке dd
читает его оттуда и потом записывает на указанное устройство. Возможно, вы захотите объединить это с однострочным:
adb push /usr/local/backup/backup.bin /sdcard/backup.bin && adb shell dd if=/sdcard/backup.bin of=/dev/block/mmcblk0p7
Это означает: «Скопируйте файл на устройство и выполняйте dd
только после успешного завершения процесса копирования».
Чтобы ответить на другую часть вашего вопроса (что не так с вашей командой): вы передаете файл локальному adb
процессу на вашем компьютере, а не удаленному dd
процессу на вашем устройстве. adb
не умеет "сдавать". Так почему это работает наоборот? Потому что там вы фиксируете вывод, отображаемый на вашем локальном компьютере, который, конечно же, вы можете перенаправить локально.