Outils pour utilisateurs

Outils du site


issue57:c_c

Back in issue #37, I wrote about configuring an SSH server on your computer, in order to use it as a SOCKS proxy. Since I imagine not all that many people want to use it as such, I decided to focus on my second-most used command (my first-most used command is “pacman” - ArchLinux's solution to package management). Before I get into what that command is, I'll briefly explain why you might be interested in this solution. Specifically, it lets you sync directories and files between two computers over the LAN (and, if properly configured, over the Internet as well). I use it in order to keep my music synced between my laptop and my PC, keep my configuration files up-to-date, and to copy anything I need from one device to the other. There are a few choices of commands you could use, two of which would be scp (secure copy), and rsync. I'll be focusing on rsync in this article, because it offers progress information, update features, and useful switches like –ignore-existing.

Dans le numéro 37, j'ai écrit un article sur la configuration d'un serveur SSH sur votre ordinateur, pour l'utiliser comme un proxy SOCKS. Mais, comme j'imagine que tous les lecteurs ne veulent pas l'utiliser comme tel, j'ai décidé de me concentrer sur la seconde commande la plus utilisée (la commande que j'utilise le plus est « pacman », la solution ArchLinux pour gérer les paquets). Avant d'aller plus loin sur ce qu'est cette commande, je vous expliquerai brièvement pourquoi vous pourriez être intéressé par cette solution. En particulier, elle vous permet de synchroniser les répertoires et les fichiers entre deux ordinateurs à travers le LAN (et, s'il est configuré correctement, aussi à travers Internet). Je l'utilise pour garder ma musique synchronisée entre mon portable et mon PC, pour garder mes fichiers de configuration à jour et pour copier tout ce dont j'ai besoin d'un appareil à l'autre. Il existe quelques commandes qui pourraient être utilisées, deux d'entre elles sont scp (secure copy) et rsync. Je m'attacherai à décrire rsync dans cet article, car il offre l'information de progression, une capacité de mise à jour et des options très utiles comme –ignore-existing.

A few of you may be asking why I don't just use Dropbox, an external hard drive, or a USB stick (for smaller files). The answer is quite simple: Dropbox offers a limited amount of space, and the other options require me to remember to do this regularly. If you have SSH configured on your “sender” (in this case, my PC from which I transfer the files), and an SSH client (no server required) on your “receiver” (my laptop, in this case), then you can easily write a small script to run a cron (in other words, regularly, and without any input). If you want to automate this, you will need to configure SSH to use keys instead of passwords, so that you can access your server without having to input anything. This is fairly simple (using ssh-keygen to create the keys, and then copying the public key to the server), and is explained in plenty of places (see the Links section below for a link to a Wiki).

Quelques-uns d'entre vous peuvent se demander pourquoi je n'utilise pas simplement DropBox, un disque externe ou une clé USB (pour les plus petits fichiers). La réponse est très simple : Dropbox n'offre qu'une quantité limitée d'espace et les autres options nécessitent que je me souvienne régulièrement de le faire. Si vous avez SSH configuré sur votre « émetteur » (dans ce cas, le PC à partir duquel je transfère les fichiers) et un client SSH (un serveur n'est pas nécessaire) sur votre « récepteur » (mon portable, dans ce cas), alors vous pouvez facilement écrire un petit script qui lance un cron (autrement dit, régulièrement, et sans intervention de votre part). Si vous voulez automatiser cela, vous aurez besoin de configurer SSH pour qu'il utilise des clés à la place de mots de passe, de telle manière que vous pourrez accéder à votre serveur sans avoir à entrer quoi que ce soit. C'est plutôt simple (en utilisant ssh-keygen pour créer les clés, et puis en copiant la clé publique sur le serveur) et ceci est expliqué dans un grand nombre d'endroits (voir la section Liens pour un lien vers un Wiki).

Once you have SSH configured, it's time to think about how the script should appear. I won't supply an example script, simply because I haven't implemented a decent one yet. There are some things you should take into consideration when designing your script, such as: The script should only do something if you're on your home network (this can be done by checking the ESSID of your wireless, or, if you connect your laptop to the LAN by cable when at home, checking if eth0 is active, or simply deciding on a specific time the script should run). The reason for this is because otherwise you'll have lots of failed SSH connections when doing this in a location besides your home network. I recommend thinking about your habits, and finding a solution that works best for you. Then write it into an if-statement in the script.

Une fois SSH configuré, pensons maintenant à quoi devrait ressembler le script. Je ne vous donnerai pas de script d'exemple, parce que je n'en ai pas encore implémenté de décent. Il y a des choses à considérer quand vous concevez votre script, comme : Le script ne doit faire quelque chose que si vous êtes sur votre réseau local (ceci peut être fait en vérifiant le ESSID de votre wifi ou, si vous connectez votre portable sur le LAN par un câble chez vous, en vérifiant que eth0 est actif, ou simplement en déterminant une heure spécifique à laquelle le script devrait tourner). La raison pour cela est que, sinon, vous aurez un grand nombre d'échecs de connexion SSH si vous faites cela dans un lieu en dehors de votre réseau local. Je vous recommande de penser à vos habitudes et de trouver la solution qui marche le mieux pour vous. Puis vous l'écrivez dans un bloc IF dans le script.

How many files/directories do you want to sync, and which ones exactly? You can either hard-code each file or directory into the script, or create a text-based list of locations on your machines, and then use a while statement and readline to handle each line separately. A few files I would recommend: .bashrc (or your rc file for the shell you use), .Xdefaults (for terminal colors), Music, Pictures, any configuration files for window managers (XMonad, DWM, etc.) Do you want to update (meaning newest copies of the files are the ones to keep), or ignore files if they already exist on the receiver (useful for music and pictures), do you need to be recursive (that means following a directory tree). There are some other useful options to consider that rsync offers (see the second section of this article). Is the destination folder and the source folder in the same location? If not, you'll need to keep track of where each file is supposed to go (similar to #2).

Combien de fichiers/répertoires voulez-vous synchroniser et lesquels exactement ? Vous pouvez soit coder en dur chaque fichier ou répertoire dans le script, soit créer une liste des emplacements sur vos machines dans un fichier texte, puis utiliser un bloc WHILE et une lecture par ligne pour gérer chaque ligne séparément. Je vous recommande quelques fichiers : .bashrc (ou votre fichier rc pour le shell que vous utilisez), .Xdefaults (pour les couleurs du terminal), vos musiques, vos images et les fichiers de configuration des gestionnaires de fenêtres (XMonad, DWM, etc.)

Est-ce que vous voulez mettre à jour (ce qui veut dire que les versions les plus récentes des fichiers sont celles à garder), ou ignorer les fichiers s'ils existent déjà sur le récepteur (utile pour la musique et les photos), avez-vous besoin de récursivité (ce qui signifie de suivre l'arborescence) ? Il y a quelques autres options très utiles à considérer offertes par rsync (voir la deuxième section de cet article).

Est-ce que le répertoire cible et le répertoire source sont au même endroit ? Si ce n'est pas le cas, vous aurez besoin de garder une trace de l'emplacement où chaque fichier est supposé aller (similaire au #2).

Space – do you have enough space on your receiver for all the files from your sender, and, if not, what are you going to do about it? You can either reduce your list of sync files, or build a check into the script using df -h to set a limit (i.e. if there are only 9GB left, stop syncing entirely, and email you/prompt you). Once you've taken these points into consideration, it's time to write the script. I recommend you have at least 2 checks in the script (if you're connected to the right network, and if the sender is currently online). The rest of the script is entirely up to you, including when and how to run it. Back in issue #24, I wrote an article on cron, and since then have used plenty of examples, so I will only briefly discuss your options. When configuring the cron job, you can either dump the script in /etc/cron.hourly, or /etc/cron.daily. The other option is to edit your crontab (crontab -e <username>). In the crontab you can then create a line for the script that either runs every set number of hours/days, or set it to run at a specific time (or a specific date), and so on. I think a script that runs once a day is going to be quite enough for this.

Espace - avez-vous assez d'espace sur votre récepteur pour tous les fichiers venant de votre émetteur et, dans le cas contraire, qu'allez-vous faire pour y remédier ? Vous pouvez soit réduire votre liste de fichiers à synchroniser, soit coder une vérification dans le script avec df -h pour fixer une limite (ex : s'il ne reste que 9 Go, arrêt complet de la synchronisation et envoi d'un mail ou d'un prompt pour vous).

Une fois que vous avez pris en considération tous ces points, il est temps d'écrire le script. Je vous recommande d'avoir au moins deux vérifications dans le script (si vous êtes connecté au bon réseau et si l'émetteur est actuellement en ligne). Le reste du script est entièrement de votre ressort, en particulier quand et comment le lancer. Dans le numéro 24, J'ai écrit un article sur cron et, depuis, j'ai utilisé des tas d'exemples, je ne vais donc parler que très brièvement des options. Quand vous configurez la tâche cron, vous pouvez copier le script soit dans /etc/cron.hourly, soit dans /etc/cron.daily. L'autre possibilité est d'éditer votre crontab (crontab -e <username>). Dans la crontab vous pouvez alors créer une ligne pour votre script qui peut être lancé à chaque période d'heures/de jours ou bien paramétrer le lancement à une heure (ou une date) spécifique, etc. Je pense qu'un script qui tourne une fois par jour sera bien suffisant.

rsync As you can see from point 3 above, rsync offers a lot of checks to avoid copying more files than necessary. Some useful ones are: -u (–update): Skips files that are newer on the receiver –inplace: updates files in-place –append: adds data on to the ends of shorter files -x: Avoid crossing filesystem boundaries (i.e. stick to one partition) –existing: Do not create new files on the receiver, only update existing files –ignore-existing: Ignore files that already exist on receiver –max-size=SIZE: Don't copy any files larger than this (–min-size also exists, though less useful in this case) –exclude=PATTERN: Excludes any file matching the pattern –exclude-from=FILE: Reads the pattern(s) from the file –partial: Keep partially copied files

rsync

Comme vous pouvez le voir dans le point 3 ci-dessus, rsync offre un grand nombre de vérifications pour éviter de copier plus de fichiers que nécessaire. Le plus utiles sont : -u (–update) : n'écrase pas les fichiers qui sont plus récents sur le récepteur ; –inplace : met à jour les fichiers sur place [Ndt : en les écrasant directement, sans fichier temporaire] ; –append : ajoute les données à la fin des fichiers plus courts ; -x : évite de dépasser les limites du filesystem (reste dans une partition) ; –existing : ne crée pas de nouveau fichier sur le récepteur, met à jour seulement les fichiers existants ; –ignore-existing : ignore les fichiers qui existent déjà sur le récepteur ; –max-size=TAILLE : ne copie aucun fichier plus grand que TAILLE (–min-size existe aussi, quoique moins utile dans ce cas) ; –exclude=MOTIF: exclut tout fichier qui correspond au MOTIF ; –exclude-from=FICHIER : lit les MOTIF(S) dans ce FICHIER ; –partial : Garde les fichiers copiés partiellement.

Some other useful switches for rsync: –delay-updates: Puts updated files into place at the very end. -r (–recursive): Follows directory trees. -d: Copy directories without recursing (by default rsync doesn't enter any directory at all) -l (–links): Copy symlinks as symlinks -E (–executability): Keep files executable (useful for scripts) -h: Human-readable sizes and output –progress: Display a progress bar for each file For the full list, check rsync's manpage. The basic format for rsync commands is: rsync <switches> <source> <destination>

D'autres options utiles pour rsync : –delay-updates : remet à leur place les fichiers mis à jour une fois que le transfert est complètement terminé ; -r (–recursive) : suit les arborescences ; -d : copie les répertoires sans récursivité (par défaut rsync n'entre dans aucun répertoire) ; -l (–links): copie les liens symboliques comme des liens symboliques ; -E (–executability) : garde les droits d'exécution des fichiers (utile pour les scripts) ; -h : affiche les tailles et messages en langage humain [Ndt : conversion automatique en Go, Mo, etc…] ; –progress : affiche une barre de progression pour chaque fichier.

Pour la liste complète, lisez la page man de rsync.

Le format de base de la commande rsync est :

rsync <options> <source> <cible>

So, if I wanted to update all files from ~/scripts on my PC with ~/.bin on my laptop, I'd write: rsync -ru lswest@127.0.0.1:/home/lswest/scripts ~/.bin This will then copy it over. Logically, you'll want to use the actual IP of your PC instead of the localhost IP, but this is only an example. As we round off this article, I'd like to make a few notes on off-site syncing: Syncing over the Internet, while useful, should be kept to a minimum, simply because the traffic, while encrypted, will be rather large, and might cause issues with an admin, or any kind of data limit you might have. Also, ssh keys are (generally) more secure than passwords, so I highly recommend using them wherever possible.

Donc, si je voulais mettre à jour tous les fichiers à partir de ~/scripts sur mon PC vers ~/.bin sur mon portable, j'écrirais :

rsync -ru lswest@127.0.0.1:/home/lswest/scripts ~/.bin

Ceci va alors les recopier en les écrasant. Logiquement, vous voudrez utiliser l'IP réelle de votre PC au lieu de l'IP localhost, mais c'est seulement un exemple.

Comme cet article est presque terminé, je voudrais dire quelques mots sur la synchronisation hors-site : synchroniser par internet, bien que très utile, devrait être restreint à un minimum, simplement parce que le trafic, quoiqu'il soit chiffré, sera plutôt large et pourrait causer des problèmes avec un administrateur ou toute sorte de limites que vous pourriez avoir pour les données. De plus, les clés ssh sont, généralement, plus sécurisées que les mots de passe, donc je vous recommande de les utiliser partout où c'est possible.

If there is a large influx of requests for an actual example script, I will happily deliver it next month. I do, however, recommend you try writing your own, or customize any example scripts you find to suit your needs. If you're of the opinion you'd like one, please let me know in an email (address is below). If you have some concrete questions about a script you're writing yourself, you're also welcome to email me about it. If anyone has questions, concerns, or simply wants to share a script they've implemented, feel free to email me at lswest34@gmail.com. If you do email me, remember to include C&C or FCM in the title, so that I don't overlook it. Links: https://wiki.archlinux.org/index.php/SSH_Keys#Generating_an_SSH_key_pair

S'il y a un large afflux de demandes pour un script d'exemple, je serai ravi de vous le fournir le mois prochain. Je vous recommande, cependant, d'essayer d'écrire le vôtre ou adapter un script d'exemple que vous jugerez correspondre à vos besoins. Si vous êtes de ceux qui en voudraient un, merci de me le faire savoir par courriel (adresse ci-dessous). Si vous avez des questions concrètes sur un script que vous écririez vous-même, vous êtes aussi invités à m'envoyer un mail sur le sujet.

Si quelqu'un a des questions, des préoccupations ou simplement veut partager un script qu'il a réalisé, merci de m'envoyer un mail à lswest34@gmail.com. Si vous le faites, pensez à inclure C&C ou FCM dans le titre, sinon je ne le regarderai pas.

Lien : https://wiki.archlinux.org/index.php/SSH_Keys#Generating_an_SSH_key_pair

issue57/c_c.txt · Dernière modification : 2012/03/06 10:55 de auntiee