質問: 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
回答: sudoersファイル内のコマンドは、コンマを使用して区切る必要があります。現在、_/sbin/start myapp-service /sbin/stop myapp-service_という単一のコマンドを許可しています。admin all=(all:all) nopasswd: /sbin/start myapp-service, /sbin/stop myapp-serviceと書く必要があります。