linux無交互登錄服務器工具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的使用