Назад | Перейти на главную страницу

Разрешение PHP запускать определенный сценарий bash с правами root

У меня есть скрипт php, вызывающий скрипт bash следующим образом:

<?php
    $result = exec('sudo /bin/bash /var/www/my_bash_script.sh /var/www/vhosts/testsite/htdocs/');
    var_dump($result);
?>

Это содержание my_bash_script.sh:

#!/bin/bash
svn export --force --no-auth-cache --username myusername --password mypassword http://1.2.3.4/repos/path/to/repo/ $1 2>&1
find $1 -print0 -type d | xargs -0 -n 1 -0 chown -R -v root:root 2>&1
find $1'storage' -print0 -type d | xargs -0 -n 1 chown -R -v apache 2>&1
find $1'shared' -print0 -type d | xargs -0 -n 1 chown -R -v apache 2>&1

Цель сценария - выполнить экспорт из моего репозитория svn и правильно установить права пользователя.

PHP работает как apache пользователь.

Чтобы предоставить PHP разрешение на запуск этого скрипта, я добавил в sudoers следующую строку:

apache ALL=(ALL) NOPASSWD:ALL

Очевидно, это дает PHP слишком много возможностей, поэтому я хочу ограничить PHP запуском этого конкретного сценария bash, но я не могу понять синтаксис правильно:

apache ALL=(ALL) NOPASSWD:/var/www/my_bash_script.sh

Вышеупомянутое просто возвращает пустую строку (в $result Переменная PHP) - что я делаю не так?

Спасибо!

Редактировать: - Я уже прокомментировал #Defaults requiretty в sudoers.

Я могу ошибаться, но я считаю, что sudoers также ограничивает параметры, которые могут быть переданы команде / скрипту, а не только саму команду.

Если вы попытаетесь запустить свой .sh без параметра, он, скорее всего, сработает, например

  sudo /bin/bash /var/www/my_bash_script.sh

Итак, чтобы указать sudoers разрешить запуск этого скрипта с любыми параметрами (с помощью apache), вам нужно будет настроить строку следующим образом:

  apache ALL=(ALL) NOPASSWD:/var/www/my_bash_script.sh *

Подстановочный знак позволяет apache запускать этот сценарий с любыми параметрами.

Вам также может понадобиться / bin / bash в этой строке, но я не уверен

  apache ALL=(ALL) NOPASSWD: /bin/bash /var/www/my_bash_script.sh *

Если кто-нибудь сможет подтвердить или опровергнуть мое понимание этого, я был бы очень признателен.

Вы можете использовать следующие настройки

Cmnd_Alias SVNUP = /root/webhooks/svn_update.sh
apache ALL=(ALL) NOPASSWD: SVNUP

Создать простой тестовый скрипт

# cat test.sh
#!/bin/bash

set -u
echo "Param1: $1"

Сделайте простые тесты

$ id alex
uid=506(alex) gid=506(alex) groups=506(alex)

$ cat /root/webhooks/test.sh
cat: /root/webhooks/test.sh: Permission denied

$ sudo /root/webhooks/test.sh val1
Param1: val1

$ sudo /root/webhooks/test.sh
/root/webhooks/test.sh: line 5: $1: unbound variable

Но вы должны быть очень осторожны с расширениями переменных, например

$ sudo /root/webhooks/test.sh "$(rm -fr ~/*)"

P.S. В качестве альтернативы вы можете использовать mpm-itk с apache и запускать этот конкретный vhosts с конкретным пользователем.