Как вызвать скрипт из php, который требует SUDO? - PullRequest
45 голосов
/ 02 июля 2010

У меня есть файл, который представляет собой bash-скрипт, для работы которого требуется SUDO.

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

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

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

Ответы [ 4 ]

44 голосов
/ 02 июля 2010

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

www-data ALL=NOPASSWD: /path/to/script
8 голосов
/ 02 июля 2010

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

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

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

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

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

5 голосов
/ 02 июля 2010

Вы можете добавить что-то подобное в ваш файл sudoers:

username ALL=NOPASSWD: /path/to/script

Это позволит конкретному пользователю вызывать sudo для этого конкретного сценария без запроса пароля.

0 голосов
/ 06 февраля 2019

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

  * * * * * killProcess.php
...