2011-01-14 35 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选项。

相关问题