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

