目标:使用最新的svn提交更新/var/www
。
ubuntu服务器10.10,最新的apache2,最新的svn,位置:/var/svn/[projectname]
为此,我创建了一个简单的提交后脚本:
#!/bin/bash
#tests if www-data user runs this script on commit (which it does)
touch /tmp/test.log
#works when run from the command line (sudo ./post-commit) but not when run by www-data
sudo /usr/bin/svn update /var/www
要解决第二个命令不能用作www-data的问题,我试过......
修改:sudo visudo
并添加(最后):www-data ALL=(ALL) NOPASSWD:ALL
Chowning:/var/www
到www-data:www-data
Chmoding:所有/var/www
到777
仍然没有运气......任何想法?
答案 0 :(得分:1)
如果您运行该怎么办:
su - www-data -c '/usr/bin/svn update /var/www'
(如果/ var / www /是777且由www-data拥有,则不需要sudo。)
作为root用户? (然后它suid()
作为www-data并运行命令)。
它应该提供有关实际失败的更多信息。
或者,您可以尝试记录提交后挂钩的svn update
输出:
/usr/bin/svn update /var/www &> /tmp/my-svn-update.log
我认为这两项测试可以为您提供有关所发生事件的更多信息。
SIDE注意:我不确定你是否真的想冒险让www-data能够以root用户身份运行任何命令..如果你绝对需要让它运行svn作为root(我没有看到它的意思,但它可能是),只需在/ etc / sudoers中使用它:
www-data ALL=NOPASSWD: /usr/bin/svn
答案 1 :(得分:0)
我首先使用您建议的日志记录机制,并帮助修复它!谢谢!
输出的错误与repro中的文件名无关,无法转换为UTF-8。我删除了文件,但它确实有效。但是为什么它在直接调用post-commit时起作用...我不知道。
顺便说一句,我错误地认为它是bash(它是sh)所以我不得不改变&>到2>此外,我删除了签出的文件,将权限和所有者重置为/ var / www上的正常,然后再将其重新检出。
我最后的sudoers线:
www-data ALL=NOPASSWD:/usr/bin/svn update /var/www
非常感谢你的帮助!