'/var/spool/cron' 不是目录,正在退出。当尝试通过 PHP 的 shell_exec 使用 crontab 时

'/var/spool/cron' 不是目录,正在退出。当尝试通过 PHP 的 shell_exec 使用 crontab 时

我正在创建一个 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

参考:

了解 audit.log

排除 SELinux 故障

答案2

抱歉,我将其作为答案发布,我只是需要格式。

如果您执行以下操作,只需将 cron 从等式中移除,并使用 cat 等简单程序,您会得到什么结果。我还假设您正在尝试获取 apache 的 crontab。并且还假设 php 以 apache 身份运行。

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

相关内容