web前端設(shè)計(jì)模板seo優(yōu)化師是什么
Shell腳本:expect腳本免交互
expect腳本免交互
- 一、免交互基本概述:
- 1.交互與免交互的區(qū)別:
- 2.格式:
- 3.通過(guò)read實(shí)現(xiàn)免交互:
- 4.通過(guò)cat實(shí)現(xiàn)查看和重定向:
- 5.變量替換:
- 二、expect安裝:
- 1.概述:
- 2.作用:
- 3.expect基本命令:
- 4.實(shí)例:
- 5.擴(kuò)展:
一、免交互基本概述:
1.交互與免交互的區(qū)別:
(1)交互:人工發(fā)出指令控制程序的運(yùn)行,程序收到人工相應(yīng)指令后,做出相應(yīng)的反應(yīng)。
(2)免交互:程序按編寫好的運(yùn)行方式,進(jìn)行指定指令操作,在這個(gè)過(guò)程中,不需要人工操作,自動(dòng)化完成。
2.格式:
(1)基本格式:
命令 <<標(biāo)記 例: wc -l<<wang
> >1
> >2
> >wang
標(biāo)記 2
(2)總結(jié):
1.標(biāo)記可以使用任意字符,但必須是合法字符(EOF)
2.結(jié)尾的標(biāo)記一定要頂格寫,前面不能有任何字符
3.結(jié)尾后也不能有任何字符,包括空格
4.開(kāi)頭標(biāo)記前后空格會(huì)被忽略
5.開(kāi)頭和結(jié)尾標(biāo)記必須一致
3.通過(guò)read實(shí)現(xiàn)免交互:
[root@test1 opt]# read i <<EOF
> wang,bkpp
> EOF
[root@test1 opt]# echo $i
wang,bkpp
4.通過(guò)cat實(shí)現(xiàn)查看和重定向:
1.[root@test1 opt]# cat <<EOF #查看
> billkin
> ppkritt
> EOF
billkin
ppkritt
2.[root@test1 opt]# cat <<EOF>wen.txt #重定向
> chanyeol
> baekhyun
> EOF
[root@test1 opt]# cat wen.txt
chanyeol
baekhyun
5.變量替換:
(1)變量替換:
[root@test1 opt]# vim chen.sh
file="chen.sh"
i="the best luck"
cat > $file <<EOF
i like $i
EOF
[root@test1 opt]# sh chen.sh
[root@test1 opt]# cat chen.sh
i like the best luck
(2)整體替換:
[root@test1 opt]# vim chen.sh
var="bkpp is real"
myvar=$(cat <<EOF
the summer in pruket
$var
EOF
)
echo $myvar
[root@test1 opt]# sh chen.sh
the summer in pruket bkpp is real
(3)關(guān)閉免交互:
[root@test1 opt]# vim wang.sh
var="GREAT!i am going to school!"
myvar=$(cat <<'EOF'
today is monday
$var
EOF
)
echo $myvar
[root@test1 opt]# sh wang.sh
today is monday $var
(4)補(bǔ)充:
1.[root@test1 opt]# vim kai.sh #去除行首的tab字符,但是不能去除空格
cat <<-'EOF'kokopoppower
EOF
[root@test1 opt]# sh kai.sh
kokopoppower
2.[root@test1 opt]# vim kai.sh #多行注釋
:<<EOFkokopoppower
EOF
[root@test1 opt]# sh kai.sh
二、expect安裝:
1.概述:
(1)建立在tcl之上的一個(gè)工具
(2)用于進(jìn)行自動(dòng)化控制和測(cè)試
(3)解決shell腳本中交互相關(guān)的問(wèn)題
2.作用:
(1)判斷上次輸出結(jié)果中是否包含指定的字符串,如果有則立即返回,否則就等待超時(shí)時(shí)間后返回。
(2)只能捕捉由spawn啟動(dòng)的進(jìn)程的輸出。
(3)用于接收命令執(zhí)行后的輸出,然后和期望的字符串匹配。
3.expect基本命令:
(1)send(設(shè)置超時(shí)時(shí)間,指定變量):向進(jìn)程發(fā)送字符串,用于模擬用戶的輸入:該命令不能自動(dòng)回車換行,一般要加\r(回車) 或者\(yùn)n
(2)spawn:用于捕捉關(guān)鍵詞,后面常跟一個(gè)linux執(zhí)行命令。
(3)expect:用于判斷上層捕捉輸出的結(jié)果是否有指定字符,有則立即返回,沒(méi)有則默認(rèn)等待10s。
(4)exp_continue命令:expect多分支判斷時(shí)使用。
(5)set命令:可用于設(shè)置變量、設(shè)置expect超時(shí)時(shí)間,默認(rèn)是10s。
(6)結(jié)束符: expect eof 結(jié)束并返回原來(lái)環(huán)境,原來(lái)主機(jī)。interact 結(jié)束但是不會(huì)返回原來(lái)的地方,保持當(dāng)前狀態(tài),當(dāng)前主機(jī)。
4.實(shí)例:
(1)用免交互的方式給用戶設(shè)置密碼。
[root@test1 opt]# vim passwd.sh
#!/usr/bin/expect
set timeout 5spawn passwd lisiexpect "New passwd:"
send "123456\r"
expect "Retype new passwd:"
send "123456\r"expect eof
[root@test1 opt]# chmod 777 passwd.sh
[root@test1 opt]# ./passwd.sh
(2)用傳參方式實(shí)現(xiàn)免交互登錄:
[root@test1 opt]# vim passwd.sh
#!/usr/bin/expect
set timeout 5set username [lindex $argv 0]
set password [lindex $argv 1]spawn su - $usernameexpect "Password:"
send "$password\r"
expect "*]$"
send_user "ok"
expect eof
(3)用嵌入模式實(shí)現(xiàn)免交互:
[root@test1 opt]# vim passwd.sh
#!/bin/bash
user=$1
password=$2
useradd $1
/usr/bin/expect <<-EOFspawn passwd $userexpect "新的 密碼:"
send "${password}\r"
expect "重新輸入新的 密碼:"
send "${password}\r"
expect eof
EOF
[root@test1 opt]# chmod 777 passwd.sh
[root@test1 opt]# ./passwd.sh wang 1233456
useradd:用戶“wang”已存在
spawn passwd wang
更改用戶 wang 的密碼 。
新的 密碼:
無(wú)效的密碼: 密碼少于 8 個(gè)字符
重新輸入新的 密碼:
passwd:所有的身份驗(yàn)證令牌已經(jīng)成功更新。
(4)用ssh實(shí)現(xiàn)免交互:
[root@test1 opt]# vim ssh.sh
#!/usr/bin/expect
set timeout 5
set hostname [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh $hostname
expect {"Connection refused" {send_user "ssh訪問(wèn)被拒絕\n"}"No route to host" {send_user "主機(jī)名/IP地址有誤\n"}"yes/no" {send "yes\n";exp_continue}"password" {send "$password\n"}
}
interact
5.擴(kuò)展:
(1)監(jiān)控腳本寫一個(gè)函數(shù)庫(kù),用定時(shí)任務(wù)調(diào)用,每月1號(hào)執(zhí)行:
[root@test1 opt]# vim hanshu.sh #創(chuàng)建函數(shù)庫(kù)
fx () {
df -h | awk -F "[ ,%]+" 'NR>1 {if($5>20){print $1"警告!"}}'
}
[root@test1 opt]# vim wang.sh #調(diào)用函數(shù)
. /opt/hanshu.sh
a=`fx`
echo $a
[root@test1 opt]# crontab -e#創(chuàng)建定時(shí)任務(wù)
0 0 1 * * /opt/wang.sh
(2)在實(shí)現(xiàn)ssh免交互登錄的基礎(chǔ)上,使它在密碼出錯(cuò)的情況下,也可以免交互自動(dòng)完成:
[root@test1 opt]# vim passwd.sh
#!/usr/bin/expect
set timeout 5
set hostname [lindex $argv 0]
set ip [lindex $argv 1]
set password [lindex $argv 2]spawn ssh $hostname@$ip
expect { "connection refused" {send_user "ssh訪問(wèn)被拒絕\n"exit}"No route to host" {send_user "主機(jī)名/ip地址有誤\n"exit}"yes/no" {send "yes\n";exp_continue}"password" {send "$password\n"}"Permission denied, please try again."} interact
[root@test1 opt]# chmod 777 passwd.sh
[root@test1 opt]# ./passwd.sh root 192.168.174.13 123
(3)免交互實(shí)現(xiàn)fdisk的磁盤分區(qū),格式化,掛載:
[root@test1 opt]# vim fdisk.sh#!/bin/bash
/usr/bin/expect <<-EOF
set timeout 5
spawn fdisk /dev/sdb
expect {"命令(輸入 m 獲取幫助):" { send "n\n";exp_continue}"Select (default p): " {send "p\n";exp_continue}"分區(qū)號(hào) (1-4,默認(rèn) 1):" {send "\n";exp_continue}"起始 扇區(qū) (2048-41943039,默認(rèn)為 2048):" {send "\n";exp_continue}"Last 扇區(qū)*" {send "+10G\nw\n";exp_continue}
expect eof
}
EOFmkfs.xfs -f /dev/sdb1
mkdir /data
mount /dev/sdb1 /data
[root@test1 opt]# chmod 777 fdisk.sh
[root@test1 opt]# ./fdisk.sh