Я загрузил библиотеку с GitHub для запуска команд оболочки из сценария PHP. Это работает так:
$process = new Process("su - {$login}");
$process->put($password);
$process->put("\n");
$process->put($command);
$process->put("\n");
$data = $process->get();
$process->put("exit");
$process->put("\n");
Он основан на proc_open()
. Я использую это на своем localhost
с моим логином и паролем Linux, и все работает нормально. Я хочу использовать эту библиотеку на веб-сервере. я хочу попробовать 'www-data'
как логин, но понятия не имею, что передать как www-data's
пароль. Что использовать в качестве логина, чтобы пользователи могли использовать эту библиотеку на реальном веб-сервере, а не на локальном хосте?
(Я разместил это в stackoverflow, но они проголосовали против, добавив, что это не о программировании, а о сбое сервера)
Во-первых, запускать системные команды из PHP-скрипта веб-сервера и даже хранить ваш пароль в PHP-скрипте с открытым текстом - плохая идея. Представьте, что вы получаете какой-то пользовательский ввод, чтобы передать его $command
, теперь, если вы пропустите некоторые проверки, вы позволите злоумышленнику создать пользовательские параметры для запуска любой произвольной команды в вашей системе.
Далее, почему вы не можете этого сделать, скорее всего, по двум причинам:
Ваш пользователь www-data, скорее всего, не имеет установленного пароля. Это запрещает вход с помощью su
и этот пользователь.
Ваша пользовательская оболочка www-data, скорее всего, настроена на что-то вроде /sbin/nologin
что имеет смысл, поскольку этот пользователь не должен входить в систему как настоящий пользователь.
Но на самом деле вам не нужно менять своего пользователя для запуска системной программы. Кроме того, скорее всего, в вашем дистрибутиве есть этот пользователь www-data для запуска под ним веб-сервера (с использованием системных средств), и каждый PHP-скрипт, который вы запускаете на своем веб-сервере, уже выполняется с правами этого пользователя. Просто запустите свою команду, не выполняя su, и это должно сработать. Что-то вроде этого:
$process = new Process($command);
$data = $process->get();
Если это не сработает, обратитесь к руководству по этой библиотеке о том, как создать оболочку без su
, наверное $process = new Process('/bin/bash')
тоже будет работать.