83 votes

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

Je dois réinstaller l'un de nos serveurs, et par précaution, je veux déplacer /home , /etc , /opt et /Services au 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 scp ignorer les liens symboliques (ou en fait copier le lien comme un lien et non comme un répertoire ou un fichier) ? Si ce n'est pas le cas, existe-t-il un autre moyen de le faire ?

85voto

Kris_R Points 602

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/

2 votes

Alors, qu'est-ce que ça commande ? Ignore-t-elle les liens symboliques ou en crée-t-elle de nouveaux ? -avhe ?

3 votes

a est une archive (préserve les choses), v verbeux, h sortie lisible par l'homme, e spécifier le service que vous souhaitez utiliser (dans ce cas, il s'agit de ssh ). Lire la suite par ici

0 votes

Merci. L'ancien serveur est mis en veilleuse. Le nouveau serveur avait besoin de contenu. J'ai perdu tous les soft-links mais beaucoup étaient cassés, donc ce sera juste maintenant une tâche de maintenance lente sur le nouveau serveur. Merci encore.

34voto

Luke Points 238

J'ai trouvé que le site rsync méthode n'a pas fonctionné pour moi, mais j'ai trouvé une alternative qui a fonctionné sur ce site ( www.docstore.mik.ua/orelly ).

Plus précisément, la section 7.5.3 de "O'Reilly : SSH : Le Secure Shell. The Definitive Guide " .

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 durs ou des liens mous, ils ne seront pas dupliqués. Les liens sont copiés en tant que fichiers simples (les cibles des liens), et pire, les liens circulaires des répertoires font tourner scp1 en boucle indéfiniment. (scp2 détecte les liens symboliques et copie leurs cibles à la place.) D'autres types de fichiers spéciaux, comme les pipes nommés, ne sont pas non plus copiés correctement. Une meilleure solution est d'utiliser tar, qui gère correctement les fichiers spéciaux, et de l'envoyer à la machine distante pour être déchargé, via SSH :

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

2 votes

C'est une bonne suggestion si rsync n'est pas installé sur l'extrémité distante, ou (avec une légère modification) si vous avez déjà un tarball du répertoire source.

1 votes

Il a besoin d'un "p" (tar xpf) pour préserver les permissions à la destination.

0 votes

Remarque : cette commande doit être exécutée à partir de l'interface utilisateur de l'ordinateur. source ordinateur, en poussant les fichiers dans le cible ordinateur. Dans mon cas (beaucoup de petits fichiers non compressés), il a fonctionné mieux et plus rapidement que le système de gestion des fichiers. scp ou rsync .

18voto

Vojtech Vitek Points 1465

Utilisation de tar sur ssh en tant qu'émetteur et récepteur fait également l'affaire :

cd $DEST_DIR
ssh user@remote-host 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf -

0 votes

J'ai ajouté du côté de la source --one-file-system et du côté de la destination p pour préserver les permissions.

0 votes

La page de manuel de tar dit ; --one-file-system = ne pas croiser les points de montage.

2voto

Kemin Zhou Points 31

Une solution consiste à utiliser un shell pipe. Je suis dans une situation où j'ai des fichiers *.gz et des liens symboliques générés par un logiciel qui renvoient aux mêmes fichiers *.gz avec un nom légèrement plus court. Si j'utilise simplement scp, les liens symboliques seront copiés comme des 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 des options synchronisables, et sync est très lent pour copier ces fichiers gz. J'utilise donc 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 réguliers et ignorera les liens symboliques. Vous devez donner cette commande sur l'hôte source. J'espère que cela pourra aider un utilisateur dans ma situation. Faites-moi savoir si j'ai oublié quelque chose.

0voto

Vinay Tiwary Points 195

Une solution unique qui peut être exécutée sur le client pour copier un dossier du serveur en utilisant la commande tar + ssh.

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

Note : mkdir est obligatoire, si le répertoire de destination distant n'est pas présent alors la commande va simplement compresser le home entier du serveur distant et l'extraire vers le client.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X