PHP sudo в shell exec


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

6 8

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, что одна команда без ввода пароля.

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

Я просто гуглил для 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.