Подтвердить что ты не робот

Как вызвать shell script из php, который требует SUDO?

У меня есть файл bash script, который требует SUDO для работы.

Я могу запустить его из командной строки с помощью SUDO, но мне будет предложено ввести пароль SUDO.

Я хочу запустить этот script из php через shell_exec, но я, если я вызову SUDO, не похож на командную строку, где мне может быть предложено ввести пароль. Есть ли способ передать пароль для sudo при вызове sudo?

Как я могу это сделать?

4b9b3361

Ответ 1

Измените файл sudoers (с помощью visudo) и добавьте правило, которое позволяет пользователю веб-сервера запускать команду без пароля. Например:

www-data ALL=NOPASSWD: /path/to/script

Ответ 2

Существуют различные решения этой проблемы.

  • Прежде всего, рассмотрите возможность изменения разрешений script, если причина, по которой вы хотите, чтобы sudo был просто проблемой разрешения (см. комментарий, который я добавил к вопросу выше).

  • Другим подходом будет использование setuid bit. [Edit: похоже, что setuid не работает хорошо со сценариями. Для пояснений см. эта ссылка.]

  • Третий, но очень небезопасный метод - это прочитать пароль из файла паролей. Предупреждение: Это очень неуверенно, если есть какая-либо другая возможность, не делайте этого. И если вы это сделаете, попробуйте скрыть файл паролей где-нибудь в иерархии папок.

    <?php
    shell_exec('sudo -u root -S bash script.sh < /home/[user]/passwordfile');
    ?>
    
  • И четвертая возможность заключается в использовании тега NOPASSWD в файле sudoers. Вы должны ограничить эту мощность конкретными командами, которые вам нужны.

Ответ 3

Вы можете добавить что-то вроде этого в свой sudoers файл:

username ALL=NOPASSWD: /path/to/script

Это позволит конкретному пользователю вызвать sudo на этом конкретном script, не запрашивая пароль.

Ответ 4

Лучший безопасный способ - использовать crontab. т.е. сохраните все ваши команды в базе данных скажем, таблицу mysql и создайте cronjob, чтобы прочитать эти mysql entreis и выполнить через shell_exec(). Пожалуйста, прочитайте эту ссылку для более подробной информации.

  * * * * * killProcess.php