1. 程式人生 > >linux無交互登錄服務器工具expect的使用

linux無交互登錄服務器工具expect的使用

不同 以及 letter 等待時間 行動 語句 引號 echo city

expect腳本遠程登錄命

linux系統默認沒有安裝expect的命令,使用yum安裝
yum install -y expect
一般我們登錄服務器會有一個機器指紋的保存確認,以及需要手動輸入密碼登錄。但是當有
編寫一個自動交互確認的登錄腳本,可以實現不需要人為幹預登錄到其他服務器
使用expect語法登錄到一臺服務器當中,對可能出現的交互進行事前確認操作,如這裏對機器驗證指紋的保存選擇“yes”
在expect每個執行動作後都必須有一個\r選項。這個是代表鍵盤回車鍵
interact參數表示執行完成這些操作後退出這個已經登錄的遠程終端

[root@localhost src]# vim 1.expect 
#!/usr/bin/expect
set host "192.168.1.200"
set passwd "123456"
spawn ssh xiangchen@$host
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "$passwd\r" }
}
interact

expect腳本執行遠程命令

expect如果想要在被登錄端的服務器上執行一些操作,那麽事先必須使用expect自動登錄到該臺機器上,然後使用expect匹配輸入端信息和輸入的操作指令即可
exit\r ? 表示執行完成一些操作後立即退出該登錄終端
這裏演示使用的是本地主機登錄本地終端,在實現效果上是一致的
expect腳本內容

#!/usr/bin/expect
set host "192.168.1.234"
set passwd "pwd@123"
spawn ssh root@$host
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "$passwd\r" }
}
expect "]*"
send "touch /tmp/12345.txt\r"
expect "]*"
send "echo 2233 > /tmp/12345.txt\r"
expect "]*"
send "exit\r"

expect腳本執行過程

[root@localhost src]# chmod a+x 2.expect 
[root@localhost src]# ./2.expect 
spawn ssh [email protected]
The authenticity of host ‘192.168.1.234 (192.168.1.234)‘ can‘t be established.
ECDSA key fingerprint is 90:7e:dc:6c:5f:b5:f2:2f:ce:ff:90:25:50:90:f5:e4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.1.234‘ (ECDSA) to the list of known hosts.
[email protected]‘s password: 
Last login: Mon Sep 24 10:55:01 2018 from 192.168.1.113
[root@localhost ~]# touch /tmp/12345.txt
[root@localhost ~]# echo 2233 > /tmp/12345.txt
[root@localhost ~]# [root@localhost src]# cd /tmp
[root@localhost tmp]# ls
123 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?12345.txt ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
pear ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? zabbix_server_alerter.sock
php-fcgi.sock ? ? ? ? ? ? ? ? ? ? ? ?  zabbix_server.log
zabbix_server.log.old ? ? ? ? ? ? ? ?  zabbix_server_preprocessing.sock
[root@localhost tmp]# cat 12345.txt 
2233

expect腳本傳遞參數

為了實現腳本登錄到多個服務器執行較多的指令,使用expect一般將要執行的參數進行傳參引用,這樣就實現了調用expect+ip、用戶名及命令來批量執行某些操作
expect腳本中的expect eof和interact的屬性是在腳本執行完成後會在登錄終端中停留幾秒等待時間。和exit不同,不會在執行完成後立即退出當前的登錄終端

#!/usr/bin/expect

set user [lindex $argv 0]
set host [lindex $argv 1]
set passwd "pwd@123"
set cm [lindex $argv 2]

spawn ssh $user@$host
expect {
"yes/no" { send "yes\r" }
"password:" { send "$passwd\r" }

}

expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"
#expect eof

expect腳本中需要註意的是在expect標簽內的語句,條件語句和確認語句中間需要有空格的格式,如果這裏沒有存在空格,那麽在執行該expect腳本時該條件確認不會執行,不會自動輸入執行條件

expect腳本傳參執行過程
將腳本給予可讀權限,然後使用腳本+用戶+主機IP+執行命令的方式來操作,如果在參數中需要執行多個命令,需要使用雙引號將命令括起來,使用分號對多個命令進行分割

[root@localhost src]# ./3.expect root 192.168.1.234 "ls;df -h"
spawn ssh [email protected]
[email protected]‘s password: 
Last login: Mon Sep 24 11:00:58 2018 from 192.168.1.234
[root@localhost ~]# ls;df -h
anaconda-ks.cfg dead.letter
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 18G 8.8G 9.1G 50% /
devtmpfs 902M 0 902M 0% /dev
tmpfs 912M 0 912M 0% /dev/shm
tmpfs 912M 8.7M 904M 1% /run
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda1 197M 117M 81M 60% /boot
tmpfs 183M 0 183M 0% /run/user/0

linux無交互登錄服務器工具expect的使用