我正在編寫一個在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