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

使用libssh执行多异步命令并获取各命令退出码的最优方案及思科路由器通道关闭问题求助

使用libssh执行多异步命令并获取各命令退出码的最优方案及思科路由器通道关闭问题求助

各位大佬好,我现在用C++结合libssh做个小项目,需求是执行多个命令,同时还要能准确拿到每个命令的退出码。目前我是用ssh_channel_request_exec配合ssh_channel_get_exit_status来实现的,但碰到个头疼的问题——在思科路由器上,每次执行完一个命令,通道就被路由器那边直接关掉了,根本没法继续执行后续的命令。

我也知道可以用ssh_channel_request_shell来启动一个交互式shell会话,然后把多个命令发过去,但这样的话,怎么才能精准获取每个命令的退出码呢?毕竟shell模式下不像exec那样每个命令对应明确的通道状态,有没有靠谱的解决办法呀?

给大家分享几个我自己琢磨或者见过的可行思路,供参考:

  • 每次命令重新创建独立通道
    既然思科路由器会在单个exec命令执行后关闭通道,那我们可以换个思路:每次要执行新命令前,重新调用ssh_channel_new创建一个全新的SSH通道,用这个新通道执行命令,拿到退出码后再关闭并释放通道。这样每个命令都用独立的通道,就不会被前一个命令的通道关闭影响了。虽说频繁创建销毁通道会有一点点性能损耗,但针对思科设备这种场景,基本是完全可以接受的。
  • shell模式配合命令行技巧捕获退出码
    如果想复用单个shell会话来执行多命令,那可以给每个要执行的命令追加一段捕获退出码的指令,比如把原命令改成your_command; echo "EXIT_CODE:$?"。这样命令执行完成后,会额外输出一行格式固定的内容,里面就包含了当前命令的退出码。你只需要在读取通道输出的时候,专门解析这行内容就能拿到对应的退出码了。不过这种方式需要处理输出的解析逻辑,得注意过滤掉命令本身的输出和shell提示符,避免解析出错。
  • 留意libssh版本的通道复用特性
    有些较新的libssh版本可能支持通道的复用或者重新激活?不过说实话,思科路由器的SSH服务在exec模式下单命令后关闭通道,大概率是设备自身SSH服务的限制,不是libssh的问题,所以这个方案的可行性不高,还是前两个方案更实际。

备注:内容来源于stack exchange,提问作者nadie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:30:29