我正在编写一个在Solaris 10中执行csh脚本的python脚本.csh脚本提示用户输入root密码(我知道)但我不知道如何使python脚本用密码回答提示。这可能吗?这里是我用来执行csh脚本:在运行csh脚本时让python输入密码
import commands
commands.getoutput('server stop')
我正在编写一个在Solaris 10中执行csh脚本的python脚本.csh脚本提示用户输入root密码(我知道)但我不知道如何使python脚本用密码回答提示。这可能吗?这里是我用来执行csh脚本:在运行csh脚本时让python输入密码
import commands
commands.getoutput('server stop')
查看pexpect模块。它旨在处理交互式程序,这似乎是你的情况。
哦,记住编码硬根在shell或Python脚本密码是一个潜在的安全漏洞:d
应该能够通过它作为参数。例如:
commands.getoutput('server stop -p password')
我们的服务器停止脚本没有-p标志,并且不可能得到一个。 – darrickc 2008-10-29 21:11:31
使用subprocess。调用Popen()来创建你的过程并使用communic()来发送它的文本。对不起,忘了包括PIPE ..
from subprocess import Popen, PIPE
proc = Popen(['server', 'stop'], stdin=PIPE)
proc.communicate('password')
你会做得更好,避免密码,并尝试像sudo和sudoers的方案。其他地方提到的Pexpect不是标准库的一部分。
这似乎并不奏效。我会继续调查popen。 – darrickc 2008-10-23 18:34:53
这似乎更好地工作:
import popen2
(stdout, stdin) = popen2.popen2('server stop')
stdin.write("password")
但它不是100%呢。即使“密码”是正确的密码,我仍然收到su:抱歉从csh脚本回来,当它试图su为根。
为了避免回答在Python脚本,我只是要运行密码问题脚本作为根。这个问题仍然没有答案,但我想我现在就这样做。
import pexpect
child = pexpect.spawn('server stop')
child.expect_exact('Password:')
child.sendline('password')
print "Stopping the servers..."
index = child.expect_exact(['Server processes successfully stopped.', 'Server is not running...'], 60)
child.expect(pexpect.EOF)
窍门! Pexpect规则!
在proc.communicate()
中添加使其运行,对于喜欢使用标准库的人来说。
from subprocess import Popen, PIPE
proc = Popen(['server', 'stop'], stdin=PIPE)
proc.communicate(input='password')
我遗漏了PIPE,新版本工作... – 2008-10-23 19:05:45
第一次看到正在使用的命令。顺便说一句 - 您可以使用getpass模块从命令行获取密码而不显示它。 – monkut 2008-10-24 03:20:30
[必须链接](http://www.perl.com/doc/FMTEYEWTK/versus/csh.whynot) – 2013-09-02 18:28:38