У меня есть скрипт 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 с конкретным пользователем.