如何在git post-receive hook中以root身份执行命令


12

我最近刚刚在服务器上为作为Upstart服务运行的Web应用程序设置了一个远程git repo。我想使用接收后挂钩触发更新应用程序代码并停止然后重新启动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,获取以root用户身份执行的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 hook脚本中启动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”
Elliott Frisch 2014年

Answers:


6

您需要使用逗号分隔sudoers文件中的命令。现在,您正在授权一个命令:/sbin/start myapp-service /sbin/stop myapp-service

你需要写admin ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service, /sbin/stop myapp-service


谢谢你的提示。我今天晚些时候尝试。如果有效,我会接受您的回答,而不是我上面的回答。
djheru 2014年

谢谢你的工作。我认为我仍将继续使用单独的脚本路线,而不是授权多个命令。
djheru 2014年

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

最后在我的visudo中:

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

希望这对别人有帮助


我相信有一天我会发现这很有用
jbo5112

1

我有一个文件,/etc/sudoers.d/root_group其中只有line %root ALL=(ALL) NOPASSWD: ALL,我将帐户添加到组根目录,以允许他们使用sudo而无需输入密码。

我敢肯定,文件权限会带来安全隐患,因为它不考虑用户帐户位于“ root”组中,但是如果您担心的话,可以使用其他组。只需将行更改为%my_new_group ALL=(ALL) NOPASSWD: ALL并将相关帐户添加到my_new_group。


谢谢,但是我正在尝试进行设置,因此脚本中只有upstart stop和start调用,而无需密码即可运行的命令。
djheru 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.