2008-10-23 86 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')