git 守护程序超过致命:协议错误:错误的行长字符:SSH-



我在服务器端创建了用户"gitproxy",将我的 ssh 密钥添加到其授权密钥中,并尝试通过 ssh 使用 git 守护程序:

gitproxy:~$ git daemon --port=2222 --verbose

但有错误: 在客户端:

o:~/git$ git clone ssh://server>:2222/home/gitproxy/git
Cloning into 'git'...
ssh: connect to host <server> port 2222: Connection refused
fatal: Could not read from remote repository.

在服务器端:

[18666] Ready to rumble
[18667] Connection from 192.168.211.174:42416
fatal: protocol error: bad line length character: SSH-
[18666] [18667] Disconnected (with error)

存储库存在。此外,我通常在没有密码的情况下通过SSH进入此服务器(因此,我的ssh密钥被接受):

$ ssh gitproxy@192.168.201.84
gitproxy@192.168.201.84:~$

另外,我可以从我的桌面(客户端)获取带有 git-receive-pack 的分支列表:

$ ssh gitproxy@192.168.201.84  git-receive-pack  /home/gitproxy/git
008fef8bbf80818e6b634ca56c3ef6c24e5bbdb7bf74 refs/heads/masterreport-status delete-refs side-band-64k quiet atomic ofs-delta agent=git/2.16.1
0046ef8bbf80818e6b634ca56c3ef6c24e5bbdb7bf74 refs/remotes/origin/HEAD
0048ef8bbf80818e6b634ca56c3ef6c24e5bbdb7bf74 refs/remotes/origin/master

我检查了堆栈溢出上提出的所有可能的修复程序。但是 git 守护进程仍然返回错误。 我将非常感谢任何帮助。提前感谢!

但是

我需要--access-hookgit daemon(或者在客户端运行"git pull"时执行某些操作的任何其他机制)。

然后,仅使用 SSH(根本没有 git 守护程序),您可以使用我举例说明的 gitolite 的 SSH 强制命令机制。

在 ~gitproxy/.ssh/authorized_keys 中,你可以调用任何你想要的脚本来执行操作,然后使用$SSH_ORIGINAL_COMMAND调用 Git 本身(这将包括"git-upload-pack|git-receive-pack|git-upload-archive"Git 命令)。

您甚至可以安装gitolite本身,因为它将为您管理授权部分。

git 守护进程是实现git协议的服务器,即与git://...URL 一起使用的协议。它不理解SSH协议,所以当你这样做时:

git clone ssh://:2222/home/gitproxy/git

您正在尝试通过 SSH 协议连接到<server>:2222(由于 URLssh://...)。然后,git daemon不了解SSH发送给它的内容(错误消息中的SSH-是初始SSH握手的一部分)。

如果您实际上打算使用 SSH 协议与远程仓库进行交互,则根本不需要使用git daemon。通过使用ssh://...URL 表单,git 命令将使用 SSH 调用所需的远程命令(例如,您手动执行的receive-pack)。在这种情况下,只需删除 URL 的端口规范并退出服务器上的git daemon即可。身份验证和加密由 SSH 作为传输机制提供,授权使用文件系统权限完成。

如果确实要使用git daemongit协议,请改为将 URL 更改为git://<server>:2222/...。请注意,git协议不提供任何身份验证、加密或授权机制,并且公开的存储库将完全公开。

> git-daemon 不说 SSH 协议,它说简单的 git 协议;协议的 URL 必须以git://开头,而不是ssh://。 即您的服务器的 URL 是git://192.168.201.84:2222/.

要通过 ssh 使用 git 存储库,您需要一个 ssh 服务器。所以你似乎有一个:在 gitproxy@192.168.201.84;好的,那么存储库的 URL 是ssh://gitproxy@192.168.201.84/home/gitproxy/git.同一 URL 的另一个"类似 scp"的语法是gitproxy@192.168.201.84:git

最新更新