Linux 命令expect使用詳解
一、概述
1.1 命令簡介
expect 是由Don Libes基于Tcl(Tool Command Language )語言開發(fā)的,是一種腳本語言,主要應(yīng)用于自動化交互式操作的場景,借助Expect處理交互的命令,可以將交互過程如:ssh登錄,ftp登錄等寫在一個腳本上,使之自動化完成。尤其適用于需要對多臺服務(wù)器執(zhí)行相同操作的環(huán)境中,可以大大提高系統(tǒng)管理人員的工作效率。
1.2 使用場景
(1)根據(jù)預(yù)定標(biāo)準(zhǔn)回答其問題,回答“是”、“否”或?qū)⒖刂茩?quán)交還給您
(2)遠程連接設(shè)備并執(zhí)行自動化操作
(3)需要人機交互的地方,如果提前知道應(yīng)該輸入什么指令都可以使用expect 工具
1.3 expect命令安裝
yum install expect -y
二、expect使用原理
2.1 命令原理介紹
spawn啟動指定進程—expect獲取指定關(guān)鍵字—send向指定程序發(fā)送指定字符—執(zhí)行完成退出
spawn命令
spawm命令就是用來啟動新的進程的。spawn后的send和expect命令都是和spawn打開的進程進行交互的、
send命令
send命令接收一個字符串參數(shù),并將該參數(shù)發(fā)送到進程,這個過程類似模擬人類輸入密碼
interact命令
結(jié)合spawn、expect、send自動化的完成很多任務(wù),interact命令可以在適當(dāng)?shù)臅r候進行任務(wù)的干預(yù),比如下載完ftp文件時,仍然可以停留在ftp命令行狀態(tài),以便手動的執(zhí)行后續(xù)命令
三、expect使用語法
3.1 expect 啟用選項
- -c 執(zhí)行腳本前先執(zhí)行的命令,可多次使用
- -d debug模式,可以在運行時輸出一些診斷信息,與在腳本開始處使用exp_internal 1相似。
- -D 啟用交換調(diào)式器,可設(shè)一整數(shù)參數(shù)。
- -f 從文件讀取命令,僅用于使用#!時。如果文件名為"-",則從stdin讀取(使用"./-"從文件名為-的文件讀取)。
- -i 交互式輸入命令,使用"exit"或"EOF"退出輸入狀態(tài)
- -- 標(biāo)示選項結(jié)束(如果你需要傳遞與expect選項相似的參數(shù)給腳本時),可放到#!行:#!/usr/bin/expect --
- -v 顯示expect版本信息
3.2 expect命令參數(shù)
- spawn: 交互程序開始,執(zhí)行后面的命令或程序。需要進入到expect環(huán)境才可以執(zhí)行,不能直接在shell環(huán)境下直接執(zhí)行
- set timeout n : 設(shè)置超時時間,表示該腳本代碼需在n秒鐘內(nèi)完成,如果超過,則退出。用來防止ssh遠程主機網(wǎng)絡(luò)不可達時卡住及在遠程主機執(zhí)行命令宕住。如果設(shè)置為-1表示不會超時
- set: 定義變量
- $argv expect腳本可以接受bash的外部傳參,可以使用[ lindex $argv n ]n為0表示第一個傳參,為1表示第二個傳參,以此類推
- expect 從交互程序進程中指定接收信息, 如果匹配成功, 就執(zhí)行send的指令交互;否則等待timeout秒后自動退出expect語句
- send 如果匹配到expect接受到的信息,就將send中的指令交互傳遞,執(zhí)行交互動作。結(jié)尾處加上\r表示如果出現(xiàn)異常等待的狀態(tài)可以進行核查
- exp_continue 表示循環(huán)式匹配,通常匹配之后都會退出語句,但如果有exp_continue則可以不斷循環(huán)匹配,輸入多條命令,簡化寫法。
- exit 退出expect腳本
- expect eof: spawn進程結(jié)束后會向expect發(fā)送eof,接收到eof代表該進程結(jié)束
- interact 執(zhí)行完代碼后保持交互狀態(tài),將控制權(quán)交給用戶。沒有該命令執(zhí)行完后自動退出而不是留在遠程終端上
- puts 輸出變量
四、實戰(zhàn)案例
4.1 登錄遠程服務(wù)器并在遠程服務(wù)器上執(zhí)行命令
#!/usr/bin/expect spawn ssh root@192.168.2.161 df -h expect "*password:" send "winner@001\n" expect eof
執(zhí)行結(jié)果如下圖:
4.2 本機免密實現(xiàn)
#! /bin/bash # # Author: kangll # CreateTime: 2023-11-10 # Desc: 基礎(chǔ)環(huán)境配置,包括服務(wù)器設(shè)置,JDK,免密,kerberos配置 # 可擴展到批量操作 # #set -x BASEDIR=$(cd "$(dirname "$0")"; pwd) # 加載配置 source $BASEDIR/config/global.sh ssh_networkname=(windp-aio) ssh_passwd=winner@#2023 ######################## # 生成本地ssh公鑰 ######################## create_ssh_pub(){ echo "生成本地ssh公鑰" /usr/bin/expect << eof # 設(shè)置捕獲字符串后,期待回復(fù)的超時時間 set timeout 30 # 執(zhí)行命令開啟一個新的進程 spawn ssh-keygen -t rsa -b 1024 ## 開始進連續(xù)捕獲 expect { ".ssh/id_rsa)" { send "\n"; exp_continue } "Overwrite (y/n)?" { send "y\n"; exp_continue } "no passphrase):" { send "\n"; exp_continue } "passphrase again:" { send "\n"; exp_continue } } eof } ######################## # 定義復(fù)制ssh公鑰方法 ######################## copy_ssh(){ if [ ! -f /root/.ssh/id_rsa.pub ];then create_ssh_pub fi echo "復(fù)制公鑰到對應(yīng)的主機上" /usr/bin/expect << eof # 設(shè)置捕獲字符串后,期待回復(fù)的超時時間 set timeout 30 # 命令執(zhí)行 spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $1@$2 ## 開始進連續(xù)捕獲 expect { "connecting (yes/no)?" { send "yes\n"; exp_continue } "s password:" { send "${ssh_passwd}\n"; exp_continue } } eof } ######################## # 配置免密 ######################## config_ssh() { # 主機遍歷 for name in ${ssh_networkname[*]};do timeout 5 ssh root@${name} "echo ${name}: 'This is success!'" if [[ $? -ne 0 ]];then echo "復(fù)制文件到: ${name}" copy_ssh root ${name} > /dev/null fi done echo "********** ssh installation completed **********" } # 配置root用戶免密 config_ssh
4.3 自動生成kerberos用戶的keytab認證文件
#! /bin/bash # # Author: kangll # CreateTime: 2023-11-10 # Desc: 基礎(chǔ)環(huán)境配置,包括服務(wù)器設(shè)置,JDK,免密,kerberos配置 # 可擴展到批量操作 # # public 主機名和root密碼 ip=$(ip addr show | grep -E 'inet [0-9]' | awk '{print $2}' | awk -F '/' '{print $1}' | sed -n '$p') ssh_hosts=${ip} ssh_networkname=(windp-aio) # global.sh 配置文件中獲取 ssh_passwd=$root_passwd ssh_passwd=winner@#2023 kerberos_user=winner_spark ################################## # 配置kerberos用戶: winner_spark # 生成keytab 文件 ################################## config_kerberos_user() { echo "******** 創(chuàng)建winner_spark用戶實例 ********" /usr/bin/expect << eof # 設(shè)置捕獲字符串后,期待回復(fù)的超時時間 set timeout 30 # 登錄 spawn kadmin.local ## 開始進連續(xù)捕獲,添加用戶 expect { "kadmin.local:" { send "addprinc ${kerberos_user}\n"; exp_continue } "Enter password for principal" { send "${ssh_passwd}\n"; exp_continue } "Re-enter password for principal" { send "${ssh_passwd}\n"; } } expect "kadmin.local:" { send "quit\r"; } eof echo "******** winner_spark用戶生成keytab文件 ********" /usr/bin/expect << eof # 設(shè)置捕獲字符串后,期待回復(fù)的超時時間 set timeout 30 spawn kadmin.local ## 開始進連續(xù)捕獲,生成keytab file expect { "kadmin.local:" { send "xst -k /etc/security/keytabs/${kerberos_user}.keytab ${kerberos_user}@WINNER.COM\n"; } } expect "kadmin.local:" { send "quit\r"; } eof # modify keytab file privilege chown ${kerberos_user}:hadoop /etc/security/keytabs/${kerberos_user}.keytab echo "********** kerberos user winner_spark add completed **********" } # 配置kerberos,并啟動 #config_krb5 # 配置kerberos用戶: winner_spark, 生成keytab 文件 config_kerberos_user
到此這篇關(guān)于Linux 命令expect使用詳解的文章就介紹到這了,更多相關(guān)Linux expect使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
linux下保留文件系統(tǒng)下剩余指定數(shù)目文件的shell腳本
本文介紹下,用于保留文件系統(tǒng)下剩余指定數(shù)量的文件的一個shell腳本,感興趣的朋友可以參考下2013-11-11