'/ var / spool / cron'不是一个目录,救援。 当试图通过PHP的shell_exec与crontab工作

我正在创build一个Web应用程序。 部分function取决于用户可以启动/停止导入电子邮件的cronjob。

它不起作用。

只是为了确保我在正确的轨道上,作为一个初学者,我只是想从PHP的'crontab -l'工作,并打印到Web浏览器。

这是我怎么做(handle_email_cronjob.php):

$output = shell_exec('crontab -l'); echo $output; 

但我得到的只是一无所有。 (做shell_exec('ls -l');给我目录中的文件/目录列表)

猫error_log:

 '/var/spool/cron' is not a directory, bailing out. 

那么,无论错误日志说什么,它都是一个目录。 ls -Z / var / spool:

 drwxr-xr-x. apache apache system_u:object_r:httpd_sys_rw_content_t:s0 cron 

SELinux已经启动,我不希望改变。

ls -Z / var / spool / cron:

 -rwxrwxrwx. apache apache unconfined_u:object_r:httpd_sys_rw_content_t:s0 apache -rw-------. root root unconfined_u:object_r:cron_spool_t:s0 root 

这是应该使用的Apache。 (我尝试设置cron_spool_t到Apache,但仍然没有工作。)

ls -Z handle_email_cronjob.php:

 -rwxr-xr-x. apache apache unconfined_u:object_r:httpd_sys_script_exec_t:s0 handle_email_cronjob.php 

在许可模式下运行时,我在audit.log中得到了下面的内容(有点奇怪,第一次设置模式为宽容后,我得到很多日志,但是第二次看起来像这样。

 type=USER_ACCT msg=audit(1337714471.878:4452): user pid=11385 uid=48 auid=0 ses=113 subj=unconfined_u:system_r:httpd_t:s0 msg='op=PAM:accounting acct="apache" exe="/usr/bin/crontab" hostname=? addr=? terminal=cron res=success' type=CRED_ACQ msg=audit(1337714471.878:4453): user pid=11385 uid=48 auid=0 ses=113 subj=unconfined_u:system_r:httpd_t:s0 msg='op=PAM:setcred acct="apache" exe="/usr/bin/crontab" hostname=? addr=? terminal=cron res=success' 

但是在强制模式下,我得到:

 type=AVC msg=audit(1337714912.294:4458): avc: denied { getattr } for pid=11416 comm="crontab" path="/var/spool/cron" dev=dm-0 ino=262695 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:system_cron_spool_t:s0 tclass=dir type=SYSCALL msg=audit(1337714912.294:4458): arch=c000003e syscall=4 success=no exit=-13 a0=7f3f120a968f a1=7fff03e9cf40 a2=7fff03e9cf40 a3=7f3f122ac2e0 items=0 ppid=10835 pid=11416 auid=0 uid=48 gid=48 euid=0 suid=0 fsuid=0 egid=48 sgid=48 fsgid=48 tty=(none) ses=113 comm="crontab" exe="/usr/bin/crontab" subj=unconfined_u:system_r:httpd_t:s0 key=(null) 

我认为应该logging错误,但不是停止,在宽容模式?

我只是有一种直觉,认为它与SELinux有关,但我无法弄清楚如何解决这个问题。

有什么问题,我该如何解决? (还是有比这更好的方法呢?)

请原谅我发表这个答案,我只是需要格式。

如果你做了以下事情,你会得到什么?只是为了取消cron,并使用像猫一样简单的东西。 我也假设你正在试图获得Apache的crontab。 并假设PHP运行为Apache。

 $output = shell_exec('/bin/cat /var/spool/cron/apache'); echo $output; 

在学习了SELinux的故障排除之后,我意识到我必须标记/ var / spool / cron,以便httpd可以读写该目录:

 chcon -R -t httpd_sys_script_rw_t /var/spool/cron 

参考文献:

了解audit.log

排除SELinux故障