当我运行代码时,我遇到此错误“sudo:没有tty存在且没有askpass程序spcified”。这是第二次子进程的行,我尝试更改密码。用户完全创建,但密码不是,只是给出给定的错误。我想要做的是,在您创建用户之后,将向用户提供书面密码。
import subprocess
def new(username, password):
subprocess.call("echo passd23 | sudo -S adduser '{username}'".format(username=username), shell=True)
subprocess.call("echo passd23 | sudo '{username}':'{password}' | chpasswd".format(username=username, password=password), shell=True)
new("username", "password")
答案 0 :(得分:0)
这是不好的做法,但它比它取代的更安全:
def new(username, password, sudopass):
p1 = subprocess.Popen(['sudo', '-S', 'adduser', username], stdin=subprocess.PIPE)
p1.communicate(sudopass)
if p1.retval != 0:
return False
p2 = subprocess.Popen(['sudo', '-S', 'chpasswd'], stdin=subprocess.PIPE)
p2.communicate('%s\n%s:%s\n' % (sudopass, username, password))
return p2.retval == 0
new('username', 'password', 'passd23')
值得注意的是:
sudo
密码作为stdin传递,而不是在生成的命令行上传递,特别是用户提供的用户名和密码永远不会被shell评估。chpasswd
,两者 sudo
密码,然后用户的用户名:密码在stdin上提供,一个接一个。那就是说 - 在一个现实世界的例子中,你的脚本根本不应该在内存中有明文密码;相反,它应该在/etc/sudoers
中配置为具有无密码权限提升。