Community编程与开发github.com

sabiviji/remote-work-ssh

通过 SSH 连接到远程机器,使用别名、密钥或密码认证方式(配置在 ssh.md 中)在远程项目上工作。当用户要求 SSH 登录服务器、在远程机器上运行命令、检查或编辑远程项目文件,或在远程项目上工作时使用。

remote-work-ssh 是什么?

此技能使 AI 代理能够通过 SSH 安全地连接到远程服务器,并在远程项目目录中执行命令、检查或编辑文件。它要求项目根目录下存在一个 `ssh.md` 文件,其中包含连接配置详情(如主机、用户、端口、认证方式等)。支持三种认证方式:别名(使用 SSH 配置中的别名)、密钥(指定身份文件)和密码(通过环境变量传递密码)。技能会严格验证配置的完整性和正确性,并在连接失败或主机密钥未知时停止操作并提示用户。连接建立后,所有命令都会在远程项目路径内执行,且遵循严格的安全规则,例如在执行破坏性操作前需征得用户同意,并且绝不泄露或存储凭据。

兼容平台✓Claude Code~Codex CLI~Cursor✓OpenCode
npx skills add https://github.com/sabiviji/remote-work-ssh/tree/HEAD/.agents/skills/remote-work-ssh

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

通过 SSH 进行远程工作

连接详情存储在项目文件夹中的 ssh.md 文件中。每次远程会话前请先读取它。切勿猜测主机、用户、端口、密钥路径或密码。

何时激活

  • 用户要求连接、登录或在远程机器上运行某些操作
  • 用户要求检查、编辑、构建或测试远程项目
  • 用户提到服务器、VPS 或远程主机,并期望使用 SSH 访问

步骤 1:定位 ssh.md

项目文件夹通过 git rev-parse --show-toplevel 获取,如果该命令失败则使用当前目录。ssh.md 始终位于 <项目文件夹>/ssh.md。

如果该文件不存在,则根据模板创建并告知用户填写:

  1. 查找 ssh.example.md。它位于此技能文件夹中,具体路径取决于代理。按顺序检查以下路径并使用第一个存在的路径:.agents/skills/remote-work-ssh/、.claude/skills/remote-work-ssh/、.opencode/skills/remote-work-ssh/、~/.agents/skills/remote-work-ssh/、~/.claude/skills/remote-work-ssh/、~/.config/opencode/skills/remote-work-ssh/。如果都不存在,运行 find ~ -path '*remote-work-ssh*' -name ssh.example.md 2>/dev/null | head -n 1。
  2. 将其复制到 <项目文件夹>/ssh.md。
  3. 将 ssh.md 添加到项目的 .gitignore 文件中(如果尚未添加)。如果需要,创建 .gitignore。
  4. 停止并告知用户填写 ssh.md。

步骤 2:验证配置

ssh.md 包含一个 YAML 块。检查以下字段:

  • auth 必须是 alias、key 或 password。
  • remote_project_path 必须设置。
  • 所选方法对应的字段必须设置:
auth必填字段
aliasalias
keyhost、user、identity_file(port 默认为 22)
passwordhost、user、password_env(port 默认为 22)

如果缺少必填字段或 auth 未知,停止并报告具体哪个字段有误。不要回退到其他方法。

步骤 3:连接

alias

首先解析别名,然后连接:

ssh -G <alias> | grep -E '^(hostname|user|port) '
ssh -o BatchMode=yes <alias> 'hostname && whoami'

key

  • 确认 identity_file 存在。如果不存在,停止。
  • 仅使用该密钥:
ssh -o BatchMode=yes -o IdentitiesOnly=yes -i <identity_file> -p <port> <user>@<host> 'hostname && whoami'
  • 如果设置了 proxy_jump,添加 -J <proxy_jump>。

password

  • 使用 command -v sshpass 检查 sshpass 是否已安装。如果缺失,停止并告知用户安装它。
  • 检查由 password_env 命名的环境变量是否已设置,无需打印其值。
  • 通过 SSHPASS 环境变量和 -e 将值传递给 sshpass。不要将密码放在命令行参数或任何输出中。
  • 禁用基于密钥的尝试,仅使用密码:
SSHPASS="$(printenv <password_env>)" sshpass -e ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password -p <port> <user>@<host> 'hostname && whoami'
  • 如果设置了 proxy_jump,添加 -J <proxy_jump>。
  • 此处不要使用 BatchMode=yes,因为它会禁用密码认证。

主机密钥(所有方法)

  • 如果主机密钥未知或已更改,停止。显示指纹并要求用户验证。
  • 切勿设置 StrictHostKeyChecking=no 或类似跳过验证的选项。

步骤 4:在远程项目中工作

  • 每个命令都在 remote_project_path 内执行,例如 ssh ... 'cd <remote_project_path> && <command>'。对路径使用引号。
  • 在假设远程机器上存在某个工具之前,先检查其清单或运行 command -v <tool>。
  • 除非用户要求,否则不要在 remote_project_path 之外写入。

安全规则

  • 在执行破坏性命令(如 rm -rf、强行推送、删除数据库、磁盘操作或服务重启)之前,先询问用户。
  • 切勿打印、复制、记录或提交密码、密钥内容或令牌。
  • 不要将凭据存储在本项目的 ssh.md 或环境变量之外的任何文件中。
  • 不要在远程机器上运行用户未要求的命令。

不支持的操作

  • 将密码存储在受跟踪的文件或此技能中
  • 代表用户处理交互式 MFA 或一次性验证码
  • 禁用主机密钥验证
  • 连接到未在 ssh.md 中定义的主机

相关技能