如何在Python中使用sudo(在stdin上还有密码)调用stdin上需要数据的程序?

时间:2017-05-13 14:29:30

标签: python python-2.7 shell subprocess

当我运行代码时,我遇到此错误“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")    

1 个答案:

答案 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')

值得注意的是:

  • 没有任何用户提供的字符串被shell解析为代码。 sudo密码作为stdin传递,而不是在生成的命令行上传递,特别是用户提供的用户名和密码永远不会被shell评估。
  • 使用chpasswd两者 sudo密码,然后用户的用户名:密码在stdin上提供,一个接一个。

那就是说 - 在一个现实世界的例子中,你的脚本根本不应该在内存中有明文密码;相反,它应该在/etc/sudoers中配置为具有无密码权限提升。