Ist es möglich, SCP dazu zu bringen, symbolische Links während des Kopierens zu ignorieren?

80

Ich brauche eine von unseren Servern zu installieren, und als Vorsichtsmaßnahme, ich will bewegen /home, /etc, /opt, und /Serviceszum Backup - Server.

Ich habe jedoch ein Problem: Aufgrund vieler symbolischer Links werden viele Dateien mehrmals kopiert.

Ist es möglich scp, die symbolischen Links zu ignorieren (oder den Link tatsächlich als Link zu kopieren, nicht als Verzeichnis oder Datei)? Wenn nicht, gibt es einen anderen Weg, dies zu tun?

Kris_R
quelle

Antworten:

82

Ich wusste, dass es möglich ist, ich habe einfach ein falsches Werkzeug genommen. Ich habe es mit rsync gemacht

rsync --progress -avhe ssh /usr/local/  XXX.XXX.XXX.XXX:/BackUp/usr/local/
Kris_R
quelle
1
Was bedeutet dieser Befehl? Ignoriert es Symlinks oder erstellt es neue? -avhe?
Ernestas Stankevičius
3
aIst Archiv (bewahrt Dinge), vausführliche, von hMenschen lesbare Ausgabe, egeben Sie den Dienst an, den Sie verwenden möchten (in diesem Fall ist es ssh). Lesen Sie hier mehr
quietContest
Vielen Dank. Alter Server wird eingemottet. Neuer Server benötigt Inhalt. Alle Softlinks sind verloren gegangen, aber viele waren defekt. Dies ist eine langsame Wartungsaufgabe auf dem neuen Server. Danke noch einmal.
Jlettvin
1
--safe-links ermöglicht es, Links innerhalb des Verzeichnisses beizubehalten und diejenigen, die außerhalb des Verzeichnisses verweisen, nicht zu kopieren.
Colin Pitrat
29

Ich stellte fest, dass die rsyncMethode bei mir nicht funktionierte, fand jedoch eine Alternative, die auf dieser Website ( www.docstore.mik.ua/orelly ) funktionierte .

Insbesondere Abschnitt 7.5.3 von "O'Reilly: SSH: The Secure Shell. The Definitive Guide" .

7.5.3. Rekursive Kopie von Verzeichnissen

...

Obwohl scp Verzeichnisse kopieren kann, ist dies nicht unbedingt die beste Methode. Wenn Ihr Verzeichnis Hardlinks oder Softlinks enthält, werden diese nicht dupliziert. Links werden als einfache Dateien (die Linkziele) kopiert, und schlimmer noch, zirkuläre Verzeichnislinks führen dazu, dass scp1 eine unbegrenzte Schleife durchläuft. (scp2 erkennt symbolische Links und kopiert stattdessen ihre Ziele.) Andere Arten von Spezialdateien, wie z. B. Named Pipes, werden ebenfalls nicht korrekt kopiert. Eine bessere Lösung besteht darin, tar zu verwenden, das Spezialdateien korrekt verarbeitet, und es an die Fernbedienung zu senden Maschine, die über SSH nicht geteert werden soll:

$ tar cf - /usr/local/bin | ssh server.example.com tar xf -
Luke
quelle
1
Dies ist ein guter Vorschlag, wenn rsync nicht auf der Remote-Seite installiert ist oder (mit geringfügigen Änderungen) wenn Sie bereits einen Tarball des Quellverzeichnisses haben.
Trebor Rude
1
Es benötigt ein "p" (tar xpf), um die Berechtigungen am Ziel zu erhalten.
Paul Lynch
Hinweis: Dieser Befehl muss vom Quellcomputer ausgeführt werden und die Dateien auf den Zielcomputer übertragen . Für meinen Fall (viele kleine, unkomprimierte Dateien) funktionierte es besser und schneller als scpoder rsync.
Gerardo Lima
18

Die Verwendung von tarover sshals Sender und Empfänger reicht ebenfalls aus:

cd $DEST_DIR
ssh user@remote-host 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf -
Vojtech Vitek
quelle
Ich habe auf der Quellenseite --one-file-systemund auf der Zielseite hinzugefügt p, um Berechtigungen beizubehalten.
Ceving
Manpage für Teer sagt; --one-file-system = Mountpunkte nicht kreuzen
AnneTheAgile
2

Eine Lösung ist die Verwendung eines Rohres. Ich habe eine Situation, in der ich einige * .gz-Dateien und symbolische Links erhalten habe, die von einer Software generiert wurden, um auf dieselben * .gz-Dateien mit einem etwas kürzeren Namen zu verlinken. Wenn ich einfach scp verwende, werden die symbolischen Links als reguläre Dateien kopiert und führen zu Duplikaten. Ich weiß, dass rsync symbolische Links ignorieren kann, aber meine gz-Dateien werden nicht mit synchronisierbaren Optionen komprimiert, und die Synchronisierung ist beim Kopieren dieser gz-Dateien sehr langsam. Also benutze ich einfach das folgende Skript, um die Dateien zu kopieren:

find . -type f -exec scp {} target_host:/directory/name/data \;

Die Option -f findet nur reguläre Dateien und ignoriert symbolische Links. Sie müssen diesen Befehl auf dem Quellhost eingeben. Hoffe, dies kann einigen Benutzern in meiner Situation helfen. Lassen Sie mich wissen, wenn ich etwas verpasst habe.

Kemin Zhou
quelle
0

Eine Einzeilerlösung, die auf dem Client ausgeführt werden kann, um Ordner mit dem Befehl tar + ssh vom Server zu kopieren.

ssh user@<Server IP/link> 'mkdir -p <Remote destination directory;cd <Remote destination directory>; tar cf - ./' | tar xf - C <Source destination directory>

Hinweis: mkdir ist ein Muss. Wenn das Remote-Zielverzeichnis nicht vorhanden ist, komprimiert der Befehl einfach das gesamte Home des Remote-Servers und extrahiert es auf den Client.

Vinay Tiwary
quelle