Wie können Sie Leerzeichen und dergleichen im Remote-Pfad umgehen, wenn Sie SSH verwenden, um rsync mit einem Remote-Server zu verbinden? Ein einfacher Backslash entgeht dem Leerzeichen für die lokale Bash-Eingabeaufforderung, aber auf dem Remotecomputer wird das Leerzeichen dann als Unterbrechung des Pfads gelesen, wodurch das Ende dieses Pfads markiert wird.
Wenn ich also tue rsync -avz /path/to/source/some\ dir/ [email protected]:/path/to/dest/some\ dir/
, liest der Remote-Server dies als gerecht /path/to/dest/some/
und da er dieses Ziel nicht aus der Ferne finden kann, weil das eigentliche Ziel "irgendein Verzeichnis" und nicht nur "irgendein" ist.
Wenn ich den gleichen Befehl versuche und dem Backslash und dem Leerzeichen entkomme, um die lokale Bash-Eingabeaufforderung zu umgehen und den Backslash für den Remote-Server beizubehalten (insgesamt drei Backslashes /path/to/dest/some\\\ dir/
:), wird der Backslash zwar an den Remote-Server, aber an den Remote-Server gesendet dann interpretiert den Pfad als /path/to/dest/some\/
anstatt /path/to/dest/some\ dir/
noch den Raum und die Zeichen nach dem Strippen.
Wenn ich versuche, den Pfad in Anführungszeichen zu setzen, verhält es sich fast genauso und schneidet den Pfad an der Stelle effektiv ab. Es funktioniert also auch nur, um die lokale Bash-Eingabeaufforderung zu überwinden.
Ursprünglich verwendete ich einen Pfad, der ein "-" (Space-Hyphen-Space) -Segment enthielt, und der Remote-Server gab einen Fehler zurück, rsync: on remote machine: -: unknown option
der dieses ganze raumflüchtige Unterfangen überhaupt erst auslöste.
Was muss ich also tun, damit dies ordnungsgemäß mit dem Remote-Server funktioniert, ohne dass Leerzeichen oder andere fehlerhafte Zeichen wie Bindestriche aus dem Remote-Pfad entfernt werden müssen?
-s
behebt das Problem, ohne dass Double-Escape manuell angewendet werden muss.Antworten:
Baut auf dem Initiatorcomputer
rsync
eine Befehlszeile auf, die das rsync-Ziel auf dem Remotecomputer aufruft, und sendet diese Befehlszeile dann mit ssh .... als einzelne Zeichenfolge . Diese einzelne Zeichenfolge wird an die Shell übergeben, um sie zu analysieren, in Argumente aufzuteilen und auszuführenrsync
. Ich habe keine Ahnung, warum das getan wird, anstatt die (bereits geteilten, erweiterten und nicht zitierten) Argumente in einen binärsicheren Container in den Remote-Rsync zu packen.Das bedeutet, dass Ihre Argumente von zwei verschiedenen Shells analysiert werden , zitieren und entsprechend anfordern . Normalerweise umschließe ich jedes Argument mit doppelten Anführungszeichen und dann den gesamten Ausdruck mit einfachen Anführungszeichen. Manchmal reicht es nicht aus, oder es kann kompliziert sein, wenn derselbe Ausdruck lokal und remote verwendet werden soll.
In diesen Fällen setze ich normalerweise einige Softlinks mit einfachen ASCII-Namen ohne Leerzeichen und verwende diese.
quelle
'[email protected]:"/path/to/dest/some\ dir/"'
eval
oder über einen Aufruf einer Funktion aus?Sie waren auf dem richtigen Weg, als Sie sagten:
Hier ist ein Weg, den ich am einfachsten finde:
und so funktioniert es auch.
Können Sie die genaue Ausgabe und eventuelle Fehler veröffentlichen?
Können Sie
rsync
auf beiden Seiten durch ein Wrapper-Skript ersetzen ?Führen Sie dann Ihren rsync erneut aus, und es sollte beweisen, dass diese Art der Flucht funktioniert, z
Client-Seite:
Serverseite:
Im obigen Beispiel
dir with spaces
besagt die Tatsache, dass das vierte Argument auf dem Server ( ) nur in einer Zeile steht, dass das Anführungszeichen ordnungsgemäß funktioniert.Wenn dies nicht hilft, versuchen Sie erneut
rsync -v
, oderrsync -vv
, oderrsync -vvv
. Sie erhalten zusätzliche Debugging-Informationen.Zwei andere dumme Vorschläge:
-a
oder hinzuzufügen-r
?quelle
Die Punktantwort:
Verwenden Sie -s (Schützen Sie Argumente) und setzen Sie Ihren Pfad in Anführungszeichen:
rsync -savz user@server:"/my path with spaces/another dir/" "/my destination/"
Funktioniert mit beiden Leerzeichen oder Bindestrichen.
quelle
Sie können Ihren Pfad einfach in Anführungszeichen setzen.
quelle