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

SSH远程转发:后台运行并将输出保存为变量

解决SSH后台运行并捕获sish输出的问题

核心问题分析

SSH的-f参数会将进程后台运行,但默认会把标准输出、标准错误重定向到/dev/null,导致无法捕获输出。另外sish的提示信息默认输出到标准错误流(而非标准输出),这也是之前捕获失败的关键原因。

可行解决方案

方法1:直接捕获输出到变量并后台运行

通过-n参数阻止SSH读取本地stdin,同时合并标准错误与标准输出,将结果存入变量,最后后台执行:

# 捕获sish输出到变量,同时后台运行SSH命令
sish_output=$(ssh -i ./tun -o StrictHostKeyChecking=no -n -R 5900:localhost:5900 tun.domain.tld sleep 10 2>&1 &)

# 从输出中提取分配的公网端口
forwarded_port=$(echo "$sish_output" | grep -oP 'TCP: tun.domain.tld:\K\d+')

# 发送端口信息到webhook(根据实际webhook格式调整)
curl -X POST -d "{\"forwarded_port\": \"$forwarded_port\"}" https://your-webhook-endpoint.com

方法2:用临时文件中转输出(适配延迟场景)

如果存在网络延迟导致变量捕获不完整,可先用临时文件存储输出,再读取处理:

# 创建临时文件
temp_file=$(mktemp)

# 后台运行SSH,将所有输出写入临时文件
ssh -i ./tun -o StrictHostKeyChecking=no -n -R 5900:localhost:5900 tun.domain.tld sleep 10 > "$temp_file" 2>&1 &

# 短暂等待确保sish输出完成(根据网络情况调整时长)
sleep 2

# 读取临时文件内容并提取端口
forwarded_port=$(grep -oP 'TCP: tun.domain.tld:\K\d+' "$temp_file")

# 发送到webhook
curl -X POST -d "{\"forwarded_port\": \"$forwarded_port\"}" https://your-webhook-endpoint.com

# 清理临时文件
rm "$temp_file"

关键注意事项

  • 必须添加-n参数:阻止SSH尝试读取本地标准输入,避免后台进程挂起。
  • 重定向2>&1:将sish输出的标准错误流合并到标准输出,确保能被捕获。
  • 按需添加sleep:若网络较慢,等待几秒可保证sish的响应完全写入文件或变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:10:38