如何在Python脚本中设置Linux用户的密码?

6

我正在尝试自动化设置SFTP访问。此脚本正在以具有sudo权限且无密码的用户身份运行。

我可以像这样创建用户:

>>> 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 lucid上运行Python 2.6。

5个回答

8
尝试以下代码,它将完成您所需的自动化操作。
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语句是可选的。


6
communicate 的文档说明如果您通过 communicate 参数向标准输入发送数据,则需要添加 stdin=PIPE

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

我知道这只是框架代码,但这里还有另外一些小意见,希望对您有所帮助:

  • 如果您对 useradd 命令的输出不感兴趣,而只关心它是否失败,那么最好使用 subprocess.check_call,它会在命令返回非零时引发异常。
  • 在第二种情况下,您应该在调用 communicate('test:password') 后检查 process.returncode 是否为0。

感谢您的评论。实际上,真正的代码更加详尽,但仍然非常感激。 - Jake

1

你忘记了这个:

stdin=subprocess.PIPE

要向进程发送数据,您需要一个 stdin

因此完整的语句是:

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

然后调用communicate('password')


1
我猜问题在于你忘记了sudo的-S选项。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接