You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本登录本地交换机CLI后无法执行命令求助

解决Bash脚本登录交换机CLI无操作的问题

首先得指出你脚本里的核心问题:你用了exec cli,这个命令会直接替换当前的Shell进程为cli程序,所以后面的exec $a1和exec exit根本没机会执行——因为原来的脚本进程已经被cli接管了,脚本剩下的代码直接就被跳过了。而且就算不用exec,直接运行cli,它是交互式程序,默认不会读取脚本后续的命令,所以你的命令根本传不到cli里面去。

下面给你几个可行的解决思路:

1. 用Here-Doc传递命令(最简单的无交互场景)

如果登录cli不需要输入密码(或者已经配置免密登录),可以用Bash的Here-Doc语法,把要执行的命令序列直接传递给cli的标准输入,相当于模拟手动输入命令的过程:

a1="show config"
cli << EOF
$a1
exit
EOF

这里的<< EOF和EOF之间的内容,会被作为cli的输入,cli会依次执行show config和exit命令,完成后回到脚本。

2. 检查cli是否支持非交互式执行参数

很多设备的cli工具都支持直接通过命令行参数指定要执行的命令,不需要进入交互式终端。你可以先试试查看cli的帮助信息:

cli --help

如果支持的话,通常会有类似-c或者--command的参数,比如:

cli -c "show config"

这种方式最简洁,直接执行命令并返回结果,不需要处理交互式输入。

3. 用Expect工具处理交互式场景

如果登录cli需要输入密码、确认提示符等交互步骤,Here-Doc就不够用了,这时候可以用expect工具(需要先安装,比如apt install expect或者yum install expect),它专门用来自动化交互式程序。

举个简单的expect脚本例子(假设cli的登录提示符是Username:,密码提示符是Password:,命令提示符是>):

#!/usr/bin/expect
# 启动cli程序
spawn cli
# 等待用户名提示符,发送用户名
expect "Username:"
send "your_username\r"
# 等待密码提示符,发送密码
expect "Password:"
send "your_password\r"
# 等待命令提示符,发送show config命令
expect ">"
send "show config\r"
# 等待命令执行完成后的提示符,发送exit命令
expect ">"
send "exit\r"
# 可选:如果需要看执行结果,可以加interact,否则脚本直接结束
interact

把上面的内容保存为switch_cli.exp,然后赋予执行权限chmod +x switch_cli.exp,运行即可。

4. 不要用exec启动cli

最后再强调下,exec命令的作用是替换当前进程,在脚本里用exec cli会直接让脚本进程变成cli,后续的代码完全不会执行,所以如果要在脚本里继续处理逻辑,直接用cli启动即可,不要加exec。

内容的提问来源于stack exchange,提问作者K Enz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:15:24