shell study-17day--expect登錄遠程主機

1expect-正則表達

1)expect 實現無交互登陸

expect是一個免費的編程工具語言,用來實現自動和交互式任務進行通訊,而無需人的干預。如:ssh登陸,ftp登陸等寫在一個腳本上,使之自動化完成。shell

2)安裝expect

[root@test ~]# yum -y install expect

3)使用方法

A、定義腳本執行的shell

[root@test ~]# find / -name expect 
/usr/bin/expect

#!/usr/bin/expect編程

定義的是 expect 可執行文件的連接路徑.bash

Bset timeout 30

設置超時時間,單位是秒,若是設爲timeout -1意爲永不超時,默認timeout 爲10s服務器

Cspawn

spawn 是進入expect 環境後才能執行的內部命令,若是沒有裝expect或直接在默認的SHELL下執行是找不到spawn命令的。不能直接在默認的shell環境中進行執行主要功能,它主要的功能是給ssh運行進程加個殼,用來傳遞交互指令。ssh

Dexpect

expect內部命令,主要用來判斷輸出結果是否包含某項字符串,沒有則當即返回,不然就等待一段時間後返回,等待時間經過timeout進行設置。ide

Esend

執行交互動做,將交互要執行的動做進行輸入給交互指令。工具

命令字符串結尾要加上"\r",若是出現異常等待的狀態能夠進行覈查。spa

Fexp_continue

繼續執行接下來的交互操做orm

Ginteract

執行完後保持交互狀態,把控制權交給控制檯;若是不加這一項,交互完成會自動退出。進程

H、$argv

expect腳本能夠接受從bash傳遞過來的參數,能夠使用 [lindex $argv n]得到,n 從 0 開始,分別表示第一個,第二個,第三個……參數。

4)免密碼經過 SSH 登陸服務器(非祕鑰方式)

[root@test shell]# vi ssh.sh 
"password" { send "$passwd\r" }
}
#!/usr/bin/expect
set ip "192.168.0.20"
set name "root"
set passwd "123456"
set timeout 25
spawn ssh $name@$ip
expect {
"yes/no" { send "yes\r";exp_continue }
"password" { send "$passwd\r" }
}
expect "#"  #判斷上次輸出結果裏是否包含「password:」的字符串,若是有則當即返回,向下執行;不然就一直等待,直到超時時間到
send "touch /root/test.txt\r"
send "ls /root > /root/test.txt\r"
send "exit\r"
expect eof  #執行完成上述命令後,退出 Expect,把控制權交給控制檯,變回手工操做
[root@test shell]# expect ssh.sh 
spawn ssh root@192.168.0.20
root@192.168.0.20's password: 
Last login: Fri Nov 27 00:18:47 2020 from 192.168.0.10
[root@test ~]# touch /root/test.txt
[root@test ~]# ls /root > /root/test.txt
[root@test ~]# exit
登出
Connection to 192.168.0.20 closed.
[root@test shell]#

 注:expect -f ssh.sh 會顯示腳本執行不成功的報錯信息。

5)批量ssh登陸服務器進行管理

[root@test shell]# cat ssh.exp 
#!/usr/bin/expect
set ipaddr [lindex $argv 0]
set passwd [lindex $argv 1]
set timeout 30
spawn ssh root@$ipaddr
expect {
"yes/no" { send "yes\r";exp_continue }
"password" { send "$passwd\r" }
}
expect "#"
send "cd /root\r"
send "rm -rf test.txt\r"
send "exit\r"
expect eof
[root@test shell]# 
Shell腳本傳遞ip及密碼等參數信息:
[root@test shell]# cat login.sh 
#!/bin/bash
echo
for ip in `awk '{print $1}' /root/shell/ip_list.txt`
do
pass=`grep $ip /root/shell/ip_list.txt|awk '{print $2}'`
expect /root//shell/ssh.exp $ip $pass
done
[root@test shell]# 
ip_list.txt文件
[root@test shell]# cat ip_list.txt 
192.168.0.20 123456
[root@test shell]# 
執行腳本
[root@test shell]# sh login.sh 
spawn ssh root@192.168.0.20
root@192.168.0.20's password: 
Last login: Fri Nov 27 00:32:36 2020 from 192.168.0.106
[root@test ~]# cd /root
[root@test ~]# rm -rf test.txt
[root@test ~]# exit
登出
Connection to 192.168.0.20 closed.
[root@test shell]#


我的公衆號:

image.png

相關文章
相關標籤/搜索