Как выполнять команды как root в git post-receive hook


12

Я только недавно настроил удаленное git-репо на сервере для веб-приложения, работающего в качестве службы Upstart. Я хотел бы использовать ловушку после получения, чтобы инициировать действия, необходимые для обновления кода приложения и остановки, а затем перезапустить службу upstart. Это мой файл repo.git / hooks / post-receive:

#!/bin/bash
export GIT_WORK_TREE=/var/www/current/myapp/
echo "Checking out new files and restarting app"
echo $USER
git checkout -f
sudo /sbin/stop myapp-service
sudo /sbin/start myapp-service

Основываясь на информации, которую я прочитал здесь: askUbuntu.com , способ заставить команды upstart выполнять от имени пользователя root - отредактировать мой файл visudo. Вот соответствующий фрагмент:

%sudo   ALL=(ALL:ALL) ALL
admin   ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service /sbin/stop myapp-service

Но когда я нажимаю кнопку на пульте, я получаю вывод:

$ git commit -am "test" && git push prod master
[master 59ffccd] test
 1 file changed, 1 insertion(+), 1 deletion(-)
Counting objects: 11, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 544 bytes, done.
Total 6 (delta 4), reused 0 (delta 0)
remote: Checking out new files on production and restarting app
remote: admin
remote: 
remote: sudo: no tty present and no askpass program specified
remote: Sorry, try again.

Я проверил, что правильный пользователь выполняет скрипт post-receive (admin, как показано выше).

Может ли кто-нибудь помочь мне остановить, а затем запустить задание Upstart в скрипте git post-receive? JavaScript-сценарии Python, PHP или node.js также будут приемлемы, если они смогут выполнять команду upstart проще, чем bash (я новичок в bash)

Я посмотрел в моем журнале авторизации, и это то, что у меня есть:

Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): auth could not identify password for [admin]
Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): conversation failed
Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): auth could not identify password for [admin]
Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): conversation failed
Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): auth could not identify password for [admin]
Apr 24 19:35:21 myhost01 sudo:    admin : 3 incorrect password attempts ; TTY=unknown ; PWD=/home/admin/myapp.git ; USER=root ; COMMAND=/s$
Apr 24 19:35:21 myhost01 sudo: unable to execute /usr/sbin/sendmail: No such file or directory
Apr 24 19:35:21  myhost01 sudo: pam_unix(sudo:auth): conversation failed

Двоеточие выглядит неправильно после NOPASSWD. Кроме того, вы проверили журналы? "/var/log/auth.log"
Эллиотт Фриш

Ответы:


6

Вам нужно разделить команды в файле sudoers с помощью запятых. Прямо сейчас, вы разрешаете одну команду: /sbin/start myapp-service /sbin/stop myapp-service.

Вам нужно написать admin ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service, /sbin/stop myapp-service.


Спасибо за чаевые. Я попробую это позже сегодня. Если это сработает, я приму ваш ответ, а не мой собственный выше.
Джеру

Спасибо, что сработало. Я думаю, что я все еще собираюсь пойти по отдельному маршруту сценария вместо авторизации нескольких команд.
Джеру

5

Хорошо, я понял это. Мне пришлось создать отдельный скрипт, содержащий только те команды, которые я хотел запустить от имени пользователя root.

#!/bin/bash
sudo /sbin/stop myapp-service
sudo /sbin/start myapp-service

Затем в моем скрипте post-receive сделайте:

#!/bin/bash
export GIT_WORK_TREE=/var/www/current/myapp/
set -x
echo "Checking out new files on production and restarting app"
echo $USER
git checkout -f
sudo /home/admin/restart-myapp

И, наконец, в моем visudo:

%sudo   ALL=(ALL:ALL) ALL
admin   ALL=(ALL) NOPASSWD: /home/admin/restart-myapp

Надеюсь, это поможет кому-то еще


Я уверен, что когда-нибудь я найду это полезным
jbo5112

1

У меня есть файл, в /etc/sudoers.d/root_groupкотором просто есть строка %root ALL=(ALL) NOPASSWD: ALL, и я добавляю учетные записи в корень группы, чтобы позволить им использовать sudoбез пароля.

Я уверен, что для безопасности доступа к файлам могут возникнуть проблемы, при которых учетные записи пользователей не входят в группу «root», но если вас это беспокоит, можно использовать другую группу. Просто измените строку %my_new_group ALL=(ALL) NOPASSWD: ALLи добавьте соответствующие учетные записи в my_new_group.


Спасибо, но я пытаюсь настроить его так, чтобы единственными командами, которые можно запускать без пароля, были остановка выскочки и запуск вызовов в сценарии.
Джеру
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.