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 -T
Option. 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 -T
wie 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.
a/b/c
die./c
auf Ihrem lokalen System kopiert wird. Eine Dateic
stimmt 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,c
unabhängig davon, wie das Remote-System interpretierta/'b'
. Da die übertragene Datei mit dem angegebenen Muster übereinstimmt, benötigen Sie sie nicht-T
.'c'
zuc
. Aber es ist furchtbar unpraktisch.scp host:"a/b/'c'" .
? Eine Dateic
? Eine Datei'c'
mit einfachen Anführungszeichen im Namen?a/b/'c'
, an die Remote-Shell und die Remote-Shell zu übergeben, um sie als Dateic
im Ordner zu interpretierena/b
. Mit anderen Worten, die in den Dateisystemen auf dem Remote- und dem lokalen Host gespeicherten Dateinamen wären beidec
. Im Idealfall würde es also keinen Fehler ohne geben-T
. Und der Einheimischescp
weiß, dass es spezifiziert'c'
und zurückgekommen istc
. Es ist jedoch möglicherweise nicht bekannt, dass die beiden in den jeweiligen Dateisystemen identisch sind.cp "a/b/'c'" .
dencp
Befehl 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 Siescp
Ihren seltsamen Dateinamen interpretieren sollen, könnte für andere (für die Autoren vonscp
) verwirrend sein .Antworten:
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:
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
.quelle