【发布时间】: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