expect 賦值shell變數_珍藝館 | expect命令的用法
阿新 • • 發佈:2020-12-26
技術標籤:expect 賦值shell變數
簡介
expect是一個用於實現自動互動功能的軟體,通過指令碼的方式實現諸如ssh、ftp等互動流程的自動執行。
原理
首先由expect派生(fork)互動程式執行,expect程序會捕獲互動程序的標準輸出(stdout),將輸出的字串與指令碼中預設的字串進行比較,匹配上則將互動命令的字串傳送給互動程序的標準輸入(stdin),從而避免使用者的手工輸入。
expect本質上就是一個shell,內建了一系列命令,其指令碼採用tcl語言編寫。
引數
- spawn-派生互動程式
- expect-匹配互動程式特定的標準輸出字串
- send-expect匹配成功後,將特定字串傳送給互動程式
- argc-引數個數
- argv-引數陣列,下標從0開始
- send_user-向用戶終端傳送提示資訊
- 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