Труба в `adb shell`

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

 [klm@kth ~]$ echo foo | adb shell cat ^C 

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

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

Solutions Collecting From Web of "Труба в `adb shell`"

Альтернативным вариантом может быть использование переадресации портов 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 

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

Обновить:

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

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

 #!/bin/bash adb forward tcp:12345 tcp:12345 adb shell busybox nc -lp 12345 -e "$@" & sleep 1s exec nc -q 1 localhost 12345 

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