如何在SSH中使用git-push –mirror和git-shell?

我正试图在我们的仓库中设置一个镜像到备份的钩子。 钩子正在执行一个git push --mirror backup@server:path/foo.git 。 但是它没有说明:

 fatal: What do you think I am? A shell? fatal: The remote end hung up unexpectedly 

我的.ssh/authorized_keys文件具有以下条目:

 command="/path/to/git-shell" ssh-rsa .... # no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty # these are all set i just removed them for brevity. 

我尝试了各种组合,但git-shell文档非常稀疏。 我不确定是什么问题,我希望这里有人能指点我的方向。 什么是造成这个错误? 我的印象是git-shell是用来推/拉的。 显然,我一定会错过一些东西,但是我不知道它是什么。

备份服务器上的path是build立裸仓库。

我认为问题在于你已经在authorized_keys文件中设置了一个命令,但man sshd的authorized_keys文件格式部分明确指出:

命令=“命令”
指定只要使用此密钥进行身份validation就执行该命令。 用户提供的命令(如果有的话)被忽略。 (……)

这意味着只要git-upload-pack尝试联系git-receive-pack (通过包括git-receive-pack的调用在内的ssh命令的方式,它将被压缩,转而使用.ssh/authorized_keys指定的命令。
git-shell可以接受入站git相关的通信,但是因为git-upload-pack的参数被压扁为空,前者假定有人试图打开一个普通的terminal,并将其切断。 这在man git-shell有解释:

名称
git-shell – 仅限Git-SSH访问的受限loginshell
概要
git shell [-c]
描述
SSH帐户的loginshell提供受限制的Git访问。 当给出-c时,程序以非交互方式执行; 可以是git的接收包,git上传包,git上传档案,cvs服务器,或COMMAND_DIR。(…)

我的build议是(假设你还没有这样做)为git单独创build一个单独的用户帐户,并让该帐户在<git-home>/.ssh/authorized_keys携带相应的公钥。 此外,不要忘记删除相关公钥中的强制命令。
另外,我build议你通过修改/etc/passwd来设置git的用户帐户来使用git-shell作为默认shell,如下所示:

 从“git:*:1000:1000:git系统帐户:/ home / git:/ bin / sh”
 “git:*:1000:1000:git系统帐户:/ home / git:/ usr / local / bin / git-shell” 

如果git-shell被安装在/usr/local/bin之外的某个地方,那么which git-shell会告诉你确切的path。

希望能帮助到你 ;-)

注意一个完整的答案,但是你可以从gitolite mirror-shell setup中获得一些线索,其中一个gl-mirror-shell脚本实际上是调用git shell

也许看看这里:

http://joey.kitenet.net/blog/entry/locking_down_ssh_authorized_keys/

这页build议

command="perl -e 'exec qw(git-shell -c), $ENV{SSH_ORIGINAL_COMMAND}'"

SSH_ORIGINAL_COMMAND转发到git-shell 。 它在我身边工作。