我有一个我负责管理的存储库服务器(主要用于学术目的),并且各种团体都想使用 git 和其他 svn。有些人需要访问这两个存储库。我不希望给个人用户 shell 访问权限,但我找不到任何方法让 git-shell 与 svn(或 svnserve 与 git)一起玩得很好。有没有办法做到这一点?也许某种方式要求 git-shell 通过一些 git-shell-commands 技巧将无法识别的命令传递给 svnserve?
对于这种情况,规定的最佳做法是什么?
我有一个我负责管理的存储库服务器(主要用于学术目的),并且各种团体都想使用 git 和其他 svn。有些人需要访问这两个存储库。我不希望给个人用户 shell 访问权限,但我找不到任何方法让 git-shell 与 svn(或 svnserve 与 git)一起玩得很好。有没有办法做到这一点?也许某种方式要求 git-shell 通过一些 git-shell-commands 技巧将无法识别的命令传递给 svnserve?
对于这种情况,规定的最佳做法是什么?
没问题,只要你在不同的端口上运行它们。
如果您希望它们都提供同一个存储库,那么它会变得有点复杂。基本上你必须用另一个库来模拟一个,因为它们不共享相同的底层设计决策,这样的模拟会有弱点。
如果您正在讨论凭据处理缺乏协调,那么只需让 svn 和 git 将它们的凭据检查委托给特定用途的凭据处理库(如 pam、kerberos 或其他东西)。
最佳实践是将凭证处理(身份验证)委托给其他东西,但单独管理每个存储库,通过 svn 配置文件(授权)管理 svn 用户(但不是他们的凭证),通过 git 管理 git 用户(但不是他们的凭证)配置文件(授权)。
在任何情况下,我都不建议在同一产品中结合身份验证和授权,即使这可能是配置它们的默认方式。这是因为密码不同步只是时间问题,任何“重置密码”工作都需要为每个产品和每个帐户重复。
使用 git-shell,可以通过创建用户 'gitsvn' 来允许访问 git 和 svn,然后使用 git-shell 作为 gitsvn 登录 shell。创建以下目录树(在 'gitroot' 中使用裸 git 存储库,在 'svnroot' 中使用 svn 存储库)。
gitsvn@server:~$ pwd
/home/gitsvn
gitsvn@server:~$ ls -l *
gitroot:
total 4
drwxr-xr-x 7 gitsvn gitsvn 4096 Jan 5 17:17 test
git-shell-commands:
total 4
-rwxr-xr-x 1 gitsvn gitsvn 52 Jan 5 17:22 help
lrwxrwxrwx 1 gitsvn gitsvn 17 Jan 5 16:22 svnserve -> /usr/bin/svnserve
svnroot:
total 4
drwxr-xr-x 6 gitsvn gitsvn 4096 Jan 5 16:23 test3
gitsvn@server:~$ cat git-shell-commands/help
#!/usr/bin/python
print """
Restricted shell.
"""
gitsvn@server:~$
可以通过以下方式访问存储库:
ruser@client:/tmp/svnc$ svn checkout svn+ssh://gitsvn@server/home/gitsvn/svnroot/test3
gitsvn@server's password:
A test3/it
Checked out revision 1.
ruser@client:/tmp/svnc$ git clone gitsvn@server:/home/gitsvn/gitroot/test
Cloning into 'test'...
gitsvn@server's password:
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
Checking connectivity... done.
我相信 git-shell 从 git 方面提供了基本的安全性。然而,一旦你在 git-shell-commands 中放置了任意应用程序,所有的赌注都没有了。因此,根据您的安全情况,可能值得围绕 svnserve 编写一个参数检查包装器,以防止恶意 svn 客户端将任意参数传递给 svnserve。