Назад | Перейти на главную страницу

Разрешение пользователям запускать команды оболочки на сервере через 'su -' в PHP

Я загрузил библиотеку с 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, теперь, если вы пропустите некоторые проверки, вы позволите злоумышленнику создать пользовательские параметры для запуска любой произвольной команды в вашей системе.

Далее, почему вы не можете этого сделать, скорее всего, по двум причинам:

  1. Ваш пользователь www-data, скорее всего, не имеет установленного пароля. Это запрещает вход с помощью su и этот пользователь.

  2. Ваша пользовательская оболочка www-data, скорее всего, настроена на что-то вроде /sbin/nologin что имеет смысл, поскольку этот пользователь не должен входить в систему как настоящий пользователь.

Но на самом деле вам не нужно менять своего пользователя для запуска системной программы. Кроме того, скорее всего, в вашем дистрибутиве есть этот пользователь www-data для запуска под ним веб-сервера (с использованием системных средств), и каждый PHP-скрипт, который вы запускаете на своем веб-сервере, уже выполняется с правами этого пользователя. Просто запустите свою команду, не выполняя su, и это должно сработать. Что-то вроде этого:

$process = new Process($command); 
$data = $process->get();

Если это не сработает, обратитесь к руководству по этой библиотеке о том, как создать оболочку без su, наверное $process = new Process('/bin/bash') тоже будет работать.