にパイプできないのはなぜadb shell
ですか?
[klm@kth ~]$ echo foo | adb shell cat
^C
上記のコマンドが私の 4.0.1 エミュレーターでハングし、予期したfoo
出力が表示されません。
adb shell
それは、stdin を子プロセスの stdout にパイプせず、cat
座って永遠に待機しているためだと思います。これは実際に に実装されていないのadb
でしょうか、それとも何か不足していますか?
別のオプションとして、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
正解です。この機能は実装されていません。
アップデート:
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
接続時に指定されたコマンドを実行し、それに接続するリスナーが作成されます。