Warum lehnt die strenge Dateinamenprüfung von scp die letzte zitierte Komponente ab, andere jedoch nicht?

7

Wenn ich versuche, eine Datei mit einem Schrägstrich im Pfad zu scpen, wird der Pfad für den lokalen Host angegeben, und die letzte Pfadkomponente wird zusätzlich für den Remote-Host angegeben, z. B. scp host:"a/b/'c'" .schlägt dies fehl

protocol error: filename does not match request

es sei denn, ich benutze die -TOption. Wenn jedoch eine andere Pfadkomponente in Anführungszeichen gesetzt wird scp host:"a/'b'/c" ., funktioniert dies. Auch wenn der Pfad nicht für den lokalen Host angegeben ist scp host:a/b/'c' ., funktioniert er.

Die Manpage dokumentiert -Twie folgt :

Deaktivieren Sie die strikte Überprüfung des Dateinamens. Beim Kopieren von Dateien von einem Remote-Host in ein lokales Verzeichnis überprüft scp standardmäßig, ob die empfangenen Dateinamen mit den in der Befehlszeile angeforderten übereinstimmen, um zu verhindern, dass das Remote-Ende unerwartete oder unerwünschte Dateien sendet. Aufgrund der unterschiedlichen Interpretation von Platzhaltern für Dateinamen durch verschiedene Betriebssysteme und Shells können diese Überprüfungen dazu führen, dass gewünschte Dateien abgelehnt werden. Diese Option deaktiviert diese Überprüfungen auf Kosten des vollständigen Vertrauens, dass der Server keine unerwarteten Dateinamen sendet.

Ich verstehe nicht, wie diese Beschreibung das Verhalten erklärt, das ich sehe. Was ist der Grund für das Verhalten von scp? Und gibt es eine Möglichkeit, diese "Funktion" zu deaktivieren?

Ich verwende Ubuntu 16.04 und auf dem Remote-Host wird Ubuntu 12.04 ausgeführt.

Setzen Sie Monica wieder ein
quelle
Möglicherweise entfernt das Remote-System die Anführungszeichen und sendet tatsächlich eine Datei, in a/b/cdie ./cauf Ihrem lokalen System kopiert wird. Eine Datei cstimmt nicht mit Ihrem Muster überein "'c'". Sie deaktivieren die Option Prüfung mit -T. Wenn Sie das Verzeichnis zitieren, erhalten 'b'Sie eine Datei mit dem Namen, cunabhängig davon, wie das Remote-System interpretiert a/'b'. Da die übertragene Datei mit dem angegebenen Muster übereinstimmt, benötigen Sie sie nicht -T.
Bodo
@ Bodo Das ist eine plausible Erklärung. Vielleicht kennt scp nicht , was die Remote - Host - Anwendungen Shell , so dass es nicht sicher ist , dass es canonicalize kann 'c'zu c. Aber es ist furchtbar unpraktisch.
Stellen Sie Monica
Wovon erwarten Sie eine Kopie scp host:"a/b/'c'" .? Eine Datei c? Eine Datei 'c'mit einfachen Anführungszeichen im Namen?
Bodo
@Bodo Ich erwarte a/b/'c', an die Remote-Shell und die Remote-Shell zu übergeben, um sie als Datei cim Ordner zu interpretieren a/b. Mit anderen Worten, die in den Dateisystemen auf dem Remote- und dem lokalen Host gespeicherten Dateinamen wären beide c. Im Idealfall würde es also keinen Fehler ohne geben -T. Und der Einheimische scpweiß, dass es spezifiziert 'c'und zurückgekommen ist c. Es ist jedoch möglicherweise nicht bekannt, dass die beiden in den jeweiligen Dateisystemen identisch sind.
Stellen Sie Monica
Warum haben Sie die verschachtelten Anführungszeichen? Wenn Sie cp "a/b/'c'" .den cpBefehl ausführen , wird versucht, eine Datei zu kopieren, 'c'da die inneren einfachen Anführungszeichen durch die äußeren doppelten Anführungszeichen in Anführungszeichen gesetzt werden. Ihre Erwartung, wie Sie scpIhren seltsamen Dateinamen interpretieren sollen, könnte für andere (für die Autoren von scp) verwirrend sein .
Bodo

Antworten:

2

Ubuntu-Leute sind dafür bekannt, rücksichtslose / teilweise Patches durchzusetzen (aktuelles Beispiel ); In Ihrem Fall handelt es sich um diesen Patch , der weniger als 3 Wochen alt ist, einschließlich der Zeit, die für Schnappschüsse aufgewendet wurde:

check in scp client that filenames sent during remote->local directory
copies satisfy the wildcard specified by the user.

This checking provides some protection against a malicious server
sending unexpected filenames, but it comes at a risk of rejecting wanted
files due to differences between client and server wildcard expansion rules.

For this reason, this also adds a new -T flag to disable the check.

reported by Harry Sintonen
fix approach suggested by markus@;
has been in snaps for ~1wk courtesy deraadt@

OpenBSD-Commit-ID: 00f44b50d2be8e321973f3c6d014260f8f7a8eda

Das ist nicht bereit für die Prime Time (es ist naiv mit fnmatch(3)auf dem Basisnamen der Datei) und bereits für Klammer zu ermöglichen , festgelegt hatte Erweiterungen .

Fazit: Es ist ein Fehler; es wird wahrscheinlich früher oder später behoben; oder wenn nicht, seien Sie bereit, diese neue Fehlfunktion immer mit zu deaktivieren -T.

Onkel Billy
quelle
Entschuldigung, ich bin neu auf dieser Seite und wusste nicht, dass sich scp unter Ubuntu anders verhalten würde als in anderen Distributionen.
Stellen Sie Monica