Ответ 1
Измените файл sudoers (с помощью visudo
) и добавьте правило, которое позволяет пользователю веб-сервера запускать команду без пароля. Например:
www-data ALL=NOPASSWD: /path/to/script
У меня есть файл bash script, который требует SUDO для работы.
Я могу запустить его из командной строки с помощью SUDO, но мне будет предложено ввести пароль SUDO.
Я хочу запустить этот script из php через shell_exec
, но я, если я вызову SUDO, не похож на командную строку, где мне может быть предложено ввести пароль. Есть ли способ передать пароль для sudo при вызове sudo?
Как я могу это сделать?
Измените файл sudoers (с помощью visudo
) и добавьте правило, которое позволяет пользователю веб-сервера запускать команду без пароля. Например:
www-data ALL=NOPASSWD: /path/to/script
Существуют различные решения этой проблемы.
Прежде всего, рассмотрите возможность изменения разрешений script, если причина, по которой вы хотите, чтобы sudo был просто проблемой разрешения (см. комментарий, который я добавил к вопросу выше).
Другим подходом будет использование setuid bit. [Edit: похоже, что setuid не работает хорошо со сценариями. Для пояснений см. эта ссылка.]
Третий, но очень небезопасный метод - это прочитать пароль из файла паролей. Предупреждение: Это очень неуверенно, если есть какая-либо другая возможность, не делайте этого. И если вы это сделаете, попробуйте скрыть файл паролей где-нибудь в иерархии папок.
<?php
shell_exec('sudo -u root -S bash script.sh < /home/[user]/passwordfile');
?>
И четвертая возможность заключается в использовании тега NOPASSWD в файле sudoers. Вы должны ограничить эту мощность конкретными командами, которые вам нужны.
Вы можете добавить что-то вроде этого в свой sudoers
файл:
username ALL=NOPASSWD: /path/to/script
Это позволит конкретному пользователю вызвать sudo
на этом конкретном script, не запрашивая пароль.
Лучший безопасный способ - использовать crontab. т.е. сохраните все ваши команды в базе данных скажем, таблицу mysql и создайте cronjob, чтобы прочитать эти mysql entreis и выполнить через shell_exec(). Пожалуйста, прочитайте эту ссылку для более подробной информации.
* * * * * killProcess.php