歡迎您光臨本站 註冊首頁

利用expect完成自動ssh到遠程計算機

←手機掃碼閱讀     火星人 @ 2014-03-03 , reply:0

利用expect完成自動ssh到遠程計算機

利用expect完成自動ssh到遠程計算機






Expect 的基礎知識

        Expect 是由 Don Libes 基於 Tcl 語言開發的,並被廣泛應用於互動式操作和自動化測試的場景之中,它尤其適用於需要對多台伺服器執行相同操作的環境中,可以大幅度得提高系統管理人員的工作效率。目前,大部分 Unix/Linux 系統安裝有 expect. 萬一系統中沒有,可以從 http://expect.nist.gov/ 下載相應的包安裝。也可以使用yum或者apt-get進行安裝。

        Expect 作為基於 Tcl 的高級語言,增加了一些特殊的語法。傳統意義上的 Expect 是以 Tcl 擴展包的形式出現的,任何 Tcl 語言編寫的應用程序都可以載入 Expect 功能;此外,Expect 已經以模塊的方式移植到了 Perl 和 Python 語言中,因此用戶同樣可以在 Perl 和 Python 腳本中利用 Expect 強大的交互功能。

Send,expect 和 spwan 是 Expect 語言最基本的命令。其中,send 命令會發送字元串給指定進程(process); expect 命令會等待接受該進程返回的結果並且會根據返回的字元串來決定下一步的操作;而 spwan 命令可以發起一個進程的運行。send命令接收一個字元串作為參數發送給指定進程。如 send "hello world\n" send 會送出字元串「Hello world」( 不帶引號 )。如果 Expect 早已經開始與某一個程序進行交互,那麼這個字元串將被發送給該程序;一般是發送到標準輸出的, expect 命令則等待一個響應,通常是來自於 Expect 正在與之交互的進程,或者來自於標準輸入設備;它會等待一個指定的字元串或者滿足給定的正則表達式的任何字元串。如:#!/usr/bin/expect  -f

expect "hi\n"

send  "hello world\n"這個文件名為hello,你執行./hello , 它會等待來自標準輸入設備的響應,直到用戶輸入 hi 並回車,它才會發送」hello world」到標準輸出設備,然後加一個回車, 然後結束 expect 腳本的運行。但是,如果用戶沒有輸入 hi 並回車,那麼 expect 會繼續等待」hi\n」;輸入其他的字元並不會影響到 expect 的工作。通常情況下,expect 會一直等會輸入,直到最終超時退出。此外, expect 還支持使用正則表達式來預防 expect 匹配到未預想到的輸入數據。

           spawn 命令會調用另一個程序。它的第一個參數是要啟動程序的名字;剩餘的參數則會被傳遞給該程序做為參數。比如


spawn ftp ftp.linux.ibm.com
這樣就會衍生一個ftp進程,並將ftp.linux.ibm.com作為一個參數傳遞給ftp進程
       用戶通過 spawn,send 和 expect 這三個基本命令,就可以編寫一段 Expect 程序來實現自動化工作。下面我寫一個自動ssh到遠程伺服器的expect腳本(名為)ssh_server
#!/usr/bin/expect

set timeout 60          #設置超時時間為60s
set host 192.168.1.2    #設置伺服器的ip
set name root           #設置登錄的用戶名
set password  ******    #設置root用戶的密碼

spawn ssh $host -l $name       #spawn一個ssh進程

expect {    # 等待響應,第一次登錄往往會提示是否永久保存 RSA 到本機的 know hosts 列表中;等到回答后,在提示輸出密碼;     "(yes/no)?" {
           send "yes\n"
           expect "password:"
           send   "$password\n"
      }
      "password:"  {
          send "$password\n"
      }
}

expect "#"#下面檢測是否登錄到hostsend "uname\n"
expect "Linux"
send_user  " Now you can do some operation on this terminal\n"interact   # 這裡使用了 interact 命令,使執行完程序后,用戶可以在 $host 終端進行交互操作。
《解決方案》

http://bbs.chinaunix.net/thread-1263669-1-1.html
:mrgreen:
《解決方案》

http://bbs.chinaunix.net/thread-3566066-1-1.html

[火星人 ] 利用expect完成自動ssh到遠程計算機已經有861次圍觀

http://coctec.com/docs/service/show-post-1629.html