为什么 ssh 命令不遵循 URI 上的 RFC?

为什么 ssh 命令不遵循 URI 上的 RFC?

RFC:

将 SSH URI 表示为:

ssh://[<user>[;fingerprint=<host-key fingerprint>]@]<host>[:<port>]

是否有任何已知原因导致 OpenSSH ssh 命令不遵循此标准的主机名选项?它不接受冒号后的端口。

我期望起作用的 URI 示例:

$ ssh user@host:2222
ssh: Could not resolve hostname host:2222: Name or service not known

答案1

我最初将其作为评论发布,但会充实它作为答案。

OpenSSH 包含多个实用程序,其中最著名的是sshscp。虽然ssh只会连接到远程计算机(并且可能在该远程计算机上执行命令),但 OpenSSH 的其他部分(例如)scp具有稍微不同的语法。由于它们都是 OpenSSH 套件的一部分,因此它们可能共享大量代码。

使用scp,您可以将远程文件以三元组形式指定为user@host:remotefilename,其中remotefilename可以是相对路径或绝对路径。

如果允许主机部分出现在表单上host:port,这会产生潜在的歧义:在标准端口上连接时是否[email protected]:2222引用了host.example.com,或者通过端口 2222 连接时~jdoe/2222是否引用了 host.example.com 上的任何文件(或更糟糕的是)?~jdoe

您提供的 URI 语法在它可以表达的内容方面受到更多限制(它不允许文件名规范),更重要的是,除非实际情况,否则永远不会有歧义。主机名包括 a :(我认为这在 DNS 中是不可能的,而且当然不常见,而全数字文件名并不是那么不寻常)。

SSH 最初开发的时间,它是作为早期 RSH/rlogin 工具套件的更安全、直接替代品而开发的。我不知道 20 世纪 90 年代初的命令行语法是什么(描述 rlogin 的 RFC 是RFC 1282 自 1991 年 12 月起,早于您引用的文档大约 15 年),但它使用非常相似的语法似乎并不是一个不合理的猜测,因为用户名是在 rlogin 协议中专门传输的。引用 RFC 1282:

连接建立后,客户端向服务器发送四个以空字符结尾的字符串。第一个是空字符串(即,它仅由一个零字节组成),后跟三个非空字符串:客户端用户名、服务器用户名,以及终端类型和速度。更明确地说:...

本地用户名可以通过各种系统设施获得,但远程用户名必须显式指定不知何故。除了@经常发音为“at”之外,因此是一个非常自然的选择,user@host它很好地映射到已建立的语法,例如电子邮件传输(比较 的 SMTP 地址user@host,其中host可能是实际主机或带有指向 MX 记录的 DNS 名称)到实际的主机),所以这可能是一个简单的选择,而不是创造新的东西。

还值得注意的是斯蒂芬·查泽拉斯 (Stephane Chazelas) 在一篇文章中指出评论:您提到的文档不是 RFC,而是目前已有七年历史的草案,通过快速 Google 搜索来确认,该草案似乎从未启动。这种事经常发生;提出了一些建议,但没有获得实际将其纳入 RFC 的支持(甚至许多,许多RFC 是非标准)。

答案2

ssh早于更通用的 URI 格式(1998年)几年(1995 IIRC)。

相关内容