用于对用户拥有的文件进行分类的 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 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何限制对 Firestore 中用户拥有的文档的写入?

文件类型分类

在构建决策树模型时处理分类特征

使用 LSA/SVD 进行文档分类

Django 石墨烯中继限制对用户拥有的对象的查询

如何删除其他用户拥有的文件