【问题标题】:How can I set a users password in linux from a python script?如何通过 python 脚本在 linux 中设置用户密码?
【发布时间】:2011-06-08 23:24:17
【问题描述】:

我正在尝试自动设置 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。

【问题讨论】:

    标签: python subprocess user-management


    【解决方案1】:

    试试下面的代码,它可以满足你的自动化需求

    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 语句是可选的。

    【讨论】:

      【解决方案2】:

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

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

      我很欣赏这只是框架代码,但这里还有另外几个小 cmets,以防它们有用:

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

      【讨论】:

      • 感谢 cmets。真正的代码实际上更彻底,但受到的赞赏却不少。
      【解决方案3】:

      你忘了这个:

      stdin=subprocess.PIPE
      

      要将数据发送到进程,您需要stdin

      所以完整的声明是:

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

      然后拨打communicate('password')

      【讨论】:

        【解决方案4】:

        在 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
        

        【讨论】:

          【解决方案5】:

          我猜问题是你忘记了 sudo 的 -S 选项。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-01-20
            • 2017-08-11
            • 2012-06-29
            • 1970-01-01
            • 1970-01-01
            • 2022-06-23
            • 1970-01-01
            • 2013-05-07
            相关资源
            最近更新 更多