Я создаю веб-приложение. Часть функциональности зависит от того, может ли пользователь запускать / останавливать задание cron, которое импортирует электронные письма.
Не работает.
Просто чтобы убедиться, что я на правильном пути, в качестве стартера я просто хочу заставить crontab -l из php работать и распечатать его в веб-браузере.
Вот как я это делаю (handle_email_cronjob.php):
$output = shell_exec('crontab -l');
echo $output;
но все, что я получаю, это ничего. (выполнение shell_exec ('ls -l'); дает мне список файлов / каталога в каталоге)
cat 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)
Думал, что ошибки надо логировать, а не останавливать, в разрешающем режиме?
У меня просто интуитивное ощущение, что это связано с SELinux, но я не могу понять, как это исправить.
В чем проблема и как ее исправить? (или есть лучший подход для этого, чем мой?)
Узнав, как устранять неполадки SELinux, я понял, что мне нужно пометить / var / spool / cron, чтобы httpd мог читать / писать в этот каталог:
chcon -R -t httpd_sys_script_rw_t /var/spool/cron
Ссылки:
Извините, что отправил это как ответ, мне просто нужен формат.
Что вы получите, если сделаете следующее, просто чтобы исключить cron из уравнения и использовать что-нибудь простое, например cat. Я также предполагаю, что вы пытаетесь получить доступ к crontab apache. А также при условии, что php работает как apache.
$output = shell_exec('/bin/cat /var/spool/cron/apache');
echo $output;