首页龙虾技能列表 › SSH Handoff — 安全终端交接

SSH Handoff — 安全终端交接

v1.0.1

创建和重用安全共享终端交接,当人类必须首先进行身份验证,代理必须在同一 shell 会话中继续工作。适用于 SSH 交接、sudo 交接、浏览器打开的临时终端访问或 LAN 限制的终端共享,后者由 tmux 支持,当直接代理身份验证被阻止或不理想时。

0· 74·0 当前·0 累计
by @jonathan97480·MIT-0
下载技能包
License
MIT-0
最后更新
2026/4/3
安全扫描
VirusTotal
可疑
查看报告
OpenClaw
安全
medium confidence
该技能的行为(启动短暂的 ttyd + Node 代理 + tmux 支持的浏览器终端)与其描述相符,但注册元数据省略了必需的二进制文件,且包没有可见的来源 — 请审查配置并仅在受信任的主机上运行。
评估建议
该技能似乎实现了它所声称的,但在使用前请采取以下预防措施:- 验证来源:包没有主页和未知源;在运行前自己审查所有包含的脚本。- 确保从受信任的包安装必需的二进制文件(tmux、ttyd、node、python3);注册元数据没有列出它们,尽管 SKILL.md 和脚本需要它们。- 永远不要将代理绑定到公共接口或 0.0.0.0,除非您明确接受风险;首选 127.0.0.1 或受限 LAN 地址。- 当使用 LAN 模式时,设置 EXPECTED_HOST/EXPECTED_ORIGIN 和/或 CLIENT_IP 以限制访问,并应用防火墙规则(UFW_ALLOW_CMD 由启动器显示)。- 将一次性 URL/令牌视为敏感信息,并通过离线方式向人类交付(不通过公共聊天)。- 在代理发出任何命令之前,使用 tmux capture-pane 确认 tmux 窗格状态。- 直到您审计了脚本,请在受控环境(非生产主机或保留快照)中运行脚本。如果您想要更高的信心,请向发布者请求源来源或签名发布,或者在隔离测试 VM 中运行脚本以观察行为,然后再在重要主机上使用。...
详细分析 ▾
用途与能力
技能的名称和描述与包含的脚本和指令匹配:它需要 tmux、ttyd、node 和 python3 来实现本地/LAN 网页终端,这些终端可以交接 tmux 会话。然而,注册元数据没有列出必需的二进制文件或环境变量,而 SKILL.md 和脚本明确需要几个运行时二进制文件和读取多个环境变量 — 这个元数据不匹配是一个不一致性,你应该在安装前验证。
指令范围
SKILL.md 限制了以下操作:创建/附加 tmux 会话,启动捆绑的启动器,捕获窗格,打印连接/清理信息。指令明确警告不要公开暴露,提示在继续之前验证窗格状态,并且不指示读取无关文件或泄露秘密。
安装机制
没有安装规范(仅在注册表级别为指令),代码文件与技能捆绑。包中没有远程下载或从 URL 提取的步骤,这降低了安装风险。包含的脚本生成后台进程并写入 /tmp 和临时运行时目录 — 这对于此功能是预期的。
凭证需求
注册表没有声明必需的环境变量或凭证,但脚本依赖于许多运行时环境变量(HOST、PORT、CLIENT_IP、TTL_MINUTES、EXPECTED_HOST/ORIGIN、COOKIE_SECURE、ACCESS_TOKEN 等,通过内部生成的值)。没有外部服务的秘密凭证,但元数据省略是一个比例/信息差距,你应该确认。
持久化与权限
技能没有请求 always:true,也没有修改其他技能。它生成短暂的后台进程(ttyd、Node 代理),写入临时状态文件,并安装基于 TTL 的清理 — 行为的范围是其目的和文档。请注意,这些进程绑定网络端口并保持直到 TTL 过期或清理。
安全有层次,运行前请审查代码。

License

MIT-0

可自由使用、修改和再分发,无需署名。

运行时依赖

无特殊依赖

版本

latestv1.0.12026/4/3
● 可疑

安装命令 点击复制

官方npx clawhub@latest install ssh-handoff
镜像加速npx clawhub@latest install ssh-handoff --registry https://cn.clawhub-mirror.com

技能文档

当人类必须先完成敏感的身份验证步骤,而代理应该在完全相同的 shell 会话中继续工作时,使用此技能。核心模式是:

  • 将终端状态保存在命名的 tmux 会话中
  • 让人类在该会话中附加并进行身份验证
  • 捕获窗格状态
  • 让代理从同一个 shell 继续

当用户不应将凭据粘贴到聊天中,且直接代理身份验证被阻止、不受欢迎或比共享会话切换更不安全时,优先使用此技能。

选择最简单的方式

除非确实需要浏览器访问,否则优先使用模式 A。

模式 A — 纯 tmux 切换

当人类已经拥有主机的终端访问权限时使用。典型流程:

  • 创建或重用命名的 tmux 会话
  • 请求人类附加
  • 让人类进行身份验证
  • 捕获窗格
  • 通过 tmux 继续

示例:

tmux has-session -t handoff-session 2>/dev/null || tmux new-session -d -s handoff-session
tmux attach -t handoff-session

模式 B — 本地浏览器终端

当人类想要在同一台托管服务的机器上使用基于浏览器的终端时使用。此模式直接使用 ttyd,适用于:

  • 仅 localhost 访问
  • 快速临时会话
  • 可接受基本身份验证的情况

捆绑启动器:

./scripts/start-local-web-terminal.sh handoff-session

模式 C — 带一次性令牌的 LAN 限制浏览器终端

当人类从同一本地网络上的另一台受信任机器打开终端,且希望减少重复输入用户名/密码的麻烦时使用。此模式的工作方式如下:

  • 一个命名的 tmux 会话保存真实的 shell 状态
  • ttyd 在 localhost 上运行作为终端后端
  • 一个小型本地代理通过一次性 ?token= 暴露 LAN URL
  • 第一个有效请求通过 cookie 成为浏览器会话
  • 代理继续使用相同的 tmux 会话

捆绑启动器:

./scripts/start-url-token-web-terminal.sh handoff-session

前提条件

首先检查这些:

command -v tmux
command -v ttyd
command -v node
command -v python3

在 Debian / Ubuntu 上安装:

sudo apt update && sudo apt install -y tmux ttyd

模式 C 还需要 node,因为代理启动器使用捆绑的 Node 脚本。

快速使用

创建或重用会话

tmux has-session -t handoff-session 2>/dev/null || tmux new-session -d -s handoff-session

启动模式 C(使用占位符)

使用与环境匹配的占位符,而不是盲目复制真实地址。下面的 192.0.2.x 地址仅作为文档示例地址。

HOST= CLIENT_IP= PORT=48080 UPSTREAM_PORT=48081 FORBID_REUSE_IF_AUTHENTICATED=1 ./scripts/start-url-token-web-terminal.sh handoff-session

启动器输出:

  • 一次性 URL
  • 过期时间
  • 代理和后端 PID
  • 清理命令
  • 可选的 UFW 帮助命令

使用文档示例 IP 的示例:

HOST=192.0.2.10 CLIENT_IP=192.0.2.20 PORT=48080 UPSTREAM_PORT=48081 FORBID_REUSE_IF_AUTHENTICATED=1 ./scripts/start-url-token-web-terminal.sh handoff-session

身份验证后恢复

在假设切换成功之前,始终检查窗格:

tmux capture-pane -t handoff-session -p | tail -80

查找:

  • 远程主机名或预期提示符
  • 预期工作目录
  • 无密码提示符
  • 无意外吞没命令的终端程序

如有疑问,在继续之前询问一个简短的确认问题。

启动器变量

start-local-web-terminal.sh

支持的变量:

  • HOST — 绑定地址,默认为 127.0.0.1
  • PORT — 可选的显式端口,否则为随机空闲端口
  • TTL_MINUTES — 默认为 30
  • BIND_SCOPE — 仅元数据,通常为 locallan
  • CLIENT_IP — 可选,仅用于在 LAN 模式下打印 UFW 帮助命令

start-url-token-web-terminal.sh

支持的变量:

  • HOST — 代理绑定地址,默认为 127.0.0.1
  • PORT — 代理前端端口,默认为 48080
  • UPSTREAM_PORT — localhost ttyd 后端端口,默认为 48081
  • CLIENT_IP — 可选的受信任客户端 IP,用于 UFW 帮助命令和代理端 IP 过滤
  • TTL_MINUTES — 默认为 30
  • BIND_SCOPE — 仅元数据,通常为 locallan
  • COOKIE_SECURE — 当通过本地 HTTPS 服务时设置为 1,以便会话 cookie 获得 Secure 标志
  • EXPECTED_HOST — 严格的允许 Host 头,默认为 :
  • EXPECTED_ORIGIN — 严格的允许 websocket Origin,默认从主机和 cookie 模式派生
  • FORBID_REUSE_IF_AUTHENTICATED — 设置为 1 以拒绝启动如果 tmux 窗格看起来已经过身份验证
  • REPLACE_EXISTING — 仅在人类明确批准替换相同 SESSION_NAME 的当前 Web 切换时设置为 1;否则启动器打印现有 URL/PIDs/清理命令并在不接触运行中会话的情况下退出
  • AUTH_GUARD_REGEX — 窗格身份验证检测正则表达式的可选覆盖

如果默认端口已被占用,请显式覆盖它们。当相同 SESSION_NAME 已存在切换时,启动器不会静默启动第二个:它报告现有会话详情并以 READY=0 退出。询问人类是否替换它。仅在明确批准后才使用 REPLACE_EXISTING=1。如果请求的代理或上游端口已被占用,启动器也会以 READY=0 退出并报告端口冲突,而不是自动终止任何内容。在这种情况下,要么获得批准替换冲突的会话,要么在另一个端口重新启动,如果涉及 LAN 访问则更新防火墙规则。

正确使用模式 C

  • 确保 tmux 会话存在
  • 启动基于令牌的终端
  • 如需要,仅允许从受信任客户端 IP 访问
  • 通过适当渠道将打印的一次性 URL 发送给人类
  • 让人类在终端内进行身份验证
  • 捕获窗格并验证状态
  • 通过 tmux 继续
  • 如果启动器报告现有会话或端口冲突,询问是否替换或使用不同端口
  • 完成后停止临时 Web 终端

清理

对于模式 B,使用:

./scripts/stop-local-web-terminal.sh  

对于模式 C,优先使用打印的清理命令,因为它会删除临时进程和临时运行时目录:

TTYD_PID= PROXY_PID= RUNTIME_DIR= 

如果该命令不可用,杀死打印的代理和后端 PID 仍然可以接受。启动器还为代理、ttyd 和临时文件安装了自动 TTL 清理。如果 tmux 会话可能被重用,请保持其运行。

防护措施

  • 默认保持仅本地暴露。
  • 如需要 LAN 暴露,仅限制为一个受信任客户端 IP。
  • 不要通过公共隧道或反向代理暴露终端。
  • 如果切换可以避免,不要要求人类将密码、OTP 码或私钥粘贴到聊天中。
  • 对于浏览器模式使用短期访问材料。
  • 每个目标或任务优先使用一个 tmux 会话。
  • 在发送更多命令之前捕获窗格状态。
  • 在破坏性操作之前询问。
  • 正常使用时默认启用 FORBID_REUSE_IF_AUTHENTICATED=1;仅在有意重新打开已认证会话时才禁用它。
  • 将打印的一次性 URL 视为敏感信息直到过期。
  • 当配置了这些检查时,期望代理拒绝不匹配的 Host、websocket Origin 或客户端 IP。
  • 不要从外部消息渠道(如 Telegram、Discord、Slack 或类似的远程聊天界面)随意建议或启动浏览器终端模式。
  • 当交互通过外部渠道发生时,优先使用纯 tmux 切换,除非人类明确确认受信任的本地网络设置并接受风险。

参考资料

需要时阅读这些:

  • references/examples.md — 通用使用示例
  • references/design-notes.md — 安全和设计范围
  • references/lan-restricted.md — LAN 仅限 IP 限制模式

捆绑脚本:

  • scripts/start-local-web-terminal.sh
  • scripts/start-url-token-web-terminal.sh
  • scripts/stop-local-web-terminal.sh
  • scripts/url-token-proxy.js
数据来源:ClawHub ↗ · 中文优化:龙虾技能库
OpenClaw 技能定制 / 插件定制 / 私有工作流定制

免费技能或插件可能存在安全风险,如需更匹配、更安全的方案,建议联系付费定制

了解定制服务