用于捕获用户拥有的文件的Cgi-bin脚本

时间:2014-03-13 18:07:42

标签: linux apache bash file-permissions cgi-bin

我正在使用Ubuntu服务器,我有一个cgi-bin脚本执行以下操作。 。

#!/bin/bash
echo Content-type: text/plain
echo ""
cat /home/user/.program/logs/file.log | tail -400  | col -b > /tmp/o.txt
cat /tmp/o.txt

现在如果我运行这个脚本我就是" su"脚本填写o.txt然后运行host.com/cgi-bin/script,但只显示我上次从CLI运行它的位置

我的apache错误日志显示"权限被拒绝"错误。所以我知道用户apache在某种程度上运行不能cat这个文件。我尝试使用chown无济于事。由于此文件位于用户目录中,复制它或符号链接的最佳方式是什么?或者什么?

我甚至考虑在crontab中以root身份运行脚本来排序"更新" / tmp /中的文件但对我不起作用。 cgi-bin的用户如何处理用户目录中的文件?

2 个答案:

答案 0 :(得分:3)

Apache用户www-data没有对另一个用户拥有的临时文件的写访问权。

但在这种特殊情况下,不需要临时文件。

tail -n 400 logfile | col -b

但是,如果Apache在受限chroot内运行,则它也无权访问/home

日志文件必须为chmod o+r,所有通向它的目录应为chmod o+x。确保你理解这个含义!如果用户有理由想要阻止访问中间目录,则对文件本身具有读访问权限是不够的。 (理论上可以使某些东西www-data成为其所有者,但是不切实际且没有意义,因为任何找到CGI脚本的人都可以访问该文件。)

更一般地说,如果你确实需要一个临时文件,那么简单修复(甚至不是解决方法)就是生成一个唯一的临时文件名,然后将其删除。

temp=$(mktemp -t cgi.XXXXXXXX) || exit $?
trap 'rm -f "$temp"' 0
trap 'exit 127' 1 2 15

tail -n 400 logfile | col -b >"$temp"

第一个trap确保在脚本终止时删除文件。第二个确保第一个trap在脚本被中断或被杀死时运行。

答案 1 :(得分:2)

我倾向于首先更改创建日志的程序并将其写入Apache可见的某个位置 - 可能通过符号链接。

例如:

ln -s /var/www/cgi-bin/logs /home/user/.program/logs

所以你的程序继续写入/home/user/.program/logs,但数据实际上位于/var/www/cgi-bin/logs,Apache可以读取它。

相关问题