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
相关产品推荐
相关产品推荐

