expect 嵌入shell的for循环中的方式对比
大家都知道expect是可以执行交互式命令的,例如:SSH等,当你有多台设备需要登录时,我们能不能使用类似java中的for循环来完成呢?下面我们来进行对比这两种方式:
1.
在我标注红色的部分,似乎不能正常的使用 类似这样:> cat forexpect.sh#!/bin/shtest(){expect -c "log_user 0;set timeout 10;spawn echo $1;interact;"}n=(192.168.0.1 192.168.0.0 192.168.1.1)length=${#n[*]}echo "$length"for((i=0;i<$length;i++))doecho "begin...."echo $itest ${n[$i]}echo "end...."done运行结果: sh forexpect.sh3
begin....
0
192.168.0.1
end....
begin....
1
192.168.0.0
end....
begin....
2
192.168.1.1
end....
spawn ssh -o "StrictHostKeyChecking no" Administrator@192.168.1.47
的命令行,让人很苦恼,只好退而求其次,将expect的.sh文件和正常的shell的.sh文件分开来写;
2.
在运行begin.sh的同时,在for循环中运行open.sh文件,既满足了我们交互式命令的需求,又能满足我们进行for循环的需要。> begin.sh
#!/bin/bash
n=(192.168.1.0 192.168.1.1 192.168.1.2)
uname="Administrator"
pwd="66666666"
length=${#n[*]}
echo "$length"
for ((i=0;i<$length;i++))
do
echo "begin..."
echo $i
./open.sh ${n[$i]} $uname $pwd
echo "end..."
done
> cat open.sh
#!/usr/bin/expect -f
set ip [lindex $argv 0]
set uname [lindex $argv 1]
set pwd [lindex $argv 2]spawn ssh -o "StrictHostKeyChecking no" $uname@$ip
expect "*password:"
send "$pwd\r"
#interact
expect eof
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南