Transférer des fichiers entre machines Linux via SSH
Overview
Parfois, nous voulons transférer des fichiers d’une machine Linux à une autre en toute sécurité. Peut-être voulons-nous télécharger certains fichiers vers un serveur de production ou prendre une sauvegarde.
Dans cet article, nous allons examiner différents outils pour transférer des fichiers entre des machines Linux sur ssh, le protocole le plus populaire pour la connexion à distance entre les machines Linux.
Nous examinerons les deux outils de transfert de fichiers les plus populaires : scp et rsync.
Utilisation de base des outils
2.1. Un exemple rapide
Imaginons que nous voulons copier le fichier text.log de notre système local vers le chemin /var/log sur un serveur Linux distant à l’adresse IP 111.111.111.111, et que nous voulons utiliser les informations d’identification de l’utilisateur root.
Cela peut être réalisé avec scp ou rsync en utilisant la même syntaxe de base:
scp text.log :/var/logrsync text.log :/var/log
Comprenons ce que ces commandes ont en commun avant d’apprendre leurs variations et leurs différences.
2.2. La syntaxe générale
La syntaxe générale de scp ou rsync est :
scp/rsync ]Source_File ]Destination_file
La section OPTION nous permet d’utiliser des commutateurs de ligne de commande pour modifier le comportement de l’opération de copie. Les deux chemins d’accès pour la source et la destination nous permettent de spécifier le chemin d’accès au fichier des deux côtés de l’opération de copie, ainsi que le ou les comptes d’utilisateur à utiliser.
Dans l’exemple ci-dessus, le fichier local est copié vers un emplacement distant – . Comme nous le verrons plus tard, nous pouvons utiliser le format distant pour décrire la source ou la cible, ce qui permet à ces commandes à la fois de télécharger des fichiers vers un serveur et de télécharger des fichiers depuis un serveur.
2.3. Choses importantes à noter
Il y a quelques points à retenir lorsque nous transférons des fichiers par ssh en utilisant n’importe quel outil :
- La commande scp/rsync demandera le mot de passe de l’utilisateur pour se connecter au serveur distant si nous n’avons pas de configuration d’auto-login par l’échange de clés RSA
- Nous n’avons pas besoin de fournir notre nom d’utilisateur ou l’IP du serveur pour notre serveur local
- Nous pouvons soit fournir un chemin absolu ou un chemin relatif au fichier source/destination, où les chemins relatifs sont relatifs au répertoire de travail actuel ou au répertoire personnel de l’utilisateur distant
2.4. Spécifier un nom de fichier
Il n’est pas obligatoire de fournir un nom de fichier au chemin de destination. Si nous ne fournissons pas de nom de fichier, le nom du fichier source sera utilisé.
Dans notre premier exemple, le fichier sera créé dans le répertoire cible avec le nom text.log. Si nous avions voulu que le fichier soit stocké avec un nom différent, nous aurions pu fournir un nom de fichier dans le cadre du chemin de destination.
En utilisant le nom de fichier implicite, nous pouvons copier un fichier à partir d’un serveur Linux distant dans le répertoire actuel avec son nom d’origine :
scp :/var/log/text.log .rsync :/var/log/text.log .
Ici, le paramètre « . » représente le répertoire de travail actuel. Nous pouvons également fournir un chemin différent si nous le souhaitons:
scp :/var/log/text.log /opt/path/mytextlog.logrsync :/var/log/text.log /opt/path/mytextlog.log
2.5. Copie entre serveurs
Nous pouvons même utiliser ces outils pour copier entre deux serveurs distants. Par exemple, copions le fichier text.log du serveur 111.111.111.111. au serveur 222.222.222.222 pour l’utilisateur root:
scp :/var/log/text.log :/var/logrsync :/var/log/text.log :/var/log
Maintenant que nous avons une compréhension de base de scp et rsync, regardons-les plus en profondeur.
scp (Secure Copy)
scp est l’abréviation de Secure Copy et est utilisé pour transférer des fichiers via une connexion ssh. C’est une copie brute, ce qui signifie qu’elle va juste lire les données du dossier source et les écrire dans le dossier de destination. Donc, si nous recherchons une copie rapide qui ne devrait pas prendre plus de quelques minutes, alors nous devrions opter pour scp.
Si nous transférons un gros fichier, nous devons nous assurer que nous avons une connexion internet stable. Comme scp n’est pas reprenable, on peut perdre du temps si la connexion tombe pendant un gros transfert, et toute l’opération de copie devra être relancée.
3.1. Installation
La plupart des distributions Linux sont livrées avec scp pré-installé. Nous pouvons facilement vérifier si scp est installé ou non :
which scp
Nous verrons le chemin de la commande scp si elle est déjà installée. Une réponse vide signifie que scp n’est pas installé.
Si nous ne l’avons pas déjà, alors pour installer scp, nous devons installer le paquetage client OpenSSH à partir du dépôt de paquets officiel :
sudo apt-get install openssh-clients # For Debian based systems like Ubuntu sudo yum install openssh-clients # For Red Hat based systems like CentOS and Fedora
Passons en revue quelques scénarios courants d’utilisation de scp.
3.2. Transférer plusieurs fichiers
Nous pouvons fournir une liste de fichiers séparés par un espace pour transférer plusieurs fichiers :
scp text.log text1.log text2.log :/var/log
Nous pouvons également utiliser l’option -r pour copier tout le répertoire de manière récursive. Par exemple, pour copier tous les fichiers du répertoire /home/app/log/:
scp -r /home/app/log :/var/log
Nous pouvons utiliser * pour envoyer les fichiers correspondant à un modèle de nom particulier. Par exemple, nous avons quatre fichiers text.log, text2.log, app.log et app2.log, et nous voulons envoyer uniquement les fichiers commençant par app:
scp /home/app/log/app* :/var/log
3.3. Transférer des fichiers en utilisant les fichiers d’identité
L’authentification par clé est privilégiée dans la plupart des distributions Linux. Dans la commande scp, nous pouvons spécifier le fichier d’identité à l’aide de l’option -i :
scp -i key.pem text.log :/var/log
De nombreux administrateurs système utilisent l’authentification par clé pour transférer des fichiers car elle ne nécessite pas les informations d’identification de l’utilisateur à chaque transfert.
3.4. Compression à la volée
Nous pouvons réduire le temps de transfert en utilisant la compression à la volée avec l’option -C. Cela va compresser et décompresser le fichier respectivement sur les chemins d’accès source et destination :
scp -C text.log :/var/log
3.5. Limiter la bande passante pendant le transfert
Nous pouvons spécifier la bande passante en Kbit/s avec l’option -l:
scp -l 500 text.log :/var/log
3.6. Mode verbeux pour le débogage
Nous pouvons activer le mode verbeux avec l’option -v :
scp -v text.log :/var/log
La sortie ressemblerait à quelque chose comme :
Executing: program /usr/bin/ssh host prod-reporting-b, user jain, command scp -v -t /tmp OpenSSH_7.9p1, LibreSSL 2.7.3 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 48: Applying options for * debug1: Connecting to prod-reporting-b port 22. debug1: Connection established. ------ Transferred: sent 2856, received 2932 bytes, in 2.1 seconds Bytes per second: sent 1366.8, received 1403.1 debug1: Exit status 0
La sortie verbeuse (débogage) imprime les étapes exactes que scp exécute, ce qui est utile pour déboguer les connexions, l’authentification et les problèmes de configuration.
rsync (synchronisation à distance)
rsync est rapide et polyvalent. Il est bon pour synchroniser et transférer intelligemment des fichiers car il garde la trace de la quantité de données copiées et de la quantité restante.
Nous devrions utiliser rsync lorsque nous avons de gros fichiers à transférer – même s’il y a des problèmes de connexion réseau, les données copiées jusqu’à ce point ne seront pas perdues, et lorsque la connexion sera rétablie, la copie reprendra à partir de ce point.
rsync est plus rapide que la commande scp lorsque nous devons transférer le même fichier plusieurs fois car il utilise un protocole de mise à jour à distance, qui permet de transférer uniquement les différences entre deux ensembles de fichiers.
4.1. Installation
Vérifions si rsync est installé en l’invoquant pour afficher sa version :
rsync --version
Si nous obtenons une erreur, alors nous pouvons l’installer :
sudo apt-get install rsync # For Debian based systems like Ubuntu sudo yum install rsync # For Red Hat based systems like CentOS and Fedora
Voyons quelques scénarios courants où nous pouvons utiliser rsync.
4.2. Faites un essai à blanc
Puisque rsync est si puissant, il peut être dangereux de l’utiliser sans vérifier ce qu’il s’apprête à faire. Heureusement, rsync fournit l’option -dry-run, qui effectue un essai sans transférer réellement les fichiers :
rsync --dry-run text.log :/var/log
4.3. Copier les attributs et les métadonnées
rsync fournit l’option -a, qui copie les liens symboliques, les heures de modification, le groupe, la propriété et les permissions en même temps que le contenu du fichier.
Une autre option importante est -h, qui imprimera la sortie sous une forme lisible par l’homme. Cela peut être particulièrement utile lors de l’exécution avec l’option -dry-run :
rsync -ah --dry-run text.log :/var/log
4.4. Transférer plusieurs fichiers dans un répertoire
On peut fournir une liste de fichiers séparés par un espace pour transférer plusieurs fichiers :
rsync text.log text1.log text2.log :/var/log
L’option -r copie récursivement tous les fichiers du répertoire :
rsync -r /home/app/log :/var/log
L’opérateur * envoie les fichiers correspondant à un motif particulier:
rsync /home/app/log/app* :/var/log
Nous pouvons utiliser l’option -include et l’option -exclude pour inclure et exclure des fichiers de la liste des fichiers à l’intérieur du répertoire. Par exemple, pour envoyer tous les fichiers d’un répertoire en excluant ceux qui commencent par ‘R’:
rsync --include '*' --exclude 'R*' text.log :/urs/log
4.5. Compression à la volée
Nous pouvons réduire le temps de transfert en utilisant la compression à la volée avec l’option -z. Cela va compresser et décompresser le fichier au niveau des chemins source et destination respectivement:
rsync -z text.log :/var/log
4.6. Supprimer les fichiers existants sur le chemin de destination avant le transfert
L’option -delete supprime les fichiers existants sur la destination avant de transférer de nouveaux fichiers:
rsync --delete text.log :/var/log
4.7. Supprimer automatiquement les fichiers sources après le transfert
Disons que nous voulons prendre une sauvegarde des journaux du serveur de production vers un serveur de sauvegarde. Dans ce scénario, nous aimerions probablement supprimer les fichiers du serveur de production après avoir transféré tous les fichiers vers notre serveur de sauvegarde.
Le serveurrsync fournit l’option -remove-source-files pour supprimer les fichiers sources une fois le transfert terminé:
rsync --remove-source-files text.log :/var/log
Quel outil choisir?
Nous pouvons utiliser ces deux outils pour transférer des fichiers entre des machines Linux. Cependant, nous devrions envisager scp lorsque la taille du fichier est petite – c’est un outil de copie simple et il est largement disponible. Dans notre utilisation quotidienne, scp est le choix facile pour les petits transferts ponctuels.
Nous bénéficierions davantage de rsync lorsque la taille du fichier est importante ou lorsque nous avons besoin d’une synchronisation plus complexe et plus efficace. C’est également le meilleur choix pour les tâches récurrentes telles que les tâches cron et les scripts.
Conclusion
Dans cet article, nous avons examiné deux outils de transfert de fichiers : scp et rsync.
Nous avons également examiné les différences entre eux, et quels outils correspondent à certains cas d’utilisation.