
本篇主要寫一些shell腳本免互動expect的使用,
概述
Expect是建立在tcl基礎上的一個工具,Expect 是用來進行自動化控制和測驗的工具,主要解決shell腳本中不可互動的問題,
安裝
- 使用此工具前需先安裝
yum install -y expect
基本命令
send
-
向行程發送字串,用于模擬用戶的輸入
-
該命令不能自動回車換行,一般要加
\r(回車)
expect
-
expect的一個內部命令,判斷上次輸出結果里是否包含指定的字串,如果有則立即回傳,否則就等待超時時間后回傳, -
只能捕捉由
spawn啟動的行程的輸出
spawn
- 啟動行程,并跟蹤后續互動資訊
interact
- 執行完成后保持互動狀態,把控制權交給控制臺
timeout
-
指定超時時間,過期則繼續執行后續指令
-
單位是:秒
-
timeout -1永不超時 -
默認情況下,
timeout是10秒
exp_continue
- 允許
expect繼續向下執行指令
send_user
- 回顯命令,相當于
echo
$argv 引數陣列
expect腳本可以接受從bash傳遞的引數.可以使用[lindex $argv n]獲得,n從0開始,分別表示第一個,第二個,第三個...引數
expect 腳本
-
expect腳本必須以interact或expect eof結束,執行自動化任務通常expect eof就夠了 -
expect eof是在等待結束標志,由spawn啟動的命令在結束時會產生一個eof標記,expect eof即在等待這個標記
expect 語法
- 單分支
expect "password:" {send "mypassword\r";}
- 多分支
expect "aaa" {send"AAA\r"}
expect "aaa" {send"AAA\r"}
expect "aaa" {send"AAA\r"}
send命令不具備回車換行功能,一般要加\r或\n
expect {
"aaa" {send "AAA\r"}
"bbb" {send "BBB\r"}
"ccc" {send "CCC\r"}
}
只要配置
aaa或bbb或ccc中的任何一個,執行相應的send陳述句后退出該expect陳述句
expect {
"aaa" {send "AAA";exp_continue}
"bbb" {send "BBB";exp_continue}
"ccc" {send "CCC"}
}
exp_continue表示繼續后面的匹配,如果匹配了aaa,執行完send陳述句后還要繼續向下匹配bbb
執行方式
- 基本語法結構
spawn 命令
expect "提示資訊"
send "代替人工輸入的字串\r"
- 直接執行
#!/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
[root@host01 ~]# yum install expect -y
[root@host01 ~]# vim ssh.sh
[root@host01 ~]# chmod +x ssh.sh
[root@host01 ~]# ./ssh.sh 192.168.28.129 000000
spawn ssh [email protected]
The authenticity of host '192.168.28.129 (192.168.28.129)' can't be established.
ECDSA key fingerprint is SHA256:QmZtJT0piBUSkF9P3GfYf3uEogzBWs08sI7j0eBE/cI.
ECDSA key fingerprint is MD5:ef:e6:06:22:8a:0f:24:00:f8:af:a5:59:5b:a2:b8:b1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.28.129' (ECDSA) to the list of known hosts.
[email protected]'s password:
Last login: Thu Oct 17 09:35:35 2019
[root@host02 ~]#
- 嵌入執行
#!/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
-EOF只能容錯制表符tab
[root@host01 ~]# vim ssh.sh
[root@host01 ~]# ./ssh.sh 192.168.28.129 000000
spawn ssh [email protected]
[email protected]'s password:
Last login: Thu Oct 17 09:38:23 2019 from 192.168.28.128
[root@host02 ~]# exit
logout
Connection to 192.168.28.129 closed.
[root@host01 ~]#
案例1 useradd
#!/bin/bash
username=$1
password=$2
useradd $username
/usr/bin/expect << EOF
spawn passwd $username
expect "New password:"
send "$password\r"
expect "Retype new password:"
send "$password\r"
expect eof
EOF
[root@host01 ~]# vim useradd.sh
[root@host01 ~]# chmod +x useradd.sh
[root@host01 ~]# ./useradd.sh zhangsan 000000
spawn passwd zhangsan
Changing password for user zhangsan.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.
案例2 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 {
"Connection refused" exit
"Name or service not known" exit
"(yes/no)" {send "yes\r";exp_continue}
"*password" {send "$password\r"}
}
# 控制權交給控制臺執行
interact
exit
[root@host02 ~]# systemctl stop sshd
[root@host01 ~]# ./ssh.sh 192.168.28.129 000000
spawn ssh [email protected]
ssh: connect to host 192.168.28.129 port 22: Connection refused
[root@host01 ~]#
[root@host02 ~]# systemctl start sshd
[root@host01 ~]# ./ssh.sh host02 000000
spawn ssh root@host02
ssh: Could not resolve hostname host02: Name or service not known
[root@host01 ~]#
[root@host01 ~]# ./ssh.sh 192.168.28.129 000000
spawn ssh [email protected]
[email protected]'s password:
Last login: Thu Oct 17 09:49:38 2019
[root@host02 ~]#
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/161986.html
標籤:Linux
上一篇:git 取消檔案跟蹤
下一篇:ubifs使用方法
