我正在使用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的用户如何处理用户目录中的文件?
答案 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可以读取它。