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

如何通过SSH在服务器启动tmux会话并执行指定程序

解决方法与SSH -t 参数解释

一、ssh -t 的作用机制

SSH 默认不会为远程执行的命令分配伪终端(PTY),当你运行依赖终端环境的程序(比如 tmux、vim 这类交互式工具)时,就会出现 "open terminal failed: not a terminal" 的错误。
-t 参数的核心作用是强制 SSH 为远程会话分配一个伪终端,让这类依赖终端的程序能正常启动并运行。这就是你第二个方案能成功打开 tmux 会话的原因。

二、你的两种方案为何失败

  1. 方案一问题:

    • 没有添加 -t 参数,导致 tmux 无法获取终端环境,直接启动失败;
    • 即便加上 -t,当前写法也有逻辑错误:tmux new-session -t session1 只是创建/连接会话,但后续的 ./program $argument 是在 SSH 的主 shell 进程中执行,而非 tmux 会话内部,所以程序根本没在 tmux 里运行。
  2. 方案二问题:

    • 只创建了 tmux 会话,但没有在会话内执行目标程序,也没处理程序结束后的会话终止逻辑,不符合你的需求。

三、正确的实现脚本

要实现「在 tmux 会话内运行带参数的程序,程序结束后自动终止会话」,可以直接让 tmux 在创建会话时就执行目标程序——tmux 默认会在会话的初始命令执行完毕后自动终止会话。脚本如下:

#!/bin/bash
argument='12345678'
ssh user@host -t "tmux new-session -s session1 './program $argument'"

补充说明(针对特殊场景):

如果你的程序可能后台化运行,需要确保程序完全结束后再关闭会话,可以用 tmux wait-for 等待会话结束信号,再手动杀死:

#!/bin/bash
argument='12345678'
ssh user@host -t << EOF
# 后台启动会话并执行程序
tmux new-session -d -s session1 "./program $argument"
# 等待会话结束的信号
tmux wait-for session1
# 彻底杀死会话(可选,程序结束后会话已处于终止状态)
tmux kill-session -t session1
EOF
  • tmux new-session 关键参数解释:
    • -s session1:指定会话名称为 session1;
    • -d:后台启动会话(不立即附着到会话);
    • 最后的单引号内容是会话启动后要执行的命令,命令结束后会话自动终止。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:20:21