用于对用户拥有的文件进行分类的 Cgi-bin 脚本
Posted
技术标签:
【中文标题】用于对用户拥有的文件进行分类的 Cgi-bin 脚本【英文标题】:Cgi-bin script to cat a file owned by a user 【发布时间】:2014-04-18 16:44:19 【问题描述】:我正在使用 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 的人如何处理对用户目录中文件的访问?
【问题讨论】:
每分钟运行一次tail -n 400 logfile | sudo -u www-data tee /var/www/tail.txt >/dev/null
将首先消除对 CGI 脚本的需求。
【参考方案1】:
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
在脚本被中断或终止时运行。
【讨论】:
我尝试单独使用tail,这是我的apache错误日志tail中的新错误:无法打开`/home/user/.program/log'进行阅读:权限被拒绝trap
中的信号编号应该是正确的符号。太老了,懒得去查了。 EXIT 和 ... 我猜是什么 anf HUP 和 INT?
用户是否知道并同意这一点?那么获得权限和/或将文件移动到更易于访问的位置应该是一件简单的事情。
是的,用户是我的用户,该文件是用户空间中的程序创建的日志,不应以 root 身份运行。有没有一种简单的方法可以将该文件实时复制到 apache 可以访问的位置?我在考虑 crontab,但您可能知道更简单的方法。
将文件放在一个健全的地方可能会更好。请注意最近的更新:目录权限。【参考方案2】:
我倾向于首先更改创建日志的程序,并将其写入 Apache 可见的某个位置 - 可能通过符号链接。
例如:
ln -s /var/www/cgi-bin/logs /home/user/.program/logs
因此,您的程序继续写入 /home/user/.program/logs
,但数据实际上落在了 Apache 可以读取的 /var/www/cgi-bin/logs
。
【讨论】:
如果不允许最终目的地,Apache 也将无法遍历符号链接。否则,获得对您被阻止的内容的访问权限将是微不足道的! Apache 不需要使用符号链接。 OP 的原始程序通过符号链接写入,Apache 读取真实文件。抱歉,我的链接是从前到后的。 符号链接对我来说很有意义,我认为可能是这样,我在系统上运行了等效的逻辑,但 ln 说“创建失败,文件存在”。抱歉,我不知道,有时 cgi 脚本会运行 btw 。 . .我很困惑。 你需要把旧文件移到一边,或者运行ln -fs
强制它。不过,这将覆盖任何现有日志。以上是关于用于对用户拥有的文件进行分类的 Cgi-bin 脚本的主要内容,如果未能解决你的问题,请参考以下文章