文章目錄
- 一 : expect 概述
- 二 : expect 安裝
- 三 : expect基本命令
- 3.1 spawn : 啓動進程,並跟蹤後續交互信息
- 3.2 expect
- 3.3 send :向進程發送字符串,用於模擬用戶的輸入
- 3.4 interact : 執行完成後保持交互狀態,把控制權交給控制檯
- 3.5 Timeout :指定超時時間,過期則繼續執行後續指令
- 3.6 exp_continue
- 3.7 send_user
- 3.8 $argv 參數數組
- 3.9 expect腳本必須以interact或expect eof結束,執行自動化任務通常expect eof就足夠了
- 四 : expect 語法
- 五 : experct 執行方式
- 六 : expect 案例
前言:
expect 用途
設置賬號密碼
ssh輸入登陸密碼
scp 輸入驗證密碼
免交互的目的是代替人工手動輸入
- expect概述
- expect安裝
- expect基本命令
- expect執行方式
- expect案例
一 : expect 概述
1.1 expect
- expect是建立在tcl基礎上的一個工具,expect是用來進行自動化控制和測試的工具。主要解決shell腳本中不可交互的問題。對於大規模的linux運維很有幫助
- 在linux運維和開發中,我們經常需要遠程登陸服務器進行操作,登陸的過程是一個交互的過程,可能會需要輸入yes/no、password等信息。爲了模擬這種輸入,可以使用expect腳本
二 : expect 安裝
2.1 掛載光盤
2.2 製作本地yum倉庫
2.3 執行安裝命令
- yum install expect -y
- 系統在默認情況下是沒有安裝expect軟件,需要手動安裝
三 : expect基本命令
3.1 spawn : 啓動進程,並跟蹤後續交互信息
3.2 expect
- expect的一個內部命令,判斷上次輸出結果裏是否包含指定的字符串,如果有則立即返回,否則就等待超過時間後返回。
- 只能捕捉由spawn啓動的進程的輸出
3.3 send :向進程發送字符串,用於模擬用戶的輸入
- 該命令不能自動回車換行,一般要加\r(回車)
3.4 interact : 執行完成後保持交互狀態,把控制權交給控制檯
3.5 Timeout :指定超時時間,過期則繼續執行後續指令
- 單位是:秒
- timeout -1 爲永不超時
- 默認情況下,timeout是10s
3.6 exp_continue
- 允許expect繼續向下執行指令
3.7 send_user
- 回顯命令,相當於echo
備註:
- 永不超時常用於網絡不穩定時使用
- shell腳本中的continue 指結束這次循環,開始下一次循環
- expect腳本中exp_continue指不會結束,繼續匹配下一行
3.8 $argv 參數數組
- expect 腳本可以接受從bash傳遞的參數,可以使用[lindex $argv n]格式,去進行獲得,n從0開始,分別表示第一個,第二個,第三個……參數
- v 代表value 值,前面是固定格式
- agv 與n 中間要有空格
3.9 expect腳本必須以interact或expect eof結束,執行自動化任務通常expect eof就足夠了
- expect eof 是在等待結束標誌。由spawn啓動的命令在結束時會產生一個eof標記,expect eof即在等待這個標記
- 看到eof 即代表結束腳本
四 : expect 語法
-
expect “要捕捉的內容” {send “要輸入的參數\r”;}
-
\r 回車符
-
沒有帶有exp_continue ,則匹配一次就推出,有的話就再往下執行匹配一次
-
-re 參數表示匹配正則表達式
五 : experct 執行方式
5.1 直接執行
[root@localhost ~]# vim a.sh
#!usr/bin/ecpect //expect二進制文件的路徑,
#設置環境
#超時時間
set timeout 9 //設置超時時間
log_file test.log //日誌文件路徑
log_user 1 //用戶數量爲1
#定義變量
set hostname [lindex $argv 0 ]
set password [lindex $argv 1 ]
#開啓追蹤spawn
spawn ssh root@$hostname //spawn 啓動命令
#匹配條件,捕捉
expect { //按條件捕捉去send執行
"(yes/no)"
{send "yes\r";exp_continue}
"*passwor"
{send "$password\r"}
}
#權限轉交控制檯
interact
[root@localhost ~]# chmod +x a.sh
[root@localhost ~]# ./a.sh $argv0 $argv1
-
interact不要寫在大括號裏面
-
[gsy@localhost root]$ which expect /usr/bin/expect
-
兩個log可加可不加
-
set兩個變量代表着傳參
-
然後以spawn 去開啓服務
-
exprct 去捕捉條件,中間send輸出指令,\r回車,exp_continue繼續匹配
-
interact結束
5.2 嵌入執行
[root@localhost ~]# vim b.sh
#!/bin/bash
hostname=$1
password=$2
/usr/bin/expect<<-EOF //expect開始EOF標誌
spawn ssh root@$hostname
expect {
"(yes/no)"
{send "yes\r";exp_continue}
"*password"
{send "$password\r"}
}
expect "*]#" //檢索是否以root登陸
send "exit\r"
expect eof
EOF //exprct結束標誌,這個EOF不能有空格
[root@localhost ~]# source b.sh
-
java的全局變量指的是類文件爲區域
-
shell的是所有bash環境都能識別
-
/usr/bin/expect<<-EOF 也可以視爲聲明expect 位置
-
EOF前後不能有空格
spawn :以spawn模式執行操作,expect 纔可以捕捉到
六 : expect 案例
6.1 創建用戶tom,密碼123123
- 正常情況下的交互過程
- 編寫shell腳本(嵌入方式)
[root@localhost ~]# vim b.sh
#!/bin/bash
user=$1
mima=$2
/usr/bin/expect<<-EOF
spawn useradd $user
spawn passwd $user
expect {
"New password"
{send "$mima\r";exp_continue}
"new password"
{send "$mima\r"}
}
expect eof
EOF
[root@localhost ~]# chmod +x b.sh
[root@localhost ~]# ./b.sh qqq 965483
spawn useradd qqq
spawn passwd qqq
Changing password for user qqq.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@localhost ~]# vim b.sh
[root@localhost ~]# id qqq
uid=1001(qqq) gid=1001(qqq) groups=1001(qqq)
6.2 ssh登錄
- 首次登錄
-
正常登錄
-
連接被拒絕,可能是ssh沒開,或者端口不對,或者防火牆限制
- 沒有連接地址
- 利用expect完成ssh登錄過程
6.3 利用expect完成ftp登錄過程
想要註釋多行語句 可以在首部輸入 :<<! 在尾部輸入!