Wie verwende ich Wildcards (*) beim Kopieren mit scp?

144

Warum kann ich nicht mit scp kopieren, wenn ich *Zeichen im Pfad verwende?

scp SERVERNAME:/DIR/* .

Welche Konfiguration benötigt SCP, um *den Pfad zuzulassen ?

UPDATE: Das Problem liegt nicht auf der Serverseite. pscp versucht, SCPv1 zu verwenden, und deshalb die Fehlermeldung:

scp Kommandozeile und Fehlermeldung bezüglich einer Datei mit dem Namen *

LanceBaynes
quelle
Überprüfen Sie dies, es hat bei mir funktioniert: https://superuser.com/a/1390405/445746
AmitM

Antworten:

126

Sie müssen einen wörtlichen Escape-Befehl übergeben, um zu scpvermeiden, dass der Remote-Computer *als Glob behandelt wird (beachten Sie, dass er in doppelten Anführungszeichen steht):

scp 'SERVERNAME:/DIR/\*' .
Chris Down
quelle
41
Sie brauchen entweder Anführungszeichen oder einen Backslash vor dem Stern, nicht beides. Und scp ist nicht derjenige, der es erweitert, sondern die Shell.
Patrick
3
Hast du es versucht? Ich habe es gerade getan, funktioniert genau so, wie ich es beschrieben habe. User1274964 bestätigt sogar das Verhalten in seiner Antwort. touch /tmp/abcd.1234; scp 'localhost:/tmp/abcd.\*' ./:scp: /tmp/abcd.*: No such file or directory
Patrick
2
@Patrick Bei der Frage geht es um die Verwendung eines wörtlichen Sterns , dh um das Vermeiden von Globbing insgesamt, und nicht darum, wie man auf der Fernbedienung ein Globing durchführt.
Chris Down
2
Tatsächlich geht es darum, pscpauf Client-Seite zu gelangen, um Remote-Globbing zu ermöglichen.
Patrick
1
Ja, Sie müssen nicht das Sternchen zu entkommen, wenn Sie die einfachen Anführungszeichen verwenden
Led
52

Ich fand Patricks Rat richtig, obwohl Chris 'Antwort mich auf den richtigen Weg brachte. Verwenden Sie Anführungszeichen und brauchen Sie dann keinen Backslash vor dem Sternchen.

scp 'SERVERNAME:/tmp/file_num\*' .

scp: /tmp/file_num*.csv: Keine solche Datei oder kein solches Verzeichnis

scp 'SERVERNAME:/tmp/file_num*' .

judgments_for_job_171642.csv 100% 32
KB 32,0 KB / s 00:00 judgments_for_job_172394.csv 100% 548 KB 182,6 KB / s 00:03

user1274964
quelle
4
Richtig, denn das bedeutet, dass Sie auf der Fernbedienung glob möchten . Die Frage ist, wie Sie das Globbing auf der Fernbedienung beenden (um ein Literal zu erhalten *), und nicht, wie Sie nur auf der Fernbedienung Globbing durchführen.
Chris Down
3
@ ChrisDown. Nein. Der Benutzer möchte, dass der Platzhalter nicht auf dem Host erweitert wird, und möchte, dass er auf der Fernbedienung erweitert wird, damit er mit mehreren Dateien dort übereinstimmt. Keine der zurückgegebenen Dateien enthält ein wörtliches '*'. Meinten Sie " stop globbing on the host "?
Tim Bird
1

HINWEIS: Die unten angebotene Lösung wurde getestet und funktioniert bekanntermaßen ordnungsgemäß.

Einfache Anführungszeichen unterbrechen die Variablenerweiterung, wenn Sie einen Teil des Pfads, den Sie verschieben, als Alias ​​definiert haben.

Hier ist ein Skript, das DOUBLE- Anführungszeichen für den Anwendungsfall des globbed-Dateinamens command-configure_ .tar.gz * verwendet, wobei ein Pfad mit einer Variablen als Alias ​​verwendet wird:

#!/bin/bash

USEREXECUTINGSCRIPT='admin'
SCRIPTSDIR="myscripts"

SCPUSER='terrencehoulahan'
SCPUSERPASSWD='Change-Me'
SCPHOST='1.2.3.4'
SCPDIRECTORYREMOTE='/Users/terrencehoulahan/Downloads/Ubuntu/18.04'

## Uncomment appropriate below command for your distro to install "sshpass"
#apt-get -y sshpass
#yum -y install sshpass

sshpass -p "$SCPUSERPASSWD" scp -o StrictHostKeyChecking=no $SCPUSER@$SCPHOST:"$SCPDIRECTORYREMOTE/command-configure_*.tar.gz" $(getent passwd|grep ^$(echo $USEREXECUTINGSCRIPT)|cut -d ':' -f6)/$SCRIPTSDIR/

Nach dem schließenden doppelten Anführungszeichen wird das lokale Verzeichnisziel erstellt, indem lediglich das Ausgangsverzeichnis des angegebenen Benutzers aus / etc / passwd extrahiert wird .

Der SCP - Befehl selbst wird vorangestellt sshpassund -o StrictHostKeyChecking=novollständig zu automatisieren den scpBefehl ohne Benutzerinteraktion. Sieht kompliziert aus, ist aber besser als Hardcodierungspfade, die sich voraussichtlich von Zeit zu Zeit ändern.

Wie auch immer, ein Beispiel mit doppelten Anführungszeichen, bei dem Variablen im Pfad, den Sie verschieben, erweitert werden müssen. HTH

F1Linux
quelle