Linux expect 用法


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


免責聲明!

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



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