Как работать с PHP a bash script под пользователем root
Как работать с PHP a bash script под пользователем root (со всеми разрешениями), а не никто пользователь - пользователь php по умолчанию?
thats my output после 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
Ответы
Ответ 1
Вы можете использовать sudo:
exec("sudo /your/script");
Вы должны разрешить выполнение script без запроса пароля. Запустите sudo visudo
в консоли и добавьте следующую строку в конец:
nobody ALL = NOPASSWD: /your/script
Вы должны правильно настроить режим файла, чтобы никто не мог изменить этот script и помещать в него опасное содержимое (в корневой консоли):
chown root:root /your/script
chmod 755 /your/script
Ответ 2
Вы можете создать программу, которая является set-uid root. Это заставляет программу всегда запускаться с правами root. Это не работает со сценариями оболочки, поэтому вы должны использовать программу которая вызывает ваш script.
Ответ 3
В Linux вы обычно делаете это с помощью sudo
. Постарайтесь быть как можно более конкретными, чтобы не давать script слишком много разрешений.
Примеры использования sudo
: http://aplawrence.com/Basics/sudo.html
Ответ 4
Я бы добавил конкретное правило, чтобы этот script вызывался пользователем nobody
, используя sudo
.
Ответ 5
Недавно я опубликовал проект, который позволяет 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');