2013-03-07 20 views
11

Warum kann ich nicht in adb shell piping?Pipe in `adb shell`

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

Der obige Befehl hängt an meinem 4.0.1 Emulator, und ich bin nicht die erwartete foo Ausgabe zu sehen.

Ich nehme an, es ist, weil adb shell nicht seine stdin in seine Child-Prozess 'stdout leitet, und cat sitzt und wartet für immer. Wurde dies in adb wirklich nicht implementiert, oder fehle ich etwas?

Antwort

3

Das ist richtig. Diese Funktionalität wurde nicht implementiert.

Update:

Viele Fehler wurden behoben und neue Funktionen in adb seit der Zeit die ursprüngliche Frage gestellt worden war, umgesetzt. Einschließlich Unterstützung für ordnungsgemäße stdin Handhabung von adb shell. Die Workarounds netcat sind daher nicht mehr erforderlich.

+2

Ich finde das seltsam! Es ist eine solche grundlegende Funktionalität und würde nicht schwer zu implementieren sein. Fehle ich etwas? – kristianlm

+0

es ist wirklich wahr ... es erstellt keine "interaktive Shell" (Lesen von stdin), wenn es Argumente für 'adb shell' gibt, wie hier [hier] (https://github.com/android/platform_system_core/blob /master/adb/commandline.c#L1204). – kristianlm

+0

Weder 'adb shell' noch' adb shell' mit Argumenten haben eine korrekte stdin-Behandlung, versuchen Sie 'echo date | adb shell' und 'echo foo | adb Schale wc'. Weder produzieren sie die erwartete Ausgabe, noch müssen Sie den Prozess mit Ctrl-C beenden. Getestet mit 'adb version' =>' Android Debug Bridge Version 1.0.39 Revision 3db08f2c6889-android auf Linux. – ack

6

Eine alternative Option kann ADB Port Forwarding und Netcat sein.

Set Android Seite zu erhalten:

busybox nc -lp 5555 > piped_file.txt 

PC-Seite, eine Weiterleitung und senden:

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 

Der PC netcat verbindet sich mit dem Android netcat durch den weitergeleiteten Port und die piped_file.txt geliefert .


Zusätzliche Informationen
mit Teer In Kombination können Sie ganze Verzeichnisstrukturen auf das Gerät kopieren.

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

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

Ich mag, dass du ganze Verzeichnisse mit tar kopieren kannst, aber mit tcp forward sind es zwei Befehle und nicht nur einer wie es sein sollte ... – kristianlm

1

Hier ist meine Lösung. Legen Sie die folgenden in die adb_shell.sh Datei und verwenden Sie es statt 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 

Dies bedeutet einen nc Zuhörer erzeugt, die auf die Verbindung den angegebenen Befehl ausgeführt wird, und dann eine Verbindung zu ihm.

+1

Ich denke, das wird nicht funktionieren, wenn Sie mehrere 'adb shell' Befehle simultan starten. Ordentlicher Hack, obwohl :) – kristianlm