在Popen的sudo命令

时间:2013-07-31 00:15:44

标签: python

我想从我的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')

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

3 个答案:

答案 0 :(得分:2)

sudo,ssh,sftp都旨在知道是否附加了tty,因此他们要求输入密码。原因是在代码中放置密码是一个很大的安全违规行为。

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

Use expect in bash script to provide password to SSH command

答案 1 :(得分:1)

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

builduser ALL=NOPASSWD: /usr/bin/make

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

答案 2 :(得分:1)

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

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