运行 AI 生成的 Bash 脚本之前,先看看这篇
AI助手12秒就写出了一个Bash脚本。脚本里有注释、有进度提示,最后一行还写着“Done!(完成)”。看起来挺专业。可惜,自信不能当权限边界用。执行之前,先问一个问题:这个脚本会改动什么?我怎么知道改的就是我想改的?你不用怀疑AI写的每一行代码,但你需要一套审查流程,而且这套流程不能建立在“AI说得像那么回事”上面。
1. 把请求变成有边界的任务
“帮我清理服务器”算不上需求说明。更适合审查的请求长这样:
在某个指定的实验目录里,列出超过14天的普通.log文件。不删除、不上传、不改所有权、不跟随符号链接目录。打印候选文件,交给人工审查。
现在边界看得见了。目录、文件年龄、文件类型、允许的操作,全都明确。这就好比告诉别人去整理哪个柜子,而不是说“把房子收拾一下”。你的护照不该成为附带损害。
2. 检查语法之前,先审这四件事
- 目标:路径最终指向的是预期目录吗?远程主机和账号对不对?
- 权限:脚本用哪个用户执行?能不能写到目标之外、访问机密信息、调用特权命令?
- 输入:文件名、环境变量或不可信文本,会不会改变命令的含义?
- 影响:会不会删除、安装、修改权限、发送数据、停止服务或改动数据库?
一条语法完全正确的命令,照样可能作用在错误的环境上。Shell静态检查工具没法替你判断业务意图。
3. 先检查,别急着改
下面这个Bash例子只做一件事:列出候选文件。假设实验用的Linux机器上装了GNU find:
#!/usr/bin/env bash
set -euo pipefail
TARGET=${1:?Usage: inspect-logs.sh /path/to/lab-logs}
if [[ ! -d "$TARGET" || -L "$TARGET" ]]; then
printf '%s\n' 'Choose an existing, non-symlink lab directory.' >&2
exit 1
fi
TARGET=$(realpath -- "$TARGET")
if [[ "$TARGET" == / ]]; then
printf '%s\n' 'The filesystem root is not an acceptable target.' >&2
exit 1
fi
printf 'Inspection only.
Target: %q\n' " $TARGET " find -P " $TARGET " -xdev -type f -name '*.log' -mtime +14 -print0 | while IFS = read -r -d '' candidate ; do printf 'Candidate: %q\n' " $candidate " done 这一步只是审查演练,并不是隔离机制。检查期间文件系统可能发生变化;仅靠路径校验并不能防止竞态条件。-xdev 也有意避免进入其他挂载的文件系统。GNU find 的年龄测试采用其文档中说明的舍入规则——如果保留策略依赖“超过 14 天”,就需要精确定义这一条件。末尾并没有隐藏的删除步骤。先检查;如果确实需要修改,再单独设计变更操作。4. 检查语法和常见 shell 错误 bash -n inspect-logs.sh
ShellCheck 可以在不执行脚本的情况下检查 Bash 语法,能发现很多常见的 shell 问题。但这两样工具都不能证明脚本安全,也不能证明它适合你的环境。
准备一个一次性目录,里面放些普通文件、带空格的文件名、意料之外的文件名、一个符号链接,以及一个本不该被匹配到的文件。运行脚本之前,先确定你预期的候选文件列表。这样得到的结果才能拿来比对,而不只是看着顺眼。
5. 提示词不是安全控制手段
AI 助手可能会读取日志、网页或文档,而这些内容里可能夹带你并未写下的指令。正因如此,区分“数据”和“指令”才格外重要。仅靠提示词的措辞,不该成为你的强制执行层。参考 OWASP 的提示词注入防护指南。
把限制放在执行环境里:收窄凭据权限、限制可用工具、对高风险操作要求显式批准。模型负责提议,周边系统决定什么能做。另外:命令失败就加 sudo,这不叫排查问题,这叫把错误的规模放大。这个习惯值得保留。
执行前该保留的习惯
在执行之前,用自己的话把脚本讲清楚,找出每一处写操作和网络操作,并说明你打算如何验证结果。如果现在还做不到,就要求一个更小的脚本,或者一个只读版本。需要别人解释并不可耻,服务器不会给勇敢加分。
面对一个陌生的 shell 脚本,你最先检查什么:路径、权限、网络调用、引号处理,还是别的?
草稿在 AI 辅助下完成。文中示例脚本在起草阶段通过了 Bash 语法检查和一次性文件夹具测试。ShellCheck 检查与针对具体作者环境的审查仍待完成。
Linux #Bash #AI #Security
助手十二秒就写好了一个 Bash 脚本。里面有注释,有进度提示,最后一行还会打印一句「Done!」。看着挺专业,兄弟。
可惜,语气再笃定,也划不出权限边界。运行之前先问一句:这个脚本能改动什么?我又凭什么确认,它改的正是我想改的那些东西?
你不需要对 AI 写出的每一行都抱着怀疑,你需要一套审查流程,而且这套流程靠不靠得住,不能取决于助手说话像不像那么回事。
- 先把需求转译成一份……