Skip to main content
Glama
perhamm

ssh-mcp-server

by perhamm

ssh-mcp-server

CI npm

基于 SSH 的 MCP 服务器:代理在远程机器上执行命令,而密钥、密码和 sudo 密码始终保留在我们这一侧。

基于 classfang/ssh-mcp-server 的 fork,采用 ISC 许可证。

俄语 | English

这是什么

ssh-mcp-server 是 MCP 客户端(Claude Desktop、Cursor、Cline)与 SSH 之间的桥梁。代理调用工具,服务器连接到机器并返回输出。模型既看不到私钥,也看不到密码,更看不到 sudo 密码:这些都从本地配置和进程的环境变量中读取。

一个服务器可以服务任意数量的主机。主机通过 ~/.ssh/config 中的别名动态选择,因此无需把每台机器都写进 MCP 客户端的配置。

Related MCP server: ssh-mcp-server

本 fork 新增的内容

功能

用途

动态读取 ~/.ssh/config 中的主机

一个 MCP 覆盖整个机器集群。别名传给 connectionName,在首次调用时建立连接

ProxyJump

位于堡垒机之后的主机可通过别名访问,ProxyJump 链从 SSH 配置中解析

从环境变量获取 sudo

代理请求 sudo: true,服务器填入密码并从输出中将其移除

禁止核心

某些操作永远不会执行:无论在 sudo 下、任何配置下,还是通过 SFTP

Guards 配置

现成的 safe 禁止规则集和 readonly 白名单,带版本管理并可更新

隧道

SOCKS5(对应 ssh -D)以及到任意本地端口的端口转发(对应 ssh -L)

主机密钥校验

默认校验 known_hosts;密钥不在列表中则拒绝连接

现代加密算法

Ed25519 优先,不使用 SHA-1、CBC 和 DSA

审计日志

每次调用都写入 JSONL,支持日志轮转和 gzip 归档

无文件上传

upload 默认不发布:guards 无法读取的文件,就是向主机传输代码的一种方式

工具

工具

功能

execute-command

执行命令,支持 sudo 和任意 connectionName

download

从服务器下载文件

list-servers

显示已配置的连接、它们的当前状态,以及已启用的 guards 配置文件

list-ssh-hosts

显示 SSH 配置中可用作 connectionName 的别名

open-tunnel

通过连接建立 SOCKS / 端口转发

close-tunnel

关闭隧道

list-tunnels

显示打开的隧道和连接计数

list-ssh-hosts 仅在传入 --ssh-config-hosts 标志时出现;隧道工具可通过 --disable-tunnels 标志移除。upload 工具不在列表中:仅在传入 --enable-upload 标志时发布。

无需多余命令即可获取主机信息

连接时,服务器会一次性采集机器状态:主机名、地址、操作系统、内核、运行时长、磁盘、内存、进程数。所有探测都合并为带标记的单独命令,因此这是一次 SSH 往返,而不是六次。

服务器缓存结果,并在 list-servers 中返回:

[connected] prod-1 | deploy@10.0.0.5:22 | hostname=prod-1 | os=Linux | updated=2026-08-19T18:14:23Z

Raw JSON:
[{"name":"prod-1","connected":true,"guards":"guards=safe ruleset=2026.08.19 ...",
  "status":{"reachable":true,"osVersion":"Ubuntu 24.04.1 LTS","kernelVersion":"6.8.0-51-generic",
  "uptime":"12 days","diskSpace":{"free":"9.8G","total":"229.6G"},
  "memory":{"free":"5.6G","total":"15.5G"},"processes":{"running":214}}}]

也就是说,无需请求 uname -a、df -h、free -h 和 uptime 的返回,因为答案已经得到。代理只需调用一次 list-servers 即可从中读取状态。

探测项会一个接一个地通过各 guards 规则。当使用白名单时,状态中只会保留允许的字段。状态不完整并不意味着主机不可达。

一条命令成功但没有输出时,会返回 [exit code] 0,而不是空字符串。模型会把空回复理解为未知结果,并尝试用 echo $? 重新检查,这就增加了额外的服务器访问和额外的 token。

快速开始:一个服务器治理整个机器集群

MCP 客户端配置:

{
  "mcpServers": {
    "ssh": {
      "command": "npx",
      "args": [
        "-y",
        "@perhamm/ssh-mcp-server",
        "--ssh-config-hosts",
        "--guards-profile", "safe"
      ],
      "env": {
        "SSH_MCP_SUDO_PASSWORD": "..."
      }
    }
  }
}

代理的工作方式如下:

  1. 调用 list-ssh-hosts,找到所需的别名,例如 r-ulybka-prod-master。对于大型配置,列表会被截断,因此代理会传递 filter,也就是子字符串或 r-ulybka-* 这样的模式。

  2. 使用 connectionName: "r-ulybka-prod-master" 调用 execute-command。

  3. 服务器从 ~/.ssh/config 读取别名,并从中获取 HostName、User、Port、IdentityFile 和 ProxyJump,建立连接并执行命令。

密钥不会离开当前机器:服务器自行读取文件,对话中只会出现 SSH 配置中的路径。如果没有指定 IdentityFile,则使用 SSH_AUTH_SOCK 中的 ssh-agent。缺少 HostName 的别名会像 ssh 本身那样按自身名称连接。

只有配置中通过单独 Host 块声明的别名才可访问。Host * 块提供默认值,但不会把任意名称变成可访问的主机。

可以通过以下方式缩小别名列表范围:

"args": [
  "-y", "@perhamm/ssh-mcp-server",
  "--ssh-config-hosts",
  "--allowed-hosts", "r-ulybka-*,*-stage-*",
  "--ssh-config-file", "/home/user/.ssh/config_work"
]

模式支持 * 和 ?。如果别名不匹配任何模式,则不会建立连接,代理会收到 SSH_HOST_NOT_ALLOWED 错误。

安全模式与 Guards

Guards 是一套带版本管理的规则集,它在每条命令发送到服务器之前对其进行校验。Rules 位于 guards/default-guards.json 中,并与仓库一起更新。

Guards 配置

配置

行为

off

The profile rules are disabled,只生效禁止核心。这是默认值

safe

另外禁止破坏性命令;其余放行

readonly

只允许读取和诊断;继承 safe 的所有禁止项

"args": ["-y", "@perhamm/ssh-mcp-server", "--ssh-config-hosts", "--guards-profile", "safe"]

safe 规则在核心之外还会拦截:shutdown 和 reboot、重置防火墙、停止 sshd 和 kubelet、kubectl delete、helm uninstall、docker system prune、删除软件包、DROP DATABASE、curl | sh、git push --force、清理日志、卸载内核模块、交互式编辑器。完整的列表及其原因见 JSON。

readonly 另外要求命令的每一部分都命中白名单:ls、cat、grep、find、ps、ss、df、journalctl、systemctl status、kubectl get/describe/logs、docker ps/logs 等等。该配置文件中的 sudo 被整体禁止,包括 su、doas 和 pkexec。

禁止核心

部分操作永远不会执行:即使在 off 配置中、sudo 下、任何配置文件之外,还是绕过命令的 SFTP,也都不会执行。The list in the forbidden block.

类别

被禁止的内容

用户账户

useradd、usermod、userdel、groupadd、passwd、chpasswd、chage、vipw,以及写入 /etc/passwd、/etc/shadow、/etc/group

sudo

写 /etc/sudoers 和 /etc/sudoers.d,visudo

计划任务

crontab(crontab -l 除外),写入 /etc/cron*、/var/spool/cron、/etc/anacrontab,at 和 batch 命令

systemd

写入 /etc/systemd、/lib/systemd、/usr/lib/systemd 中的单元文件和 timer,systemctl edit,systemd-run

SSH

修改 /etc/ssh/*、~/.ssh/*、authorized_keys、sshd_config,以及 ssh-keygen、ssh-copy-id、ssh-add

解释器

python、perl、ruby、node、php、lua、Rscript,以及以文件方式运行脚本:bash /tmp/x.sh、sh -s、source. Guards 不读取第三方代码,因此这类执行整体被禁止

批量删除

对一级目录或系统子目录执行 rm -r,使用通配符 rm -r,find -delete,通过 xargs rm 删除,--no-preserve-root 标志

磁盘和机密

mkfs、wipefs、dd of=/dev/、写入 /dev/sd*、fork 炸弹、读取 /etc/shadow 和私钥

普通操作仍可通过:crontab -l、cat /etc/ssh/sshd_config、systemctl restart nginx、rm -rf /var/lib/myapp/cache/tmp。可解析的 bash -c "..." 也会按相同规则校验其内容。

核心限制也适用于文件工具。download 不会取走 /etc/shadow 或 ~/.ssh 中的内容,而 allowedRemotePaths 在这里也不能重新放行它们。本地一侧同样受保护:download 不会把文件写入我们自己的 ~/.ssh。

文件上传是完全被禁止的。除非传入 --enable-upload,否则 upload 工具不会发布;即使带该标志,readonly 配置也会拒绝上传。

如果服务器正好用于创建用户或修改 cron,就必须有意识地修改 fork 中的禁止核心:没有可禁用它返回命令行标志。

为什么用分号绕过不了

命令会按 ;、|、&&、||、&、换行符和 $(...) 替换拆分成多个片段,每个片段单独校验。Split时会考虑引号。因此,ls; rm -rf / 在任何配置中都不会通过,尽管整行以允许的 ls 开头。

外壳包装在执行时会被去除:sudo、env、timeout 5、nohup 以及 LC_ALL=C 这样的变量赋值,都不能把命令藏起来。bash -c "..." 中的脚本会单独解析,并应用相同的规则。命令长度上限为 5000 个字符。

Guards 防范的是代理的错误疏漏,而不是蓄意绕过。像 python -c 这种内部可包含任意命令的解释器,规则无法对其进行解析。对于那些不能绕过的地方,就需要限制 SSH 用户本身的权限。

更新规则

有三种方式可以让规则保持最新:

  1. 将上游合并到自己的 fork。规则文件在 version 字段中进行版本管理,在 list-servers 和规则校验失败的文本中可见。

  2. 保存自己的文件,并通过 --guards-file /etc/ssh-mcp/guards.json 指定。其中的规则会合并到内置规则中,版本号表示形式为 2026.08.19+local-1。

  3. 通过计划任务更新文件:

node scripts/update-guards.js https://example.com/guards.json /etc/ssh-mcp/guards.json

脚本会校验 JSON 并编译每个正则表达式,然后才替换文件。出现异常加载不会破坏正在使用的规则集。

此文件格式为:

{
  "version": "local-1",
  "profiles": {
    "safe": {
      "deny": [
        { "id": "no-ansible", "pattern": "^ansible-playbook\\b", "reason": "выкат идёт из CI" }
      ]
    }
  }
}

scope: "command" 字段会让一条规则检查整条命令,而不是命令片段。curl、curl | sh 和 SQL 的规则就是这样工作的。在 forbidden 中可以额外添加自己的自定义规则,但无法移除内置规则:这些规则会被合并。

旧的 --whitelist 和 --blacklist 仍然有效,并且执行顺序在 guards 之前。

在对话中无需密码使用 sudo

sudo 密码存放在服务器进程的环境变量中。代理传递 sudo: true,但密码既不会出现在调用参数中,也不会出现在输出中。

{
  "mcpServers": {
    "ssh": {
      "command": "npx",
      "args": ["-y", "@perhamm/ssh-mcp-server", "--ssh-config-hosts", "--guards-profile", "safe"],
      "env": {
        "SSH_MCP_SUDO_PASSWORD": "..."
      }
    }
  }
}

工具调用:

{
  "tool": "execute-command",
  "params": {
    "cmdString": "systemctl restart nginx",
    "connectionName": "r-ulybka-prod-master",
    "sudo": true
  }
}

命令以 sudo -S -k -p '' -u root -- /bin/sh -c '<命令>' 的形式发送到服务器,密码写入通道的标准输入。命令行中不包含密码,因此不会出现在 ps 或历史记录中。此类命令会禁用伪终端,否则 tty 会将输入回显到输出中。为保险起见,密码会从输出和错误文本中剔除。

变量名和目标用户可通过 --sudo-password-env 和 --sudo-user 标志修改。如果变量为空,调用会在连接前以 SUDO_PASSWORD_MISSING 失败。readonly 配置文件完全禁止 sudo。

在 shell 模式下,密码会作为单独一行附加在命令之后,因为 sudo 读取的是与 shell 相同的标准输入。-k 标志确保始终请求密码,且该行不会作为命令执行。对于 sudo,exec 模式更合适。

隧道

open-tunnel 启动本地监听器,并通过 SSH 连接转发流量。当无法直接访问集群服务但可以访问节点时,此功能非常有用。

SOCKS5 在端口 8777 上:

{
  "tool": "open-tunnel",
  "params": {
    "type": "socks5",
    "localPort": 8777,
    "connectionName": "r-ulybka-prod-master"
  }
}

之后任何客户端都通过代理访问,域名在远端解析:

curl --socks5-hostname 127.0.0.1:8777 http://prometheus.monitoring.svc:9090/api/v1/query?query=up
kubectl --request-timeout=30s ... # через HTTPS_PROXY=socks5h://127.0.0.1:8777

单端口转发,类似 ssh -L:

{
  "tool": "open-tunnel",
  "params": {
    "type": "local",
    "localPort": 15432,
    "remoteHost": "pg-master.internal",
    "remotePort": 5432
  }
}

如果未指定 localPort,系统会自动选择端口并在响应中返回。隧道一直存在,直到 close-tunnel、SSH 连接断开或服务器停止。

限制通过标志设置:

标志

默认值

作用

--tunnel-bind-address

127.0.0.1

隧道监听的地址

--allowed-tunnel-ports

无限制

允许占用的端口列表

--max-tunnels

8

同时保持的隧道数量

--disable-tunnels

关闭

从列表中移除隧道工具

默认监听器在回环地址上启动。将地址扩展到回环之外会将代理暴露到您的网络中,因此请谨慎修改。

3. 主机密钥验证

每次连接时都会将服务器密钥与 known_hosts 进行比对,包括 ProxyJump 链中的中间主机。默认模式为 strict:主机不在 known_hosts 中则拒绝连接。

模式

行为

strict

默认。仅连接到 known_hosts 中的主机

accept-new

首次连接时记录未知主机,密钥不匹配仍然拒绝

off

不进行验证,行为与上游一致

检查 ~/.ssh/known_hosts、~/.ssh/known_hosts2 和 /etc/ssh/ssh_known_hosts,对于带有 UserKnownHostsFile 的别名,则检查 SSH 配置中指定的文件。可通过 --known-hosts-file 标志指定自定义列表。支持哈希记录、模式、[host]:port 格式和 @revoked 标记。

拒绝时返回 SSH_HOST_KEY_REJECTED 代码和包含指纹的文本:

Host key of prod.example.com is not in known_hosts (~/.ssh/known_hosts): ssh-ed25519 SHA256:xxxx.
Verify that fingerprint, add the host to known_hosts, or start the server with --host-key-checking accept-new.

密钥不匹配在任何模式下都绝不接受:服务器拒绝连接并提示主机可能被重新创建,或存在中间人攻击。

对于首次接触服务器群,建议使用 --host-key-checking accept-new 进行一次,然后恢复为 strict。

4. 审计日志

每次调用都会以 JSON 行格式记录:命令、连接、sudo 标志、守卫判定、持续时间、输出大小。输出内容不会进入日志,sudo 密码会被剔除。

{"time":"2026-08-19T08:12:44.101Z","pid":8123,"event":"command","result":"blocked","connection":"r-ulybka-prod-master","command":"useradd deploy","sudo":true,"code":"COMMAND_VALIDATION_FAILED","reason":"Blocked by the forbidden core ..."}
{"time":"2026-08-19T08:12:51.880Z","pid":8123,"event":"command","result":"ok","connection":"r-ulybka-prod-master","command":"systemctl status nginx","sudo":false,"durationMs":412,"bytes":1840}

记录 connect、command、download、upload、tunnel-open、tunnel-close、host-key 事件。

默认文件位于 $XDG_STATE_HOME/ssh-mcp-server/audit.jsonl,通常为 ~/.local/state/ssh-mcp-server/audit.jsonl,权限为 0600。

标志

默认值

作用

--audit-log <path>

XDG 状态目录

日志路径,off 值禁用记录

--audit-max-size <bytes>

10485760

文件大小达到后轮转。0 禁用内置轮转

--audit-keep <count>

10

保留的 gzip 归档数量

内置轮转:达到限制后,当前文件重命名为 audit.jsonl.1.gz,旧归档依次移位,超出 --audit-keep 的删除。十个 10 MiB 的归档在未压缩时约为 100 兆字节,gzip 后明显更小。

如果日志已由 logrotate 管理,设置 --audit-max-size 0 并使用 copytruncate 模式配置轮转。

写入错误不会导致命令失败:服务器在 stderr 中记录一次,然后继续运行。

5. 连接方式

以下是从简单到复杂的场景。在 args 中,每个标志及其值都是数组中的两个独立元素:"--host", "192.168.1.1",而不是 "--host 192.168.1.1"。

5.1 用户名和密码

{
  "mcpServers": {
    "ssh-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "@perhamm/ssh-mcp-server",
        "--host", "192.168.1.1",
        "--port", "22",
        "--username", "root",
        "--password", "pwd123456"
      ]
    }
  }
}

5.2 私钥

"args": [
  "-y", "@perhamm/ssh-mcp-server",
  "--host", "192.168.1.1",
  "--username", "root",
  "--privateKey", "~/.ssh/id_rsa",
  "--passphrase", "pwd123456"
]

密钥密码可以不写入配置,而是放在 SSH_MCP_PASSPHRASE 环境变量中。

5.3 来自 ~/.ssh/config 的单个别名

"args": ["-y", "@perhamm/ssh-mcp-server", "--host", "myserver"]

服务器从 Host myserver 块中读取 HostName、Port、User、IdentityFile 和 ProxyJump,包括 Include 指令和模板。命令行标志优先级更高:--port 2222 会覆盖配置中的端口。

5.4 堡垒主机和 ProxyJump

如果别名有 ProxyJump,链会自动建立:

Host r-ulybka-prod-master
    HostName 10.20.30.40
    User ops
    ProxyJump bastion
    IdentityFile ~/.ssh/prod_key

每个后续跳点都通过前一个跳点的通道连接,就像 ssh -J 一样。链也可以手动指定:--proxy-jump "bastion,gateway:2222"。链深度限制为五个跳点。

5.5 代理

"args": [
  "-y", "@perhamm/ssh-mcp-server",
  "--host", "192.168.1.1",
  "--username", "root",
  "--password", "pwd123456",
  "--proxy", "socks5://user:pwd@proxy-host:1080"
]

支持 socks://、socks5://、http:// 和 https://。HTTP 和 HTTPS 使用 CONNECT 方法,支持 Basic 认证,默认端口分别为 80 和 443。SOCKS5 必须指定端口。旧标志 --socksProxy 仍然有效,但仅支持 SOCKS。--proxy 和 --proxy-jump 不能同时使用。

5.6 带交互式 shell 的跳板主机

transportMode 默认为 exec。如果登录后命令无法执行,或设备仅提供交互式会话,则切换到 shell:

"args": [
  "-y", "@perhamm/ssh-mcp-server",
  "--host", "bastion.example.com",
  "--username", "ops",
  "--password", "pwd123456",
  "--transport-mode", "shell",
  "--shell-ready-timeout", "15000"
]

在 shell 模式下,命令通过单个持久会话顺序执行,upload 和 download 不可用:SFTP 已禁用。

5.7 双因素认证

--try-keyboard 标志启用键盘交互。密码和密钥自动提供,第二因素代码从 SSH_MCP_2FA_CODE 环境变量中读取。

5.8 同一服务器上的多个连接

除了 SSH 配置中的别名,旧方法仍然可用:包含连接描述的文件。

[
  {
    "name": "dev",
    "host": "1.2.3.4",
    "port": 22,
    "username": "alice",
    "privateKey": "~/.ssh/dev_key",
    "guardProfile": "safe",
    "commandTimeoutMs": 120000
  },
  {
    "name": "prod",
    "host": "5.6.7.8",
    "port": 22,
    "username": "bob",
    "privateKey": "~/.ssh/prod_key",
    "guardProfile": "readonly",
    "allowedRemotePaths": ["/var/log", "/tmp"]
  }
]
"args": ["-y", "@perhamm/ssh-mcp-server", "--config-file", "/abs/path/ssh-config.json"]

也支持对象格式,其中键是连接名称。通过 connectionName 参数选择连接,未指定时使用第一个。

6. 命令和路径限制

6.1 白名单和黑名单

"args": [
  "-y", "@perhamm/ssh-mcp-server",
  "--host", "192.168.1.1",
  "--username", "root",
  "--privateKey", "~/.ssh/id_rsa",
  "--whitelist", "^ls( .*)?,^cat .*,^df.*",
  "--blacklist", "^rm .*,^shutdown.*"
]

模板是逗号分隔的正则表达式。命令首先检查白名单,然后检查黑名单,最后检查守卫配置文件,必须通过所有三项检查。

6.2 命令模板

--command-template 包装每条命令。<quotedCommand> 将命令作为转义参数插入,<command> 原样插入。模板在工作目录替换后应用。

su root -c <quotedCommand>
docker exec -i mycontainer sh -c <quotedCommand>

6.3 文件操作路径

--allowed-local-paths 扩展了 upload 和 download 可访问的本地目录列表(默认仅当前目录)。--allowed-remote-paths 限制远程路径,使用逗号分隔的绝对 POSIX 路径。如果没有此标志,SFTP 可以访问主机的整个文件系统,服务器启动时会发出警告。

7. 超时和输出限制

参数

默认值

限制对象

工具调用中的 timeout

无

单条命令,覆盖连接设置

commandTimeoutMs

30000

exec 模式下的命令

shellCommandTimeoutMs

30000

shell 模式下的命令

connectionTimeoutMs

30000

连接建立和握手

sftpTimeoutMs

300000

SFTP 操作

maxOutputBytes

10485760

单条命令捕获的输出

keepaliveIntervalMs

10000

keepalive 间隔

超过输出限制时,命令被终止,工具返回 OUTPUT_LIMIT_EXCEEDED 以及已收集的部分。错误以 code、message 和 retriable 结构返回。

8. 命令行标志

  --config-file <path>             Файл с описанием соединений
  --ssh-config-file <path>         Путь к SSH-конфигу (по умолчанию ~/.ssh/config)
  --ssh <config>                   Соединение как JSON или пары key=value
  -h, --host <host>                Хост или алиас из SSH-конфига
  -p, --port <port>                Порт
  -u, --username <name>            Пользователь
  -w, --password <password>        Пароль
  -k, --privateKey <path>          Путь к приватному ключу
  -P, --passphrase <passphrase>    Пароль от ключа
  -a, --agent <path>               Сокет ssh-agent
  -W, --whitelist <patterns>       Белый список команд, через запятую
  -B, --blacklist <patterns>       Чёрный список команд, через запятую
  --proxy <url>                    Прокси SOCKS5, HTTP или HTTPS
  -s, --socksProxy <url>           Старый флаг только для SOCKS5
  --allowed-local-paths <paths>    Локальные каталоги для upload и download
  --allowed-remote-paths <paths>   Удалённые каталоги для SFTP
  --transport-mode <mode>          exec или shell (по умолчанию exec)
  --shell-ready-timeout <ms>       Таймаут готовности shell (по умолчанию 10000)
  --command-template <template>    Шаблон с <command> или <quotedCommand>
  --pty                            Псевдотерминал для exec (по умолчанию включён)
  --try-keyboard                   Keyboard-interactive для 2FA
  --pre-connect                    Подключиться ко всем хостам при старте
  --ssh-config-hosts               Разрешить хосты из SSH-конфига на лету
  --allowed-hosts <patterns>       Шаблоны разрешённых алиасов, через запятую
  --proxy-jump <chain>             Цепочка ProxyJump, через запятую
  --guards-profile <name>          off, safe или readonly (по умолчанию off)
  --guards-file <path>             Свой набор правил поверх встроенного
  --sudo-password-env <var>        Переменная с паролем sudo
  --sudo-user <user>               Пользователь для sudo (по умолчанию root)
  --host-key-checking <mode>       strict, accept-new или off (по умолчанию strict)
  --known-hosts-file <paths>       Свои файлы known_hosts, через запятую
  --host-key-algorithms <list>     Алгоритмы хост-ключа, через запятую
  --enable-upload                  Опубликовать инструмент upload (по умолчанию выключен)
  --audit-log <path|off>           Путь к аудит-логу (по умолчанию каталог состояния XDG)
  --audit-max-size <bytes>         Порог ротации, 0 отключает (по умолчанию 10485760)
  --audit-keep <count>             Сколько архивов держим (по умолчанию 10)
  --disable-tunnels                Убрать туннельные инструменты
  --tunnel-bind-address <addr>     Адрес для туннелей (по умолчанию 127.0.0.1)
  --allowed-tunnel-ports <ports>   Разрешённые порты туннелей, через запятую
  --max-tunnels <count>            Лимит одновременных туннелей (по умолчанию 8)
  --version, -v                    Версия пакета
  --help                           Справка

9. 安全

  • 生产环境启用 --guards-profile safe,readonly 适用于事件分析。使用 off 时,仅保留禁止的核心:其他所有内容都会执行,服务器会在日志中记录警告。

  • 密钥、密钥密码和 sudo 密码从文件和环境变量中读取。在 MCP 客户端配置中存储密钥路径,而不是密钥本身。

  • 隧道监听回环地址。SOCKS5 没有认证,因此将代理暴露在 0.0.0.0 上会将内部网络暴露给任何能访问该端口的人,服务器启动时会发出警告。

  • 没有 --allowed-remote-paths,SFTP 可以读取和写入主机上的任何路径,包括 ~/.ssh/authorized_keys。

  • 主机密钥在 strict 模式下与 known_hosts 验证。仅在实验室中才应通过 --host-key-checking off 禁用验证。

  • 没有调用频率限制。

10. 开发

npm install
npm run build
npm test

测试使用 Node.js 内置运行器运行,位于 test/。

11. 上游和许可证

该项目源自 classfang/ssh-mcp-server(作者 junki.cn),ISC 许可证。上游版权保留在 LICENSE 中,其中还包含原始仓库的链接。

守卫集合部分基于 tufantunc/ssh-mcp(MIT)的想法。

NPM 包:@perhamm/ssh-mcp-server。

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    F
    maintenance
    An MCP server that allows AI models to execute system commands on local machines or remote hosts via SSH, supporting persistent sessions and environment variables.
    1
    9 npm
    28
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that enables remote SSH command execution and bidirectional file transfers through a standardized interface. It allows AI assistants to securely manage remote servers while keeping credentials isolated and applying command-level security controls.
    ISC
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for managing multiple SSH servers via AI assistants, offering tools for remote command execution, file operations, and system monitoring.
    11
    71 PyPI
    2
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that gives AI agents SSH capabilities to execute commands, transfer files, and inspect remote systems through a preconfigured host list.
    33 npm
    MIT