2011-01-14 84 views
6

我正在嘗試自動化SFTP訪問的設置。該腳本以具有sudo權限且沒有密碼的用戶身份運行。如何在python腳本中設置Linux用戶密碼?

我可以像這樣創建一個用戶:

>>> 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') 

在我的python程序中它沒有任何作用,在交互式解釋器中,它在第一行後鎖定。

這樣做的最好方法是什麼?

我在Ubuntu上運行python 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是否爲0到下面的代碼,這將做communicate('test:password')
+0

感謝您的意見。實際的代碼實際上更徹底,但讚賞不多。 – Jake 2011-01-14 06:57:12

1

你忘了這一點:

stdin=subprocess.PIPE 

要發送數據的過程中,你需要一個stdin

,所以該完整的說法是:

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

,然後調用communicate('password')

7

儘可能嘗試所需的自動化

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

在Ubuntu上,使用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選項。

相關問題