Сценарий оболочки запускает приложения только при использовании через ssh

Что может привести к тому, что сценарии .sh будут нормально работать через оболочку SSH, но не при выполнении через PHP или crontab?

У меня есть VPS, на котором я запускаю игровые серверы, но для того, чтобы сделать его удобным для обслуживания, я планирую автоматизировать большую часть утомительных процессов (таких как настройка или удаление сервера) и сделать важные функции (такие как запуск и остановка серверов) проще. приемлемо для тех, кому это действительно необходимо.

Теперь, когда я сделал сценарии оболочки и протестировал их, они работали абсолютно нормально. startserver запустил сервер, restartserver перезапустил его и т.д. Но при запуске из PHP или, как я позже понял, из crontab, запуск серверов волшебным образом не работает. Их остановка, проверка их работы, обновление и все остальные функции работали, как и предполагалось, но запуск сервера ничего не дал. Он просто вернул 0, ничего не печатая.

Например, вот пример скрипта, который работает в любом случае: (statusserver.sh)

/sbin/start-stop-daemon -v -t --start --exec ~mta/servers/$1/files/mta-server -- -d

А вот тот, который ни в коем случае не работает: (startserver.sh)

/sbin/start-stop-daemon -v --start --exec ~mta/servers/$1/files/mta-server -- -d

Единственная разница в том, что в statusserver.sh есть «-t», который только скажет вам, действительно ли выполнение той же команды без -t будет успешным. И выполнение statusserver.sh вот так:

sudo -u mta ~mta/sh/statusserver.sh test

Действительно работает, напечатав что-то вроде «Would start ~mta/servers/test/files/mta-server -d». Но делая это:

sudo -u mta ~mta/sh/startserver.sh $2

Абсолютно ничего не делает. Он ничего не печатает и на самом деле возвращает 0 (что должно означать, что операция прошла успешно).

Теперь самое интересное: когда сервер уже запущен, startserver.sh сделает то, что должен: скажет, что сервер уже запущен, и вернет код ошибки. (Потому что start-stop-daemon достаточно любезен, чтобы сделать это для меня). Но он наотрез отказывается запускать что-либо.

Замена start-stop-daemon на что-то вроде:

sudo -u mta ~mta/servers/test/files/mta-server -d

Делает то же самое: просто откажется запускаться, но по-прежнему будет возвращать 0.

Да, кстати, это не проблема sudo. В этом я совершенно уверен, так как следующее тоже отлично работает

sudo -u web1 sudo -u mta ~mta/scripts/startserver.sh test

Итак, вернемся к моему вопросу: что может привести к тому, что Linux, Shell, Bash или что-то еще категорически отказываются запускать приложение при запуске через PHP или crontab, но с радостью принимают его при запуске через SSH? Есть ли какие-либо настройки, которые мне нужно переключить? Любой пакет, который может блокировать то, что я хочу сделать? Что-то еще, что мне просто не хватает?


person Gamesnert    schedule 03.08.2012    source источник
comment
Вы указали сценарий или двоичный файл в качестве исполняемого файла?   -  person Lars Knickrehm    schedule 04.08.2012
comment
Да. Я запускаю сценарии оболочки в домашней папке других пользователей, чтобы выполнять различные действия, и все они работают при использовании SSH для их запуска. Однако при использовании PHP команда запуска не срабатывает.   -  person Gamesnert    schedule 04.08.2012


Ответы (2)


Изучите использование sudo.

Настройте /etc/sudoer (используя visudo) для пользователя, под которым работает Apache (обычно для пользователя «никто» или пользователя «apache»), так как это то, под чем обычно работает Apache. Предоставьте sudo доступ к командам, которые вы хотите запустить, с параметром NOPASSWD.

В вашем PHP-скрипте используйте exec() для выполнения команд для запуска/остановки демонов и добавляйте к командам префикс sudo.

Вот статья о sudo:

http://www.cyberciti.biz/tips/allow-a-normal-user-to-run-commands-as-root.html

person Justin Swanhart    schedule 03.08.2012
comment
Я думаю, что должен был прояснить это раньше, поэтому приношу свои извинения: пользователь файла PHP (web1) уже использует sudo для выполнения команд для другого пользователя (mta). (например, sudo -u mta sh /home/mta/sh/startserver.sh $1) Это работает нормально, так как работают все команды. Помимо startserver.sh, который, по-видимому, является ограничением либо веб-сервера, либо чего-то еще, что я не могу понять. Я отредактирую свой вопрос, чтобы прояснить это немного больше. - person Gamesnert; 04.08.2012

Как я думаю, Джастин затронул, но не сказал конкретно, может показаться, что проблема невозможности запустить скрипт заключается в том, что учетная запись пользователя apache (которая, как правило, довольно ограничена намеренно) не может видеть в пользовательском домашний каталог из-за разрешений. Как правило, только пользователь и root могут видеть свой собственный домашний каталог. Вы можете сделать несколько вещей: sudo для запуска скрипта в домашнем каталоге, переместить его из домашнего каталога пользователя или, возможно, изменить разрешения на скрипты/дома, чтобы их можно было запускать в домашнем каталоге пользователя с помощью apache.

person Jonathan Kuhn    schedule 04.08.2012
comment
Скорее всего, это не так, поскольку я попытался объяснить немного подробнее как в самом вопросе, так и в ответ на ответ Джастина. Интересно, если бы это было так, не вызвала бы проблемы остановка серверов и т. д.? Поскольку в настоящее время это не так; start-stop-daemon -v --start просто полностью отказывается запускать исполняемый файл, без каких-либо указаний на то, почему, и с 0 в качестве кода возврата, что обычно указывает на успех. Хотя я могу просто ошибаться. В любом случае, я немного не понял ситуацию, но все равно спасибо за попытку прояснить это. - person Gamesnert; 04.08.2012