我正在使用 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 运行时无法捕获此文件。我尝试使用 chown 但没有成功。由于该文件位于用户目录中,复制它或符号链接(symbolic link)它的最佳方法是什么?
我什至考虑过在 crontab 中以 root 身份运行脚本来“更新”/tmp/中的文件,但这对我来说不起作用。有 cgi-bin 经验的人将如何处理对用户目录中文件的访问?
最佳答案
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"
第一个陷阱
确保脚本终止时删除文件。第二个确保在脚本被中断或终止时第一个陷阱
运行。
关于linux - 用于捕获用户拥有的文件的 Cgi-bin 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22387265/