Wie kann ich mit einem Befehl mehrere Dateien über scp kopieren?

20

Ich muss viele Dateien von einem PC auf einen anderen transportieren (beide Linux). Ich würde dafür gerne verwenden scp, aber es kann immer scpnur eine Datei gleichzeitig übertragen werden.

Wie kann ich das machen?

ich habe

  • Keine Möglichkeit, rsync oder ein anderes Protokoll zu verwenden
  • Keine Möglichkeit, passphrasenfreie Zertifikate zu verwenden (aber ein Zertifikat mit einer Passphrase haben)
  • Eine Liste der zu übertragenden Dateien und eine Liste mit dem Zielpfad der Dateien auf dem anderen Server
  • Die Dateien sind auf viele Verzeichnisse verteilt und nicht alle Dateien in den Verzeichnissen, die ich kopieren möchte

Wenn möglich, möchte ich transparent gzipen und ungzipen, um Bandbreite zu sparen!

Ist das möglich?

Peter Smit
quelle

Antworten:

31

Verwendung tar:

tar cvzf - -T list_of_filenames | ssh hostname tar xzf -
Akira
quelle
2
Hier ist das Dateiformat: "Im c-Modus liest tar die zu archivierenden Namen aus dem Dateinamen. Der spezielle Name -C'' on a line by itself will cause the current directory to be changed to the directory specified on the following line. Names are terminated by newlines unless --null is specified. Note that --null also disables the special handling of lines containing -C ''."
Kousha
14

Ich würde dafür gerne scp verwenden, aber scp erlaubt immer nur die Übertragung einer Datei.

Ich bin mir ziemlich sicher, dass dies nicht zutrifft, zumindest nicht für den scpBefehl, der von OpenSSH bereitgestellt wird, der in den meisten Linux-Distributionen enthalten ist.

Ich benutze scp file1 file2 ... fileN user@host:/destination/directory/ziemlich häufig.

Für die transparente Komprimierung ist dieses Protokoll im SSH-Protokoll integriert und scpkann verwendet werden, wenn Sie die -COption in der Befehlszeile angeben. Für viele ähnliche kleine Dateien wird die von akira vorgeschlagene Option tar + gz für eine bessere Komprimierung empfohlen, da sie die Ähnlichkeit zwischen solchen Dateien nutzen kann, bei denen scpjede Datei als separate Einheit komprimiert wird. Ich bevorzuge im Allgemeinen die Verwendung von scp, da es einfacher ist, eine teilweise Übertragung fortzusetzen (oder, obwohl ich in dieser Situation weiß, dass der Fragesteller nicht über die Option verfügt), rsyncda dies sowohl noch einfacher ist, als auch die gesamte Option tar + gz gemeinsam nutzt -stream Komprimierungsvorteil.

David Spillett
quelle
Dies ist die richtige Antwort, überträgt jedoch nur jeweils eine Datei. Trotzdem wird die verfügbare Bandbreite voll ausgenutzt und sollte so schnell wie möglich ausgeführt werden.
Benjamin Bannier
4

Nicht scp -r yourdir otherhost:/otherdirfunktioniert?

Versuchen Sie dies dann:

tar cfz - . | ssh otherhost "cd /mydir; tar xvzf -"

Das z-flag to tar macht die Komprimierung. Oder Sie können -C für ssh verwenden:

tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"
Jimmy Hedman
quelle
Was bedeutet -Ctun?
Nathan Fellman
1
Das Problem ist, ich habe eine Liste von Dateien. Die Dateien sind auf viele Verzeichnisse verteilt und nicht alle Dateien in den Verzeichnissen, die ich kopieren möchte
Peter Smit
2
@ Nathan: -C soll ssh die Komprimierung machen lassen.
Jimmy Hedman
1

Unter RHEL5 ist dies die einzige mir bekannte Möglichkeit, eine Liste von Dateien, die Sonderzeichen enthalten (z. B. ein Leerzeichen), sicher zu kopieren. Erstellen Sie ein Shell-Skript und fügen Sie Folgendes hinzu:

FILE="/path/filename"
while read line; do
scp "$line" username@servername:/destination/
done < $FILE
Brian Thomas
quelle
0

Es kann ohne viel Mühe gemacht werden.

Ich erstelle einfach eine Liste von Dateien mit dem Hostnamen neben jeder Datei und scp scheint es gut zu analysieren. dh

srchost=`hostname`
myfiles="${srchost}:~/.bashrc ${srchost}:~/.bash_profile ${srchost}:~/.vimrc ${srchost}:~/.viminfo ${srchost}:~/.toprc ${srchost}:~/.dir_colors"
scp -v $myfiles $HOME

Scp scheint mit dieser Syntax gut zu funktionieren. Da ich es ohne den Hostnamen neben jeder Datei versuchte, schlug es nach der ersten Datei fehl. Ich erinnere mich an eine andere Syntax, die ich zuvor verwendet habe, und werde sie veröffentlichen, sobald ich sie gefunden habe.

Ernie M.
quelle
Dies funktioniert, ist aber recht langsam - es scheint, als würde für jede Datei eine Verbindung hergestellt ... (ich bin auf der Suche nach einer Lösung für die langsame Kopie hierher gekommen ...) ~/kann größtenteils weggelassen werden - SCP arbeitet relativ zum Basisverzeichnis. .. Wenn Sie eine Liste von woanders in haben $list: scp $(echo "$list"|sed "s/^/$srchost:/") local_destination(Dies wird jedoch für Dateinamen mit Leerzeichen brechen)
Gert van den Berg
-1

Ich würde empfehlen, Teile einen Befehl wie diesen zu verwenden, um ein Archiv aus Ihrer Dateiliste zu erstellen

tar -cvf allfiles.tar -L mylist.txt

Verwenden Sie dann scp, um das Archiv herunterzuladen.

scp user @ remotehost: ~ / allfiles.tar

/programming/8033857/tar-archiving-that-takes-input-from-a-list-of-files

Justin Kubicek
quelle