shell編程基本知識?[root@qfedu ~] yum -y install expect是一個免費的編程工具, 用來實現自動的交互式任務, 而無需人為幹預. 說白了 expect 就是一套用來實現自動交互功能的軟件,我來為大家講解一下關于shell編程基本知識?跟着小編一起來看一看吧!
[root@qfedu ~] yum -y install expect
No.2 expect的語法-------通過expect可以實現将交互式的命令變為非交互式執行,不需要人為幹預(手動輸入)是一個免費的編程工具, 用來實現自動的交互式任務, 而無需人為幹預. 說白了 expect 就是一套用來實現自動交互功能的軟件
在實際工作中我們運行命令、腳本或程序時, 都需要從終端輸入某些繼續運行的指令,而這些輸 入都需要人為的手工進行. 而利用 expect 則可以根據程序的提示, 模拟标準輸入提供給程序, 從而實現自動化交互執 行. 這就是 expect
如果能夠在工作中熟練的使用shell腳本就可以很大程度的提高工作效率, 那麼再搭配上expect這個時候很多工作都可以實現自動化進行。
用法:
1)定義expect腳本執行的shell
#!/usr/bin/expect -----類似于#!/bin/bash
2)set timeout 30
設置超時時間30s
3)spawn
spawn是執行expect之後後執行的内部命令開啟一個會話 #功能:用來執行shell的交互命令
4)expect ---相當于捕捉
功能:判斷輸出結果是否包含某項字符串(相當于捕捉返回的結果),沒有則會斷開,否則等待一段時間後返回,等待通過timeout設置
5)send
執行交互動作,将交互要執行的命令進行發送給交互指令,命令字符串結尾要加上“\r”,#---相當于回車
6)interract
執行完後保持交互狀态,需要等待手動退出交互狀态,如果不加這一項,交互完成會自動退出
7)exp_continue
繼續執行接下來的操作
案例1:普通操作
[root@qfedu script]# vim expect01.sh
#!/usr/bin/expect
spawn ssh [email protected]
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "1\r" };
}
interact
[root@qfedu script]# chmod x expect01.sh
[root@qfedu script]# ./expect01.sh
spawn ssh [email protected]
[email protected]'s password:
Last login: Fri Aug 28 16:57:09 2019
#如果添加interact參數将會等待我們手動交互進行退出。如果不加interact參數在登錄成功之後會立刻退出。
============================================================================
2.設置變量與進行傳參的方式
#注意:expect環境中設置變量用set,識别不了bash方式定義的變量
[root@qfedu script]# vim expect01.sh
#!/usr/bin/expect
set user root
set pass 1
set ip [ lindex $argv 0 ] #expect固定寫法,從0開始,第一個位置參數,相當于shell中的$1
set timeout 10
spawn ssh $user@$ip
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "$pass\r" };
}
interact
[root@qfedu script]# ./expect01.sh 192.168.246.115
spawn ssh [email protected]
[email protected]'s password:
Last login: Fri Aug 28 07:13:57 2019 from 192.168.246.135
#如果想登錄成功自動結束交互模式也就是expect,可以采用下面方式:
expect "#"
send "useradd test\r"
send "pwd\r"
send "exit\r"
expect eof #直接退出expect模式
============================================================================
3.進行批量推送公鑰實現免密連接,ping通一個ip地址連接一個ip------!!!!擴展
[root@qfedu script]# vim getip_push.sh
#!/usr/bin/bash
pass=1
#判斷expect命令是否安裝
rpm -qa expect &> /dev/null
if [ $? -ne 0 ];then
yum install -y expect
fi
#判斷主機下面是否生成秘鑰,如果沒有生成秘鑰
if [ ! -f ~/.ssh/id_rsa ];then
ssh-keygen -P "" -f ~/.ssh/id_rsa
fi
#循環執行獲取up狀态的ip地址。
for i in {2..254}
do
{
ip=192.168.198.$i
ping -c1 $ip &> /dev/null
if [ $? -eq 0 ];then
echo "$ip" >> up_ip.txt
set timeout 10
/usr/bin/expect <<-EOF #shell腳本中調用expect命令
spawn ssh-copy-id $ip
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "$pass\r" };
}
expect eof
EOF
fi
} &
wait
done
echo "finish..."
[root@qfedu script]# chmod x getip_push.sh
[root@qfedu script]# ./getip_push.sh
測試....
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!