web-dev-qa-db-ja.com

git post-receiveフックでrootとしてコマンドを実行する方法

最近、Upstartサービスとして実行されているWebアプリ用のリモートgitリポジトリをサーバーにセットアップしました。 post-receiveフックを使用して、アプリケーションコードを更新し、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コマンドを取得する方法は、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.

正しいユーザーが受信後スクリプト(上記のようにadmin)を実行していることを確認しました。

誰かが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
12
djheru

Sudoersファイル内のコマンドは、コンマを使用して区切る必要があります。現在、_/sbin/start myapp-service /sbin/stop myapp-service_という単一のコマンドを許可しています。

admin ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service, /sbin/stop myapp-serviceと書く必要があります。

6
user2313067

わかりました。 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

そして最後に私のvisudoで:

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

これが誰かを助けることを願っています

5
djheru

_/etc/sudoers.d/root_group_に%root ALL=(ALL) NOPASSWD: ALLという行があるファイルがあり、アカウントをグループルートに追加して、パスワードなしでSudoを使用できるようにします。

ユーザーアカウントがグループ「root」に属しているとは見なされなかったファイルのアクセス許可には、セキュリティ上の影響があると思いますが、心配であれば、別のグループを使用できます。行を%my_new_group ALL=(ALL) NOPASSWD: ALLに変更し、関連するアカウントをmy_new_groupに追加します。

1
jbo5112