2014-02-07 51 views
0

在Expect腳本中,如何在不寫入標準輸出的情況下提示用戶?是否可以通過stderr提示用戶?期望/ Tcl腳本:如何提示用戶不寫入標準輸出?

我有一個用Perl編寫的腳本,用ssh自動化一些測試。爲了自動登錄ssh,我使用Expect封裝了ssh命令,但有時ssh的密碼會在執行代碼的中途過期(例如,rsa令牌每30秒刷新一次)。

我發現這一點:How can I make an expect script prompt for a password?

偉大的工程,但它會提示通過標準輸出的用戶。我的Perl腳本讀取並解析stdout。

我想在不修改Perl代碼的情況下將其抽象到我的Expect腳本中,這有可能嗎?

編輯:我剛剛意識到我的用例很愚蠢,因爲我不確定Perl會如何與Expect腳本提示符交互,因爲我從Perl調用了Expect腳本。 :/ 但是,知道是否有可能寫信給stderr仍然是件好事。:D

謝謝!

+0

一旦進入,密碼過期並不重要,除非您有一個非常不尋常的SSH/shell配置。不知道細節,很難給你任何有用的建議。另外,向我們展示你的代碼! – salva

+0

問題是我需要運行一系列不同的命令到盒子。理想情況下,最好生成一個持久的ssh會話並通過該命令傳遞,但每次產生一個新會話都會更容易。我不太熟悉Perl來實現前一種方法。 –

+0

然後,嘗試Net :: OpenSSH。 – salva

回答

1

您可以嘗試訪問「文件」/dev/tty(它確實是一個虛擬設備)。這將繞過Perl腳本並直接聯繫用戶的終端。一旦你打開了,你使用普通的Expect命令來要求用戶輸入他們的密碼(記住在正確的時間用stty關閉回聲)。

否則,你最好的選擇可能實際上是彈出一個GUI;用少量的Tcl/Tk腳本來做到這一點是非常簡單的:

# This goes in its own script: 
pack [label .l -text "Password for [lindex $argv 0]"] 
pack [entry .e -textvariable pass -show "*"] 
bind .e <Enter> { 
    puts $pass 
    exit 
} 
focus .e 
# In your expect script: 
set password [exec wish getPass.tcl "[email protected]"] 

這就是全部。它也是獲取密碼的合理安全方式,因爲密碼始終由(不可攔截的)管道通信。唯一的缺點是它需要一個GUI來呈現。

GUI可能需要變得更漂亮。那只是你需要的那些骨頭。

+0

子過程GUI腳本也可以是任何其他語言,但Tcl/Tk是我最瞭解的。 –

+0

謝謝你的回覆。我決定去修改我的Perl腳本,因爲Perl腳本應該知道新密碼,以便它可以在不需要每次重新驗證的情況下在不同的調用中重複使用它。用於顯示如何繞過Perl腳本並直接訪問用戶終端/ :)。謝謝! –