一、介紹
expect是一款自動化的腳本解釋型的工具。
expect基於tcl腳本,expect腳本的運行需要tcl的支持。
expect對一些需要交互輸入的命令很有幫助,比如ssh ftp scp telnet。
遠程登錄linux服務器的時候,ssh命令需要手工輸入密碼,當登錄多台機器的時候就會非常繁瑣。
expect就可以根據設定的規則,自動幫我們輸入密碼,大大節省了時間。
二、安裝expect
一般機器不會自帶expect,需要手動安裝。yum源安裝expect,使用yum源可以自動解決依賴,也可以rpm包安裝
# yum install expect -y # expect expect1.1>
三、expect基礎知識
expect腳本
腳本開頭
expect腳本一般以#!/usr/bin/expect -f開頭,類似bash腳本。
常用后綴
expect腳本常常以.exp或者.ex結束。
expect主要命令
spawn 新建一個進程,這個進程的交互由expect控制
expect 等待接受進程返回的字符串,直到超時時間,根據規則決定下一步操作
send 發送字符串給expect控制的進程
set 設定變量為某個值
exp_continue 重新執行expect命令分支
[lindex $argv 0] 獲取expect腳本的第1個參數
[lindex $argv 1] 獲取expect腳本的第2個參數
set timeout -1 設置超時方式為永遠等待
set timeout 30 設置超時時間為30秒
interact 將腳本的控制權交給用戶,用戶可繼續輸入命令
expect eof 等待spawn進程結束后退出信號eof
expect命令分支
expect命令采用了tcl的模式-動作語法,此語法有以下幾種模式:
單一分支語法
set password 123456
expect "*assword:" { send "$password\r" }
當輸出中匹配*assword:時,輸出password變量的數值和回車。
多分支語法
set password 123456
expect {
"(yes/no)?" { send "yes\r"; exp_continue }
"*assword:" { send "$password\r" }
}
當輸出中包含(yes/no)?時,輸出yes和回車,同時重新執行此多分支語句。
當輸出中匹配*assword:時,輸出password變量的數值和回車。
四、expect應用實例
1.傳參式ssh登錄指定主機
#!/usr/bin/expect -f set ip [ lindex $argv 0 ] //接收第一個參數,並設置IP set pass [ lindex $argv 1 ] //接收第二個參數,並設置密碼 set timeout 10 //設置超時時間 spawn ssh root@$ip //發送ssh請求 expect { //返回信息匹配 "*yes/no" { send "yes\r"; exp_continue} //第一次ssh連接會提示yes/no,自動發送yes "*password:" { send "$pass\r" } //出現密碼提示,發送密碼 } interact //交互模式,用戶會停留在遠程服務器上面
2.利用expect批量ssh互信
編寫hosts文本用於存放主機信息
#!/bin/bash # 判斷id_rsa密鑰文件是否存在 if [ ! -f ~/.ssh/id_rsa ];then ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa else echo "id_rsa has created ..." fi #分發到各個節點,這里分發到host文件中的主機中. while read line do user=`echo $line | cut -d " " -f 2` ip=`echo $line | cut -d " " -f 1` passwd=`echo $line | cut -d " " -f 3` expect <<EOF set timeout 10 spawn ssh-copy-id $user@$ip expect { "yes/no" { send "yes\n";exp_continue } "password" { send "$passwd\n" } } expect "password" { send "$passwd\n" } EOF done < hosts