PHP sudo в shell_exec - PullRequest
       41

PHP sudo в shell_exec

8 голосов
/ 13 апреля 2011

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

Ответы [ 6 ]

13 голосов
/ 13 апреля 2011

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

Тем не менее, может быть лучше создать скрипт-обертку, выполняющий только одну работу, которая требуется, а затем предоставить пользователю http доступпросто эту ОДНУ команду как sudo

http  ALL=(ALL) NOPASSWD:/user/local/bin/your_wrapper_script.sh
12 голосов
/ 19 апреля 2011

Для этого можно использовать последнюю версию 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]');
?>
3 голосов
/ 13 апреля 2011

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

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

2 голосов
/ 13 апреля 2011

Я просто Google'd для php sudo shell_exec, и это получилось как матч # 1:

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

Илья у linemedia dot ru 16 декабря 2010 г. 04: 36
sudo может быть выполнен без сохранения прохода в файле

system('echo "PASS" | sudo -u root -S COMMAND');
0 голосов
/ 07 июля 2016

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

$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.

0 голосов
/ 12 января 2015
$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;
...