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

SSH远程执行screen报Must be connected to a terminal错误

错误原因

两个问题直接导致执行失败:

  1. 脚本末尾的screen -r是报错的直接触发点:SSH默认在执行远程命令时不会为会话分配伪终端(PTY),而screen -r的作用是附着到已存在的screen交互会话,必须依赖终端环境才能运行,因此直接抛出Must be connected to a terminal.错误。而且你是批量无人值守部署,本来就不需要在脚本执行时附着screen会话,这行命令完全是多余的。
  2. 原有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 12:25:00