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

SSH会话中Shell脚本无返回值问题排查

问题原因分析及解决方法

咱们一步步拆解你的问题:你单独执行远程命令没问题,但脚本里返回空,大概率是远程命令执行环境的差异或者输出捕获的细节问题,以下是具体排查和解决思路:

可能的核心原因

  1. 远程Shell环境差异:当你通过ssh user@host 'command'执行单条命令时,路由器的Shell是非交互式非登录Shell,它加载的配置文件(比如~/.profile、/etc/profile)和手动SSH登录的交互式Shell不一样。如果getrealip.sh依赖某些只有交互式Shell才会加载的环境变量(比如PATH、自定义函数),就可能导致它在非交互式环境下无法正常输出IP。
  2. 输出流向问题:有些脚本会把关键输出写到stderr而非stdout,你的远程命令只捕获了stdout,所以看起来返回空。
  3. 变量赋值的语法细节:华硕路由器的Shell一般是BusyBox ash,虽然支持标准变量赋值,但特殊字符(比如换行、空格)可能干扰变量捕获,或者echo的行为和预期不同。

针对性解决方法

方法1:简化远程命令,直接捕获脚本输出

跳过远程端的变量赋值环节,直接返回getrealip.sh的输出,减少中间步骤的干扰:

#!/bin/sh
myip=$(ssh admin@192.168.1.1 '/usr/sbin/getrealip.sh')
echo "$myip"
exit

如果这样能拿到预期IP,说明之前远程端的变量赋值环节出了语法适配问题。

方法2:强制捕获所有输出(包括错误信息)

把远程命令的stderr重定向到stdout,确保不会漏掉错误信息或异常输出:

#!/bin/sh
myip=$(ssh admin@192.168.1.1 '/usr/sbin/getrealip.sh 2>&1')
echo "$myip"
exit

如果返回的是错误内容,就能直接看到getrealip.sh在远程执行时的具体问题。

方法3:添加调试日志,定位远程执行过程

在远程命令里加入调试语句,明确是脚本没输出还是后续环节出问题:

#!/bin/sh
myip=$(ssh admin@192.168.1.1 'echo "Debug: 开始执行getrealip"; result=$(/usr/sbin/getrealip.sh); echo "Debug: 捕获结果为[$result]"; echo "$result"')
echo "$myip"
exit

运行后你会看到远程执行的完整日志,能快速定位问题节点。

方法4:强制远程Shell加载登录环境

如果getrealip.sh依赖交互式Shell的配置,可以让远程Shell以登录模式启动:

#!/bin/sh
myip=$(ssh admin@192.168.1.1 'sh -l -c "/usr/sbin/getrealip.sh"')
echo "$myip"
exit

sh -l会让Shell加载/etc/profile和用户~/.profile等配置文件,补全必要的环境变量。


额外排查:TextBar的运行环境

因为脚本是给TextBar用的,还要考虑它和终端的环境差异:

  • 检查TextBar是否能访问你的SSH密钥:如果你在终端用密钥免密登录,TextBar可能没加载ssh-agent,导致SSH需要密码但无法输入,最终超时返回空。可以在脚本里加入SSH调试参数-v查看连接日志:
    myip=$(ssh -v admin@192.168.1.1 '/usr/sbin/getrealip.sh')
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:22:28