我想从我的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')
它再次要求输入密码。 我的代码出了什么问题。在互联网上进行一些搜索之后,我尝试了以上所有尝试,看起来它们应该可以正常工作。
答案 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)
要添加用户互动,您应该使用pexpect
(http://www.noah.org/wiki/pexpect)而不是popen。这将允许您的程序正确运行sudo。
在脚本中保留密码总是一个坏主意,并允许通过修改sudoer进行访问,尤其是make
这样的安全漏洞。