Я имею Ubuntu 14 и хочу создать некоторые задания крона с помощью своего кода PHP.
В настоящее время я делаю что-то как crontab -u www-data
, и от моего PHP кодируют, я могу записать в crontab.
Если я делаю crontab -u www-data -e
Я вижу, что существуют некоторые команды, но они управляют, не выполняются, хотя, если я добавляю те же команды к crontab -e
(не указывая пользователя), они работают успешно.
Файлы крона также имеют ОБЯЗАТЕЛЬНУЮ новую строку в конце.
TL; DR: Как может я делать работать на работах крона, созданных пользователем www-data
работа?
Править: 1
РЕШЕНИЕ: нажмите для наблюдения решения
Поэтому, традиционно (и из очень хороших соображений безопасности), www-data
пользователю не разрешают ничего сделать кроме веб-обслуживания. Никакие логины, никакие задания крона, nada.
$ getent passwd www-data
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
Переосмысление Ваш поток заданий, не пытайтесь выполнить вещи как www-data
.
Я нашел решение. Я проверил cronlogs путем ввода
sudo grep CRON /var/log/syslog
, И я видел сообщение “(CRON) info (No MTA installed, discarding output)”
, Это означало, что я должен был отправить по почте установленный.
, Таким образом, я работал sudo apt-get install postfix
и теперь все работает.
Крон выполнит www.data объекты. Можно проверить это с этим простым тестом:
$ sudo crontab -u www-data -e
Добавьте эту запись:
* * * * * date >> /tmp/date.out
Теперь исследуйте вывод с:
$ tail -f /tmp/date.out
После выполнения этого, чтобы гарантировать, что crontab работает, можно работать фактические скрипты, которые Вы хотите запустить.
пользователь www-data
в то время как не имеют тот же путь как Вы, таким образом, много команд, которые работают из Вашей учетной записи, не будет работать от www-data
пользователь, если Вы конкретно не устанавливаете путь для того сценария. путь www-данных по умолчанию содержит только: PATH=/usr/bin:/bin
Можно сделать это путем экспорта списка трактов, затем размещения его в список трактов для сценария.
Можно сделать это с:
$ echo $PATH > ~/mypath.txt
Теперь добавьте текст ~/mypath.txt к верхней части Вашего сценария как:
Ваш сценарий:
#!/bin/bash
export PATH=$PATH:/home/users/l/j/ljames/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
# rest of your script code here.
Можно точно настроить путь путем удаления некоторых очевидных объектов, что Вы не будете использовать такой в качестве в случае моего примера:
/home/users/l/j/ljames/bin
/usr/games
/usr/local/games
/snap/bin
Это оставило бы строку пути со сценария с:
#!/bin/bash
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# ... rest of your script code here
php сценарий тестирования (/home/users/l/j/ljames/test.php
)
#!/usr/bin/php
<?php
$string=`date`;
print "Output from PHP script: $string";
?>
php crontab запись
* * * * * php /home/users/l/j/ljames/test.php >> /tmp/date.out
Можно исследовать вывод с:
$ tail -f /tmp/date.out
Output from PHP script: Fri Feb 3 14:46:01 EST 2017
Output from PHP script: Fri Feb 3 14:47:01 EST 2017
Output from PHP script: Fri Feb 3 14:48:01 EST 2017
Вывод проверяет, что crontab выполнит Ваши сценарии PHP. Это показывает, что преступник является фактическим сценарием, который должен был бы быть отлажен для функционирования правильно за пределами крона сначала. Вероятный преступник был бы список трактов среды.
Примечание:
Ваш sytsem с Вашими скриптами веб-сервера, запущенными как пользователь www-data
будет более безопасным, чем если бы они были выполнены как Вы или корень. Если бы они были, поскольку Вы, сценарий имел бы доступ к каждой вещи, к которой у Вас есть доступ и если бы Ваш веб-сервер был поставлен под угрозу, то это могло бы даже иметь корневой доступ с sudo
. Выполнение Ваших сценариев веб-сервера как www-data
, поставленный под угрозу сервер только сможет получить доступ к Вашему серверу. Который, если сохранено, было бы легче зафиксировать, чем должным быть иметь дело с Вашим целым сервером.
Для пользователя www-data
для надлежащего выполнения задания крона этот файл должен существовать:
/var/spool/cron/crontabs/www-data
с полномочиями:
-rw------- 1 www-data crontab
Это должно достигнуть, который (упомянул выше):
sudo crontab -u www-data -e
... добавьте, в чем Вы нуждаетесь.
Если полномочия не корректны, используйте:
sudo chmod 600 /var/spool/cron/crontabs/www-data
sudo chown www-data:crontab /var/spool/cron/crontabs/www-data
Редактирование этого файла непосредственно осуждено, даже если это работает, потому что cron
любит управлять собой.