如何在 SSH 中将 git-push --mirror 与 git-shell 结合使用?

如何在 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 是用于推送/拉取的。显然,我一定漏掉了什么,但我不知道是什么。

备份服务器上的路径是设置的裸存储库。

答案1

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

命令=“命令”
指定每当使用此密钥进行身份验证时执行该命令。用户提供的命令(如果有)将被忽略。(…)

这意味着,无论何时git-upload-pack尝试联系git-receive-pack(通过包括ssh调用 的命令git-receive-pack),它将被压缩以支持 中指定的命令.ssh/authorized_keys
git-shell可以并且确实接受与 git 相关的入站通信,但是因为 中的参数git-upload-pack被压缩为空,前者假定有人正在尝试打开一个普通终端,并将其切断。这在 中有解释man git-shell

姓名
git-shell - 仅限 Git SSH 访问的受限登录 shell
概要
git shell [-c ]
描述
SSH 帐户的登录 shell,用于提供受限的 Git 访问。当指定 -c 时,程序将以非交互方式执行;可以是 git accept-pack、git upload-pack、git upload-archive、cvs server 或 COMMAND_DIR 中的命令之一。(…)

我的建议是(假设您还没有这样做)为gitalone 创建一个单独的用户帐户,并让该帐户在 中携带相应的公钥<git-home>/.ssh/authorized_keys。另外,不要忘记从相关公钥中删除强制命令。
此外,我建议您设置git的用户帐户以用作git-shell其默认 shell,方法是进行/etc/passwd如下修改:

来自“git:*:1000:1000:git 系统账户:/home/git:/bin/sh”
到“git:*:1000:1000:git 系统帐户:/home/git:/usr/local/bin/git-shell”

如果git-shell安装在除 之外的其他地方/usr/local/binwhich git-shell将会告诉您要遵循的确切路径。

希望能帮助到你 ;-)

答案2

注意完整的答案,但你可以从中得到一些线索gitolite 镜像外壳设置,其中gl-mirror-shell脚本实际上是在呼叫git shell

答案3

也许可以看看这里:

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

本页建议

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

转发SSH_ORIGINAL_COMMANDgit-shell。它在我这边工作。

相关内容