我在 Ubuntu 上运行了一些网站,并且正在设置一个新的部署工作流程,如下所示(示例使用暂存环境):
在我的开发机器上,我执行git push staging
推送到裸存储库并触发post-receive
钩子的操作,该钩子执行以下操作:
- 在单独的文件夹中检出项目
- 备份当前部署的目录
- 使用 rsync 部署文件
post_deploy.sh
使用脚本设置适当的权限
除权限设置部分外,以上内容均运行良好。
因为我需要使用sudo
来做chgrp
和chown
,所以我尝试将以下内容添加到/etc/sudoers
:
myusername ALL=(ALL:ALL) NOPASSWD: /path/to/post_deploy.sh
但是执行时git push
出现此错误:
remote: sudo: no tty present and no askpass program specified
如果我post_deploy.sh
直接从部署的服务器运行,则不会遇到任何问题。
我如何post_deploy.sh
从 git hook 运行脚本?我不介意输入额外的密码,但据我所知,askpass 不适用于命令行(我是对的吗?)。
答案1
这是 /etc/sudoers 文件的问题,其中有以下条目:
Defaults requiretty
详细信息这个帖子
有两个选项,从 /etc/sudoers 中注释掉Defaults requiretty
设置或使用伪 tty 分配(-t
)参数ssh
。
在您的接收后脚本中尝试执行以下操作:
ssh -t 127.0.0.1 "sudo chown user /path/to/pushfile"
尽管您必须ssh
为自己配置预共享密钥并手动运行一次以向已知主机添加条目(或找到忽略此项的参数)。