我有一台 Linux 服务器,我正尝试svnsync
根据存储库列表来运行镜像/备份。
我创建了一个文件夹/srv/backups
并将其设置为具有 的组 gsid adm
,chmod g+s
以便在此目录中创建的任何项目或文件夹都保留 adm 组所有权。
失败
然后我:
svnadmin create blah
在下创建一个存储库/srv/backups
,- 将
pre-revprop-change
钩子脚本复制到blah/hooks/
- 确保钩子是可执行的
chmod +ax blah/hooks/pre-revprop-change
- 尝试
svnsync init
针对 blah 和远程存储库运行。无论以我本人还是 root 身份运行,都会失败,并出现 pre-revprop-change 脚本的 255 错误消息。
svnsync:E165001:Revprop 更改被 pre-revprop-change 钩子阻止(退出代码 255),没有输出。
成功
如果我重复上述相同的步骤,将相同的pre-revprop-change
钩子复制到目标镜像,但是:
- 以我自己的身份运行我主目录下的文件夹,
- 或者以 root 身份运行,但
/srv/svnmirrors
该目录下root:adm
有所有权,但 gsid 未设置,
然后它正确执行,允许我初始化并稍后同步。
假设
因此,我很确定这是 gsid 的问题,并且 svnsync 没有权限运行该钩子。
我的理解是设置 gsid 会告诉针对此目录运行的程序使用这些凭据运行;因此添加文件夹是以 myself:adm 的身份完成的,并且我希望运行 svnsync 能够以 myself:adm 或 root:adm 的身份运行,并且应该具有足够的权限。
权限
以下是失败和成功/srv
下的主要文件夹:backups
svnmirrors
drwxrwsr-x 11 root adm 4096 9月 16 17:09 备份
drwxrwxr-x 2 root adm 4096 9月 16 17:24 svnmirrors
以下是两个位置的挂钩:
执行失败的钩子;以 root 和 myuser 身份尝试:
-rwxr-xr-x 1 myuser adm 2794 9月 16 16:54 backups/blah/hooks/pre-revprop-change
- 或 -
-rwxr-xr-x 1 root adm 2794 9月 16 16:54 backups/blah/hooks/pre-revprop-change
接下来的一个
-rwxr-xr-x 1 myuser myuser 2794 9月 16 16:45 svnmirrors/blah/hooks/pre-revprop-change
想法:
- 是不是svnsync没有在adm组下运行?
- 如果可以,是否可以将 svnsync 添加到 adm?
- 或者我需要在文件夹上设置不同的组并确保我在该组中?
- 通过设置 gsid,我是否会暴露服务器上的漏洞?参考本章主要讨论安全性。
答案1
已解决 - 无需noexec
选项即可挂载分区
确保您已经挂载了没有该选项的目录noexec
!
我不知道是什么让我看进去/etc/fstab
(或者为什么我没有早点想到这一点)但这/srv/backups
是一个单独的分区并且我已经用选项声明了它noexec
。
这使得钩子无法运行;将其移除并重新安装,一切正常。
但是,我将从文件夹中删除 gsid,将分区更改为nosuid
,并允许执行。
答案2
如果还没有,pre-revprop-change
除了将其复制到位之外,您还需要修改钩子——svn:log
默认情况下,它会阻止 revprop 更改(对除 之外的所有属性)。您需要添加类似以下内容的内容:
if [ "$USER" = "svnsync" ]; then exit 0; fi
看这里了解更多信息。
答案3
我是否可以建议使用 Chris Knight 的 svnbackup.pl 和 svnrestore.pl 脚本来备份您的 Repo?我们使用它并且效果很好。