SSH远程执行screen报Must be connected to a terminal错误
错误原因
两个问题直接导致执行失败:
- 脚本末尾的
screen -r是报错的直接触发点:SSH默认在执行远程命令时不会为会话分配伪终端(PTY),而screen -r的作用是附着到已存在的screen交互会话,必须依赖终端环境才能运行,因此直接抛出Must be connected to a terminal.错误。而且你是批量无人值守部署,本来就不需要在脚本执行时附着screen会话,这行命令完全是多余的。 - 原有
screen -dmS的启动命令存在引号转义错误:多层嵌套的单双引号、多余转义符会在SSH命令传递过程中被提前解析,就算删掉screen -r,后续的环境变量设置、Python启动命令也会出现截断、变量解析失败的问题,无法正常在screen中运行。
修复方案
直接替换为以下修正后的脚本即可:
for ((i = 0; i < ${#COMPUTERS[@]}; i++)); do echo "" echo ">> Start simulations on computer ${COMPUTERS[i]}..." ssh -o "StrictHostKeyChecking=accept-new" ${COMPUTERS[i]} " cd ${WORKING_DIRECTORY}/compressor && git pull; # 屏蔽无对应screen会话时的错误输出 screen -S ${SCREEN_NAME} -X quit > /dev/null 2>&1; echo 'Start screen ${SCREEN_NAME} on ${COMPUTERS[i]}'; # 用bash -c包裹screen内要执行的命令,修正转义问题 screen -dmS ${SCREEN_NAME} bash -c ' export LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}:${WORKING_DIRECTORY}/venv/lib/\"; ${WORKING_DIRECTORY}/venv/bin/python ${WORKING_DIRECTORY}/deployment/simulations/simulate.py ${i} > ~/output_${COMPUTERS[i]}.txt; # 脚本执行完保留screen会话,方便后续登录排查,不需要可删除 exec bash '; " echo "Done for ${COMPUTERS[i]}" done
补充说明
- 修正后脚本会在远程服务器后台启动screen会话运行Python任务,启动完成后直接断开SSH连接,符合批量部署的需求。后续如果需要检查任务运行状态,手动SSH登录对应服务器后执行
screen -r ${SCREEN_NAME}即可附着会话查看。 - 如果你的场景确实需要在SSH执行阶段临时分配交互终端,可以给ssh命令加上
-t参数强制分配PTY,但当前无人值守批量启动任务的场景不需要该参数,后台启动后直接断开的稳定性更高。 - 如果你不需要在Python任务执行结束后保留screen会话,可以删掉screen命令块末尾的
exec bash行,任务跑完后screen会话会自动退出。
内容的提问来源于stack exchange,提问作者graille
相关产品推荐
相关产品推荐

