![为什么 ssh 命令不遵循 URI 上的 RFC?](https://linux22.com/image/31893/%E4%B8%BA%E4%BB%80%E4%B9%88%20ssh%20%E5%91%BD%E4%BB%A4%E4%B8%8D%E9%81%B5%E5%BE%AA%20URI%20%E4%B8%8A%E7%9A%84%20RFC%EF%BC%9F.png)
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 包含多个实用程序,其中最著名的是ssh
和scp
。虽然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)。