2013-03-07 19 views
11

Dlaczego nie mogę podłączyć do adb shell?Rura w "muszlę adb"

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

Powyższe polecenie wisi na mojej 4.0.1 emulatora, a ja nie widzę oczekiwanej foo wyjście.

Przypuszczam, że to dlatego, że adb shell nie przetwarza stdin w proces potomny 'stdout, a cat siedzi i czeka na zawsze. Czy naprawdę nie zostało to zaimplementowane w adb, czy też czegoś brakuje?

Odpowiedz

3

To się zgadza. Ta funkcja nie została zaimplementowana.

Aktualizacja:

Wiele błędów zostało poprawionych i nowe funkcje zaimplementowane w adb od czasu pierwotnego pytania została wysłana. W tym wsparcie dla prawidłowego obsługi stdin przez . W związku z tym nie ma już potrzeby stosowania obejść netcat.

+2

Uważam, że to dziwne! Jest to taka podstawowa funkcjonalność i nie wydaje się trudne do wdrożenia. Czy czegoś brakuje? – kristianlm

+0

to naprawdę prawda ... nie tworzy "interaktywnej powłoki" (czytanie ze standardowego wejścia), gdy istnieją argumenty do 'powłoki adb', jak pokazano [tutaj] (https://github.com/android/platform_system_core/blob /master/adb/commandline.c#L1204). – kristianlm

+0

Ani 'adb shell' ani' adb shell' z argumentami nie mają poprawnej obsługi standardu stdin, spróbuj 'echo date | adb shell' i 'echo foo | adb shell wc'. Nie produkują oczekiwanych wyników, muszą zabić proces za pomocą Ctrl-C. Przetestowano z 'adb version' =>' Android Debug Bridge wersja 1.0.39 Wersja 3db08f2c6889-android' na Linux. – ack

6

Alternatywną opcją może być użycie przekierowania portów adb i netcat.

Ustaw Android strona otrzymywać:

busybox nc -lp 5555 > piped_file.txt 

PC boku, ustawione przekazywanie i wysyłanie:

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 PC łączy się z systemem Android netcata przez przekazany portu, a piped_file.txt jest dostarczany .


Dodatkowe informacje
połączeniu ze smoły, można skopiować całe struktury katalogów na urządzeniu.

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

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

Podoba mi się, że możesz skopiować całe katalogi z tar, ale z tcp do przodu to dwie komendy, a nie tylko jedna powinna być ... – kristianlm

1

Oto moje rozwiązanie. Umieścić następujące do pliku adb_shell.sh i używać go zamiast 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 

Stwarza to nc słuchacza kursujący określonego polecenia na połączenia, a następnie łączy się z nim.

+1

Myślę, że to nie zadziała, jeśli jednocześnie uruchomisz wiele poleceń 'adb shell'. Neat Hack, choć :) – kristianlm