Zapmyco
内置工具

shell_exec — 执行命令

在本地系统执行 shell 命令并返回标准输出、标准错误和退出码

在本地系统执行 shell 命令并返回标准输出、标准错误和退出码。

适用场景:让 AI 运行代码检查、查询系统信息、操作文件、执行 git 命令等。

参数

参数类型必填说明
commandstring要执行的 shell 命令
descriptionstring向用户解释为什么执行此命令及预期效果
working_directorystring命令执行的工作目录(绝对路径),不指定则使用当前目录

安全机制

交互模式(TTY)下,AI Agent 每次执行命令前都会弹出确认提示,由你决定是否授权:

⚠️  准备执行命令:
  └ 描述: 检查当前目录下 Rust 文件的编码格式
  └ 命令: file src/*.rs

? 是否确认执行?
  ▸ 1. 允许
    0. 拒绝
  • 允许 — 按 Enter1,命令将被执行
  • 拒绝 — 按 0,命令被取消
  • Ctrl+C — 安全退出

非交互环境(管道、CI、重定向等):默认拒绝所有命令执行,这是安全设计。

自动放行

对于绝对安全的只读命令(如查看系统信息、打印工作目录等),shell_exec 会自动放行, 不会弹出确认提示。内置命令列表按操作系统划分:

适用于 Unix 系操作系统:

类别命令说明
通用pwd打印工作目录
whoami打印当前用户名
true false无操作,返回 0/1
echo输出文本(需带参数,裸 echo 不放行)
printf格式化输出(需带参数)
cd改变工作目录
系统信息uname系统信息
hostname主机名
uptime系统运行时间
arch硬件架构
which定位命令路径(需带参数)
id用户身份信息
logname登录用户名
tty终端设备名
cal显示日历
seq生成数字序列(需带参数)
getconf系统配置变量(需带参数)
pathchk路径名检查(需带参数)
路径操作basename从路径中提取文件名(需带参数)
dirname从路径中提取目录名(需带参数)
realpath解析为绝对路径(需带参数)
目录列表ls列出目录内容
日期时间date查看当前日期时间

适用于 Windows 操作系统:

类别命令说明
通用pwd打印工作目录
whoami打印当前用户名
true false无操作,返回 0/1
echo输出文本(需带参数,裸 echo 不放行)
printf格式化输出(需带参数)
cd改变工作目录
系统信息hostname主机名
which定位命令路径(需带参数)
id用户身份信息
ver显示 Windows 版本
systeminfo显示系统信息
目录列表dir列出目录
日期时间date /t显示日期(/t 表示只查看不设置)
time /t显示时间(/t 表示只查看不设置)
vol显示卷标

匹配规则:命令以列表中的某个条目开头即匹配(前缀匹配)。 例如 ls 会放行 lsls -la,但不会误放 lsblk

即使前缀匹配,包含 ; | > < ` $ & 等控制运算符的命令仍会要求确认,这是安全保护。

内置列表的設計原则是"宁可漏放(回到确认流程)也不错放"。 如果内置列表未覆盖你常用的安全命令,可以通过 [permissions.commands] 配置自行扩展。

自定义权限配置

你可以在 ~/.zapmyco/settings.toml 中配置命令的自动放行(白名单)和自动拒绝(黑名单):

[permissions.commands]
# 自动放行的命令前缀列表(白名单)
# 命令将以"开头匹配"的方式检查:
# - "git status" 会放行 "git status" 和 "git status -s"
# - 匹配的命令会跳过用户确认
allow = [
    "git status",
    "git diff",
    "git log",
    "cargo check",
    "cargo clippy",
    "cargo fmt --check",
]

# 自动拒绝的命令前缀列表(黑名单,优先于 allow)
# 如果一个命令同时匹配 allow 和 deny,deny 优先生效
deny = [
    "rm -rf",
    "sudo",
]

在配置自定义放行命令时请谨慎评估安全性。 即使配置了放行列表,包含控制运算符的命令仍会要求确认。

约束与限制

限制项
执行超时30 秒
输出最大长度100,000 字符(stdout + stderr 合计)
Shell(Unix)sh -c
Shell(Windows)cmd.exe /C

错误场景

错误类型说明
超时命令执行超过 30 秒
命令未找到Shell 无法找到指定的可执行文件
输出过大stdout + stderr 超过 100K 字符限制
用户拒绝用户在确认提示中选择了"拒绝"或 Ctrl+C

使用示例

zapmyco run '列出当前目录的文件'
zapmyco run '运行测试并显示结果'
zapmyco run --profile advanced '重构 src/cli.rs 中的重复代码,然后运行 cargo fmt'

相关文档

On this page