1. 程式人生 > >Linux expect使用摘要

Linux expect使用摘要

expect互動,包括三個檔案:bash.sh、expect.exp、ip.list(預設在同一個目錄下)
執行有兩種方式,1.sh bash.sh 根據ip.list表來執行;2.expect.exp x.x.x.x單個ip執行
後面發現在expect指令碼中,“#”要出現在命令最開始的地方才是註釋,否則會報錯。

bash程式碼:

#!/bin/bash

for ip in `awk '{print $1}' ip.list` ## 從ip.list檔案中獲取需要處理的ip
do
## echo -e "\033[47;30m start get_NicSpeed of $ip \033[0m" 
expect -f  expect.exp $ip > $ip.result ## 將ip作為引數傳遞給expect指令碼執行,並將結果寫入生成$ip.result檔案
## cat $ip.result |grep --color Speed  ## 讀出檔案內容,並過濾。
done

expect程式碼:

#!/usr/bin/expect -f

# 取傳入的第一個引數賦值
set ipaddress   [lindex $argv 0]
  
# 變數賦值
set password    ******** 

# 設定超時時間3s,預設10s
set timeout 3  

 # “spawn” 關鍵字發起一個程序,“exp_continue” 繼續執行下面匹配
spawn ssh $ipaddress 
expect {  
        "yes/no" {send "yes\r";exp_continue}  
        "*assword:" {send "$password\n"}
}

## 下面是執行語句,仍然需要使用 “expect” 關鍵字進行匹配,配合 “send” 關鍵字,傳送命令。
for {set i 0} {$i < 8 } {incr i} {  ## 迴圈
        expect  "]#" {send "ethtool eth$i|grep Speed\r"}
        set j [expr $i+1]  ##expect中的加法  ## 加法
        expect  "~#" {send "/usr/local/bin/ethtool eth$j|grep Speed\r"}
}
# 退出方式之一
expect {
        "~#" {send "exit\r";exp_continue} 
        "]#" {send "exit\r"}
}

ip列表檔案:

10.10.10.1
10.10.10.2
...

其他:

$argc:統計位置引數數量
timeout -1:永不超時退出
interact:互動後不退出遠端終端
puts:列印字串,類似於echo