天天看點

linux expect遠端自動登入以及執行指令

#!/bin/bash

passwd='Abcd1234'

/usr/bin/expect <<-EOF

set time 30                執行逾時時間  任何輸入30S後退出

spawn ssh -p22 [email protected]

expect {

"*yes/no" { send "yes\r"; exp_continue }

"*password:" { send "$passwd\r" }

}

expect "*#"                        定義指令的開始

send "echo test >>/root/d.txt\r"          發送要執行的指令

send "echo test >>/root/e.txt\r"

expect "*#"    

send "exit\r"

interact      用exact這個指令是為了把控制權交給使用者,代替send "logout\r"    終端不會斷開

expect eof

EOF

 1. [spawn ssh -p22 [email protected]] 

spawn是進入expect環境後才可以執行的expect内部指令,如果沒有裝expect或者直接在預設的SHELL下執行是找不到spawn指令的。是以不要用 “which spawn“之類的指令去找spawn指令。好比windows裡的dir就是一個内部指令,這個指令由shell自帶,你無法找到一個dir.com 或 dir.exe 的可執行檔案。 

它主要的功能是給ssh運作程序加個殼,用來傳遞互動指令。 

2. [expect "password:"] 

這裡的expect也是expect的一個内部指令,有點暈吧,expect的shell指令和内部指令是一樣的,但不是一個功能,習慣就好了。這個指令的意思是判斷上次輸出結果裡是否包含“password:”的字元串,如果有則立即傳回,否則就等待一段時間後傳回,這裡等待時長就是前面設定的30秒 

  3. [send "df\r"] 

這裡就是執行互動動作,與手工輸入密碼的動作等效。 

溫馨提示: 指令字元串結尾别忘記加上“\r”,如果出現異常等待的狀态可以核查一下。 

4. [interact] 

執行完成後保持互動狀态,把控制權交給控制台,這個時候就可以手工操作了。如果沒有這一句登入完成後會退出,而不是留在遠端終端上。如果你隻是登入過去執行 

#!/usr/bin/expect #注意安裝的路徑,不确定 whereis expect 一下 

########################################################################################

<code>#! /usr/local/bin/expect</code>

<code>set timeout 10</code>

<code>spawn sudo su -                  # 在expect 中用"spawn"關鍵字來調用指令“su - ” </code>

<code>expect </code><code>":"                          #//判斷上次輸出結果裡是否包含“:”的字元串,如果有則立即傳回,否則就等待一段時間後傳回,這裡等待時長就是前面設定的10秒</code>

<code>send</code> <code>"123456\r"</code><code>          </code><code>#root密碼</code>

<code>expect </code><code>"#"</code>

<code>send</code> <code>"cd /home/youruser\r"</code><code>   </code><code>#腳本所在的目錄</code>

<code>send</code> <code>"./autostart_root.sh\r"</code><code>  </code><code>#腳本運作</code>

<code>send</code>  <code>"echo $?\r"</code>

<code>sleep</code> <code>10</code>

<code>interact                           //操作完成。</code>

<code>本文轉自silence部落格51CTO部落格,原文連結http://blog.51cto.com/silencezone/1881182如需轉載請自行聯系原作者</code>

<code></code>

<code>a120518129</code>

繼續閱讀