我正在尝试在我们的存储库中设置镜像到备份钩子。该钩子正在执行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 中的命令之一。(…)
我的建议是(假设您还没有这样做)为git
alone 创建一个单独的用户帐户,并让该帐户在 中携带相应的公钥<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/bin
,which 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_COMMAND
到git-shell
。它在我这边工作。