2

我想从我的 python 模块中运行 sudo 命令并在 python 代码中提供密码。以下是我不成功的尝试:

output = subprocess.Popen(['sudo', 'make', 'install'], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
print output.communicate('mypass\n')

它从控制台窗口询问密码(然后我不想要)。然后我尝试了:

output = subprocess.Popen(['sudo', 'make', 'install'], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
output.stdin.write('mypass\n')
output.stdin.close()
output.wait()

它再次询问密码。然后我尝试了:

os.popen("sudo make install", 'w').write('mypass')

它再次要求输入密码。我的代码有什么问题。在互联网上进行一些搜索后,我尝试了上述所有尝试,似乎它们应该可以工作。

4

3 回答 3

2

sudo、ssh、sftp 都是为了知道是否连接了 tty,所以他们要求输入密码。原因是在代码中输入密码是一个很大的安全违规行为。

您也可以使用 expect 实用程序来运行 sudo 或 ssh 以及您的 python 代码...

在 bash 脚本中使用 expect 为 SSH 命令提供密码

于 2013-07-31T00:19:56.987 回答
1

另一种选择是在 /etc/sudoers 中为特定命令和特定用户添加一个条目。

builduser ALL=NOPASSWD: /usr/bin/make

编辑:最好将您想要的特定命令包装在脚本中,然后允许他们使用 sudo 访问带有 oa 密码的脚本;显然'make'是相当危险的......

于 2013-07-31T00:30:57.427 回答
1

要添加用户交互性,您应该使用pexpect( http://www.noah.org/wiki/pexpect ) 而不是 popen。这将允许您的程序正确运行 sudo。

在脚本中保留密码总是一个坏主意,并且允许通过修改 sudoer 进行访问,尤其是对于像make安全漏洞这样的东西。

于 2013-07-31T00:56:10.017 回答