2008-10-23 88 views
5

我正在编写一个在Solaris 10中执行csh脚本的python脚本.csh脚本提示用户输入root密码(我知道)但我不知道如何使python脚本用密码回答提示。这可能吗?这里是我用来执行csh脚本:在运行csh脚本时让python输入密码

import commands 

commands.getoutput('server stop') 
+0

我遗漏了PIPE,新版本工作... – 2008-10-23 19:05:45

+0

第一次看到正在使用的命令。顺便说一句 - 您可以使用getpass模块从命令行获取密码而不显示它。 – monkut 2008-10-24 03:20:30

+1

[必须链接](http://www.perl.com/doc/FMTEYEWTK/versus/csh.whynot) – 2013-09-02 18:28:38

回答

7

查看pexpect模块。它旨在处理交互式程序,这似乎是你的情况。

哦,记住编码硬根在shell或Python脚本密码是一个潜在的安全漏洞:d

0

应该能够通过它作为参数。例如:

commands.getoutput('server stop -p password') 
+0

我们的服务器停止脚本没有-p标志,并且不可能得到一个。 – darrickc 2008-10-29 21:11:31

3

使用subprocess。调用Popen()来创建你的过程并使用communic()来发送它的文本。对不起,忘了包括PIPE ..

from subprocess import Popen, PIPE 

proc = Popen(['server', 'stop'], stdin=PIPE) 

proc.communicate('password') 

你会做得更好,避免密码,并尝试像sudo和sudoers的方案。其他地方提到的Pexpect不是标准库的一部分。

+0

这似乎并不奏效。我会继续调查popen。 – darrickc 2008-10-23 18:34:53

0

这似乎更好地工作:

import popen2 

(stdout, stdin) = popen2.popen2('server stop') 

stdin.write("password") 

但它不是100%呢。即使“密码”是正确的密码,我仍然收到su:抱歉从csh脚本回来,当它试图su为根。

0

为了避免回答在Python脚本,我只是要运行密码问题脚本作为根。这个问题仍然没有答案,但我想我现在就这样做。

1
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规则!

0

proc.communicate()中添加使其运行,对于喜欢使用标准库的人来说。

from subprocess import Popen, PIPE 
proc = Popen(['server', 'stop'], stdin=PIPE) 
proc.communicate(input='password')