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
posted @ 2017-07-10 18:02  0xcafedaddy  阅读(2504)  评论(0编辑  收藏  举报