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.
'c'
zu c
. Aber es ist furchtbar unpraktisch.
scp host:"a/b/'c'" .
? Eine Datei c
? 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 Datei c
im 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 scp
weiß, 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.
cp "a/b/'c'" .
den cp
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 Sie scp
Ihren seltsamen Dateinamen interpretieren sollen, könnte für andere (für die Autoren von scp
) verwirrend sein .
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
.