我正在创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故障