git post-receive hook에서 루트로 명령을 실행하는 방법


12

최근에 Upstart 서비스로 실행되는 웹 앱을 위해 서버에 원격 git repo를 설정했습니다. 수신 후 후크를 사용하여 애플리케이션 코드를 업데이트하고 시작 서비스를 중지 한 후 다시 시작하는 데 필요한 조치를 트리거하고 싶습니다. 이것은 내 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

내가 읽은 info : askUbuntu.com을 기반으로 upstart 명령을 루트로 실행하는 방법은 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.

올바른 사용자가 수신 후 스크립트를 실행하고 있는지 확인했습니다 (위의 에코).

누군가 내가 git post-receive 훅 스크립트에서 Upstart 작업을 중지했다가 시작하도록 도울 수 있습니까? Python, PHP 또는 node.js Javascript 스크립트는 bash보다 upstart 명령을 더 쉽게 실행할 수 있으면 허용됩니다 (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

알았어 루트로 실행하려는 명령 만 포함하는 별도의 스크립트를 만들어야했습니다.

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

그리고 마지막으로 내 visudo에서 :

%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하여 암호없이 사용할 수 있습니다 .

"루트"그룹에있는 사용자 계정을 고려하지 않은 파일 권한에 보안 관련이 있다고 확신하지만, 우려되는 경우 다른 그룹을 사용할 수 있습니다. 행을 변경하고 %my_new_group ALL=(ALL) NOPASSWD: ALL관련 계정을 my_new_group에 추가하십시오.


고맙지 만 암호없이 실행할 수있는 유일한 명령은 스크립트에서 시작 중지 및 시작 호출 만하도록 설정하려고합니다.
djheru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.