expect是創建在tcl語言基礎上的一個工具,它可讓一些須要交互的任務自動化地完成。至關於模擬了用戶和命令行的交互操做。
一個經常使用的場景就是批量配置集羣無祕鑰登陸。若是集羣的機器數量不少,手動一臺一臺地去每臺機子去配置無密鑰是很是糟糕的事情。使用expect功能,能夠遠程登陸機器,並經過交互方式進行無祕鑰登陸。shell
掛載光盤
製做本地yum源
執行安裝命令:yum install expect -y編程
send:向進程發送字符串,用於模擬用戶的輸出
expect:expect的一個內部命令,判斷上次輸出結果裏是否包含指定的字符串,若是有則當即返回,不然就等待超時時間後返回。
spawn:啓動進程,並跟蹤後續交互信息
interact:執行完後保持交互狀態,把控制權交給控制檯
EOF:結束
Timeout:指定超時時間,過時則繼續執行後續指令
單位是秒
timeout -1 爲永不超時
默認狀況下,timeout是10秒
exp_continue
容許expect繼續向下執行命令
send_user
回顯命令,至關於echo
$argv參數數組
Expect腳本能夠接受從bash傳遞的參數,能夠使用[lindex $argv n]得到,n從0開始,分別表示第一個,第二個,第三個。。。。參數
Expect腳本必須以interact或者expect eof結束,執行自動化任務一般expect eof就夠了
expect eof是在等待結束標誌。由spwan啓動的命令在結束時會產生一個eof標記,expect eof即在等待這個標記。數組
直接執行bash
ssh免交互遠程鏈接ssh
#!/usr/bin/expect #超時時間 set timeout 20 log_file test.log log_user 1 #參數傳入 set hostname [lindex $argv 0] set password [lindex $argv 1] #追蹤命令 spawn ssh root@$hostname #捕捉信息而且匹配,免交互執行 expect { "(yes/no)" {send "yes\r";exp_continue} "*password" {send "$password\r"} } #控制權交給控制檯執行 interact
腳本執行結果ide
[root@localhost opt]# chmod +x a.sh [root@localhost opt]# ./a.sh 192.168.131.129 123123 spawn ssh root@192.168.131.129 root@192.168.131.129's password: Last login: Thu Oct 10 18:56:11 2019 from 192.168.131.133 [root@localhost ~]#
嵌入執行工具
ssh免交互遠程鏈接spa
#!/bin/bash hostname=$1 password=$2 /usr/bin/expect<<-EOF spawn ssh root@${hostname} expect { "(yes/no)" {send "yes\r";exp_continue} "*password" {send "$password\r"} } expect "*]#" send "exit\r" expect eof EOF
腳本執行結果pwa
[root@localhost opt]# chmod +x b.sh [root@localhost opt]# ./b.sh 192.168.131.129 123123 spawn ssh root@192.168.131.129 root@192.168.131.129's password: Last login: Thu Oct 10 18:56:02 2019 from 192.168.131.133 [root@localhost ~]# exit 登出 Connection to 192.168.131.129 closed. [root@localhost opt]#
建立用戶tom,密碼tom123命令行
#!/bin/bash hostname=$1 password=$2 useradd $hostname expect <<-EOF spawn passwd $hostname expect "新的*" send "$password\r" expect "從新輸入*" send "$password\r" expect eof; EOF
[root@localhost opt]# chmod +x c.sh [root@localhost opt]# ./c.sh tom tom123 spawn passwd tom 更改用戶 tom 的密碼 。 新的 密碼: 無效的密碼: 密碼少於 7 個字符 從新輸入新的 密碼: passwd:全部的身份驗證令牌已經成功更新。 [root@localhost opt]#
SSH遠程登陸腳本健壯版
在ssh遠程登陸沒法鏈接到時,不會輸出報錯信息。
#!/usr/bin/expect set timeout 20 //超時時間log_file test.log log_user 1set hostname [lindex $argv 0] //參數傳入set password [lindex $argv 1]spawn ssh root@$hostname //追蹤命令expect { //捕捉信息而且匹配,免交互執行"Connection refused" exit"service not known" exit"(yes/no)"{send "yes\r";exp_continue}"*password" {send "$password\r"}}interact //控制權交給控制檯執行exit