2010-07-21 66 views
1

我想自動化ssh登錄。經過一番研究,似乎tcl/expect是要走的路線。自動化ssh登錄:tcl expect交互命令行爲怪異

但是,我的問題是,當交互接管我的終端,東西不能按預期工作(雙關語不是預期的)。

例如,如果我調整終端大小,它不會「取」。另外,有時互動不響應,有時它只是無緣無故地掛起。我在下面列出了我的代碼。我的代碼問題是,我錯過了什麼?

另外,有沒有更好的方法來做到這一點(與另一種腳本語言?)我需要終端非常靈敏,沒有比在手持式控制檯上手動鍵入ssh沒有什麼不同。

proc Login {username server password} { 
    set prompt "(%|>|\#|\\\$) $" 

    spawn /usr/bin/ssh [email protected]$server 
    expect { 
     -re "Are you sure you want to continue connecting (yes/no)?" { 
      exp_send "yes\r" 
      exp_continue 
      #continue to match statements within this expect {} 
     } 

     -nocase "password: " { 
      exp_send "$password\r" 
      interact 
     } 
    } 
} 
+2

大概你不能使用'ssh-keygen'生成認證的RSA/DSA密鑰? – 2010-07-21 18:39:20

回答

4

你提出的關於'交互'的問題並沒有注意到窗口已經改變了大小,因爲默認情況下,交互只監視字符流。調整窗口大小時,會產生一個WINCH信號。默認情況下,Expect具有默認的操作,即忽略它。您應該使用Expect的陷阱命令來捕獲SIGWINCH。然後你可以做你想做的事 - 例如,把新的尺寸傳播給對方或採取其他的本地行動。

您可以在Expect的示例腳本中找到這樣的示例。有關如何處理SIGWINCH的Expect書中的解釋和示例。

0

由於W.克雷格交易提到了評論,「正確」的方式做到這一點是使用ssh-凱基生成用於認證的密鑰。

您可以通過設置-o StrictHostKeyChecking=no來避免「繼續」提示。