как сделать PHP списки всех пользователей Linux? - PullRequest
2 голосов
/ 23 мая 2010

Я хочу создать сайт на основе php, который (автоматизирует) некоторые команды на моем сервере Ubuntu

Первым делом я пошел в файл (sudoers) и добавил пользовательские www-данные, чтобы я мог выполнять команды php с привилегиями root!

# running the web apps with root power!!!
www-data    ALL=(ALL) NOPASSWD: ALL

тогда мой код PHP был

<?php
   $command = "cat /etc/passwd | cut -d\":\" -f1";
   echo 'running the command: <b>'.$command."</b><br />";
   echo exec($command);
?>

возвращает только одного пользователя (последнего пользователя) !!! как заставить его вернуть всех пользователей?

спасибо

Ответы [ 4 ]

3 голосов
/ 23 мая 2010

Из руководства по PHP для exec:

Возвращаемые значения

Последняя строка из результата команда. Если вам нужно выполнить команда и иметь все данные из команда передана обратно без любое вмешательство, используйте passthru () функция. Чтобы получить вывод выполненной команды, обязательно установите и используйте выходной параметр.

Итак, вы должны сделать что-то похожее на это:

<?php
   $output = array();
   $command = "cat /etc/passwd | cut -d\":\" -f1";
   echo 'running the command: <b>'.$command."</b><br />";
   exec($command, &$output);
   echo implode("<br />\n", $output);
?>
1 голос
/ 26 июля 2018

Как объясняет @benjamin, не нужно быть пользователем root или sudo, не нужно SUID.
Просто чистый PHP. Я использовал имена полей из posix_getpwnam .

function getUsers() {
    $result = [];
    /** @see http://php.net/manual/en/function.posix-getpwnam.php */
    $keys = ['name', 'passwd', 'uid', 'gid', 'gecos', 'dir', 'shell'];
    $handle = fopen('/etc/passwd', 'r');
    if(!$handle){
        throw new \RuntimeException("failed to open /etc/passwd for reading! ".print_r(error_get_last(),true));
    }
    while ( ($values = fgetcsv($handle, 1000, ':')) !== false ) {
        $result[] = array_combine($keys, $values);
    }
    fclose($handle);
    return $result;
}

Возвращает массив, содержащий всех пользователей, отформатированный так:

[
  [
    'name' => 'root',
    'passwd' => 'x',
    'uid' => '0',
    'gid' => '0',
    'gecos' => 'root',
    'dir' => '/root',
    'shell' => '/bin/bash',
  ],
  [
    'name' => 'daemon',
    'passwd' => 'x',
    'uid' => '1',
    'gid' => '1',
    'gecos' => 'daemon',
    'dir' => '/usr/sbin',
    'shell' => '/usr/sbin/nologin',
  ],
  ...
]
1 голос
/ 23 мая 2010

Как сказал Мэтт С., это невероятно плохая идея - разрешить доступ к корневым данным www на вашем сервере. Малейший компромисс в ваших веб-приложениях может дать любому полный контроль над вашей системой.

Лучше было бы создать отдельные сценарии для конкретных образцов доступа, а затем использовать разрешения SUID . Это означает, что конкретный пользователь (в данном случае www-data) может вносить небольшие изменения в систему посредством выполнения скриптов. Тем не менее, это не очень хорошая идея. Возможно, вам удастся обойти это с помощью suPHP, но безопасность по-прежнему остается серьезной проблемой.

0 голосов
/ 23 мая 2010

/ etc / passwd доступен для чтения любому, поэтому вы должны иметь возможность выполнять свою команду без каких-либо специальных прав (если PHP не запрещает это?).

...