Подтвердить что ты не робот

Как запустить PHP exec() как root?

Я пытаюсь создать менеджер брандмауэра в PHP, но когда я выполняю, <?php exec('iptables -L'); ?>, массив результатов пуст.

Я попытался, <?php echo exec('whoami'); ?>, и ответ www-data (пользователь, который использует Apache). Что я могу сделать для выполнения функции exec как root? (Желательно без изменения пользователя Apache.)

4b9b3361

Ответ 1

Не делай этого! Вы оставите себя открытым для всех видов злонамеренных хакеров.

Взгляните на документацию "sudo".

Вы должны иметь возможность настроить все команды, которые вам нужны, в качестве сценариев "sudo". Гораздо лучше писать конкретные скрипты с ограниченными функциями, чем раскрывать основная привилегированная команда.

Как в:

exec ('sudo getIpTables.ksh')

Ответ 2

Вы можете запустить sudo через 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

Я знаю, что это старый вопрос

добавить, что пользовательский php запускается в группу sudo, если он еще не назначен

используйте sudo -S, чтобы вы могли передавать пароль через echo

$exec = "echo your_passwd | /usr/bin/sudo -S your command";
exec($exec,$out,$rcode);

если у вас есть проблемы с путями - используйте

"bash -lc 'echo your_passwd | /usr/bin/sudo -S your command'"

чтобы вы получили новый bash, который действует как оболочка входа и имеет установленные пути

проверьте страницы man sudo

Ответ 4

Если вы не используете suphp и настройте его как root, вы не сможете запускать какой-либо PHP скрипт от имени любого другого пользователя системы, кроме того, кто запускает PHP.

Изменить:

Просто небольшая идея. Добавьте процесс очереди в некотором роде и запустите процесс cron в корневом каталоге crontab.

Пожалуйста, будьте очень осторожны. Любая инъекция может буквально разрушить систему.

Ответ 5

Это очень опасная и плохая идея. Переосмыслите свой дизайн. Если вы действительно хотите это сделать, используйте sudo как рекомендуется. Альтернативное решение может состоять в том, чтобы идти вперед и запускаться с правами root, но делать это внутри chroot или изображения vm (оба из которых могут быть разбиты, но все же).

Или лучше всего работать как sudo внутри chroot!

Ответ 6

Вы можете поместить необходимые команды в отдельный файл script/исполняемый файл (sh, PHP, реальный исполняемый файл, не имеет значения), измените его владельца на root и примените к нему "setuid".

Это позволит кому угодно и кому-либо запустить этот script как root, поэтому вам нужно убедиться, что у него есть собственные правила безопасности для просмотра, если это разрешено, и очень ограничено тем, что он делает.

Ответ 7

Просто предположение - это веб-приложение PHP, которое это сделает? Это не звучит слишком безопасно. Приложение, которое нуждается в корневой папке - можете ли вы создать это отдельно, а затем вызвать его из PHP? Если нет, возможно, вы можете выполнить этот процесс, чтобы он выполнялся как root.

Ответ 8

Недавно я опубликовал проект, который позволяет PHP получать и взаимодействовать с реальной оболочкой Bash. Получите его здесь: https://github.com/merlinthemagic/MTS

После загрузки вы просто используете следующий код:

$shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1  = $shell->exeCmd('iptables -L');
//the return will be a string containing the return of the command
echo $return1;