expect安裝及使用


一、介紹

expect是一款自動化的腳本解釋型的工具。

expect基於tcl腳本,expect腳本的運行需要tcl的支持。

expect對一些需要交互輸入的命令很有幫助,比如ssh ftp scp telnet。

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

expect就可以根據設定的規則,自動幫我們輸入密碼,大大節省了時間。

二、安裝expect
一般機器不會自帶expect,需要手動安裝。yum源安裝expect,使用yum源可以自動解決依賴,也可以rpm包安裝

# yum install expect -y
# expect 
expect1.1> 

三、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變量的數值和回車。

 

四、expect應用實例

1.傳參式ssh登錄指定主機

#!/usr/bin/expect -f 
set ip [ lindex $argv 0 ]               //接收第一個參數,並設置IP 
set pass [ lindex $argv 1 ]            //接收第二個參數,並設置密碼 
set timeout 10                           //設置超時時間 
spawn ssh root@$ip                      //發送ssh請求
expect {                                  //返回信息匹配 
 "*yes/no" { send "yes\r"; exp_continue}    //第一次ssh連接會提示yes/no,自動發送yes
 "*password:" { send "$pass\r" }            //出現密碼提示,發送密碼 
} 
interact                                    //交互模式,用戶會停留在遠程服務器上面

2.利用expect批量ssh互信
編寫hosts文本用於存放主機信息

#!/bin/bash

# 判斷id_rsa密鑰文件是否存在
if [ ! -f ~/.ssh/id_rsa ];then
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
else
 echo "id_rsa has created ..."
fi

#分發到各個節點,這里分發到host文件中的主機中.
while read line
  do
    user=`echo $line | cut -d " " -f 2`
    ip=`echo $line | cut -d " " -f 1`
    passwd=`echo $line | cut -d " " -f 3`
    
    expect <<EOF
      set timeout 10
      spawn ssh-copy-id $user@$ip
      expect {
        "yes/no" { send "yes\n";exp_continue }
        "password" { send "$passwd\n" }
      }
     expect "password" { send "$passwd\n" }
EOF
  done <  hosts

 


免責聲明!

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



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