Apache2 Bash CGI:动态时间页面与请求验证
1. 服务介绍
CGI 让 Apache 执行服务端程序并将输出作为 HTTP 响应。本文用固定 Bash 脚本输出系统时间,说明响应头后的空行、模块与执行权限;不接受用户输入或拼接系统命令。
2. 准备运行环境
UOS/Debian 系 Apache2、Bash、管理员配置权限及隔离测试站点。先确认 Apache MPM 和现有虚拟主机,不将整个上传目录开放为可执行脚本。浏览器请求以Web服务账号执行,不应获得root权限。
3. 相关知识与注意点
• CGI输出先写Content-Type,再空行分隔头和正文;空行不是装饰。
• Shell命令区分大小写,使用printf/date而非Echo和中文引号。
• threaded MPM一般使用cgid,prefork可用cgi;按实际模块依赖确认。
• 不启用目录索引,不对任意.sh全站启用ExecCGI;限制到受控CGI目录。
• 脚本由管理员维护,不可被Web账号或上传用户修改。
4. 实验步骤
Debian系按实际MPM启用对应CGI模块,例如:
apache2ctl -V
sudo a2enmod cgid
在受控虚拟主机中配置独立路径,实际目录替换为管理员创建的目录:
ScriptAlias /lab-cgi/ /var/www/lab-cgi/
<Directory /var/www/lab-cgi>
Options -Indexes +ExecCGI
AllowOverride None
Require local
</Directory>
仅允许本机测试;若需远程客户端,按明确授权网段调整访问规则。将time.sh放入该目录:
#!/bin/bash
printf 'Content-Type: text/plain; charset=UTF-8\r\n'
printf 'Cache-Control: no-store\r\n\r\n'
printf 'Current system time is: %s\n' "$(LC_ALL=C date '+%Y/%m/%d %r')"
脚本须可被Web账号读取执行,父目录可遍历;不要chmod 777。配置验证后reload:
sudo apache2ctl configtest
sudo systemctl reload apache2
curl -i http://127.0.0.1/lab-cgi/time.sh
5. 原实验截图



6. 验证命令
先 bash -n time.sh、apache2ctl configtest;curl -i 两次请求,间隔数秒,比较时间变化和Content-Type。apache2ctl -M 查看cgi/cgid模块;journalctl -u apache2 -n 50 --no-pager 以及 /var/log/apache2/error.log 排查500。403查Require与目录权限;源码直接返回时停止对外访问,修正CGI映射;不要添加sudo绕过权限。本文未实际部署,动态输出以现场请求为准。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_44524357/article/details/170420034



