随笔 - 65  文章 - 0 评论 - 0 阅读 - 28752
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

应用场景:一个终端shell脚本实现多台主机自动部署。无需人为干预。

expect是一个自动交互功能的工具。可以在主机切换时【即需要交互操作时】,利用expect,则可以根据程序的提示,模拟标准输入提供给程序,从而实现自动化交互执行。

实例:

PASSWD=xxx

for host in $@
do
CMD="ssh $host"
expect -c "
set timeout 20;      #超时时间。默认10s。防止那些执行死机的命令的。一旦到了这个timeout,还是没有屏幕输出的话,expect脚本中下面的代码就会执行。
spawn $CMD
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}        #匹配到*yes/no*,输入yes
\"*password*\" {send \"${PASSWD}\r\";}         #匹配到*password*,输入${PASSWD}
}
expect \"]#\"
send \"echo hello\r\";
send \"exit\r\";
expect eof"
done

执行结果如图:

 附常用命令:

send    用于向进程发送字符串
expect    从进程接收字符串
spawn    启动新的进程
interact    允许用户交互【较少使用】

一般情况下使用spawn、send和expect命令就可以很好的完成我们的任务;但在一些特殊场合下还是需要使用interact命令的,interact命令主要用于退出自动化,进入人工交互。比如我们使用spawn、send和expect命令完成了ssh登陆主机,执行命令,但是我们希望在命令执行以后,仍然可以停留在ssh连接状态,以便手动的执行后续命令,此时使用interact命令就可以很好的完成这个任务。

实例:

PASSWD=xxx
for host in $@
do
CMD="ssh $host"
expect -c "
set timeout 20; #超时时间
spawn $CMD
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*password*\" {send \"${PASSWD}\r\";}
}
expect \"]#\"
send \"echo hello\r\";
expect eof"
interact
done

执行结果如图:

 

posted on   大明花花  阅读(159)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示