Я хочу выполнить команду как root с помощью shell_exec. Теперь я знаю, что это опасно, но поверьте мне, вам нужно войти в систему с MOD_AUTH и иметь правильные привилегии, чтобы прийти на эту страницу. Это безопасно. Как я могу это сделать?
Для этого вы можете использовать последнюю версию SVN phpclib, чистую реализацию 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 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-пользователю доступ только к одной команде ONE в качестве sudo
http ALL=(ALL) NOPASSWD:/user/local/bin/your_wrapper_script.sh
Определить не рекомендуется. Тем не менее, вы захотите изучить редактирование файла sudoers
и добавить, что пользовательский php работает как NOPASSWD
для команды, которую вам нужно запустить. Это позволит ему только выполнить эту команду без ввода пароля.
Если вам нужно больше команд, добавьте еще больше. Конфигурация Sudoers. Я знаю, что forum / post основан на debian, но sudo не является строго debian, и это должно помочь вам с настройками конфигурации sudo, которые вам нужно поместить.
Я просто Google'd для php sudo shell_exec
и это php sudo shell_exec
как совпадение # 1:
http://www.php.net/manual/en/function.shell-exec.php#101440
ilya at linemedia dot ru 16-Dec-2010 04:36
sudo может быть выполнен без сохранения прохода в файле
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.