2010-03-05 18 views
14

मैं एक सुरक्षित ftp साइट में लॉग इन करने के लिए पाइथन उपप्रोसेसर मॉड्यूल का उपयोग करने का प्रयास कर रहा हूं और फिर फ़ाइल लेता हूं। हालांकि, जब अनुरोध किया जाता है तो पासवर्ड भेजने की कोशिश करने पर मैं लटका रहता हूं।पासवर्ड भेजने के लिए उपप्रोसेसर का उपयोग करें

from subprocess import Popen, PIPE 

proc = Popen(['sftp','[email protected]', 'stop'], stdin=PIPE) 
proc.communicate('password') 

यह अभी भी पासवर्ड प्रॉम्प्ट पर बंद हो जाता है: मैं अब तक निम्नलिखित कोड है। यदि मैं मैन्युअल रूप से पासवर्ड दर्ज करता हूं तो यह FTP साइट पर जाता है और फिर कमांड लाइन पर पासवर्ड दर्ज करता है। मैंने लोगों को pexpect का उपयोग करने का सुझाव दिया है लेकिन लंबी कहानी छोटी मुझे मानक पुस्तकालय समाधान की आवश्यकता है। क्या वैसे भी subprocess और/या किसी अन्य stdlib के साथ है? मैं ऊपर क्या भूल रहा हूँ?

+0

http://stackoverflow.com/questions/2356391/why-does-supplying-stdin-to-subprocess-popen-cause-what-is-written-to-stdout-to-c का डुप्लिकेट? –

उत्तर

8

शायद आपको expect-पुस्तकालय की तरह इस्तेमाल करना चाहिए?

उदाहरण के लिए Pexpect (example)। अन्य, समान पाइथन पुस्तकालय भी हैं।

+0

+1 के साथ हूँ। कंसोल प्रक्रियाओं के साथ बातचीत के लिए यह सही समाधान है। –

+0

क्या स्टडलिब मॉड्यूल की अपेक्षा करता है? मुझे stdlib करने के लिए चिपकने की जरूरत है। –

+0

Pexpect stdlib नहीं है। लेकिन यह शुद्ध पायथन है, इसलिए बस अपने python पथ पर pexpect.py फ़ाइल डालें। उदाहरण के लिए अपनी स्क्रिप्ट फ़ाइल के बगल में। – codeape

6

proc.stdin.write('yourPassword\n') 
proc.stdin.flush() 

यही काम करना चाहिए की कोशिश करो।

आप stdin=None जैसी ध्वनि का वर्णन करते हैं जहां बच्चे की प्रक्रिया माता-पिता (आपके पायथन प्रोग्राम) के stdin को विरासत में लेती है।

+0

एचएम ... यह अभी भी रोक रहा है और पासवर्ड मांग रहा है। –

+1

आप दूसरे थ्रेड में प्रक्रिया के stdout पढ़ते हैं, है ना? अन्यथा, विषम चीजें हो सकती हैं। साथ ही, यह जांचें कि क्या sftp 'echo password | का उपयोग करके stdin से पासवर्ड की अनुमति देता है sftp ... 'कमांड लाइन से। यह संभव है कि sftp हमेशा एक खोल खोलता है। जहां तक ​​मुझे पता है –

+2

पासवर्ड मानक इनपुट के माध्यम से नहीं लिखे गए हैं। क्या यह कोड परीक्षण किया गया है? –

1

मैं subprocess दृष्टिकोण को स्क्रैप करने और sftp एक्सेस के लिए paramiko पैकेज का उपयोग करने की सलाह दूंगा।

1

एसएफटीपी के लिए Paramiko का उपयोग करें। कुछ और के लिए, यह काम करता है:

import subprocess 

args = ['command-that-requires-password', '-user', 'me'] 

proc = subprocess.Popen(args, 
         stdin=subprocess.PIPE, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 

proc.stdin.write('mypassword\n') 
proc.stdin.flush() 

stdout, stderr = proc.communicate() 
print stdout 
print stderr 
+0

परीक्षण किया, और काम नहीं किया – weefwefwqg3

2
from subprocess import Popen, PIPE 

proc = Popen(['sftp','[email protected]', 'stop'], stdin=PIPE) 
proc.communicate(input='password') 

इनपुट = 'पासवर्ड' में संवाद, वह मेरे लिए काम किया साथ प्रयास करें।

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