为什么使用ssh的git使用git作为用户名

时间:2017-12-06 00:14:14

标签: git github ssh

这只是关于git如何运作的一般问题。我在git手册中找不到与此相关的任何内容,也许我找不到合适的位置。

当您使用git服务器中的ssh链接进行克隆时,它使用的用户名是git,而不是您尝试使用的密钥的用户名。为什么git会这样做?git如何能够告诉它应该使用哪个密钥对来验证连接。

2 个答案:

答案 0 :(得分:1)

  

当您使用git服务器中的ssh链接进行克隆时,它使用的用户名是git,而不是您尝试使用的密钥的用户名。

正确。原因是该服务与用户帐户绑定,您需要以该用户身份访问服务器才能调用该服务。这实际上是SSH的一个特性,而不是Git的特性 - Git只是使用SSH作为传输。  此外,SSH - 因此Git - 对与SSH密钥关联的用户一无所知 - 只是它已被批准用于访问该帐户。这通常通过Git用户的authorized_keys文件完成,Gerrit或Gitolite等工具在您添加和删除用户时管理该文件。 authorized_keys文件允许指定在经过身份验证时运行的特定命令,这些工具使用该功能与用户进行通信 - 然后应用程序从该处确定权限。

  

为什么git会这样做?git如何能够告诉它应该使用哪个密钥对来验证连接。

这里有一点误解。其中一些不是Git,而是SSH。像Git这样的工具使用SSH作为传输,因为它完成了身份验证,保护网络活动的艰苦工作,并且使用ssh-agent等工具来简化身份验证。为什么重新发明轮子?

密钥对实际上是通过以下两种方式之一确定的:您在~/.ssh/config中指定它(这就是我所做的),或者让ssh遍历可用密钥并弄清楚。如果管理员设置了严格的规则,后者可能会导致问题,因为任何不起作用的密钥都将被视为身份验证尝试。大多数人没有多个密钥,因此通常不是问题。

您可以使用ssh -v git@github.com或您要针对的服务器查看此次谈判的一些内容:

OpenSSH_7.4p1, LibreSSL 2.5.0
debug1: Reading configuration data /Users/jszakmeister/.ssh/config
debug1: /Users/jszakmeister/.ssh/config line 286: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Control socket "/tmp/git@github.com:22" does not exist
debug1: Connecting to github.com [192.30.255.113] port 22.
debug1: Connection established.
debug1: identity file /Users/jszakmeister/.ssh/id_rsa type 1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/jszakmeister/.ssh/id_rsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.4
debug1: Remote protocol version 2.0, remote software version libssh_0.7.0
debug1: no match: libssh_0.7.0
debug1: Authenticating to github.com:22 as 'git'
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: curve25519-sha256@libssh.org
debug1: kex: host key algorithm: ssh-rsa
debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ssh-rsa SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8
debug1: Host 'github.com' is known and matches the RSA host key.
debug1: Found key in /Users/jszakmeister/.ssh/known_hosts:25
Warning: Permanently added the RSA host key for IP address '192.30.255.113' to the list of known hosts.
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/jszakmeister/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
debug1: Authentication succeeded (publickey).
Authenticated to github.com ([192.30.255.113]:22).
debug1: channel 0: new [client-session]
debug1: Entering interactive session.
debug1: pledge: network
PTY allocation request failed on channel 0
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
Hi jszakmeister! You've successfully authenticated, but GitHub does not provide shell access.
debug1: channel 0: free: client-session, nchannels 1
Connection to github.com closed.
Transferred: sent 2988, received 1868 bytes, in 0.2 seconds
Bytes per second: sent 19242.2, received 12029.6
debug1: Exit status 1

我不确定完全回答你的问题,但我希望它有所帮助。

<强>更新

SSH是一个非常强大的工具,也有很多配置选项。为了让生活更轻松,您可以做的一件事是设置您的配置以应用您想要使用的用户名和密钥文件:

的〜/ .ssh /配置

Host gh
    Username git
    Hostname github.com
    IdentityFile ~/.ssh/id_github

您可以使用上述内容来允许git clone gh:foo/bar.git基本上表示git clone git@github.com:foo/bar.git并使用不同的SSH密钥进行身份验证。我一直使用这个功能,而不仅仅是与Git相关的东西。

答案 1 :(得分:0)

请勿忘记,您无法在远程Git存储库托管服务器上实际打开交互式安全shell:

  1. 您没有业务执行该服务器上的任何命令
  2. 您的帐户永远不会被创建(因为1。)
  3. 您应该感兴趣的唯一命令是Git命令(upload-pack,receive-pack,用于实现您正在执行的git clone / pull / push。)
  4. 出于所有这些原因,您申请远程shell所需的唯一帐户是管理这些Git远程回购的管理帐户,通常命名为&#39; git&#39;。

    其中一些服务器会使用名为&#39;强制命令&#39; 的 ssh功能(I presented it here for Gitolite,但它也适用于GitLab)
    这意味着它知道您的帐户名称,因为它被写为与~git/.ssh/authorized_keys中的公钥关联的强制命令的参数,该命令跟踪授权打开(非交互式)shell的所有公钥。
    这就是Git托管服务如何知道哪些帐户正在发出Git请求。