Un peu de libre dans ce monde propriétaire

On y parle de libre, de configuration et d'autres trucs hermétiques à la plupart des personnes

Aller au contenu | Aller au menu | Aller à la recherche

19oct.

Copier des fichiers par un canal sécurisé

La semaine passée j'ai dû copier des fichiers entre plusieurs machines. J'ai fait comme d'habitude, j'ai utilisé scp de la manière suivante :

  1. scp host:fileWithoutSpaces .

Jusqu'au moment où je suis tombé sur un fichier comportant des espaces. Cette syntaxe n'était plus du tout valide car scp considère les espaces comme des séparateurs de fichiers. Dans ce cas, il faut utiliser la syntaxe suivante :

  1. scp host:"file\ with\ spaces" .

Il ne faut oublier ni les " ni les \.

En recherchant cette syntaxe, j'ai trouvé quelques petites choses intéressantes à faire avec scp. Alors en bonus :

  1. # Copier plusieurs fichiers en une seule fois :
  2. scp host:"file1 file2 file3" .
  3.  
  4. # Copier un répertoire complet :
  5. scp -r host:folder .
  6.  
  7. # Copier plusieurs fichiers vers une machine distante
  8. scp file1 file2 file3 host:.
  9.  
  10. # Copier un fichier avec espaces vers une machine distante
  11. scp file\ with\ spaces host:.
  12. # ou
  13. scp "file with spaces" host:.

25août

Renommer des fichiers

Aujourd'hui, nous allons renommer des fichiers avec les outils en ligne de commande.

Renommages simples avec l'outil mv

Pour renommer fichier1 en fichier2

  1. mv fichier1 fichier2

ou

  1. mv fichier{1,2}

Pour renommer fichier1 en fichier1.bak

  1. mv fichier1{,.bak}

mv est pratique pour renommer un fichier à la fois. Si vous en avez plus que 2, il vaut mieux passer à un autre outil.

Renommages moins simples avec l'outil rename

L'outil rename fonctionne grâce aux expressions rationnelles [1][2][3][4] mais malheureusement, nous ne sommes pas dans un monde parfait car l'outil a quelques particularité dans l'interprétation qu'il fait de celles-ci.

Pour renommer fichier1 et fichier2 en fichier1.bak et fichier2.bak

  1. rename 's/$/.bak/' fichier1 fichier2

ou

  1. rename 's/$/.bak/' fichier{1,2}

Pour renommer fichier 1 et fichier 2 en fichier1.bak et fichier2.bak

  1. rename 's/ ([1,2])$/$1.bak/' fichier\ {1,2}

Pour renommer premier gros fichier en premier.Gros.Fichier

  1. rename 's/ (.)/.\u$1/g' premier\ gros\ fichier

Pour renommer exemple d'un gros fichier en exemple.D.Un.Gros.Fichier

  1. rename 's/[ '"'"'](.)/.\u$1/g' exemple\ d\'un\ gros\ fichier

Notez dans cet exemple la manière dont il faut échapper l'apostrophe (').

Pour renommer fichier1 et fichier2 en FICHIER1 et FICHIER2

  1. rename 's/(.)/\u$1/g' fichier{1,2}

ou

  1. rename 'y/a-z/A-Z/' fichier{1,2}

Pour renommer FICHIER1 et FICHIER2 en fichier1 et fichier2

  1. rename 's/(.)/\l$1/g' FICHIER{1,2}

ou

  1. rename 'y/A-Z/a-z/' FICHIER{1,2}

Bon amusement pour renommer vos fichiers maintenant que vous avez quelques outils.

21août

Envoyer un courriel

Récemment, j'ai eu besoin d'envoyer un courriel automatiquement car à une heure à laquelle je dormais (oui, ça m'arrive parfois :) ). J'ai alors cherché à envoyer un message automatiquement.

Je me suis donc tourné vers les outils disponibles sur la distribution de mon serveur. Et j'y ai trouvé l'utilitaire mail qui répond exactement au besoin que j'avais. On peut utiliser ce logiciel en mode interactif en l'appelant simplement depuis la console ou en mode autonome. C'est cette deuxième méthode qui nous intéresse.

Pour commencer, il est nécessaire de créer un fichier contenant le message à envoyer, appelons ce fichier message.A.Envoyer. Ensuite il faut envoyer le contenu du message à mail pour qu'il l'envoie à l'adresse sélectionnée :

  1. cat message.A.Envoyer | mail -s "Sujet du message" address@to.com

Voila, c'est aussi simple que ça.

Si on regarde de plus près le message reçu, on s'aperçoit que dans l'entête l'origine est le courriel de notre serveur. Si c'est le courriel que l'on utilise, il n'y a pas de problèmes, sinon on risque de ne jamais recevoir de réponse. Toutefois, avec mail, il n'y a pas vraiment de problèmes car on peut modifier les valeurs de l'entête :

  1. cat message.A.Envoyer | mail -s "Sujet du message" -a 'From: "Mon nom" <address@from.com>' address@to.com

Toutes les autres valeurs de l'entête sont modifiables de la même manière.

On peut également envoyer le message en copie et en copie cachée :

  1. cat message.A.Envoyer | mail -s "Sujet du message" -a 'From: "Mon nom" <address@from.com>' -b address.blind.carbon.copy@to.com -c address.carbon.copy@to.com address@to.com

Avec ces quelques options, on couvre déjà beaucoup de besoins. Il ne reste plus qu'à appeler notre script depuis cron pour envoyer le message aux dates et heures désirées.

06juil.

Vérifier la somme de contrôle d'un fichier

Quand je fais des téléchargements de gros fichiers, comme des distributions Linux, j'aime savoir si l'intégrité de mon fichier est préservée. Pour le savoir, j'ai recours aux sommes de contrôle.

Qu'est ce qu'une somme de contrôle [1] ou empreinte?

C'est le résultat, de longueur fixe, de la transformation d'un fichier par une fonction de hachage [2]. Selon la théorie des codes, à chaque empreinte correspond un seul et unique fichier. Mais ce n'est que de la théorie, car la recherche faisant des progrès, ce n'est plus tout à fait vrai [3].

De ce fait, il est facile ensuite de vérifier si le fichier est bien ce qu'il prétend être en comparant son empreinte réelle avec son empreinte théorique.

Il existe différentes fonctions de hachages, mais les plus courantes (en tout cas sur GNU/Linux) sont MD5, SHA1 et SHA256. On préfèrera l'utilisation de l'algorithme SHA pour des raisons évidentes de sécurité (voir annexes).

Vérification de l'intégrité d'un fichier

D'abord, téléchargeons un fichier ainsi que son empreinte. On peux prendre l'exemple de l'ISO de la version 13 de Fedora et de son empreinte SHA256. Dans ce fichier, ce qui nous intéresse, c'est la ligne suivante

47ccc37db256387b70857f53a6067e8d50e692c9aa85e45e63e5190c5d1e0942 *Fedora-13-i686-Live.iso
Première méthode : la mauvaise

On peux calculer l'empreinte de notre fichier de la manière suivante :

sha256sum Fedora-13-i686-Live.iso

et on obtiendra l'empreinte à comparer (manuellement) avec l'empreinte originale. C'est très chiant rébarbatif et source d'erreurs. On préfèrera donc l'une des 2 méthodes suivantes.

Deuxième méthode : en 1 seule commande

En fait, dans la première méthode, on a utilisé le programme sha1sum pour générer une empreinte, alors qu'il y a moyen de lui fournir un fichier et une empreinte afin qu'il nous dise si le fichier correspond à l'empreinte.
Il y a plusieurs syntaxes différentes, je vous en propose 2 :

echo "47ccc37db256387b70857f53a6067e8d50e692c9aa85e45e63e5190c5d1e0942 *Fedora-13-i686-Live.iso" | sha256sum -c -
sha256sum -c - <<< "47ccc37db256387b70857f53a6067e8d50e692c9aa85e45e63e5190c5d1e0942 *Fedora-13-i686-Live.iso"

Je préfère la seconde syntaxe car il y a moins à écrire et qu'il n'y a qu'un seul programme appelé. Mais les 2 sont équivalentes.

Notons que le paramètre -c indique que la commande va vérifier un fichier et son empreinte, que le paramètre - indique que la commande attend la chaîne de caractères formatée sur son entrée standard.

L'inconvénient de cette méthode, c'est que l'on ne peut traiter qu'un seul fichier à la fois. Pour traiter plusieurs fichiers à la fois, on utilise la troisième méthode.

Troisième méthode : en 1 commande et un fichier

La syntaxe est assez similaire et doit ressembler à ça :

sha256sum -c FICHIER_DE_CONTROLE

où FICHIER_DE_CONTROLE est le nom du fichier contenant 1 chaîne de caractères formatée par ligne.

La chaîne de caractères formatée [4]

Elle est composée de 4 éléments :

  • l'empreinte du fichier à vérifier
  • un espace
  • une étoile ou astérisque (*)
  • le nom du fichier à vérifier