关于 Shellguard
ShellGuard 是一个 MCP 服务,让 LLM Agent 通过 SSH 以只读方式访问远程 Linux 主机。它在执行前解析并校验每条命令,只允许白名单中的诊断类命令,并对被拒绝的操作给出替代建议。适合需要在生产或测试环境中排查问题的运维与开发人员。
主要功能
- 01通过 SSH 连接远程 Linux 主机
- 02命令解析、白名单校验与参数重组
- 03默认拒绝的只读命令策略
- 04被拒绝命令附带可操作的修正建议
- 05支持原生与系统 ssh 两种模式
- 06可按需提供诊断工具 rg、jq、yq
适用场景
- 01让 AI 助手查看生产服务器日志并排查故障
- 02在预发布或开发环境中执行只读诊断
- 03在无法直接粘贴终端输出时辅助远程排障
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
ShellGuard
别再把终端输出复制粘贴到 AI 中了。让你的 LLM 通过 SSH 登录并查看情况。
ShellGuard 是一款 MCP 服务,可让 LLM Agent 通过 SSH 受控地访问远程服务器上的 bash。将 AI 连接到生产、预发布或开发服务器,让它自动运行诊断、检查日志、查询数据库并排查问题。
ShellGuard 是由 Fawdy 团队打造的开源安全层。它为 Fawdy 的 AI Linux 服务器调查工具提供支持,该工具能够以通俗易懂的语言给出根因分析。
你可以将 ShellGuard 单独与任何兼容 MCP 的 AI Agent 搭配使用,也可以通过 Fawdy 体验完整的调查功能。
为什么选择 ShellGuard?
AI Agent 能力强大,但让它们不受限制地访问生产服务器的 shell 存在风险。ShellGuard 通过在命令级别强制执行只读访问来解决这一问题。每条命令都会经过解析、与允许列表进行验证,然后重新构建再执行。如果 Agent 尝试执行具有破坏性的操作,ShellGuard 会拦截命令,并告诉 Agent 应该怎么做。
命令仅限于一组经过筛选的观察和诊断工具。系统会拦截具有破坏性的操作,并提供可行的建议,让 LLM 能自行纠正并继续调查:
wget -r->"Recursive downloading is not allowed"tail -f->"Follow mode hangs until timeout. Use tail -n 100 for recent lines."sed->"Stream editing can modify files -- read-only access only. Use grep for searching."$HOME/file->"Variable expansion will not expand. Use absolute paths."
快速开始
安装
brew install fawdyinc/tap/shellguard
或下载最新的二进制文件:
curl -fsSL https://raw.githubusercontent.com/fawdyinc/shellguard/main/install.sh | sh
或使用 Go:
go install github.com/fawdyinc/shellguard/cmd/shellguard@latest
配置 MCP 客户端
ShellGuard 会作为 stdio MCP 服务启动,无需任何参数。将它添加到你选择的 MCP 客户端:
Cursor
前往:Settings -> Cursor Settings -> MCP -> Add new global MCP server
也可以将以下内容粘贴到 ~/.cursor/mcp.json 文件中。你也可以在项目文件夹中创建 .cursor/mcp.json,按项目安装。更多信息请参阅 Cursor MCP 文档。
{
"mcpServers": {
"shellguard": {
"command": "shellguard"
}
}
}
Claude Desktop
将以下内容添加到 Claude Desktop 配置文件中。更多信息请参阅 Claude Desktop MCP 文档。
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"shellguard": {
"command": "shellguard"
}
}
}
OpenCode
将以下内容添加到 OpenCode 配置文件中。更多信息请参阅 OpenCode MCP 文档。
{
"mcp": {
"shellguard": {
"type": "local",
"command": ["shellguard"],
"enabled": true
}
}
}
VS Code / GitHub Copilot
将以下内容添加到 VS Code 的 settings.json 或 .vscode/mcp.json 中。更多信息请参阅 VS Code MCP 文档。
用户设置(settings.json)
{
"mcp": {
"servers": {
"shellguard": {
"type": "stdio",
"command": "shellguard"
}
}
}
}
工作区配置(.vscode/mcp.json)
{
"servers": {
"shellguard": {
"type": "stdio",
"command": "shellguard"
}
}
}
Zed
将以下内容添加到 Zed 设置文件(~/.config/zed/settings.json)中。更多信息请参阅 Zed MCP 文档。
{
"context_servers": {
"shellguard": {
"command": {
"path": "shellguard",
"args": []
}
}
}
}
Roo Code
前往:Roo Code Settings -> MCP Servers -> Edit MCP Settings
也可以将以下内容添加到 Roo Code MCP 设置文件中。更多信息请参阅 Roo Code MCP 文档。
{
"mcpServers": {
"shellguard": {
"command": "shellguard"
}
}
}
ShellGuard 向大模型提供 6 个工具:
| 工具 | 描述 |
|---|---|
connect | 与远程主机建立 SSH 连接 |
execute | 在远程主机上运行经过验证的 shell 命令 |
disconnect | 关闭 SSH 连接 |
sleep | 在诊断检查之间等待(最长 15 秒) |
provision | 将诊断工具(rg、jq、yq)部署到远程主机 |
download_file | 通过 SFTP 从远程主机下载文件(上限为 50 MB) |
可通过 disabled_tools 配置选项或 SHELLGUARD_DISABLED_TOOLS 环境变量禁用 provision、download_file 和 sleep。
大模型连接到服务器、运行命令并读取输出——这与手动操作的工作流相同,但无需在不同上下文之间切换。
工作原理
每条命令到达远程主机前都会经过以下处理流程:
- 解析——将 bash 解析为 AST。在语法层面拒绝 shell 技巧(分号、重定向、命令替换等)。
- 验证——根据精选的命令允许列表(并配有明确的拒绝列表)检查命令、标志和参数。默认拒绝。
- 重构——重新引用参数以防止注入。
- 执行——通过 SSH 运行命令,并设置每条命令的超时时间和输出截断。
完整详情请参阅 ARCHITECTURE.md。
SSH 配置
身份验证
ShellGuard 按以下顺序尝试身份验证方式,并在首次成功后停止:
| 优先级 | 方式 | 来源 | 失败时 |
|---|---|---|---|
| 1 | 显式密钥 | connect 中的 identity_file 参数 | 致命错误——立即连接失败 |
| 2 | ssh-agent | SSH_AUTH_SOCK Unix 套接字 | 静默跳过 |
| 3 | 默认密钥 | ~/.ssh/id_ed25519、id_ecdsa、id_rsa | 静默跳过 |
在默认密钥发现过程中,加密密钥会被静默跳过。如果通过 identity_file 指定加密密钥,连接将失败。请先将密钥添加到 Agent:ssh-add ~/.ssh/my_key。
SSH 模式
ShellGuard 支持两种 SSH 模式:
| 模式 | 描述 |
|---|---|
native | (默认) 使用 Go 内置的 SSH 库。读取 ~/.ssh/config 中的 HostName、User、Port 和 IdentityFile。轻量级,无外部依赖。 |
system | 使用本地 ssh 二进制文件。全面支持 ~/.ssh/config,包括 ProxyJump、ProxyCommand、Match 块和所有其他 OpenSSH 功能。需要安装 ssh。 |
如果通过堡垒主机连接、使用 ProxyJump,或依赖 SSH 配置中的 Match 块,请启用 system 模式:
ssh:
mode: system
export SHELLGUARD_SSH_MODE=system
如果将 mode 设为 system,但找不到 ssh 二进制文件,ShellGuard 会记录警告并回退到 native 模式。
**Native 模式限制:**不支持 Match 指令、ProxyJump、ProxyCommand 和 ForwardAgent。如果基础设施需要这些功能,请使用 system 模式。
System 模式说明:
- 主机密钥验证完全由 OpenSSH 处理。
host_key_checking和known_hosts_file设置仅适用于 native 模式。 - 连接使用 OpenSSH
ControlMaster进行多路复用,因此每台主机仅第一个连接需要承担 SSH 握手开销。
主机密钥验证
ShellGuard 使用 ~/.ssh/known_hosts 验证 SSH 主机密钥。提供三种模式:
| 模式 | 行为 |
|---|---|
accept-new | (默认) 首次使用时信任。接受未知主机并将其写入 known_hosts。拒绝密钥变更。 |
strict | 要求主机密钥已存在于 known_hosts 中。拒绝未知主机。 |
off | 完全禁用主机密钥验证。 |
如果主机密钥已变更,请从 known_hosts 文件中删除旧条目。
配置
设置可在 YAML 配置文件中指定,也可通过环境变量指定。环境变量优先级更高。
配置文件位置: $XDG_CONFIG_HOME/shellguard/config.yaml(默认:~/.config/shellguard/config.yaml)
ssh:
mode: "native" # native | system
connect_timeout: "10s" # default 10s
retries: 2 # default 2
retry_backoff: "250ms" # default 250ms
host_key_checking: "accept-new" # accept-new | strict | off (native mode only)
known_hosts_file: "~/.ssh/known_hosts" # native mode only
| YAML 字段 | 环境变量 | 默认值 | 描述 |
|---|---|---|---|
ssh.mode | SHELLGUARD_SSH_MODE | native | SSH 模式:native(内置)或 system(使用本地 ssh 二进制文件) |
ssh.connect_timeout | SHELLGUARD_SSH_CONNECT_TIMEOUT | 10s | TCP 和 SSH 握手超时 |
ssh.retries | SHELLGUARD_SSH_RETRIES | 2 | 连接/执行重试次数 |
ssh.retry_backoff | SHELLGUARD_SSH_RETRY_BACKOFF | 250ms | 基础退避时长(指数增长:backoff * 2^attempt) |
ssh.host_key_checking | SHELLGUARD_SSH_HOST_KEY_CHECKING | accept-new | 主机密钥验证模式(仅限 native 模式) |
ssh.known_hosts_file | SHELLGUARD_SSH_KNOWN_HOSTS_FILE | ~/.ssh/known_hosts | known_hosts 文件路径(仅限 native 模式) |
工具集部署
远程服务上不一定有你需要的工具。执行 connect 时,ShellGuard 会检查是否有 rg、jq 和 yq。如果缺少其中任何一个,大模型便可调用 provision 来部署它们:
| 工具 | 版本 | 架构 |
|---|---|---|
rg (ripgrep) | 14.1.1 | x86_64, aarch64 |
jq | 1.7.1 | x86_64, aarch64 |
yq | 4.52.2 | x86_64, aarch64 |
二进制文件从 GitHub Releases 下载并通过 SHA-256 校验,缓存在本地,然后部署到远程主机的 ~/.shellguard/bin/。
库用法
ShellGuard 可作为 Go 库使用:
package main
import (
"context"
"log/slog"
"os"
"github.com/fawdyinc/shellguard"
)
func main() {
ctx := context.Background()
logger := slog.New(slog.NewTextHandler(os.Stderr, nil))
err := shellguard.RunStdio(ctx, shellguard.Config{Logger: logger})
if err != nil {
os.Exit(1)
}
}
如需了解高级用法,请参阅下文的自定义配置和自定义执行器部分。
自定义配置
import (
"github.com/fawdyinc/shellguard"
"github.com/fawdyinc/shellguard/manifest"
"github.com/fawdyinc/shellguard/server"
)
manifests, _ := manifest.LoadEmbedded()
// Add or remove commands as needed
core, err := shellguard.New(shellguard.Config{
Manifests: manifests, // Custom registry (nil = embedded defaults)
Executor: myCustomExecutor, // Custom backend (nil = SSH)
Name: "my-server", // MCP server name
Version: "1.0.0", // MCP server version
})
自定义执行器后端
实现 server.Executor 接口即可使用非 SSH 后端:
type Executor interface {
Connect(ctx context.Context, params ssh.ConnectionParams) error
Execute(ctx context.Context, host, command string, timeout time.Duration) (ssh.ExecResult, error)
ExecuteRaw(ctx context.Context, host, command string, timeout time.Duration) (ssh.ExecResult, error)
SFTPSession(host string) (ssh.SFTPClient, error)
Disconnect(host string) error
}
测试
make test # Run all tests
make test-race # Run with race detector
make lint # Run go vet
项目结构
shellguard/
shellguard.go # Top-level constructor (New, RunStdio)
cmd/shellguard/ # CLI entrypoint
server/ # MCP server core, tool registration, Executor interface
parser/ # Shell AST parser (mvdan.cc/sh/v3)
validator/ # Command/flag/SQL validation engine
manifest/ # YAML command registry (embed.FS)
manifests/ # allowed command manifests
manifests/denied/ # denied command manifests
ssh/ # SSH manager, ShellQuote, ReconstructCommand
output/ # Output truncation (64KB cap)
toolkit/ # Diagnostic tool provisioning (rg, jq, yq)
体验完整功能
ShellGuard 本身就很好用。如果你希望自动调查事件并生成通俗易懂的根因报告,可以了解一下 Fawdy。它通过 ShellGuard 连接到你的 Linux 服务器,并自动调查事件。10 分钟即可完成设置。
许可证
Apache License 2.0。详情请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。