PHP sudo в shell exec

Я хочу выполнить команду как root с помощью shell_exec. Теперь я знаю, что это опасно, но поверьте мне, вам нужно войти в систему с MOD_AUTH и иметь право привилегий, чтобы прийти на эту страницу. Это безопасно. Как я могу это сделать?

6 ответов


вы можете использовать последнюю версию SVN phpseclib, чистая реализация PHP SSH, чтобы сделать это. например.

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('www.domain.tld');
$ssh->login('username', 'password');

$ssh->read('[prompt]');
$ssh->write("sudo command\n");
$ssh->read('Password:');
$ssh->write("Password\n");
echo $ssh->read('[prompt]');
?>

проблема не в том, что код страница является или не является безопасной, проблема в том, что предоставление PHP-странице возможности запуска некоторой команды sudo даст ее все страницы, включая любой введенный код на любой небезопасной странице на любом сайте на сервере.

тем не менее, было бы лучше сделать сценарий-оболочку, который выполняет только одну работу, которую нужно сделать, а затем предоставить пользователю http доступ только к одной команде как sudo

http  ALL=(ALL) NOPASSWD:/user/local/bin/your_wrapper_script.sh

определенно не рекомендуется. Тем не менее, вы захотите изучить редактирование sudoers файл и добавить пользователя php работает как NOPASSWD для команды, которую вам нужно запустить. Это позволит ему только sudo что одна команда без ввода пароля.

Если вам нужно больше команд, добавьте к нему больше. Настройки Пользователям Использовать Sudo? Я знаю, что forum / post основан на debian, но sudo не является строго debian, и это должно помочь вам с значениями конфигурации sudo, которые ты должен положить его.


Я просто Google для php sudo shell_exec и это вышло как матч #1:

http://www.php.net/manual/en/function.shell-exec.php#101440

Илья на linemedia dot ru 16-Dec-2010 04: 36
sudo может быть выполнен без сохранения pass в файле

system('echo "PASS" | sudo -u root -S COMMAND');

$aux=echo "admin-pass" | your command;
echo $aux;

/******************************* ************Образец************* *******************************/

запустите скрипт Perl с именем my_perl_script.pl:

$aux=echo "admin-pass" | sudo -u root -S perl /path-to-the-script/my-perl-script.pl;
echo $aux;

лучший способ сделать это:

$descriptorSpec = array(
    0 => STDIN,
    1 => STDOUT,
    2 => STDERR,
);

if (posix_getuid() === 0) {
    echo "Root\n";
} else {
    echo "No root\n";
    $command = 'sudo ' . PHP_BINARY . ' ' . implode(' ', $_SERVER['argv']);

    $pipes = [];
    $process = proc_open($command, $descriptorSpec, $pipes);
    if (is_resource($process)) {
        proc_close($process);
    }
}

он снова запускает ту же команду с префиксом sudo.