通过SSH在screen中执行远程shell脚本并实时查看标准输出的问题
通过SSH在screen中执行远程shell脚本并实时查看标准输出的问题
我之前在macOS上用自带screen做类似操作时也踩过这些坑,给你梳理下问题和可行的解决方案:
先分析你当前命令的问题
你用的ssh -f user@machineB 'screen -dm sh /Users/user/Bin/script.sh; exec sh'有两个主要问题:
screen -dm是后台分离模式启动screen,会话一开始就和终端断开了,所以你看不到脚本的实时输出;而且exec sh完全多余,它会在SSH连接里启动一个新shell,但screen已经分离了,这个shell根本没用。- 你提到的
$TERM too long报错,是因为macOS默认的TERM环境变量(比如xterm-256color)长度超过了原生screen的限制,它对TERM字符串长度有严格要求。
解决方案1:直接启动screen会话并实时查看输出
如果你想立刻看到脚本的执行输出,不用后台启动,用这个命令:
ssh -t user@machineB 'screen -S my_script_session sh /Users/user/Bin/script.sh'
-t:强制给SSH分配伪终端,这是screen正常运行的必要条件-S my_script_session:给screen会话起个自定义名字,后续恢复时更容易找到
执行后你会直接进入screen会话,实时看到脚本的stdout。如果想暂时退出但保持脚本运行,按Ctrl+A再按d即可分离会话;之后要恢复的话,执行:
ssh -t user@machineB 'screen -r my_script_session'
解决方案2:后台启动screen,后续再查看输出(同时解决TERM报错)
如果需要先把脚本放后台运行,之后再查看输出,要先处理TERM的问题,命令如下:
# 后台启动screen并执行脚本 ssh -f user@machineB 'TERM=xterm screen -dmS my_script_session sh /Users/user/Bin/script.sh'
这里TERM=xterm把终端类型改成短字符串,避开screen的长度限制。之后恢复会话时也要指定TERM:
ssh -t user@machineB 'TERM=xterm screen -r my_script_session'
额外注意事项
- 确保你的脚本有执行权限:如果还没加,在机器B上执行
chmod +x /Users/user/Bin/script.sh - 如果脚本需要交互输入,你恢复screen会话后正常输入即可,screen会传递交互内容到脚本
备注:内容来源于stack exchange,提问作者DeathToMediocrity
相关产品推荐
相关产品推荐

