Разрешить PHP-скрипт для ssh, используя sudo - PullRequest
1 голос
/ 13 января 2012

Мне нужно разрешить скрипт PHP на моем локальном веб-сервере, чтобы SSH подключался к другому компьютеру для выполнения определенной задачи с некоторыми файлами. Мой httpd работает как _www с низкими разрешениями, поэтому установка прямого SSH без пароля затруднительна, если не сказать неуместна.

Способ, которым я делаю это сейчас, состоит в том, чтобы иметь минимальный PHP-скрипт, который sudo-exec (как и я) является сценарием оболочки, который находится вне корня документа. Сценарий оболочки, в свою очередь, вызывает (как и я) код PHP, который выполняет фактическую работу SSH, и печатает его вывод. Вот код.

read_remote_files.php (скрипт, который я вызываю из моего браузера):

exec('sudo -u me -n /home/me/run_php.sh /path/to/my_prog.php', $results);
print $results;

/home/me/run_php.sh (работает как я, вызывает все, что ему дают):

php $1 2>&1

sudoers:

_www ALL = (me) NOPASSWD: /home/me/run_php.sh

Это все работает, так как my_prog.php называется как я и может SSH как я. Кажется, это не слишком небезопасно, поскольку run_php.sh нельзя вызвать напрямую из браузера (вне корня документа). У меня проблема в том, что my_prog.php не вызывается как программа HTTP, поэтому не имеет доступа к переменным среды HTTP (DOCUMENT_ROOT и т. Д.).

Два вопроса:

  1. Я делаю это слишком сложным?
  2. Есть ли простой способ для моего окончательного сценария получить переменные HTTP?

Спасибо! Andy

Ответы [ 2 ]

2 голосов
/ 13 января 2012

Многие системы делают подобные вещи, используя (привилегированное) задание cron, которое часто проверяет наличие файла, записи базы данных или какого-либо другого ресурса, а затем выполняет действия, если они есть.

Огромным преимуществом этого является то, что нет никакого прямого взаимодействия между сценарием PHP и привилегированным сценарием вообще. Скрипт PHP оставляет инструкции в ресурсе, а привилегированный скрипт их получает. Пока инструкции не могут привести к взлому или повреждению системы, она определенно более безопасна, чем sudoing.

Недостатком является то, что вы не можете вносить изменения в любое время; Вы должны подождать, пока снова не запустится задание cron. Но, может быть, это вариант?

0 голосов
/ 13 января 2012

«Мне нужно разрешить сценарий PHP на моем локальном веб-сервере, чтобы SSH подключался к другому компьютеру для выполнения определенной задачи над некоторыми файлами.»

Я думаю, что вы формулируете это с точки зрения решения , что у вас есть трудности с работой, а не требование . Конечно, вы должны сказать: «Я хочу вызвать задачу на компьютере B из сценария PHP, работающего под Apache на компьютере A.» А затем исследуйте решения для этого - к которым есть многие, от простого RPC «по собственному желанию», туннелированного через HTTP (S), до использования XMLRPC или SOA Framework.

Два предостережения:

  • Сделайте phpinfo (); на обеих машинах, чтобы проверить, какие расширения доступны и
  • Также проверьте настройки php.ini, чтобы убедиться, что ваш поставщик услуг не отключил какие-либо функции, которые вы ожидаете использовать (или выполните сценарий вопросов и ответов для echo 'disable_functions = ' . ini_get('disable_functions') . "\n"; ...)

Если вы просматриваете здесь и в более широком Интернете, вы найдете много примеров. Здесь - это то, что я использую для аналогичной цели.

...