如何设置对ssh git服务器的只读访问权限?

时间:2012-03-08 15:52:57

标签: git ssh repository shared git-clone

我的服务器上有一个git repo,我可以通过SSH推送/拉取,就像:

git clone ssh://user@domain.com/repositories/myrepo.git

它提示我使用我的公钥密码,我可以获取或推送更改,但我想知道是否有一种方法可以设置它,以便人们只能clone读访问权限,因此他们不必输入任何SSH凭据。

提前致谢!

4 个答案:

答案 0 :(得分:4)

不通过ssh;除非你想分发公众,否则他们可以登录,这是一个糟糕的主意。

我们在gitolite上获得此功能的方式是使用git-daemon;您需要打开一个新端口,但可以为每个存储库指定它将服务的端口,并且可以指定只读。用户将使用git协议进行克隆,即

  

git clone git://domain.com/repositories/myrepo.git

另一种方法是将存储库设置为直接通过Web服务器共享;然后用户可以访问标准的http。

git社区书籍here上的页面是一个很好的概述,以及git-daemon的手册页。

答案 1 :(得分:1)

您可以使用git-daemon。这将消除对拥有有效ssh凭证的依赖。

答案 2 :(得分:1)

您可以使用git-shell,仅对存储库设置读取权限,并使用密钥身份验证。当您控制谁获得密钥时,这是可行的。

答案 3 :(得分:0)

鉴于:

  • git clone ssh://remote/src/proj1 和后续的 git pull / git fetch 执行 git-upload-pack 'src/proj1'(带引号)
  • git push 等在远程服务器上执行 git-receive-pack 'src/proj1'

在您的 ~/.ssh/authorized_keys 中,您可以设置一行以:

command="/home/yourusername/bin/checker" ssh-…

其中 ... 部分是您将提供给用户的 SSH 私钥的公钥。

/home/yourusername/bin/checker 可以是一个 shell 脚本:

case $SSH_ORIGINAL_COMMAND in
(git-upload-pack*)
     # run git-upload-pack after unquoting its argument, optionally further restricting
     # access to specific directories
     ;;
(git-receive-pack*)
     exit 1 # deny access
     ;;
(*)
     exit 1 # allow nothing else
     ;;
esac

请检查 authorized_keys man page 以获取额外的安全选项,例如 no-port-forwarding,您很可能希望将其包含在 command="…" 文件中的 authorized_keys 选项中。