问题 管道进入'adb shell`


为什么我不能管道 adb shell

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

上面的命令挂起我的4.0.1模拟器,我没有看到预期的 foo 输出。

我认为这是因为 adb shell 不会将其stdin传入其子进程'stdout,并且 cat 坐着等待永远。这真的没有实现 adb或者我错过了什么?


5269
2018-03-07 18:08


起源



答案:


备用选项可能是使用adb端口转发和netcat。

设置Android端接收:

busybox nc -lp 5555 > piped_file.txt

PC端,设置转发和发送:

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

PC netcat通过转发端口连接到Android netcat,并且 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

7
2018-04-16 03:45



我喜欢你可以用tar复制整个dirs,但是使用tcp转发它是两个命令而不仅仅是它应该是... - kristianlm


答案:


备用选项可能是使用adb端口转发和netcat。

设置Android端接收:

busybox nc -lp 5555 > piped_file.txt

PC端,设置转发和发送:

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

PC netcat通过转发端口连接到Android netcat,并且 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

7
2018-04-16 03:45



我喜欢你可以用tar复制整个dirs,但是使用tcp转发它是两个命令而不仅仅是它应该是... - kristianlm


这是对的。此功能尚未实现。

更新:

修复了许多错误,并实现了新功能 adb 自原始问题发布以来。包括对正确的支持 stdin 处理 adb shell。所以没有必要 netcat 解决方法了。


3
2018-03-07 19:10



我觉得很奇怪!它是这样的基本功能,并且似乎难以实现。我错过了什么吗? - kristianlm
这是真的......当有参数时,它不会创建一个“交互式shell”(从stdin读取) adb shell 如图所示 这里。 - kristianlm
也不 adb shell 也不 adb shell 参数有正确的stdin处理,试试 echo date | adb shell 和 echo foo | adb shell wc。既不产生预期的输出,也需要使用Ctrl-C来终止进程。经过测试 adb version => Android Debug Bridge version 1.0.39 Revision 3db08f2c6889-android 在Linux上。 - ack
@ack, echo foo | adb shell wc 产生我预期的结果。您的设备太旧或者您的期望错误 - Alex P.


这是我的解决方案。把以下内容放入 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 在连接上运行指定命令的侦听器,然后连接到它。


1
2017-07-15 07:51



我想如果你开始运行多个,这将不起作用 adb shell 同时命令。整洁的哈克,但:) - kristianlm