看到 <html> 或 <!DOCTYPE,就先停下来
运行刚下载的脚本时出现 syntax error near unexpected token,不一定是 Bash 版本太旧。可能只是把登录页、404页或带下载按钮的网页保存成了 .sh。
这时不要继续给文件加执行权限,也不要把它复制进管理员终端。先检查你已经下载的那个文件:
head -n 5 ./tool.sh
把 tool.sh 换成实际文件名。若开头是网页标记,先找真正的文件地址。真实脚本也不一定只有一种首行,但不能只靠扩展名判断内容。
1. 保存响应信息,而不是边下载边执行
下面用本站公开的诊断脚本演示完整下载过程:
curl --disable --fail --location --connect-timeout 3 --max-time 15 \
--dump-header tool.headers --output tool.sh \
--write-out 'HTTP=%{http_code} final=%{url_effective}\n' \
https://netgoeasy.com/scripts/dns-check.sh
download_status=$?
printf 'download_exit=%s\n' "$download_status"
最后一行应显示download_exit=0;非0时停在这里,不执行后面的语法检查或运行命令。重新检查地址、网络和错误,再重新下载。
这里会创建 tool.headers 和 tool.sh。在空目录操作,或者先确认没有同名重要文件。不要把这条命令改成下载后直接接给 Bash 执行。
--fail 让 HTTP 错误状态返回失败,--location 跟随重定向。但200状态仍可能是登录页,跟随重定向也不保证最终站点是你想要的发布方。
2. 核对这三项,再看源码
head -n 12 ./tool.headers
head -n 5 ./tool.sh
less ./tool.sh
在 less 中按 q 退出。重定向时,头文件可能包含多段响应,要结合命令最后打印的最终地址与状态判断。
| 结果 | 怎样处理 |
|---|---|
| 404、403等错误 | 回到原发布页核对地址或访问条件,不执行残留文件 |
| 200,但正文是 HTML | 可能是展示页、登录页或验证页,查原发布者提供的直接文件入口 |
| 最终域名和原预期不同 | 先确认分发关系,不把跳转自动当成可信授权 |
| 内容是脚本 | 继续查看它要改什么、需要什么权限,核对用途后再运行 |
Content-Type 是线索,不是安全鉴定。真正的脚本也可能被服务器作为普通文本或二进制流发送。
3. 用已确认的文件做语法检查
确认文件来源与用途后,Bash 脚本可先检查语法:
bash -n ./tool.sh
语法通过只说明 Bash 能解析它,不能证明脚本安全。以这里的 DNS 检查工具为例,核对内容后才运行:
bash ./tool.sh localhost
localhost 是本机检查,不证明外部 DNS 正常。详细结果见域名解析脚本教程。下载别的脚本时不要照搬这个参数。
为什么 --fail 没挡住那个网页?
因为有些错误页面或登录页也返回200。必须同时核对状态、最终地址和内容。HTTP200只说明服务器给出成功状态,不会替你检查内容是不是脚本。404或网络中断后也可能存在旧文件或部分文件;命令失败后不要继续执行它。
检查结束后,可删除你自己新建的头文件和临时副本;不要用模糊通配符删除目录。本站工具的固定下载地址不要求登录,但这不代表所有第三方下载页也一样。
参考资料
- curl 使用手册 · 资料日期 2026-10-22