expect是建立在tcl基礎上的一個工具,它用來讓一些需要交互的任務自動化地完成。 因為expect是基於tcl的,所以需要你的系統中安裝有tcl
檢查是否安裝tcl,expect
[root@master shell]# whereis tcl
tcl: /usr/lib64/tcl8.5 /usr/share/tcl8.5
如果沒有安裝,使用yum安裝:
yum install -y tcl
yum install -y expect
expect的4個命令
- Expect中最關鍵的四個命令是send,expect,spawn,interact。
命令 | 說明 |
---|---|
send | 用於向進程發送字符串 |
expect | 從進程接收字符串 |
spawn | 啟動新的進程 |
interact | 允許用戶交互 |
例1:遠程登錄並創建文件后退出
#!/usr/bin/expect ##注意路徑,使用 [whereis expect] 查看
set user "hadoop" ##設定參數,注意",'的區別
set pwd "yangkun"
set host "48.93.36.144"
set timeout -1 ##;號可有可無
spawn ssh -p 2020 $user@$host
expect { ##expect后有空格
"*yes/no" {send "yes\r";exp_continue}
"*password:" {send "$pwd\r"}
}
expect "]*" ## 通配符,使用 ]* 有效, 使用 *# 無效
send "touch /home/hadoop/aa.txt\r"
expect "]*"
send "echo hello world >> /home/hadoop/aa.txt\r"
expect "]*"
[interact] ##人為交互
send "exit\r" ##退出
例2:配置免密登錄並安裝JDK
#!/bin/bash
#!/usr/bin/expect
SERVERS="114.114.114.114" ##數組以空格分隔,可以為目標ip 或者hostName
PASSWORD="yangkun"
## 實現免密登錄配置的函數
auto_ssh_copy_id() {
expect -c "set timeout -1;
spawn ssh-copy-id \"-p 2020 $1\"; ## 這里要注意,使用'或\'不可行
expect {
*(yes/no)* {send -- yes\r;exp_continue;}
*password:* {send -- $2\r;exp_continue;}
eof {exit 0;}
}";
}
## 循環執行,配置主機到從節點所有免密
ssh_copy_id_to_all() {
for SERVER in $SERVERS ## 取值需要加$
do
auto_ssh_copy_id $SERVER $PASSWORD
done
}
## 調用循環配置函數
ssh_copy_id_to_all
## 批量部署
for SERVER in $SERVERS
do
scp install.sh root@$SERVER:/root
ssh root@$SERVER /root/install.sh
done
- 讀取文件中的host配置
讓腳本自動讀取slaves文件中的機器名來批量安裝
cat slaves | while read host
do
echo $host
expect -c "set timeout -f
spawn ssh-copy-id $host"
done
例3:批量配置JDK,install.sh
- 以root用戶執行
#!/bin/bash
BASE_SERVER=master
BASE_PATH=/home/hadoop/soft
TARGET_PATH=/usr/local
JAVA_PATH=$TARGET_PATH/java
## 1.判斷是否存在文件夾,不存在則創建soft文件夾
#if [ ! -d "$BASE_PATH" ]; then
# mkdir "$BASE_PATH"
#fi
## 2.從指定host拷貝jdk到目標機器上(已經拷貝文件夾)
scp -r $BASE_SERVER:$BASE_PATH $BASE_PATH
## 2.解壓jdk到指定目錄
if [ ! -d "$JAVA_PATH" ]; then
sudo -S mkdir -p "$JAVA_PATH"
fi
## 賦予權限
sudo -S chmod -R hadoop:hadoop $JAVA_PATH
tar -zxvf $BASE_PATH/jdk1.8.0_121.tar.gz -C $JAVA_PATH
## 3.配置環境變量
sudo -S cat>>/etc/profile<<EOF
export JAVA_HOME=$JAVA_PATH/jdk1.8.0_121
export PATH=\$PATH:\$JAVA_HOME/bin
EOF