expect腳本遠程登錄、遠程執行命令和腳本傳參簡單用法


expect介紹:

最近想寫一個自動化安裝腳本,涉及到遠程登錄、分發文件包、遠程執行命令等,其中少不了來回輸入登錄密碼,交互式輸入命令等,這樣就大大降低了效率,那么有什么方法能解決呢?不妨試試expect:

  • expect是一款自動化的腳本解釋型的工具。
  • expect基於tcl腳本,expect腳本的運行需要tcl的支持。
  • expect對一些需要交互輸入的命令很有幫助,比如ssh ftp scp telnet。
  • expect就可以根據設定的規則,自動幫我們輸入密碼,大大節省了時間。

遠程登錄linux服務器的時候,ssh命令需要手工輸入密碼,當登錄多台機器的時候就會非常繁瑣。

expect安裝

一般機器不會自帶expect和tcl需要手動安裝。

[root@bqh-nfs-123 ~]# yum install expect tcl -y
[root@bqh-nfs-123 ~]# rpm -qa  expect tcl
expect-5.44.1.15-5.el6_4.x86_64
tcl-8.5.7-6.el6.x86_64

expect基礎知識

expect腳本

腳本開頭

expect腳本一般以#!/usr/bin/expect -f開頭,類似bash腳本。

常用后綴

expect腳本常常以.exp或者.ex結束。

expect主要命令

  • spawn 新建一個進程,這個進程的交互由expect控制
  • expect 等待接受進程返回的字符串,直到超時時間,根據規則決定下一步操作
  • send 發送字符串給expect控制的進程
  • set 設定變量為某個值
  • exp_continue 重新執行expect命令分支
  • [lindex $argv 0] 獲取expect腳本的第1個參數
  • [lindex $argv 1] 獲取expect腳本的第2個參數
  • set timeout -1 設置超時方式為永遠等待
  • set timeout 30 設置超時時間為30秒
  • interact 將腳本的控制權交給用戶,用戶可繼續輸入命令
  • expect eof 等待spawn進程結束后退出信號eof

expect命令分支

expect命令采用了tcl的模式-動作語法,此語法有以下幾種模式:

單一分支語法

set password 123456
expect "*assword:" { send "$password\r" }

當輸出中匹配*assword:時,輸出password變量的數值和回車。

多分支模式語法

set password 123456
expect {
      "(yes/no)?" { send "yes\r"; exp_continue }
      "*assword:" { send "$password\r" }
}

當輸出中包含(yes/no)?時,輸出yes和回車,同時重新執行此多分支語句。

當輸出中匹配*assword:時,輸出password變量的數值和回車。

自動遠程登錄腳本:bqh-nfs-123機器免輸密登錄bqh-back-124機器上

[root@bqh-nfs-123 scripts]# vim test.exp 

#!/usr/bin/expect -f            #expect的路徑,which expect查詢獲取
set timeout 20                  #連接超時
set host "192.168.0.124"        
set password "123456"
spawn ssh root@$host            #登錄服務器用戶+地址
expect {                        #等待接受進程返回的字符串
  "yes/no" {send "yes\n";exp_continue}  #等待輸入yes
  "password:" {send "$password\n"}      #等待輸入密碼
}
interact  #將腳本的控制權交給用戶,用戶可繼續輸入命令

執行結果如下:

expect腳本遠程執行命令:

[root@bqh-nfs-123 scripts]# vim test.exp 

#!/usr/bin/expect -f
set timeout 20
set host "192.168.0.124"
set password "123456"
spawn ssh root@$host
expect {
  "yes/no" {send "yes\n";exp_continue}
  "password:" {send "$password\n"}
}
expect "]*"
send "/application/nginx/sbin/nginx\n"
expect "]*"
send "lsof -i:80\n"
expect "]*"
send "echo 1147076062 >1.log\n"
expect "]*"
send "cat 1.log\n"
expect "]*"
send "exit\n"

執行結果如下:

expet腳本傳參執行命令:

[root@bqh-nfs-123 scripts]# cat test1.exp
#!/usr/bin/expect

set user [lindex $argv 0]
set host [lindex $argv 1]
set passwd "123456"
set cmd [lindex $argv 2]
spawn ssh $user@$host

expect {
"yes/no" { send "yes\n"}
"password:" { send "$passwd\n" }
}

expect "]*"
send "$cmd\n"
expect "]*"
send "exit\n"

執行結果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM