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

6 投票
5 回答
15869 浏览
提问于 2025-04-16 09:56

我正在尝试自动化设置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 个回答

2

在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
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,这样可以知道命令是否成功执行。

撰写回答