我正在创建一个 Web 应用程序。部分功能取决于用户可以启动/停止导入电子邮件的 cronjob。
它不起作用。
只是为了确保我走在正确的轨道上,作为初学者,我只想让 php 的“crontab -l”运行并将其打印到 Web 浏览器。
这是我的操作方式(handle_email_cronjob.php):
$output = shell_exec('crontab -l');
echo $output;
但我什么也没得到。(执行 shell_exec('ls -l'); 会给我目录中的文件/目录列表)
cat 错误日志:
'/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)
我认为在宽容模式下应该记录错误,但不应该停止?
我只是直觉地认为它与 SELinux 有关,但我不知道如何修复它。
问题是什么?我该如何解决?(或者有没有比我的方法更好的方法?)
答案1
在学习如何排除 SELinux 故障后,我意识到我必须标记 /var/spool/cron,以便 httpd 可以读取/写入该目录:
chcon -R -t httpd_sys_script_rw_t /var/spool/cron
参考:
答案2
抱歉,我将其作为答案发布,我只是需要格式。
如果您执行以下操作,只需将 cron 从等式中移除,并使用 cat 等简单程序,您会得到什么结果。我还假设您正在尝试获取 apache 的 crontab。并且还假设 php 以 apache 身份运行。
$output = shell_exec('/bin/cat /var/spool/cron/apache');
echo $output;