1. 程式人生 > 其它 >expect 賦值shell變數_珍藝館 | expect命令的用法

expect 賦值shell變數_珍藝館 | expect命令的用法

技術標籤:expect 賦值shell變數

簡介

expect是一個用於實現自動互動功能的軟體,通過指令碼的方式實現諸如ssh、ftp等互動流程的自動執行。

原理

首先由expect派生(fork)互動程式執行,expect程序會捕獲互動程序的標準輸出(stdout),將輸出的字串與指令碼中預設的字串進行比較,匹配上則將互動命令的字串傳送給互動程序的標準輸入(stdin),從而避免使用者的手工輸入。

expect本質上就是一個shell,內建了一系列命令,其指令碼採用tcl語言編寫。

引數

  1. spawn-派生互動程式
  2. expect-匹配互動程式特定的標準輸出字串
  3. send-expect匹配成功後,將特定字串傳送給互動程式
  4. argc-引數個數
  5. argv-引數陣列,下標從0開始
  6. send_user-向用戶終端傳送提示資訊
  7. interact-執行完成後保持互動狀態,否則退出

例項

ssh方式登入遠端主機

#!/usr/bin/expect -f  
set ip [lindex $argv 0]
set username [lindex $argv 1]
set mypassword [lindex $argv 2]
set timeout 10
send_user "It's OKr"
spawn ssh [email protected]$ip
expect {                      
"*yes/no" { send "yesr"; exp_continue}
"*password:" { send "$mypasswordr" } 
} 

interact

在伺服器叢集中配置ssh互信

#!/bin/bash
if [ $# -ne 3 ]; then
  echo "usage: ssh_intertrust.sh <ip file> <username> <password>"
  echo "用於配置叢集互信,需先安裝expect軟體"
  echo "arguments:"
  echo "    ip file: 存放叢集ip的檔案,每一行為一條記錄,格式為ip hostname"
  echo "    username: 登入使用者名稱"
  echo "    password: 登入密碼"
  exit
fi

ip_file=$1
user=$2
passwd=$3
if [ ! -f ${ip_file} ];
then
  echo "ip列表檔案不存在"
  exit
fi

#生成認證金鑰檔案authorized_keys
cat ${ip_file}|while read line
do
  ip=`echo $line|awk '{print $1}'`
  hostname=`echo $line|awk '{print $2}'`
  #判斷對應IP的目錄是否存在,不存在,則自動建立
  if [ ! -d /tmp/ssh/$ip ];
  then
    mkdir -p /tmp/ssh/$ip
  fi
  #在對應的IP的伺服器本機生成公鑰檔案id_rsa.pub
  expect <<EOF
    spawn ssh 
[email protected]
$ip ssh-keygen -t rsa expect { "password:" {send "$passwdn";exp_continue} "yes/no" {send "yesn";exp_continue} "Enter file in which to save the key*" {send "n";exp_continue} "Enter passphrase*" {send "n";exp_continue} "Enter same passphrase again:" {send "n";exp_continue} "Overwrite (y/n)" {send "n";exp_continue} } EOF #將各伺服器的id_rsa.pub檔案拷貝到本地/tmp/ssh的對應IP地址目下 expect <<EOF spawn scp [email protected]$ip:~/.ssh/id_rsa.pub /tmp/ssh/$ip expect { "yes/no" {send "yesn";exp_continue} "password:" {send "$passwdn";exp_continue} } EOF #生成金鑰認證檔案authorized_keys cat /tmp/ssh/$ip/id_rsa.pub >> /tmp/ssh/authorized_keys done #將本管理節點加入金鑰認證檔案authorized_keys cat ~/.ssh/id_rsa.pub >> /tmp/ssh/authorized_keys #將authorized_keys檔案scp到各個機器~/.ssh/下 cat ip.cfg|while read line do ip=`echo $line|awk '{print $1}'` hostname=`echo $line|awk '{print $2}'` expect <<EOF spawn scp /tmp/ssh/authorized_keys [email protected]$ip:~/.ssh/ expect { "yes/no" {send "yesn";exp_continue} "password:" {send "$passwdn";exp_continue} } EOF done #刪除臨時目錄 rm -fr /tmp/ssh