Как запустить PHP exec() как root?
Я пытаюсь создать менеджер брандмауэра в PHP, но когда я выполняю, <?php exec('iptables -L'); ?>
, массив результатов пуст.
Я попытался, <?php echo exec('whoami'); ?>
, и ответ www-data
(пользователь, который использует Apache). Что я могу сделать для выполнения функции exec как root? (Желательно без изменения пользователя Apache.)
Ответы
Ответ 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;