Як виконувати команди як root у git post-accept hoke


12

Нещодавно я створив віддалений git repo на сервері для веб-програми, що працює як послуга Upstart. Я хотів би використати гачок після отримання, щоб запустити дії, необхідні для оновлення коду програми та зупинки, а потім перезапустіть послугу запуску. Це мій файл repo.git / гачки / пост-отримання:

#!/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 , спосіб отримати команди для запуску для запуску як root - це редагувати мій файл visudo. Ось відповідний фрагмент:

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

Але коли я git push до пульта, я отримую висновок на зразок:

$ 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.

Я перевірив, що правильний користувач виконує сценарій після отримання (адміністратор, як повторено вище).

Чи може хтось допомогти мені зупинитись, а потім запустити роботу Upstart у скрипті з гаком, який отримує після git? Скрипти JavaScript JavaScript Python, PHP або node.js також будуть прийнятними, якщо вони зможуть виконати команду для запуску легше, ніж 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.


Дякую за пораду. Я спробую це пізніше сьогодні. Якщо це спрацює, я прийму вашу відповідь, а не мою власну вище.
djheru

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

5

Гаразд, я зрозумів це. Мені довелося створити окремий скрипт, що містить лише команди, які я хотів запустити як root.

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

Потім у моєму сценарії після отримання:

#!/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

І нарешті в моєму візуаді:

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

Сподіваюся, це допоможе комусь іншому


Я впевнений, що колись мені це
стане в

1

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

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


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