Niedawno skonfigurowałem zdalne repozytorium git na serwerze dla aplikacji internetowej działającej jako usługa Upstart. Chciałbym użyć haczyka po otrzymaniu do uruchomienia działań wymaganych do zaktualizowania kodu aplikacji i zatrzymania, a następnie ponownego uruchomienia usługi aktualizacji. To jest mój plik 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
Na podstawie informacji, które tutaj czytam: askUbuntu.com , sposobem na uruchomienie poleceń upstart jako root jest edycja mojego pliku visudo. Oto odpowiedni fragment:
%sudo ALL=(ALL:ALL) ALL
admin ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service /sbin/stop myapp-service
Ale kiedy pcham push do pilota, otrzymuję dane wyjściowe takie jak:
$ 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.
Sprawdziłem, czy właściwy użytkownik wykonuje skrypt po odbiorze (admin, jak powtórzono powyżej).
Czy ktoś może mi pomóc zatrzymać, a następnie rozpocząć zadanie Upstart w skrypcie przechwytującym git po otrzymaniu? Dopuszczalne byłyby również skrypty javascript w języku Python, PHP lub node.js, gdyby były w stanie wykonać polecenie upstart łatwiej niż bash (jestem nowicjuszem w bash)
Przejrzałem mój dziennik uwierzytelniania i oto, co mam:
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
Odpowiedzi:
Musisz rozdzielić polecenia w pliku sudoers za pomocą przecinków. Teraz, jesteś upoważniające jednego polecenia:
/sbin/start myapp-service /sbin/stop myapp-service
.Musisz pisać
admin ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service, /sbin/stop myapp-service
.źródło
Ok, rozgryzłem to. Musiałem stworzyć osobny skrypt zawierający tylko polecenia, które chciałem uruchomić jako root.
Następnie w moim skrypcie po otrzymaniu wykonaj:
I wreszcie w moim visudo:
Mam nadzieję, że to pomaga komuś innemu
źródło
Mam plik,
/etc/sudoers.d/root_group
który ma po prostu linię%root ALL=(ALL) NOPASSWD: ALL
, i dodaję konta do katalogu głównego grupy, aby umożliwić im korzystaniesudo
bez hasła.Jestem pewien, że istnieją konsekwencje dla bezpieczeństwa plików, które nie uwzględniały kont użytkowników w grupie „root”, ale jeśli się martwisz, możesz użyć innej grupy. Wystarczy zmienić linię
%my_new_group ALL=(ALL) NOPASSWD: ALL
i dodać odpowiednie konta do mojej_nowej_grupy.źródło