我有一个 perl 脚本,可以与 sudo 配合使用,并解析 Ubuntu 14 中 /var/log/ 上的一些日志文件。我想在网页上显示程序输出。我的网页代码非常简单:
<html><body>
<h1>Under construction</h1>
<?php
exec ("perl /usr/local/bin/pflogsumm -d yesterday --smtpd_stats /var/log/mail/mail.log > parsed_mail_log.txt");
echo "<pre><p style='font-family:monospace;'>".nl2br(file_get_contents("parsed_mail_log.txt"))."</p></pre>";
?>
</body></html>
如果没有 sudo,www-data(我猜是运行脚本时的用户)就没有权限访问 /var/log/mail/mail.log,因此无法计算我想要的数据。它输出了一些内容,但只有零代替了我想要检查的数字。
我的问题是:什么才是“好的”做法?
将 www-data 放在根组中以便它可以读取日志似乎不正确。
也许我可以用 sudo 调用一个脚本,在这样的脚本中调用
sudo perl /usr/local/bin/pflogsumm -d yesterday...
并将之前的脚本添加到 visudo 中,以便 www-data 可以使用 sudo 运行它而无需身份验证。同样,这似乎不是“好的”或“正确的”做法...
有什么建议吗?
答案1
为什么不每天早上运行一个 cron 任务(以 root 身份)来执行
perl /usr/local/bin/pflogsumm -d yesterday --smtpd_stats /var/log/mail/mail.log > /path/to/parsed_mail_log.txt; chown www-data.www-data /path/to/parsed_mail_log.txt
(假设是 Ubuntu - 在 chown 上使用适当的 apache 所有者),然后在浏览器中执行第二部分
这会更加安全(无需从浏览器执行脚本 - 从命令行执行脚本就更少了),速度更快 - 它可以在非高峰时段而不是实时预处理数据,而且更简单。
答案2
好的开始是查看日志文件的所有者和组 ( ls -l /var/log/mail/mail.log
)。让它们公开可读通常不是一个好主意。然后检查在哪个组www-data
中:groups www-data
应该会告诉你。
您可以
- 调整文件的权限以便用户访问(可能不太清楚)
- 调整访问这些文件的用户组(该文件的现有组)
在脚本中使用无密码sudo
不是一个好主意。