双轨终端监视系统部署手册tmux + ttyd 实时 SSH 操作可视化方案
双轨终端监视系统部署手册
tmux + ttyd 实时 SSH 操作可视化方案
适用场景:AI 远程操控服务器时,用户通过浏览器实时观察所有终端操作,零延迟、零信任成本。
适用系统:OpenCloudOS 9 / CentOS 9 Stream / RHEL 9 系列(x86_64)
文档版本:v2.1(修正版)
最后更新:2026-05-29
目录
1. 方案概述
1.1 什么是双轨监视
双轨 = 轨道 A(AI 执行)+ 轨道 B(用户观察)
| 轨道 | 角色 | 入口 | 可见性 |
|---|---|---|---|
| 轨道 A | AI / 自动化脚本 | SSH (paramiko / OpenSSH) | 执行命令、上传文件、部署服务 |
| 轨道 B | 用户 / 审计员 | 浏览器 (http://<IP>:7681) |
实时观看 tmux 会话中的所有输出 |
两者完全同步:AI 每输入一条命令,浏览器端即时滚动显示命令及其回显,无需事后查日志。
1.2 为什么需要双轨
| 痛点 | 传统 SSH 方案 | 双轨监视方案 |
|---|---|---|
| 操作不可见 | 只能看最终状态,中间过程黑盒 | 实时看到每一条命令与回显 |
| 误操作难发现 | 等出问题了才回头排查 | 用户可立即叫停或反馈 |
| 信任成本高 | “AI 到底在服务器上干了什么?” | 浏览器即监控台,完全透明 |
| 日志延迟 | 需要事后登录查日志 | 命令输出实时滚动,零延迟 |
1.3 核心组件
| 组件 | 版本 | 职责 | 监听端口 |
|---|---|---|---|
| tmux | 3.4 | 终端复用器,保持会话不中断,作为命令实际执行环境 | 无(本地 UNIX socket) |
| ttyd | 1.7.7 | 将 tmux 会话转为 Web 页面,通过 WebSocket 推送终端内容 | 7681/TCP |
| libwebsockets | 4.3.2 | ttyd 的 WebSocket 底层依赖库 | 无 |
| tmux 会话 | ai-work |
AI 命令实际执行的终端会话,所有输出被 ttyd 镜像 | 无 |
2. 架构设计
2.1 数据流图
┌─────────────┐ SSH (轨道 A) ┌─────────────┐
│ AI 本地 │ ───────────────────────► │ 服务器 │
│ (paramiko) │ 执行命令 / 上传文件 │ (OpenCloudOS)│
└─────────────┘ └──────┬──────┘
│
│ tmux send-keys
▼
┌─────────────┐
│ tmux ai-work│
│ 会话 │
│ (命令执行) │
└──────┬──────┘
│
│ 终端输出
│ (stdout/stderr)
▼
┌─────────────┐
│ ttyd │
│ (WebSocket)│
│ :7681 │
└──────┬──────┘
│
│ HTTP/WebSocket
▼
┌─────────────┐
│ 浏览器 │
│ 用户观察端 │
│ (轨道 B) │
└─────────────┘
2.2 时序关系
时间轴 ──────────────────────────────────────────────►
AI (SSH) [send-keys 'cmd'] [send-keys 'cmd2']
│ │
▼ ▼
tmux ai-work 执行 cmd ──► 输出回显 执行 cmd2 ──► 输出回显
│ │ │ │
└────────────┘ └────────────┘
│ │
▼ ▼
ttyd :7681 转发输出 转发输出
│ │
▼ ▼
浏览器用户 实时看到 cmd 实时看到 cmd2
执行过程及结果 执行过程及结果
关键约束:ttyd 仅做被动镜像,不干预命令执行;tmux 会话是唯一的共享状态点。
3. 前置条件与依赖矩阵
3.1 系统要求
| 项目 | 要求 | 验证命令 |
|---|---|---|
| 操作系统 | OpenCloudOS 9 / CentOS 9 Stream / RHEL 9 (x86_64) | cat /etc/os-release |
| 内核版本 | >= 5.14 | uname -r |
| 内存 | >= 512 MB(编译阶段需要) | free -h |
| 磁盘 | >= 2 GB 可用空间 | df -h /tmp |
| 网络 | 可访问 GitHub(或自备镜像) | curl -I https://github.com |
| 权限 | root 或 sudo | whoami |
3.2 依赖包清单
| 包名 | 用途 | 安装来源 |
|---|---|---|
tmux |
终端复用 | yum |
json-c-devel |
JSON 解析(ttyd 依赖) | yum |
libuv-devel |
事件循环(libwebsockets 需要) | yum |
zlib-devel |
压缩支持 | yum |
openssl-devel |
TLS/SSL 支持 | yum |
cmake |
构建系统 | yum |
gcc |
C 编译器 | yum |
make |
构建工具 | yum |
git |
源码获取 | yum |
wget |
文件下载 | yum |
⚠️ 注意:
libwebsockets-devel可安装,但不要依赖它编译 ttyd(详见 坑1)。
4. 完整安装流程
4.1 安装系统依赖
yum install -y tmux json-c-devel libuv-devel zlib-devel openssl-devel cmake gcc make git vim wget unzip
验证关键工具:
cmake --version # >= 3.20
gcc --version # >= 11.0
tmux -V # 3.x
4.2 编译安装 libwebsockets(从源码)
必须源码编译,系统包缺少 CMake 配置文件。
cd /tmp
wget --timeout=120 --tries=3 \
https://github.com/warmcat/libwebsockets/archive/refs/tags/v4.3.2.tar.gz \
-O libwebsockets-4.3.2.tar.gz
tar xzf libwebsockets-4.3.2.tar.gz
cd libwebsockets-4.3.2
mkdir -p build && cd build
cmake -DLWS_WITHOUT_TESTAPPS=ON \
-DLWS_WITHOUT_EXTENSIONS=OFF \
-DLWS_WITH_SSL=ON \
-DLWS_WITH_LIBUV=ON \
..
make -j$(nproc)
make install
ldconfig
关键参数说明:
| 参数 | 作用 | 缺失后果 |
|---|---|---|
-DLWS_WITH_LIBUV=ON |
启用 libuv 事件循环支持 | ttyd 编译报错:“libwebsockets was not build with libuv support” |
-DLWS_WITH_SSL=ON |
启用 TLS(ttyd 后续可配 HTTPS) | 仅影响后续 HTTPS 选项,不影响基础功能 |
-DLWS_WITHOUT_TESTAPPS=ON |
不编译测试程序 | 减少编译时间 |
验证安装:
ls /usr/local/lib/cmake/libwebsockets/
# 应存在 LibwebsocketsConfig.cmake
4.3 编译安装 ttyd
cd /tmp
wget --timeout=60 --tries=3 \
https://github.com/tsl0922/ttyd/archive/refs/heads/master.tar.gz \
-O ttyd-master.tar.gz
tar xzf ttyd-master.tar.gz
cd ttyd-main
mkdir -p build && cd build
cmake -DCMAKE_PREFIX_PATH=/usr/local ..
make -j$(nproc)
cp ttyd /usr/local/bin/
chmod +x /usr/local/bin/ttyd
关键参数说明:
| 参数 | 作用 | 缺失后果 |
|---|---|---|
-DCMAKE_PREFIX_PATH=/usr/local |
告诉 CMake 去 /usr/local 找 libwebsockets |
报错:“Could not find a package configuration file provided by Libwebsockets” |
验证安装:
ttyd --version
# 输出:ttyd version 1.7.7-unknown(从源码编译无 git tag 时显示 unknown,属正常)
4.4 创建 tmux 会话
# 创建名为 ai-work 的 tmux 会话(后台运行,不附加终端)
tmux new-session -d -s ai-work
# 验证会话存在
tmux list-sessions
# 输出:ai-work: 1 windows (created ...)
4.5 启动 ttyd 服务
首次验证(手动前台启动,确认无报错后按 Ctrl+C 停止):
ttyd -p 7681 tmux attach -t ai-work
ttyd 默认行为即为只读:浏览器端只能观察,无法输入。这是双轨监视的安全基线。
如需允许浏览器端交互(不推荐用于生产监视场景),可添加
-W(writable)参数。
确认前台运行正常后,停止并按 4.6 节配置 systemd 持久化。
验证进程:
ps aux | grep ttyd
ss -tlnp | grep 7681
4.6 配置 systemd 持久化
创建服务文件 /etc/systemd/system/ttyd.service:
[Unit]
Description=ttyd Web Terminal Monitor
After=network.target
[Service]
Type=simple
ExecStartPre=/bin/bash -c 'tmux has-session -t ai-work 2>/dev/null || tmux new-session -d -s ai-work'
ExecStart=/usr/local/bin/ttyd -p 7681 tmux attach -t ai-work
Restart=always
RestartSec=5
User=root
[Install]
WantedBy=multi-user.target
启用并启动:
systemctl daemon-reload
systemctl enable ttyd
systemctl start ttyd
systemctl status ttyd --no-pager
4.7 防火墙配置
两层防火墙都需要放行:
A. 系统防火墙(firewalld)
firewall-cmd --permanent --add-port=7681/tcp
firewall-cmd --reload
firewall-cmd --list-ports
B. 云平台安全组(以腾讯云为例)
| 方向 | 协议 | 端口 | 来源 | 策略 |
|---|---|---|---|---|
| 入站 | TCP | 7681 | 0.0.0.0/0(或限制为办公 IP) | 允许 |
如使用阿里云、AWS、GCP,请在对应控制台的安全组 / 防火墙规则中添加相同规则。
4.8 浏览器验证
访问:http://<服务器公网IP>:7681/
应看到 tmux ai-work 会话的终端界面(可能当前为空,等待命令输入后会有输出)。
5. 双轨工作流
5.1 轨道 A:AI 执行命令(写入端)
原则:AI 不直接通过 SSH 执行命令,而是通过 tmux send-keys 将命令注入 ai-work 会话。
# 正确方式(用户可见)
tmux send-keys -t ai-work 'cd /opt/project && docker compose ps' Enter
# 错误方式(用户不可见,绕过监视)
ssh user@server "cd /opt/project && docker compose ps"
批量命令序列示例:
# AI 通过 SSH 执行以下命令序列
tmux send-keys -t ai-work 'clear' Enter
tmux send-keys -t ai-work 'echo "[$(date +%H:%M:%S)] 开始部署..."' Enter
tmux send-keys -t ai-work 'cd /opt/iot-platform && git pull origin main' Enter
tmux send-keys -t ai-work 'docker compose up -d --build' Enter
5.2 轨道 B:用户观察(读取端)
- 打开浏览器
- 访问:
http://<服务器IP>:7681/ - 实时观看 tmux
ai-work会话中的命令执行和输出滚动
5.3 交互反馈闭环
┌─────────────┐ 发现问题 ┌─────────────┐
│ 浏览器 │ ────────────────► │ 用户 │
│ (轨道 B) │ │ │
└─────────────┘ └──────┬──────┘
│
聊天反馈 / SSH干预 │
▼
┌─────────────┐
│ AI │
│ (调整指令) │
└──────┬──────┘
│
│ tmux send-keys
▼
┌─────────────┐
│ tmux ai-work│
│ (轨道 A) │
└─────────────┘
如果用户在观察中发现问题,可以:
- 在聊天中直接告诉 AI:“刚才
docker compose报错了,端口冲突” - 通过独立 SSH 会话自行干预(不影响 tmux 会话)
6. 故障排查
6.1 ttyd 页面无法访问
| 排查层级 | 检查项 | 命令 / 方法 |
|---|---|---|
| 进程层 | ttyd 是否在运行 | ps aux | grep ttyd |
| 端口层 | 7681 是否监听 | ss -tlnp | grep 7681 |
| 系统防火墙 | firewalld 是否放行 | firewall-cmd --list-ports |
| 云平台 | 安全组是否放行 | 登录控制台检查入站规则 |
| 网络层 | 本地能否访问 | curl http://127.0.0.1:7681 |
| 日志层 | ttyd 报错信息 | journalctl -u ttyd -n 50 |
6.2 页面打开但黑屏 / 无输出
| 排查项 | 命令 |
|---|---|
| tmux 会话是否存在 | tmux list-sessions |
| 会话中是否有活动 | tmux capture-pane -t ai-work -p |
| 手动附加查看 | tmux attach -t ai-work(按 Ctrl+B 再按 D 分离,不要关闭窗口) |
| ttyd 是否附加正确会话 | 检查 systemd 服务文件中的会话名拼写 |
6.3 tmux 会话丢失或崩溃
# 如果 ai-work 会话不存在,重新创建
tmux new-session -d -s ai-work
# 重启 ttyd 服务
systemctl restart ttyd
6.4 中文乱码
# 检查 locale
echo $LANG
# 应为:en_US.UTF-8 或 zh_CN.UTF-8
# 如不正确,临时设置
export LANG=en_US.UTF-8
# 永久设置
echo 'export LANG=en_US.UTF-8' >> /etc/profile
浏览器端确保使用 UTF-8 编码(现代浏览器默认如此)。
6.5 编译阶段错误速查
| 错误现象 | 根因 | 解决 |
|---|---|---|
Could not find LibwebsocketsConfig.cmake |
系统包缺少 CMake 配置 | 源码编译 libwebsockets |
libwebsockets was not build with libuv support |
编译 libwebsockets 时未开 -DLWS_WITH_LIBUV=ON |
重新编译 libwebsockets 并加该参数 |
json.h: No such file or directory |
头文件路径问题 | 使用 CMake 编译 ttyd,不要手动 gcc |
| CMake 找不到 libwebsockets | 安装路径不在默认搜索路径 | 加 -DCMAKE_PREFIX_PATH=/usr/local |
7. 安全加固
7.1 当前部署的安全基线
| 风险点 | 当前防护措施 | 风险等级 |
|---|---|---|
| ttyd 暴露公网 | ttyd 默认只读,浏览器端无法输入 | 低 |
| 敏感命令泄露 | 所有命令对用户透明(设计如此) | 低 |
| 会话被劫持 | tmux 会话仅在本地,不暴露网络端口 | 低 |
| 端口扫描 | 7681 可被扫描发现 | 中 |
| 无身份验证 | 任何人知道 IP+端口即可访问 | 高 |
7.2 推荐加固措施(按优先级)
措施 1:限制来源 IP(最高优先级)
# firewalld 限制特定 IP
firewall-cmd --permanent --remove-port=7681/tcp
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="YOUR_OFFICE_IP/32" port protocol="tcp" port="7681" accept'
firewall-cmd --reload
措施 2:启用 ttyd 基础认证
# 修改 /etc/systemd/system/ttyd.service 的 ExecStart 行:
ExecStart=/usr/local/bin/ttyd -p 7681 -c admin:StrongPassword123 tmux attach -t ai-work
# 重载并重启
systemctl daemon-reload
systemctl restart ttyd
-c参数为 ttyd 原生基础认证(username:password)。注意:ttyd 默认仍为只读,即使通过认证也只能观察。
如需允许认证后的浏览器端输入,需额外添加-W参数(不推荐用于监视场景)。
措施 3:Nginx 反向代理 + Basic Auth(生产推荐)
server {
listen 80;
server_name ttyd.yourdomain.com;
location / {
auth_basic "ttyd monitor";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:7681;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
}
措施 4:启用 HTTPS
# ttyd 原生 HTTPS(需证书)
# 修改 systemd 服务文件中的 ExecStart:
ExecStart=/usr/local/bin/ttyd -p 7681 -S -C /path/to/cert.pem -K /path/to/key.pem tmux attach -t ai-work
措施 5:避免在监视会话中输入密码
# 错误:密码会显示在浏览器中
tmux send-keys -t ai-work 'mysql -u root -pMySecretPassword' Enter
# 正确:使用环境变量或配置文件
tmux send-keys -t ai-work 'mysql -u root -p' Enter
# 然后由 AI 通过独立安全通道提供密码,或预先配置 .my.cnf
7.3 安全加固决策树
部署环境 ──► 内网 / 跳板机访问 ──► 仅限制来源 IP 即可
│
└────► 公网直接访问 ──► 必须叠加以下至少两项:
├─ 来源 IP 白名单
├─ ttyd -c 基础认证
├─ Nginx 反向代理 + Basic Auth
└─ HTTPS (防止中间人窥视终端内容)
8. 一键安装脚本
适用于全新 OpenCloudOS 9 系统,网络可达 GitHub 的情况。
#!/bin/bash
set -euo pipefail
# ─────────────────────────────────────────────
# 双轨终端监视系统 - 一键安装脚本
# 适用:OpenCloudOS 9 / CentOS 9 Stream / RHEL 9
# ─────────────────────────────────────────────
TMUX_SESSION="ai-work"
TTYD_PORT=7681
# 1. 安装系统依赖
echo "[1/6] 安装系统依赖..."
yum install -y tmux json-c-devel libuv-devel zlib-devel openssl-devel cmake gcc make wget
# 2. 编译安装 libwebsockets
echo "[2/6] 编译安装 libwebsockets..."
cd /tmp
rm -f libwebsockets-4.3.2.tar.gz
wget --timeout=120 --tries=3 \
https://github.com/warmcat/libwebsockets/archive/refs/tags/v4.3.2.tar.gz \
-O libwebsockets-4.3.2.tar.gz
tar xzf libwebsockets-4.3.2.tar.gz
cd libwebsockets-4.3.2
mkdir -p build && cd build
cmake -DLWS_WITHOUT_TESTAPPS=ON \
-DLWS_WITHOUT_EXTENSIONS=OFF \
-DLWS_WITH_SSL=ON \
-DLWS_WITH_LIBUV=ON \
..
make -j$(nproc)
make install
ldconfig
# 3. 编译安装 ttyd
echo "[3/6] 编译安装 ttyd..."
cd /tmp
rm -f ttyd-master.tar.gz
wget --timeout=60 --tries=3 \
https://github.com/tsl0922/ttyd/archive/refs/heads/master.tar.gz \
-O ttyd-master.tar.gz
tar xzf ttyd-master.tar.gz
cd ttyd-main
mkdir -p build && cd build
cmake -DCMAKE_PREFIX_PATH=/usr/local ..
make -j$(nproc)
cp ttyd /usr/local/bin/
chmod +x /usr/local/bin/ttyd
# 4. 创建 tmux 会话
echo "[4/6] 创建 tmux 会话 '${TMUX_SESSION}'..."
tmux new-session -d -s "${TMUX_SESSION}" 2>/dev/null || true
# 5. 配置防火墙
echo "[5/6] 配置系统防火墙..."
firewall-cmd --permanent --add-port=${TTYD_PORT}/tcp 2>/dev/null || true
firewall-cmd --reload 2>/dev/null || true
# 6. 配置 systemd 并启动
echo "[6/6] 配置 systemd 服务..."
cat > /etc/systemd/system/ttyd.service <<EOF
[Unit]
Description=ttyd Web Terminal Monitor
After=network.target
[Service]
Type=simple
ExecStartPre=/bin/bash -c 'tmux has-session -t ${TMUX_SESSION} 2>/dev/null || tmux new-session -d -s ${TMUX_SESSION}'
ExecStart=/usr/local/bin/ttyd -p ${TTYD_PORT} tmux attach -t ${TMUX_SESSION}
Restart=always
RestartSec=5
User=root
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable ttyd
systemctl start ttyd
# 输出访问信息
IP_ADDR=$(hostname -I | awk '{print $1}')
echo ""
echo "========================================"
echo " 双轨监视系统安装完成!"
echo ""
echo " 轨道 B (浏览器观察): http://${IP_ADDR}:${TTYD_PORT}/"
echo " tmux 会话名: ${TMUX_SESSION}"
echo ""
echo " 轨道 A (AI 执行命令):"
echo " tmux send-keys -t ${TMUX_SESSION} 'your-command' Enter"
echo ""
echo " 安全提示:"
echo " - ttyd 默认只读,浏览器端无法输入"
echo " - 建议限制来源 IP 或添加认证"
echo " - 生产环境请配置 Nginx 反向代理 + HTTPS"
echo "========================================"
9. 运维速查表
9.1 进程与会话管理
| 操作 | 命令 |
|---|---|
| 查看 tmux 会话 | tmux list-sessions |
| 创建新会话 | tmux new-session -d -s ai-work |
| 发送命令到会话 | tmux send-keys -t ai-work '命令' Enter |
| 查看会话内容(不附加) | tmux capture-pane -t ai-work -p |
| 手动附加到会话 | tmux attach -t ai-work(Ctrl+B 然后 D 分离) |
| 杀掉 tmux 会话 | tmux kill-session -t ai-work |
9.2 ttyd 管理
| 操作 | 命令 |
|---|---|
| 查看 ttyd 进程 | ps aux | grep ttyd |
| 查看端口监听 | ss -tlnp | grep 7681 |
| 查看 ttyd 日志 | journalctl -u ttyd -n 50 |
| 停止 ttyd | systemctl stop ttyd |
| 重启 ttyd | systemctl restart ttyd |
| 查看 ttyd 版本 | ttyd --version |
9.3 systemd 服务管理
# 查看状态
systemctl status ttyd --no-pager
# 启动 / 停止 / 重启
systemctl start ttyd
systemctl stop ttyd
systemctl restart ttyd
# 开机自启
systemctl enable ttyd
# 查看日志
journalctl -u ttyd -f
10. 踩坑记录总表
以下所有坑均来自 OpenCloudOS 9 / CentOS 9 Stream 实际踩坑经验。
10.1 坑1:系统 libwebsockets-devel 不含 CMake 配置文件
| 项目 | 内容 |
|---|---|
| 现象 | CMake Error: Could not find a package configuration file provided by "Libwebsockets" |
| 根因 | OpenCloudOS 9 的 libwebsockets-devel 包只安装了头文件和 .so,未安装 LibwebsocketsConfig.cmake,CMake 的 find_package 无法定位 |
| 解决 | 必须从源码编译 libwebsockets,编译后会自动生成并安装 CMake 配置文件到 /usr/local/lib/cmake/libwebsockets/ |
| 预防 | 安装流程中直接跳过系统包,始终源码编译 libwebsockets |
10.2 坑2:libwebsockets 未启用 libuv 支持
| 项目 | 内容 |
|---|---|
| 现象 | CMake Error: libwebsockets was not build with libuv support (-DLWS_WITH_LIBUV=ON) |
| 根因 | ttyd 依赖 libwebsockets 的 libuv 事件循环支持,但默认编译 libwebsockets 时不会启用 |
| 解决 | 编译 libwebsockets 时必须添加 -DLWS_WITH_LIBUV=ON |
| 预防 | 见 4.2 节 cmake 命令,该参数为强制项 |
10.3 坑3:json-c 头文件路径不在默认搜索路径
| 项目 | 内容 |
|---|---|
| 现象 | fatal error: json.h: No such file or directory |
| 根因 | json-c 的头文件安装在 /usr/include/json-c/ 子目录下,直接 gcc 编译时找不到 |
| 解决 | 使用 CMake 编译 ttyd,CMake 会自动处理头文件路径;不要尝试手动 gcc 编译 ttyd |
| 预防 | 严格按文档使用 cmake + make 流程 |
10.4 坑4:GitHub 下载超时 / zip 文件损坏
| 项目 | 内容 |
|---|---|
| 现象 | wget 超时;unzip 报错 End-of-central-directory signature not found |
| 根因 | 国内服务器访问 GitHub 不稳定,下载中断导致文件损坏;zip 格式对断点续传容错性差 |
| 解决 | ① 使用 --timeout=120 --tries=3 增加超时和重试;② 优先使用 .tar.gz 而非 .zip;③ 下载失败删除后重试;④ 验证文件大小 |
| 预防 | 脚本中使用 rm -f 先删旧文件再下载;使用 tar.gz 格式 |
10.5 坑5:CMAKE_PREFIX_PATH 未设置
| 项目 | 内容 |
|---|---|
| 现象 | CMake 找不到源码安装的 libwebsockets |
| 根因 | 源码安装到 /usr/local,但 CMake 默认搜索路径可能不包含该位置(取决于发行版) |
| 解决 | 编译 ttyd 时显式指定 -DCMAKE_PREFIX_PATH=/usr/local |
| 预防 | 见 4.3 节 cmake 命令,该参数为强制项 |
11. 变更记录
| 日期 | 版本 | 变更内容 | 作者 |
|---|---|---|---|
| 2026-05-29 | v1.0 | 初始安装指南(OpenCloudOS 9),含踩坑记录与一键脚本 | 原始文档 A |
| 2026-05-29 | v1.0 | 双轨观察方案架构设计、日常使用流程、故障排查 | 原始文档 B |
| 2026-05-29 | v2.0 | 融合两份文档,统一架构视图,补充安全加固决策树、systemd 自启、运维速查表 | 融合版 |
| 2026-05-29 | v2.1 | 修正 -W 参数含义(ttyd 默认只读,-W 为开启可写);统一 systemd 服务文件名为 ttyd.service;4.5 节启动方式改为 systemd 持久化 |
验证修正 |
附录:快速验证清单
部署完成后,按以下顺序验证:
tmux list-sessions能看到ai-workttyd --version输出 1.7.7ss -tlnp \| grep 7681显示 ttyd 在监听firewall-cmd --list-ports包含 7681/tcp- 浏览器访问
http://<IP>:7681/能看到终端界面- 执行
tmux send-keys -t ai-work 'echo hello' Enter后浏览器能看到hello- 云平台安全组已放行 7681
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)