So kopieren Sie Dateien mit SCP vom Remote-Host, wenn die Datei Leerzeichen enthält

So kopieren Sie Dateien mit SCP vom Remote-Host, wenn die Datei Leerzeichen enthält

Ich muss eine Datei von einem Remote-Host in mein lokales Verzeichnis kopieren, wobei ich SCM verwende, wo eine Datei Leerzeichen enthält. Bisher habe ich das Problem behoben, indem ich eine SSH-Verbindung zu diesem Host hergestellt und die Datei per SCP zurückgeschickt habe. Aber ich möchte wissen, wie ich diese Datei kopieren kann, da es beispielsweise vorkommen kann, dass auf dem lokalen Host kein SSHD installiert ist.

Ich habe Folgendes versucht:

scp [email protected]:~/download/file\ that\ have\ spaces.txt ~/download/

aber es kam ein Fehler:

scp: /home/kuba/Pobrane/file: No such file or directory
scp: that: No such file or directory
scp: have: No such file or directory
scp: spaces.txt: No such file or directory

Ich habe auch versucht file\\ that\\ have\\ spaces.txtundfile%20that%20have%20spaces.txt

Antwort1

SSH ruft eine Shell auf dem Server auf (das lässt sich nicht umgehen). Scp ruft diese Shell auf und teilt ihr die Namen der zu schreibenden Dateien mit. scp ist so konzipiert, dass alles, was Sie als Dateinamen übergeben, direkt in den Remote-Shell-Befehl interpoliert wird. Das bedeutet, dass Sie Shell-Sonderzeichen in Dateinamen, die bei typischen Unix-Shells Leerzeichen und !"#$&'()*-;<=>?@[\]^`{|}~(einige davon hängen von der Shell und der Position im Namen ab) bedeuten, zweimal in Anführungszeichen setzen müssen: einmal für die lokale Shell und einmal für die Remote-Shell.

Dies hat Vorteile, insbesondere können Sie Platzhalter angeben. Außerdem können Sie damit ~für das Remote-Home-Verzeichnis verwenden (Dateinamen sind jedoch relativ zum Remote-Home-Verzeichnis, sodass Sie einfach [email protected]:download/…anstelle von verwenden können [email protected]:~/download/…). Der Nachteil besteht jedoch darin, dass Sie vorsichtig sein müssen, wenn die Dateinamen Sonderzeichen enthalten. Sie müssen auch vorsichtig sein, wenn Sie zulässige Dateinamen auf dem Server filtern möchten (insbesondere für ein eingeschränktes Konto ohne Shell-Befehlsberechtigung).

Die einfache Möglichkeit, doppelte Anführungszeichen zu setzen, besteht darin, den gesamten Namen in einfache Anführungszeichen zu setzen und vor jedem Sonderzeichen, das auf der Remote-Seite geschützt werden muss, einen Backslash zu setzen. Das funktioniert nicht für einfache Anführungszeichen im Dateinamen; maskieren Sie diese mit den vier Zeichen '\''. In Ihrem Beispiel:

scp '[email protected]:download/file\ that\ have\ spaces.txt' ~/download/

Ihr Versuch mit zwei Backslashs hat nicht funktioniert, da \\es von der lokalen Shell als Backslash gefolgt von einem Leerzeichen analysiert wird, das die Argumente trennt. Sie müssen einen Backslash und ein Leerzeichen an den Remote-Host senden und sowohl der Backslash als auch das Leerzeichen müssen vor der Analyse durch die lokale Shell geschützt werden. Daher benötigen beide einen Backslash davor, d. h. Sie benötigen drei Backslashs und ein Leerzeichen.

scp [email protected]:download/file\\\ that\\\ have\\\ spaces.txt ~/download/

SFTP läuft nicht über eine Shell und ist daher eine Möglichkeit, Probleme mit Sonderzeichen zu vermeiden.SSHFSbasiert auf SFTP und bietet direkten Remote-Dateizugriff, so dass Sie

mkdir remote
sshfs [email protected]: remote
cp remote/download/file\ that\ have\ spaces.txt ~/download/
fusermount -u remote
rmdir remote

Antwort2

Die Lösung besteht darin, sowohl Anführungszeichen als auch Escape-Leerzeichen zu verwenden:

scp "[email protected]:~/download/file\ that\ have\ spaces.txt" ~/download/

verwandte Informationen