前文

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,希望这篇文章可以给你带来一些想法,谢谢。