【问题标题】:How can I invoke a program that needs data on stdin with sudo (w/ password also on stdin) from Python?如何使用 Python 中的 sudo(在标准输入上也带有密码)调用需要标准输入数据的程序?
【发布时间】:2017-05-13 14:29:29
【问题描述】:

我在运行代码时遇到此错误“sudo: no tty present and no askpass program 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")    

【问题讨论】:

  • sudo 不会从标准输入读取密码——而且它不应该,因为您的echo passd23 天生就是不安全的。
  • ...所以,这种行为正确地阻止了您做这种极其不安全的事情,这会将您的密码暴露给系统上可以读取进程表的每个程序。
  • (说到非常不安全——密码可以包含文字引号,因此尝试使用文字引号在直接替换到 shell 命令行的代码中转义 shell 密码是鲁莽。如果一个新用户在这个 GUI 中将他们的密码指定为'$(rm -rf /*)' -- 执行命令sudo 'username':''$(rm -rf /*)'',其中以硬编码代码打开的引号在密码本身内关闭,您将有一个非常,非常糟糕的一天)。
  • @Charles Duffy 我没有在这里写下真正的密码,我是自己编的,但我写它更像是我的代码的示例,这里的任何信息都不应该被认真对待:) 更多的是为了大学,而不是为公司使用
  • 它没有在 StackOverflow 中发布,这使得它不安全。它被发布在操作系统的进程列表中(系统上的每个用户都可以阅读,包括nobody——一个用于未经身份验证和不受信任的代码的帐户),这使得密码不安全。密码应该从不在命令行中传递。

标签: python python-2.7 shell subprocess


【解决方案1】:

这是一种不好的做法,但它比它所替代的更安全:

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 密码作为标准输入传递,而不是在生成的命令行上传递,尤其是用户提供的用户名和密码永远不会被 shell 评估。
  • 使用chpasswdbothsudo 密码和用户的用户名:密码在标准输入上依次提供。

也就是说——在一个真实的例子中,你的脚本在内存中根本不应该有明文密码;相反,它应该在/etc/sudoers 中配置为无密码提权。

【讨论】:

    猜你喜欢
    • 2022-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2018-04-28
    相关资源
    最近更新 更多