1. 程式人生 > 實用技巧 >shell腳本系列:expect指令碼

shell腳本系列:expect指令碼

引數說明:

  • set:可以設定超時,也可以設定變數
  • timeout:expect超時等待時間,預設10S
  • spawn:執行一個命令
  • expect "":匹配輸出的內容
  • exp_continue:繼續執行下面匹配
  • \r:可以理解為回車
  • $argc:統計位置引數數量
  • [lindex $argv 0]:指令碼後第一個引數,類似於shell中$1,以此類推
  • puts:列印字串,類似於echo
  • awk -v I="$ip":賦值變數
  • expect{...}:輸入多行記錄

其他引數說明:

  • timeout -1:永不超時退出
  • log_file /var/log/expect.log:記錄互動資訊,一般crontab時使用
  • interact:互動後不退出遠端終端,如果加要把expect "root@*" {send "exit\r"}註釋掉,如果不加,就直接退出
  • 將spawn ssh root@$ip換成spawn ssh -o StrictHostKeyChecking=no root@ip既不會再提示是否將伺服器計算機金鑰加入本地known_hosts

示例:

shell內嵌型別:

#!/bin/bash
/usr/bin/expect << EOF
spawn /bin/su -
expect "Password: "
send "123\r"
expect "*#"
interact
expect eof
EOF

分離型:

vi login.exp
#!/usr/bin/expect 
set ipaddress [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]

if { $argc != 3 } {
puts "Usage: expect login.exp ipaddress username password"
exit 1
}

set timeout 30
spawn ssh $username@$ipaddress
expect {
        "(yes/no)" {send "yes\r"; exp_continue}
        "password:" {send "$password\r"}
}

expect "$username@*"  {send "df -h\r"}
expect "$username@*"  {send "exit\r"}
expect eof
vi user_info
192.168.1.156   user    user
192.168.1.154   root    123.com
vi expect.sh
#!/bin/bash
for ip in `awk '{print $1}' user_info`
do
    user=`awk -v I="$ip" '{if(I==$1)print $2}' user_info`
    pass=`awk -v I="$ip" '{if(I==$1)print $3}' user_info`
    expect login.exp $ip $user $pass
done