Warum folgt der Befehl ssh nicht RFC auf URI?

9

Der RFC:

präsentiert die SSH-URI als:

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

Gibt es bekannte Gründe, warum der OpenSSH-Befehl ssh diesem Standard mit der Option hostname nicht folgt? Es akzeptiert keinen Port nach einem Doppelpunkt.

Beispiel für eine URI, von der ich erwartet hatte, dass sie funktioniert:

$ ssh user@host:2222
ssh: Could not resolve hostname host:2222: Name or service not known
Tomasz Wasiluk
quelle
Ich denke @ MichaelKjörling ist richtig. Der Doppelpunkt ist die Grenze, an der der Hostname stoppt und der Pfad auf diesem Host beginnt. Sie müssen den -pSwitch verwenden, um einen alternativen Port zu übertragen.
slm
6
Das ist kein RFC, das ist ein Entwurf, der seit 2006 nicht mehr
durchgearbeitet wurde
Ich bin damit einverstanden, dass rfc3986 angemessener gewesen wäre, um zu zitieren.
Tomasz Wasiluk

Antworten:

5

sshälter als das allgemeinere URI-Format ( 1998 ) um mehrere Jahre (1995 IIRC).

Anthon
quelle
Sie sagen also, dass der im Dezember 1994 veröffentlichte Entwurf von RFC 1738 die OpenSSH-Entwicklung nicht hätte beeinflussen können? OpenSSH erschien zuerst in OpenBSD 2.6 und die erste tragbare Version wurde im Oktober 1999 nach Wikipedia veröffentlicht . Es sei denn, es musste mit den ssh.com-Tools kompatibel sein?
Tomasz Wasiluk
RFC 1738 ist für URLs und war in meiner Erinnerung kein so allgemeines Format und wurde später in URIs verallgemeinert. openssh ist viel später als ssh, ich erinnere mich nicht, dass ich den Übergang gemacht habe, daher besteht eine gute Chance, dass sie weitgehend mit der Befehlszeile kompatibel sind.
Anthon
14

Ich habe dies ursprünglich als Kommentar gepostet, werde es aber als Antwort ein wenig ausarbeiten.

OpenSSH enthält mehrere Dienstprogramme, die zu den bemerkenswertesten davon sshund scp. Während sshnur eine Verbindung zu einem Remotecomputer hergestellt wird (und möglicherweise ein Befehl auf diesem Remotecomputer ausgeführt wird), haben andere Teile von OpenSSH, z. B. scpeine etwas andere Syntax. Da alle Teil der OpenSSH-Suite sind, teilen diese wahrscheinlich viel Code.

Mit geben scpSie eine entfernte Datei in einem Triplett-Formular an user@host:remotefilename, wobei remotefilenamees sich um einen relativen oder absoluten Pfad handeln kann.

Wenn der Host - Abschnitt erlaubt wurde auf der Form zu seinhost:port , wäre dies eine mögliche Zweideutigkeit schaffen: sich [email protected]:2222bezieht ~jdoe/2222auf host.example.com wenn sie auf dem Standard - Port anschließen, oder bezieht es überhaupt keine Datei (oder noch schlimmer, ~jdoe) auf host.example.com beim Verbinden über Port 2222?

Die von Ihnen präsentierte URI-Syntax ist in ihren Ausdrucksmöglichkeiten eingeschränkter (sie erlaubt keine Dateinamenangabe), und was noch wichtiger ist, es kann niemals zu Mehrdeutigkeiten kommen, es sei denn, der tatsächliche Hostname enthält a :(was ich nicht glaube) ist sogar in DNS möglich und wird sicherlich nicht häufig durchgeführt, wohingegen rein numerische Dateinamen nicht allzu ungewöhnlich sind.

Als SSH ursprünglich entwickelt wurde , wurde es als sicherer Ersatz für die frühere RSH / rlogin-Tool-Suite entwickelt. Ich weiß nicht, wie die Befehlszeilensyntax dafür Anfang der neunziger Jahre lautete (der RFC, der rlogin beschreibt, ist RFC 1282 vom Dezember 1991 und liegt etwa 15 Jahre vor dem von Ihnen zitierten Dokument), aber es scheint nicht unangemessen Vermutlich wurde eine sehr ähnliche Syntax verwendet, da der Benutzername speziell im rlogin-Protokoll übertragen wurde. RFC 1282 zitieren:

Beim Verbindungsaufbau sendet der Client vier nullterminierte Zeichenfolgen an den Server. Die erste ist eine leere Zeichenfolge (dh sie besteht nur aus einem einzelnen Null-Byte), gefolgt von drei Nicht-Null-Zeichenfolgen: dem Client-Benutzernamen, dem Server-Benutzernamen sowie dem Terminaltyp und der Geschwindigkeit. Genauer gesagt: ...

Der lokale Benutzername kann über verschiedene Systemeinrichtungen abgerufen werden, aber der Remote-Benutzername muss irgendwie explizit angegeben werden . Abgesehen davon, dass es @häufig als "at" ausgesprochen wird und daher zunächst eine ziemlich natürliche Wahl ist, lässt es sich user@hostgut auf die etablierte Syntax für z. B. E-Mail-Übertragung abbilden (vergleichen Sie eine SMTP-Adresse von user@host, bei der es sich hostmöglicherweise um einen tatsächlichen Host oder einen DNS-Namen handelt, auf den ein MX-Eintrag zeigt zu einem tatsächlichen Gastgeber), also war es wahrscheinlich eine einfache Wahl, anstatt sich etwas Neues auszudenken.

Es ist auch erwähnenswert, worauf Stephane Chazelas in einem Kommentar hingewiesen hat : Das Dokument, auf das Sie sich beziehen, ist kein RFC, sondern ein derzeit sieben Jahre alter Entwurf, der nach einer schnellen Google-Suche zur Bestätigung nie in Gang gekommen zu sein scheint . Das passiert die ganze Zeit; Es wird etwas vorgeschlagen, das jedoch nicht die Unterstützung erhält, um es tatsächlich zu einem RFC zu machen (und selbst viele, viele RFCs sind keine Standards).

ein CVn
quelle
1
Ich denke, meine Frage hätte lauten sollen: "Warum folgen OpenSSH-Dienstprogramme nicht den allgemeinen URI-Standards?". Obwohl ich Ihre Einsicht schätze, hat sie meine Frage nicht beantwortet.
Tomasz Wasiluk
+1 historische Perspektive ist nützlich, um das chaotische Meer der Standards
msw
Um den Kommentar "Viele RFCs sind keine Standards" zu erweitern, könnte dies nicht weiter von der Wahrheit entfernt sein. Die Natur eines RFC ist eine "Bitte um Kommentar"; es ist nur informativ. Dies kann eine Notiz, ein Memo oder eine Dokumentation sein. Ein RFC ist lediglich ein veröffentlichtes Memo. RFCs sind einfach auch eine der vielen Möglichkeiten, wie Standarddokumentationen veröffentlicht werden, obwohl dies nicht der einzige Zweck eines RFC ist. Ein Standard kann über einen RFC dokumentiert werden, ein RFC ist jedoch nicht immer eine Dokumentation für einen bestimmten Standard. Eine Banane ist eine Frucht, aber nicht alle Früchte sind Bananen.
Schwenken