SCP von Remote-Linux zu lokalen Windows mit Leerzeichen im lokalen Pfad

1614
Clay

Um eine Datei von einem Linux-Terminal auf ein Windows-System zu übertragen, funktionieren die folgenden beiden Beispiele gut.

scp /home/user.name/file.html user.name@local.ip.num:/C:/Users/user.name/test_folder/file.html  scp /home/user.name/file.html user.name@local.ip.num:"/C:/Users/user.name/test_folder/file.html" 

Ich muss dies tun, wenn der lokale Ordner Leerzeichen hat und ich den Namen nicht ändern kann /C:/Users/user.name/test folder/

Alle folgenden Fehler schlagen mit der Nachricht fehl scp: ambiguous target

scp /home/user.name/file.html user.name@local.ip.num:"/C:/Users/user.name/test folder/file.html"  scp /home/user.name/file.html user.name@local.ip.num:"/C:/Users/user.name/test\ folder/file.html"  scp /home/user.name/file.html user.name@local.ip.num:"'/C:/Users/user.name/test\ folder/file.html'"  scp /home/user.name/file.html user.name@local.ip.num:"/C:/Users/user.name/test\\ folder/file.html"  scp /home/user.name/file.html user.name@local.ip.num:"'/C:/Users/user.name/test\\ folder/file.html'"  scp /home/user.name/file.html user.name@local.ip.num:"/C:/Users/user.name/test\\\ folder/file.html"  scp /home/user.name/file.html user.name@local.ip.num:"'/C:/Users/user.name/test\\\ folder/file.html'" 

Wie bekomme ich das zum Laufen?

1
Als erstes würde ich versuchen, das komplette Argument zu zitieren (weil es ein einzelnes Argument ist): `scp /home/user.name/file.html 'user.name@local.ip.num: / C: / Users / user.name/test ordner / '`. Wenn dies nicht funktioniert, lesen Sie als Nächstes den SCP-Quellcode, um herauszufinden, wie dieses Argument analysiert wird. dirkt vor 6 Jahren 1
Perfekt gearbeitet! Clay vor 6 Jahren 0

2 Antworten auf die Frage

2
C0deDaedalus
  • Versuchen Sie es mit quotes 'oderDouble quotes " um ein vollständiges Argument.

    Wie von @dirkt in Kommentaren vorgeschlagen. Das vollständige Pfadargument für den ssh-Host sollte die Arbeit erledigen. Das macht Ihren Befehl so:

    scp /home/user.name/file.html 'user.name@local.ip.num:/C:/Users/user.name/test folder/' 
  • Benutzen escape sequence for space dazwischen den Namen des Ordners.

    Sie können die \Fluchtsequenz für ein Leerzeichen (umgekehrter Schrägstrich mit einem Leerzeichen) verwenden. Das macht Ihren Befehl so:

    scp /home/user.name/file.html 'user.name@local.ip.num:/C:/Users/user.name/test\ folder/' 

    Beachten Sie das \mit einem Leerzeichen dazwischen testund folderdas macht es test\ folder.

  • Es kann sein, dass Sie need to escape twiceals Es zuerst lokal und dann auf der Gegenseite entkommen sind. In diesem Fall kannst du so schreiben:

    1. "'complete argument'" innere Anführungszeichen innerhalb doppelter Anführungszeichen wie folgt:

      "'user.name@local.ip.num:/C:/Users/user.name/test folder/'" 

      ODER

    2. Leerzeichen entkommen und komplettes Argument wie folgt zitieren:

      'user.name@local.ip.num:/C:/Users/user.name/test\ folder/' 

      ODER

    3. Entkommen Sie zweimal direkt mit einer Escape-Sequenz

      user.name@local.ip.num:/C:/Users/user.name/test\\ folder/ 

Fühlen Sie sich frei, um weitere Details hinzuzufügen.

Die erste Antwort funktionierte wie ein Zauber. Vielen Dank! Clay vor 6 Jahren 0
0
someoneelse

Das " Symbol " wird von Bash selbst interpretiert. Bash entkapselt alles zwischen Interbreten, wenn dies möglich ist, und stellt den Ausgang einem Befehl dar, der als Zeichenfolge mit bestimmten Sonderzeichen aufgerufen wird. Versuchen Sie es mit dem Apostroph ( ' ) - Symbol Schauen Sie sich die Zeichenfolge nicht an und übergeben Sie sie einfach an einen Befehl, der zuerst aufgerufen wurde. Diese Zeichenfolgen mit ' sollten wie folgt formatiert sein: Wenn Sie sehen möchten

nicht

echo $'dont\'t'