shell腳本系列:expect指令碼
阿新 • • 發佈:2020-08-20
引數說明:
- 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