Как запустить из PHP скрипт bash под пользователем root (со всеми разрешениями), а не с пользователем user – php default user?
thats мой результат после sudo visudo:
Defaults env_keep += "LINES COLUMNS" Defaults env_keep += "LSCOLORS" Defaults env_keep += "SSH_AUTH_SOCK" Defaults env_keep += "TZ" Defaults env_keep += "DISPLAY XAUTHORIZATION XAUTHORITY" Defaults env_keep += "EDITOR VISUAL" Defaults env_keep += "HOME MAIL" #User privilege specification root ALL=(ALL) ALL %admin ALL=(ALL) ALL # Uncomment to allow people in group wheel to run all commands # %wheel ALL=(ALL) ALL # Same thing without a password # %wheel ALL=(ALL) NOPASSWD: ALL # Samples # %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom # %users localhost=/sbin/shutdown -h now
Вы можете использовать sudo:
exec("sudo /your/script");
Вы должны разрешить выполнение скрипта без запроса пароля. Запустите sudo visudo
в консоли и добавьте следующую строку в конец:
nobody ALL = NOPASSWD: /your/script
Вы должны правильно настроить режим файла, чтобы никто не мог модифицировать этот скрипт и помещать в него опасное содержимое (в корневой консоли):
chown root:root /your/script chmod 755 /your/script
Вы можете создать программу, которая является set-uid root. Это заставляет программу всегда запускаться с правами root. Это не работает со сценариями оболочки, поэтому вам нужно использовать программу, которая вызывает ваш скрипт .
В Linux вы обычно делаете это с помощью sudo
. Постарайтесь быть как можно более конкретными, чтобы не давать сценарию слишком много разрешений.
Примеры использования sudo
: http://aplawrence.com/Basics/sudo.html
Я бы добавил определенное правило, позволяющее этому скрипту вызываться nobody
, используя sudo
.
Недавно я опубликовал проект, который позволяет PHP получать и взаимодействовать с реальной оболочкой Bash (в качестве пользователя: apache / www-data или root при необходимости). Получить его здесь: https://github.com/merlinthemagic/MTS
После загрузки вы просто используете следующий код:
$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true); $return1 = $shell->exeCmd('/full/path/to/script.sh');