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

如何在 git post-receive hook 中以 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 命令以 root 身份执行的方法是编辑我的 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.

我已检查正确的用户是否正在执行后接收脚本(管理员,如上所述)。

有人能帮我在 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

答案1

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

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

答案2

好的,我明白了。我必须创建一个单独的脚本,其中只包含我想要以 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

希望这能帮助别人

答案3

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

我确信文件权限不考虑用户帐户在“root”组中存在安全隐患,但如果您担心,可以使用其他组。只需将行更改为%my_new_group ALL=(ALL) NOPASSWD: ALL并将相关帐户添加到 my_new_group 即可。

相关内容