![svnserve 似乎以 root 身份写入文件。如何通过 svnserve 和 apache 授予对同一存储库的访问权限?](https://linux22.com/image/614906/svnserve%20%E4%BC%BC%E4%B9%8E%E4%BB%A5%20root%20%E8%BA%AB%E4%BB%BD%E5%86%99%E5%85%A5%E6%96%87%E4%BB%B6%E3%80%82%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%20svnserve%20%E5%92%8C%20apache%20%E6%8E%88%E4%BA%88%E5%AF%B9%E5%90%8C%E4%B8%80%E5%AD%98%E5%82%A8%E5%BA%93%E7%9A%84%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90%EF%BC%9F.png)
目的是设置具有 svnserve 和 apache/webdav 访问权限的 subversion。
当用户通过 http/apache 提交时,文件将写入文件系统并属于 apache 用户。
当用户通过 svn/svnserve 提交时,文件被写入文件系统并属于 root 用户。
我尝试以 svnserve 用户身份设置 apache,但没有任何效果:
cat /pathto/repo/conf/passwd
[users]
apache = XxXxXxX
cat /pathto/repo/conf/svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = passwd
[sasl]
use-sasl = false
svn: Commit failed (details follow):
svn: Can't move '/pathto/repo/db/txn-protorevs/1091-ux.rev'
to '/pathto/repo/db/revs/1/1092': Permission denied
确实,root 是目录的所有者,我想要 apache。
ls -ld /pathto/repo/db/revs/1/
drwxr-s--- 2 root svn 4096 Jul 17 15:25 /pathto/repo/db/revs/1/
现在我使用以下解决方法:
chown -R apache /pathto/repo/db/
有人有干净的运行 svnserve 的解决方案?
更新1:svnserve 作为独立服务运行
更新2:这是 /etc/sysconfig/svnserve 内容:
OPTIONS="--threads --root /pathto "
更新3:我同意 JvO 的观点:使用 http/apache/webdav 作为唯一访问系统会简单得多。不幸的是,第三方软件只有 svn:// 绑定,没有 http:// 绑定。
更新4:修改 svnserve init 脚本应该可行,但是有人有其他想法吗?
更新 5:增加赏金:寻找一个优雅的解决方案
答案1
显然,您的 svnserve 进程以 root 身份运行。因此,请更改配置,以某个非特权用户身份运行该进程(从您的描述中不清楚 svnserve 究竟是如何启动的;可能是 xinetd 或其他东西)。
从安全角度来看,我认为最好的方法是将 apache 和 snvserve 用户添加到一个公共组(如“svn”),并将存储库的权限更改为 drwxrws---(即,组权限是“粘性的”)
答案2
您应该能够修改 svnserv 启动脚本以作为其他用户运行。看一下 https://gist.github.com/dexterbt1/905615 相关部分是
start() {
echo -n $"Starting $desc ($prog): "
daemon --user $USER $prog -d $OPTIONS
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
echo
}
然后你应该能够将 USER 设置/etc/sysconfig/subversion
为你想要运行的用户。我也会回应@JVQ关于以具有共同组的用户身份运行的建议(即创建 svn 用户,使用 svn 组使守护进程以用户 svn 身份运行,然后将 apache 用户添加到 svn 组)