web前端設計模板seo優(yōu)化師是什么
Shell腳本:expect腳本免交互
expect腳本免交互
- 一、免交互基本概述:
- 1.交互與免交互的區(qū)別:
- 2.格式:
- 3.通過read實現(xiàn)免交互:
- 4.通過cat實現(xiàn)查看和重定向:
- 5.變量替換:
- 二、expect安裝:
- 1.概述:
- 2.作用:
- 3.expect基本命令:
- 4.實例:
- 5.擴展:
一、免交互基本概述:
1.交互與免交互的區(qū)別:
(1)交互:人工發(fā)出指令控制程序的運行,程序收到人工相應指令后,做出相應的反應。
(2)免交互:程序按編寫好的運行方式,進行指定指令操作,在這個過程中,不需要人工操作,自動化完成。
2.格式:
(1)基本格式:
命令 <<標記 例: wc -l<<wang
> >1
> >2
> >wang
標記 2
(2)總結:
1.標記可以使用任意字符,但必須是合法字符(EOF)
2.結尾的標記一定要頂格寫,前面不能有任何字符
3.結尾后也不能有任何字符,包括空格
4.開頭標記前后空格會被忽略
5.開頭和結尾標記必須一致
3.通過read實現(xiàn)免交互:
[root@test1 opt]# read i <<EOF
> wang,bkpp
> EOF
[root@test1 opt]# echo $i
wang,bkpp
4.通過cat實現(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)關閉免交互:
[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)補充:
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之上的一個工具
(2)用于進行自動化控制和測試
(3)解決shell腳本中交互相關的問題
2.作用:
(1)判斷上次輸出結果中是否包含指定的字符串,如果有則立即返回,否則就等待超時時間后返回。
(2)只能捕捉由spawn啟動的進程的輸出。
(3)用于接收命令執(zhí)行后的輸出,然后和期望的字符串匹配。
3.expect基本命令:
(1)send(設置超時時間,指定變量):向進程發(fā)送字符串,用于模擬用戶的輸入:該命令不能自動回車換行,一般要加\r(回車) 或者\n
(2)spawn:用于捕捉關鍵詞,后面常跟一個linux執(zhí)行命令。
(3)expect:用于判斷上層捕捉輸出的結果是否有指定字符,有則立即返回,沒有則默認等待10s。
(4)exp_continue命令:expect多分支判斷時使用。
(5)set命令:可用于設置變量、設置expect超時時間,默認是10s。
(6)結束符: expect eof 結束并返回原來環(huán)境,原來主機。interact 結束但是不會返回原來的地方,保持當前狀態(tài),當前主機。
4.實例:
(1)用免交互的方式給用戶設置密碼。
[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)用傳參方式實現(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)用嵌入模式實現(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 的密碼 。
新的 密碼:
無效的密碼: 密碼少于 8 個字符
重新輸入新的 密碼:
passwd:所有的身份驗證令牌已經成功更新。
(4)用ssh實現(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訪問被拒絕\n"}"No route to host" {send_user "主機名/IP地址有誤\n"}"yes/no" {send "yes\n";exp_continue}"password" {send "$password\n"}
}
interact
5.擴展:
(1)監(jiān)控腳本寫一個函數(shù)庫,用定時任務調用,每月1號執(zhí)行:
[root@test1 opt]# vim hanshu.sh #創(chuàng)建函數(shù)庫
fx () {
df -h | awk -F "[ ,%]+" 'NR>1 {if($5>20){print $1"警告!"}}'
}
[root@test1 opt]# vim wang.sh #調用函數(shù)
. /opt/hanshu.sh
a=`fx`
echo $a
[root@test1 opt]# crontab -e#創(chuàng)建定時任務
0 0 1 * * /opt/wang.sh
(2)在實現(xiàn)ssh免交互登錄的基礎上,使它在密碼出錯的情況下,也可以免交互自動完成:
[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訪問被拒絕\n"exit}"No route to host" {send_user "主機名/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)免交互實現(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ū)號 (1-4,默認 1):" {send "\n";exp_continue}"起始 扇區(qū) (2048-41943039,默認為 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