Труба в оболочку adb

Почему я не могу adb shell?

[[email protected] ~]$ echo foo | adb shell cat
^C

Вышеупомянутая команда зависает на моем эмуляторе 4.0.1, и я не вижу ожидаемого выхода foo.

Я предполагаю это, потому что adb shell не передает свой stdin в его дочерний процесс stdout, а cat сидит и ждет навсегда. Это действительно не реализовано в adb, или я чего-то не хватает?

Ответ 1

Альтернативным вариантом может быть использование переадресации портов adb и netcat.

Установите сторону Android для получения:

busybox nc -lp 5555 > piped_file.txt

ПК, переадресовать и отправить:

adb forward tcp:4444 tcp:5555 # Anything sent to localhost 4444 will be forwarded to Android 5555
cat piped_file.txt | busybox nc localhost 4444 # Pipe through the port to Android

ПК netcat подключается к netcat Android через перенаправленный порт, и поставляется piped_file.txt.


Дополнительная информация
В сочетании с tar вы можете скопировать целые структуры каталогов на ваше устройство.

busybox nc -lp 5555 | tar -x # Android side

adb forward tcp:4444 tcp:5555 # PC side
tar -c directory | busybox nc localhost 4444

Ответ 2

Это верно. Эта функциональность не реализована.

Обновить:

Исправлено множество ошибок, а новые функции реализованы в adb с момента adb исходного вопроса. Включая поддержку правильной обработки stdin adb shell. Поэтому нет необходимости в обходных решениях netcat.

Ответ 3

Вот мое решение. Поместите следующее в файл adb_shell.sh и используйте его вместо adb shell:

#!/bin/bash

adb forward tcp:12345 tcp:12345
adb shell busybox nc -lp 12345 -e "[email protected]" &
sleep 1s
exec nc -q 1 localhost 12345

Это создает nc прослушиватель, который запускает указанную команду при подключении, а затем подключается к нему.