2013-03-07 29 views
11

adb shellにパイプできないのはなぜですか?パイプを `adbシェル`に変換する

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

上記のコマンドは、私の4.0.1エミュレータ上でハングアップ、と私は予想foo出力が表示されません。

adb shellはstdinをその子プロセスのstdoutにパイプしないので、catは永遠に座って待ちます。これは実際にadbに実装されていないのですか、何か不足していますか?

答えて

3

これは正しいです。この機能は実装されていません。

更新:

多くのバグが修正されていると新機能は、元の質問が投稿されていた時以来adbに実装されています。適切なstdin処理のサポートを含めてadb shell。だから、もうnetcat回避策の必要はありません。

+2

私はそれが奇妙なことを発見!それは基本的な機能であり、実装が難しいとは思われません。何か不足していますか? – kristianlm

+0

これは本当に真実です...ここに表示されているように 'adb shell'への引数がある場合、' interactive shell '(stdinから読み込み)を作成しません。(https://github.com/android/platform_system_core/blob /master/adb/commandline.c#L1204)。 – kristianlm

+0

引数を持つ 'adb shell'も' adb shell'も適切な標準処理をしていません。 'echo date | adbシェル 'と' echo foo | adbシェルwc'。どちらも期待どおりの出力を生成せず、Ctrl-Cを使用してプロセスを終了する必要があります。 Linux上で 'adb version' =>' Android Debug Bridge version 1.0.39 リビジョン3db08f2c6889-android'でテストされました。 – ack

6

代替オプションとして、adbポート転送とnetcatを使用することができます。

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が配信される受け取るために、Androidの側面を設定

。タールと組み合わせる


追加情報
、あなたはあなたのデバイス上に全体のディレクトリ構造をコピーすることができます。

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

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

私はtarでdir全体をコピーできるのが好きですが、tcp forwardでは2つのコマンドであり、そうでなければならないだけではありません... – kristianlm

1

ここに私のソリューションです。 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リスナーを作成します。

+1

複数の 'adbシェル'コマンドを同時に実行し始めると、これはうまくいかないでしょう。ニートハック、しかし:) – kristianlm

関連する問題