前文
1.目标主机登录用户都为root,且密码一致
2.目标主机开放启动了SSH服务且22号端口可访问(防火墙未进行拦截)
软件介绍
expect
Expect是一个用来实现自动和交互式任务进行通信的免费编程工具语言。由Don Libes在1990年开始编写。
结合Shell Script实现自动和交互式任务进行通信,而无需人的干预。
实现代码
#!/bin/bash
#Author:cosann
#date:2022/7/21
#description:该脚本可以实现批量登录远程主机执行命令
#检测安装expect
rpm -qa | grep expect
if [ $? -eq 0 ];then
echo "Expect软件已安装"
else
echo "Expect软件未安装"
yum install -y expect &> /dev/null
fi
#初始化远端主机账户及密码
user=root
passwd=123456
#设定超时
set timeout 30
#定义并初始化远端主机IP列表
array_adress=(
192.168.222.133
192.168.222.134
192.168.222.240
192.168.222.250
192.168.222.132
) #最后IP写上运行脚本的主机,即关闭自身
#定义登录远程主机函数
function remote_shutdown () {
<span >#加载expect文件路径</span>
/usr/bin/expect<span ><<-</span><span >EOF
spawn ssh -o "StrictHostKeyChecking no" \(user</span>@<span >\)address
expect {
"Connection refused" exit
"No route to host" exit
"password" {send "$passwd\r"}
}
expect "]#"
send "#登录远程主机成功,开始推送关机指令!\r"
expect "]#"
send "shutdown -h now \r"
expect "]#"
send "exit\r"
expect eof
EOF
}
#循环控制执行远端主机命令
for address in </span><span >echo</span> $<span >{<!-- --></span>array_adress<span >[</span>@<span >]</span><span >}</span><span >
do
#调用函数执行远程登录关机
shutdown
done
<span >#加载expect文件路径</span>
/usr/bin/expect<span ><<-</span><span >EOF
</span><span >echo</span> $<span >{<!-- --></span>array_adress<span >[</span>@<span >]</span><span >}</span><span >
使用tips:expect代码块处的shutdown关机命令换成其他命令就可以批量在远端主机执行其他命令啦
#例如
expect "*]#" #匹配*]#关键字后执行下面的命令
send "date\r" #显示日期
避坑心得
1. expect缩进
expect的编码方式有多种写法,如果使用本文的写法,注意不能写成以下格式,亲测报错
expect { "*password" {send "$passwd\r"}
}
正确写法
expect {
"*password" {send "$passwd\r"}
}
2.关于expect最后的关键字EOF
spawn ssh root@127.0.0.1
expect {
"*password" {send "123456\r"}
}
expect "*]#"
send "exit\r"
expect eof
EOF #前后不能有空格,否则会报错
以上是关于expect使用的案例分享,现在已有很方便且简易的工具可以实现以上类似且更强大的功能,但是如果你和我一样也在了解expect,希望这篇文章可以给你带来一些想法,谢谢。