Git URI 与 SSH URI 规范不匹配

met*_*pia 3 git ssh port uri github

我正在研究SSH URI 规范,以便更多地了解用于通过 SSH 访问 Github 或 Bitbucket 等服务中的存储库的 URL。

\n

典型的 SSH Github URL 如下所示:git@github.com:myuser/myrepo.git,我认为可以将其分解为以下部分:

\n
   scheme           authority\n     |                 |\n    /\xe2\x80\xbe\xe2\x80\xbe\\/\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\\\n    ssh://git@github.com:myuser/myrepo.git\n          \\_/ \\________/ \\_______________/\n           |      |              |\n          user   host           port\n
Run Code Online (Sandbox Code Playgroud)\n

我不明白的是端口部分。官方通用 URI 规范规定端口应仅包含数字值。SSH URI 方案规范遵循通用 URI 规范。OpenSSH配置手册的作用相同。

\n

那么为什么他们在端口部分使用类似路径的文本呢?这是否偏离了事实上已制定的标准?还是我对整件事的理解错误?

\n

如果有人能澄清这一点,我将不胜感激。

\n

met*_*pia 5

TL:DR问题中描述的语法是一个名为 的旧程序的继承rcp,并且不符合 URI 规范。

\n

解释

\n

感谢@jthill 和@torek 为我指明了正确的方向。这是我经过几天的研究后的猜测。

\n

OpenSSH 中的所有三个远程操作程序(sshscpsftp)都接受符合 SSH URI 方案的参数,该方案在其自己的IETF 规范中进行了描述。

\n

广义上讲,任何 URI 都由五个部分组成:方案、权限、路径、查询和片段。另外,权限可以由userinfo、host、port组成。对于 SSH URI 方案,仅允许方案、权限和路径。

\n
   scheme     authority           path\n     |           |                 |\n    /\xe2\x80\xbe\xe2\x80\xbe\\/\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\\/\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\xe2\x80\xbe\\\n    ssh://git@github.com:22/myuser/myrepo.git\n          \\_/\\_________/\\_/\n           |      |      |\n          user   host   port\n
Run Code Online (Sandbox Code Playgroud)\n

然而,有一种替代语法与标准 SSH URI 方案非常相似,但并不完全符合它。此语法是 1981 年创建的旧(远程复制)程序的遗产rcp,比 URI 协议创建早了近十五年。当Berkeley r 命令发布时,要在rsh(远程 shell)或rlogin(远程登录)中指定操作的目标,只需要指定要在其中执行操作的远程计算机,以及可能的用户那台机器也是如此。当时的共识是语法username@hostname。然而,该rcp程序还有一个附加条件,即为了从一个远程位置复制文件或将文件复制到一个远程位置,除了用户和主机之外,开发人员还需要指定该远程计算机中文件的路径,就像cp程序一样。他们遇到的语法是将路径附加到用户/主机声明的末尾,并用冒号分隔:(username@hostname:path/to/file如其自己的联机帮助页中所述)。

\n
    git@github.com:myuser/myrepo.git\n    \\_/ \\________/ \\_______________/\n     |      |              |\n    user   host           path\n
Run Code Online (Sandbox Code Playgroud)\n

当 OpenSSH 团队实现该scp程序时,他们希望为已经使用的开发人员提供熟悉的 API rcp,因此除了新的标准化 SSH URI 方案之外,他们决定继续支持这种旧的自定义语法。然后,在 2005 年,Git 进入了对 SSH 的原生支持,可能在幕后使用 OpenSSH,当 SSH 用于远程操作(如 、 、 和 )时,最终使用了类似rcp的语法。Git 文档将此语法称为类 scp 语法,并且在scp 联机帮助页git-clone 文档Git 协议文档中对其进行了简要描述。最后,尽管缺乏标准化,但它似乎是所有云 Git 服务(如 Github 或 Bitbucket)在提供​​用于克隆存储库的 URL 时使用的语法。clonefetchpushpull

\n