Я пытаюсь создать менеджер брандмауэра в PHP, но когда я выполняю, <?php exec('iptables -L'); ?>
<?php exec('iptables -L'); ?>
, массив результатов пуст.
Я пробовал, <?php echo exec('whoami'); ?>
<?php echo exec('whoami'); ?>
, а ответ – www-data
(пользователь, который использует Apache). Что я могу сделать для выполнения функции exec как root? (Желательно без изменения пользователя Apache).
Не делай этого! Вы оставите себя открытым для всех видов злонамеренных хакеров.
Взгляните на документацию «sudo».
Вы должны быть в состоянии настроить все команды, которые вам нужны, в качестве сценариев «sudo». Гораздо лучше писать конкретные скрипты с ограниченными функциями, чем раскрывать основную привилегированную команду.
Как в:
exec ('sudo getIpTables.ksh')
Вы можете запустить 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]'); ?>
в<?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, если он еще не назначен
используйте 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, который действует как оболочка входа и имеет установленные пути
проверьте страницы руководства sudo
Это очень опасная и плохая идея. Переосмыслите свой дизайн. Если вы действительно хотите это сделать, используйте sudo как рекомендуется. Альтернативное решение может состоять в том, чтобы идти вперед и запускаться с правами root, но делать это внутри chroot или изображения vm (оба из которых могут быть разбиты, но все же).
Или лучше всего работать как sudo внутри chroot!
Если вы не используете suphp и не настроите его на запуск под root, вы не сможете запускать какой-либо скрипт PHP от имени любого другого пользователя системы, кроме того, кто работает с PHP.
Просто небольшая идея. Добавьте процесс очереди в некотором роде и запустите процесс cron в корнебре root.
Пожалуйста, будьте очень осторожны. Любая инъекция может буквально разрушить систему.
Вы можете поместить необходимые команды в отдельный скрипт / исполняемый файл (sh, PHP, настоящий исполняемый файл, не имеет значения), измените его владельца на root и примените к нему «setuid».
Это позволит кому угодно и кому-либо запустить этот скрипт как root, поэтому вам нужно убедиться, что у него есть свои собственные правила безопасности, чтобы увидеть, разрешено ли это, и очень ограничено в том, что он делает.
Просто предположение – это веб-приложение PHP, которое это сделает? Это не звучит слишком безопасно. Приложение, которое нуждается в корневой папке – можете ли вы создать это отдельно, а затем вызвать его из PHP? Если нет, возможно, вы можете sudo процесс, чтобы он мог работать от имени root.
Недавно я опубликовал проект, который позволяет 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;