#expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
#spawn启动指定进程---expect获取指定关键字---send向指定程序发送指定字符---执行完成退出.
#expect常用命令总结:
spawn 交互程序开始后面跟命令或者指定程序
expect 获取匹配信息匹配成功则执行expect后面的程序动作
send exp_send 用于发送指定的字符串信息
exp_continue 在expect中多次匹配就需要用到
send_user 用来打印输出 相当于shell中的echo
exit 退出expect脚本
eof expect执行结束 退出
set 定义变量
puts 输出变量
set timeout 设置超时时间
#安装expect工具
yum -y install expect
#存放远程登录IP,用户,端口,密码的一个文件,从这里调取
vim host.info
192.168.1.3 root 22 123.com
#!/bin/bash
#执行的shell命令,$*表示所有位置参数
COMMAND=$*
#存放远程登录IP,用户,端口,密码的一个文件,从这里调取
HOST_INFO=host.info
#^[^#]表示开头为#号并取反,也就是除了#号开头的,其余都遍历
#循环遍历host.info文件中的第一列值(除#号开头的)
for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); do
#解释:判断当前ip是不是host.info文件中第一列的值,如果是打印这个值对应的第二列的值
USER=$(awk -v ip=$IP 'ip==$1{print $2}' $HOST_INFO)
#解释:判断当前ip是不是host.info文件中第一列的值,如果是打印这个值对应的第三列的值
PORT=$(awk -v ip=$IP 'ip==$1{print $3}' $HOST_INFO)
#解释:判断当前ip是不是host.info文件中第一列的值,如果是打印这个值对应的第四列的值
PASS=$(awk -v ip=$IP 'ip==$1{print $4}' $HOST_INFO)
#表示执行expect自身的一个指令
expect -c "
#在expect的shell环境中执行ssh -p $PORT $USER@$IP这条命令
spawn ssh -p $PORT $USER@$IP
#捕获当前的一个信息,自动帮你输入
expect {
#初次远程登录会输入yes/no,发送yes指令,\表示转义,r表示回车
\"(yes/no)\" {send \"yes\r\"; exp_continue}
#紧接着就是输入密码,发送密码指令
\"password:\" {send \"$PASS\r\"; exp_continue}
#$USER@*表示匹配当前的用户名和@符号,发送你想要的执行的命令
\"$USER@*\" {send \"$COMMAND\r exit\r\"; exp_continue}
}
"
echo "-------------------"
done