2011-01-14 11 views
6

मैं एसएफटीपी एक्सेस के सेटअप को स्वचालित करने की कोशिश कर रहा हूं। यह स्क्रिप्ट सुडो अनुमतियों के साथ उपयोगकर्ता के रूप में चल रही है और कोई पासवर्ड नहीं है।मैं एक पाइथन लिपि से लिनक्स में उपयोगकर्ता पासवर्ड कैसे सेट कर सकता हूं?

मैं बहुत की तरह एक उपयोगकर्ता बना सकते हैं:

>>> import subprocess 
>>> process = subprocess.Popen(['sudo', 'useradd', 'test'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
>>> process.communicate() 
('', '') 

अगला मैं उपयोगकर्ता का पासवर्ड सेट करने की जरूरत है, लेकिन मैं कैसे को समझ नहीं सकता। मैंने जो कोशिश की है वह यहां है।

>>> process = subprocess.Popen(['sudo', 'chpasswd'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
>>> process.communicate('test:password') 

मेरी अजगर कार्यक्रम में यह इंटरैक्टिव दुभाषिया में कोई प्रभाव नहीं है, यह पहली पंक्ति के बाद ताले है।

यह करने के लिए सबसे अच्छा तरीका क्या है?

मैं उबंटू ल्यूसिड पर पायथन 2.6 चला रहा हूं।

उत्तर

6

communicate के लिए दस्तावेज़ का कहना है कि आप stdin=PIPE जोड़ने के लिए communicate पैरामीटर के माध्यम से मानक इनपुट के लिए डेटा भेज रहे हैं की आवश्यकता होगी:

http://docs.python.org/release/2.6/library/subprocess.html#subprocess.Popen.communicate

मुझे खुशी यह सिर्फ कंकाल कोड है, लेकिन यहाँ

  • आप चाहे वह अलावा अन्य useradd आदेश के उत्पादन में कोई दिलचस्पी नहीं कर रहे हैं: मामले में वे उपयोग की कर रहे हैं, अन्य छोटे टिप्पणियों का एक और जोड़ी हैं असफल रहा या नहीं, आप subprocess.check_call का उपयोग कर बेहतर हो सकते हैं जो कमांड लौटाता है तो अपवाद उठाएगा।
  • दूसरे मामले में, आप जांच करनी चाहिए कि क्या process.returncode करने के लिए कोड जो करना होगा नीचे communicate('test:password')
+0

टिप्पणियों के लिए धन्यवाद। वास्तविक कोड वास्तव में अधिक गहन है, लेकिन कम की सराहना की। – Jake

1

आप इस भूल गया:

stdin=subprocess.PIPE 

प्रक्रिया को डेटा भेजने के लिए, आप एक stdin की जरूरत है।

तो पूर्ण कथन है:

process = subprocess.Popen(['sudo', 'chpasswd'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) 

और फिर communicate('password') कहते हैं।

7

कोशिश अपने कॉल के बाद 0 है के रूप में आप स्वचालन

from subprocess import Popen, PIPE, check_call 
check_call(['useradd', 'test']) 
proc=Popen(['passwd', 'test'],stdin=PIPE,stdout=PIPE,stderr=PIPE) 
proc.stdin.write('password\n') 
proc.stdin.write('password') 
proc.stdin.flush() 
stdout,stderr = proc.communicate() 
print stdout 
print stderr 

print बयान वैकल्पिक हैं की आवश्यकता है।

1

उबंटू पर, usermod

class SomeClass 
    def userPasswd(self, login, password): 
     encPass = crypt.crypt(password) 
     command = "usermod -p '{0:s}' {1:s}".format(encPass, login) 
     result = os.system(command) 
     if result != 0: 
      logging.error(command) 
     return result 
1

का उपयोग मुझे लगता है कि मुद्दा यह है कि आप sudo के लिए -S विकल्प भूल गया।

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