我的 apache 服务器上有一个统计文件
/var/www/vhosts/test/statistics/logs/access_log
我尝试使用
echo system('cat /var/www/vhosts/test/statistics/logs/access_log');
在 php 脚本中访问它,但我没有得到任何输出。
echo system('dir');
给出预期的 dir 输出。
cat /var/www/vhosts/test/statistics/logs/access_log
不过,使用腻子连接并以 root 身份工作。
如何通过 php 脚本访问日志?
答案1
您的 HTTP 进程无法访问该文件。 CentOS 6 Apache 进程以 apache 用户身份运行。例子:
[root@talara ~]# ps aux | grep httpd
root 2300 0.0 2.7 334744 28020 ? Ss Jul10 0:47 /usr/sbin/httpd
apache 8354 0.0 2.0 334744 20536 ? S Jul21 0:00 /usr/sbin/httpd
apache 8355 0.0 2.0 334744 20536 ? S Jul21 0:00 /usr/sbin/httpd
apache 8356 0.0 2.0 334744 20536 ? S Jul21 0:00 /usr/sbin/httpd
为了测试以 apache 形式访问文件,我这样做:
[root@talara ~]# su apache
bash-4.1$ cat /var/log/messages
cat: /var/log/messages: Permission denied
bash-4.1$
我所知道的大多数允许 apache 直接访问这些文件的方法都会因为它打开的巨大安全漏洞而以某种方式受到反对。但是,如果您认为安全性已足够,请将 apache 添加到不带密码的 sudoers 文件中(看到了吗?非常非常糟糕)。然后将 PHP 代码更改为如下所示:
echo system('sudo cat /var/www/vhosts/test/statistics/logs/access_log');
欢迎社区就更好的方法提出意见。
答案2
您进行系统调用来访问该文件是否有特定原因?
如果没有,您可以使用 PHP 中的现有构造来访问该文件:
$log = file_get_contents('/var/www/vhosts/test/statistics/logs/access_log');
或者
$log = file('/var/www/vhosts/test/statistics/logs/access_log');