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

标签 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 运行时无法捕获此文件。我尝试使用 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/

相关文章:

python - 使用 Python 查找远程主机操作系统的有效方法

linux - 使用 jboss 7.1 将图像显示为 url

apache - 使用 nutch 0.9 创建搜索引擎的问题

php - 使用 PHP 的 exec() 函数重定向 shell 命令的输出

java - Apache http 服务器重写 url 失败

linux - 我应该对同一文件上的并行 sed 执行进行竞争条件检查吗?如果是,那么如何锁定文件

regex - 在一行匹配后替换为第 N 行中存在的字符串

regex - 如何从文件中删除与正则表达式不匹配的行?

regex - Linux Shell 脚本 - 正则表达式过滤带有日期的文件名

bash - 为什么另一个字符串中的一个字符串在bash/ssh中拆分?