2013-03-07 5 views
11

मैं adb shell में पाइप क्यों नहीं कर सकता?'adb shell` में पाइप

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

उपरोक्त आदेश मेरा 4.0.1 एमुलेटर पर लटका हुआ है, और मैं नहीं दिखाई दे रही है उम्मीद foo उत्पादन।

मुझे लगता है कि यह adb shell अपने stdin को अपने बच्चे की प्रक्रिया 'stdout में पाइप नहीं करता है, और cat बैठता है और हमेशा इंतजार करता है। क्या यह वास्तव में adb में लागू नहीं किया गया है, या क्या मुझे कुछ याद आ रहा है?

उत्तर

3

यह सही है। यह कार्यक्षमता लागू नहीं की गई है।

अद्यतन:

कीड़े का एक बहुत निर्धारित किया गया है और नई सुविधाओं समय मूल प्रश्न पोस्ट किया गया है के बाद से adb में लागू। द्वारा उचित stdin हैंडलिंग के लिए समर्थन सहित। तो अब netcat कामकाज की कोई ज़रूरत नहीं है।

+2

मुझे वह अजीब लगता है! यह ऐसी बुनियादी कार्यक्षमता है, और इसे लागू करने में कठिनाई नहीं लगती है। क्या मैं कुछ भूल रहा हूँ? – kristianlm

+0

यह वास्तव में सच है ... यह दिखाया गया है कि यह 'इंटरैक्टिव शैल "(stdin से पढ़ना) नहीं है जब' adb shell' के तर्क हैं [https://github.com/android/platform_system_core/blob /master/adb/commandline.c#L1204)। – kristianlm

+0

तर्कों के साथ न तो 'adb shell' और न ही' adb shell' उचित stdin हैंडलिंग है, 'echo date' आज़माएं। adb shell' और 'echo foo | एडीबी खोल wc'। न तो अपेक्षित आउटपुट का उत्पादन, Ctrl-C का उपयोग कर प्रक्रिया को मारने की आवश्यकता है। लिनक्स पर 'adb संस्करण' =>' एंड्रॉइड डीबग ब्रिज संस्करण 1.0.39 संशोधन 3db08f2c6889-android' के साथ परीक्षण किया गया। – ack

6

एडीबी पोर्ट अग्रेषण और नेटकैट का उपयोग करने के लिए एक वैकल्पिक विकल्प हो सकता है।

सेट एंड्रॉयड पक्ष प्राप्त करने के लिए:

busybox nc -lp 5555 > piped_file.txt 

पीसी ओर, सेट अग्रेषण और भेजें:

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 अग्रेषित पोर्ट के माध्यम से एंड्रॉयड netcat को जोड़ता है, और piped_file.txt वितरित किया जाता है ।


अतिरिक्त जानकारी
राल के साथ संयुक्त, आप अपने डिवाइस पर पूरी निर्देशिका संरचनाओं कॉपी कर सकते हैं।

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

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

मुझे यह पसंद है कि आप पूरे डीआईआर को टैर के साथ प्रतिलिपि बना सकते हैं, लेकिन टीसीपी के साथ यह दो कमांड है और ऐसा नहीं होना चाहिए ... – 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 shell' आदेशों को एक साथ चलाना शुरू करते हैं तो यह काम नहीं करेगा। साफ हैक, यद्यपि :) – kristianlm

संबंधित मुद्दे