[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Правила написания скриптов для Cron
Quieteroks
Добрый день.

Подскажите, есть какие то особенности в написании скриптов для выполнения их через крон? Или просто голый скрипт запускается?

Как тогда защитить код от выполнения извне?



Спустя 12 минут, 3 секунды (30.07.2012 - 15:35) killer8080 написал(а):
Цитата (Quieteroks @ 30.07.2012 - 16:23)
Подскажите, есть какие то особенности в написании скриптов для выполнения их через крон? Или просто голый скрипт запускается?


Конечно есть, большая часть элементов массива $_SERVER недоступна, в том числе DOCUMENT_ROOT, ввиду отсутствия вебсервера. Кроме того, текущая директория скрипта может не соответствовать физическому месторасположению скрипта. Об этом важно помнить.

Цитата (Quieteroks @ 30.07.2012 - 16:23)
Как тогда защитить код от выполнения извне?

Извне это как? Запускать вебсервером? Ну тут просто нужно проверять sapi в начале работы.

Спустя 15 минут, 26 секунд (30.07.2012 - 15:50) inpost написал(а):
а зачем защищать? Думаешь, что кто-то найдет этот крон-файл и будет тыкать?

Спустя 6 минут, 46 секунд (30.07.2012 - 15:57) Quieteroks написал(а):
killer8080
Цитата
Кроме того, текущая директория скрипта может не соответствовать физическому месторасположению скрипта.

С этого момента подробнее... Т.е. можно GET запрос бросить а не путь к фалу?

Или имеется в виду что то такое:
$ php -q another_directory/test.php
/tmp/another_directory


Про sapi что то вообще незнакомое.
Можно какой нить пример или ссылку на статью про cron скрипты?
А то про правила вызова полно, а про скрипты ниче найти не могу.

inpost
Мало ли кто найдет и решит попробовать его запустить?
Нельзя же подобное просто так оставить на обозрение.

Или где хранить скрипты, чтоб их нельзя было вызвать из под браузера?

Спустя 29 минут, 44 секунды (30.07.2012 - 16:27) Invis1ble написал(а):
if (PHP_SAPI === 'cli')
{
// ...
}

Спустя 9 минут, 38 секунд (30.07.2012 - 16:37) killer8080 написал(а):
Цитата (Quieteroks @ 30.07.2012 - 16:57)
С этого момента подробнее... Т.е. можно GET запрос бросить а не путь к фалу?


Причем тут GET запрос? Не путай вебсервер с командной строкой. При запуске скрипта в CLI текущей директорией может оказаться не директория скрипта, а директория интерпретатора, т.е. /usr/bin или /usr/local/bin. Поэтому нужно осторожно использовать относительные пути, а лучше использовать только полные, полученные из __FILE__(__DIR__). Или вручную устанавливать текущую директорию
chdir( dirname(__FILE__) );

Спустя 7 минут, 13 секунд (30.07.2012 - 16:44) Quieteroks написал(а):
Invis1ble
А для запуска из крона он всегда cli?
А cgi тогда когда он принимает значение?

И соответственно запуск не через консоль (коим является запуск из крона, в смысле крон запускает через консоль скрипты) не создает данных констант?

killer8080
Ну для запуска понятное дело прямые пути от корня.
А внутри скрипта варианты защиты от вызова какие применяются...
Так что скрипты можно защитить просто конструкцией DEFINED OR DIE к примеру, а вот крон только начинаю познавать...

Технически крону не важно где лежат скрипты, значит если сервер мой собственный будет, а не снятый хостинг, то теоретически можно в отдельную папку их сложить, которая не будет доступна вообще извне. Правильно?

Спустя 10 минут, 56 секунд (30.07.2012 - 16:55) killer8080 написал(а):
Цитата (Quieteroks @ 30.07.2012 - 17:44)
А для запуска из крона он всегда cli?

Если крон вызывает команду php или сам скрипт напрямую - да. Если ты его дергаешь извращенскими способами, то может и нет
Цитата (Quieteroks @ 30.07.2012 - 17:44)
И соответственно запуск не через консоль (коим является запуск из крона, в смысле крон запускает через консоль скрипты) не создает данных констант?

Константа PHP_SAPI есть всегда, вне зависимости от способа интерпретации, она как раз и нужна для того чтоб определить в каком режиме работает скрипт.
Цитата (Quieteroks @ 30.07.2012 - 17:44)
А внутри скрипта варианты защиты от вызова какие применяются...
Так что скрипты можно защитить просто конструкцией DEFINED OR DIE к примеру, а вот крон только начинаю познавать...


PHP_SAPI === 'cli' or die('Web access restricted!');

Цитата (Quieteroks @ 30.07.2012 - 17:44)
Технически крону не важно где лежат скрипты, значит если сервер мой собственный будет, а не снятый хостинг, то теоретически можно в отдельную папку их сложить, которая не будет доступна вообще извне. Правильно?

само собой, более того, если в начале файла пропишешь шибэнг, и установишь права на запуск, скрипт можно будет запускать напрямую, а не как аргумент к команде php.
./script.php

Спустя 5 минут, 16 секунд (30.07.2012 - 17:00) Invis1ble написал(а):

Спустя 13 минут, 35 секунд (30.07.2012 - 17:14) killer8080 написал(а):
Quieteroks
ну и это еще будет полезно
http://php.net/manual/ru/features.commandline.php

Спустя 1 час, 33 минуты, 35 секунд (30.07.2012 - 18:47) Gradus написал(а):
ещё можно передавать доп. get параметр и проверять

if($_GET['pass']!=="my_secret_pass") exit();

Спустя 1 месяц, 24 дня, 22 часа, 20 минут, 21 секунда (25.09.2012 - 17:08) Quieteroks написал(а):
Открываю тему заново...

Скрипт ругается, когда его запускают...
Пути выставляю полные путем:
define('ROOT_DIR',		str_replace('\\', '/', dirname(__FILE__)).'/');


Потом относительно ее подключаю библиотеки для выполнения.

А Cron ругается примерно так:
/home/cron/division.php: 1: /home/cron/division.php: cannot open ?php
: No such file
/home/cron/division.php: 2: /home/cron/division.php: /*
: not found
/home/cron/division.php: 3: /home/cron/division.php: =====================================================
: not found
/home/cron/division.php: 5: /home/cron/division.php: =====================================================
: not found
/home/cron/division.php: 6: /home/cron/division.php: */
: not found
/home/cron/division.php: 7: /home/cron/division.php:
: not found
/home/cron/division.php: 8: /home/cron/division.php: //: Permission denied
/home/cron/division.php: 9: /home/cron/division.php: Syntax error: word unexpected (expecting ")")


Как я понял ругается на комменты и <?php...
С чем это может быть связанно? С Неправильным запуском скрипта или в самом скрипте так?
Может в начале скрипта нужно что то типа #! bin/че-то?

Спустя 7 часов, 10 минут, 23 секунды (26.09.2012 - 00:18) killer8080 написал(а):
Quieteroks
у тебя скрипт лежит в /home/cron/?
Покажи команду, которую вызываешь кроном.

Спустя 9 часов, 24 минуты, 31 секунда (26.09.2012 - 09:42) Quieteroks написал(а):
killer8080
Да. В корне папка home. В ней лежат сайты, и туда же запихнули папку cron.
В целом не проблема в любую директорию перекинуть...

Вариант, что cronу прав на запуск скриптов в этой директории не хватает, есть смысл рассматривать?

Конфиг правим ВебАдмином.
Содержание его такое:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.EWWS4b/crontab installed on Wed Sep 26 06:08:23 2012)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
5 6 * * * /etc/webmin/virtual-server/sendratings.pl
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /etc/webmin/virtual-server/collectinfo.pl
8 1 * * * /etc/webmin/virtual-server/scriptlatest.pl
0 2,5,8,11,14,17,20,23 * * * /usr/bin/php /home/cron/division.php


Спустя 24 минуты, 33 секунды (26.09.2012 - 10:07) killer8080 написал(а):
Quieteroks
к консоли доступ есть?

Спустя 1 час, 20 минут, 44 секунды (26.09.2012 - 11:28) Quieteroks написал(а):
killer8080
У меня нет.

Все, кажись разобрались. Оказалось это уже исправленный конфиг.
Скрипт отрабатывает.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.