web-dev-qa-db-fra.com

Est-il possible de faire en sorte que SCP ignore les liens symboliques lors de la copie?

Je dois réinstaller l'un de nos serveurs et, par précaution, je souhaite déménager /home, /etc, /opt, et /Services sur le serveur de sauvegarde.

Cependant, j'ai un problème: à cause de nombreux liens symboliques, beaucoup de fichiers sont copiés plusieurs fois.

Est-il possible de faire en sorte que scp ignore les liens symboliques (ou en fait de copier un lien en tant que lien et non en tant que répertoire ou fichier)? Si non, y a-t-il une autre façon de le faire?

71
Kris_R

Je savais que c'était possible, j'ai juste pris le mauvais outil. Je l'ai fait avec rsync

rsync --progress -avhe ssh /usr/local/  XXX.XXX.XXX.XXX:/BackUp/usr/local/
73
Kris_R

J'ai trouvé que la méthode rsync ne fonctionnait pas pour moi, mais j'ai trouvé une alternative qui fonctionnait sur ce site Web ( www.docstore.mik.ua/orelly ).

Plus précisément la section 7.5.3 de "O'Reilly: SSH: Le shell sécurisé. Le guide définitif" .

7.5.3. Copie récursive de répertoires

...

Bien que scp puisse copier des répertoires, ce n'est pas nécessairement la meilleure méthode. Si votre répertoire contient des liens physiques ou des liens symboliques, ils ne seront pas dupliqués. Les liens sont copiés en tant que fichiers simples (les cibles de lien) et, pire encore, les liens de répertoire circulaires entraînent la boucle indéfiniment de scp1. (scp2 détecte les liens symboliques et copie leurs cibles à la place.) Les autres types de fichiers spéciaux, tels que les canaux nommés, ne sont pas non plus copiés correctement. Une meilleure solution consiste à utiliser tar, qui gère correctement les fichiers spéciaux, et de l'envoyer à distance. machine à libérer, via SSH:

$ tar cf - /usr/local/bin | ssh server.example.com tar xf -
27
Luke

Utiliser tar sur ssh à la fois comme émetteur et destinataire fait également l'affaire:

cd $DEST_DIR
ssh user@remote-Host 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf -
16
Vojtech Vitek

Une solution consiste à utiliser un tuyau Shell. J'ai une situation où j'ai obtenu des fichiers * .gz et des liens symboliques générés par certains logiciels pour créer un lien vers les mêmes fichiers * .gz avec un nom légèrement plus court. Si j'utilise simplement scp, les liens symboliques seront copiés en tant que fichiers normaux, ce qui entraînera des doublons. Je sais que rsync peut ignorer les liens symboliques, mais mes fichiers gz ne sont pas compressés avec les options syncable et la synchronisation est très lente pour la copie de ces fichiers gz. Donc, j'utilise simplement le script suivant pour copier les fichiers:

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

L'option -f ne trouvera que les fichiers normaux et ignorera les liens symboliques. Vous devez donner cette commande sur l'hôte source. J'espère que cela pourra aider certains utilisateurs dans ma situation. Faites-moi savoir si j'ai raté quelque chose.

1
Kemin Zhou