Ellendhel's Blog

LinuxContrôler votre historique de commandes

Une des fonctions couramment utilisée avec l'interpréteur de commandes Bash est l'historique de commandes : par une simple pression sur la touche fléchée "Haut" vous retrouvez les commandes lancées précédemment, avec leurs options. Vous pouvez éviter de fastidieuses saisies, limiter les erreurs et être plus efficace d'un manière générale.

Ce qui est parfois moins connu est l'utilisation de la commande history, qui affiche l'intégralité de commandes sauvegardées (500 lignes par défaut). Cet historique n'est toutefois pas parfait, entre autre exemple aucune date ou heure n'est indiquée.

Cela se règle assez facilement en déclarant une variable dans votre fichier ~/.profile :

export HISTTIMEFORMAT='%F %T '

Une fois le fichier enregistré, vous pouvez appliquer ce nouveau paramètre dans votre session :

source ~/.profile

Et la commande history vous donnera maintenant la date et l'heure pour chaque entrée de votre historique.

Mais dans certaines situations vous ne souhaitez pas que certaines commandes soit enregistrées. L'exemple le plus évident est lors de l'utilisation de commandes intégrant un mot de passe en clair (mysql, smbclient ou testsaslauthd entre autre). Une autre option peut être ajoutée à votre fichier .profile pour déclarer des exceptions :

export HISTIGNORE="mysql *:smbclient *:testsaslauthd *"

Toute ligne de commande débutant par une des commandes listées suivies d'un espace et d'arguments ne sera pas inclue dans votre historique.

Il reste quelques rares cas où vous souhaitez qu'une commande soit ignorée, mais que vous n'avez pas définie à l'avance. Bash propose alors une option supplémentaire adaptée à cette situation :

export HISTCONTROL=ignorespace

Toute commande débutant par un espace sera alors ignorée dans l'historique, sans que cela interfère lors de l'exécution.

Bash dispose d'autres options liées à l'historique de commandes, que vous pouvez trouver dans la page de manuel correspondante.

publié le 29 janvier 2016

lien direct

LinuxInstaller un logiciel depuis ses sources : iperf3

Pour diverses raisons vous pouvez être amené à compiler un logiciel depuis ses sources et ce que l'on peut entendre ou lire le plus souvent ressemble à "c'est simple : configure, make, make install et c'est réglé". C'est probablement vrai dans de nombreux cas mais pour certains logiciels, une bibliothèque particulière peut être requise, une option nécessite d'être activée ou l'on souhaite contrôler la manière dont l'installation se déroule.

Dans tous les cas l'administrateur système se retrouve à sortir des sentiers battus. Cet article est un exemple basée sur l'installation de iperf3, un outil de mesure de performance réseau. Le but est non seulement d'installer iperf et de pouvoir l'utiliser mais également de savoir comment progresser lorsqu'un problème se présente. Comme à l'accoutumée, l'environnement utilisé est une Slackware 64 bits.

Commençons par obtenir les sources. Rien de très spécial, il suffit de télécharger une archive .tar.gz depuis le site officiel. Vérifier la signature GPG est toujours une bonne idée avant de se lancer dans les étapes suivantes. Si tout est correct il n'y a qu'à décompresser le fichier.

# cd /usr/local/src
# mkdir iperf
# cd iperf
# wget http://downloads.es.net/pub/iperf/iperf-3.0.11.tar.gz
# wget http://downloads.es.net/pub/iperf/iperf-3.0.11.txt.asc
# gpg --verify iperf-3.0.11.txt.asc
gpg: Signature made Fri 09 Jan 2015 01:01:36 PM EST using RSA key ID 8CAAEE8A
gpg: Can't check signature: public key not found

Première embûche, "impossible" de vérifier la signature GPG. Et pour cause, il faut avoir une copie de la clé publique en premier lieu. L'identifiant de la clé est indiqué dans le message d'erreur, et GPG dispose d'une fonction pour interroger un serveur de clés, rien de très complexe donc :

# gpg --search 8CAAEE8A

Une fois la clé ajoutée à votre trousseau (sélectionnez la clé proposée avec son numéro et confirmez), la vérification peut avoir lieu :

# gpg --verify iperf-3.0.11.txt.asc
# grep --color $(sha256sum iperf-3.0.11.tar.gz) iperf-3.0.11.txt.asc

La première commande vérifie la validité de la signature du fichier texte et doit renvoyer un message contenant "Good signature".

La deuxième commande recherche l'empreinte SHA-256 du fichier compressé dans le fichier texte et une longue chaîne de caractères doit apparaître en résultat. À noter que cela n'est pas la procédure la plus courante ; en règle générale un fichier de signature permet de vérifier le fichier de sources lui-même sans passer par un fichier texte intermédiaire.

Reste à décompresser le fichier :

# tar xvfz iperf-3.0.11.tar.gz
# cd iperf-3.0.11

Nous y sommes. En théorie, il ne reste qu'à appliquer la formule magique "configure, make, make install". Essayons donc.

# ./configure
# make
# make install

Et ça marche. Où en tout cas, ça y ressemble :

Par défaut, les fichiers binaires sont généralement installés dans /usr/local/bin, ou /usr/local/sbin s'ils sont destinés uniquement à l'utilisateur root. Vérifions rapidement :

# whereis iperf3
iperf3: /usr/local/bin/iperf3

Effectivement, il y a quelque chose ; tentons d'exécuter le programme :

# /usr/local/bin/iperf3
/usr/local/bin/iperf3: error while loading shared libraries: libiperf.so.0: cannot open shared object file: No such file or directory

Nouveau problème, la bibliothèque libiperf.so est introuvable. L'utilitaire ldd le confirme. ldd affiche les liens entre un programme donné et les bibliothèques partagés dont il dépend.

# ldd /usr/local/bin/iperf3
        linux-vdso.so.1 => (0x00007fff6a3ff000)
        libiperf.so.0 => not found
        libc.so.6 => /lib64/libc.so.6 (0x00007fb7c2d6e000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb7c3143000)

Pourtant libiperf est fournie avec les sources d'iperf3 et est installée en même temps. Vérifions :

# find /usr/local -type f -name 'libiperf.*'

Les résultats montrent bien des fichiers dans /usr/local/lib/.

# ls /usr/local/lib/libiperf.*

Tout est là mais cela ne fonctionne pas. Ce qui est parfois nécessaire est d'utiliser la commande ldconfig pour recréer les liens pour les bibliothèques partagées.

# ldconfig

Testons à nouveau :

# /usr/local/bin/iperf3

Ça marche ! Et ldd ne ne plaint plus :

# ldd /usr/local/bin/iperf3
        linux-vdso.so.1 => (0x00007fff535de000)
        libiperf.so.0 => /usr/local/lib/libiperf.so.0 (0x00007f9f12511000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f9f12168000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f9f12758000)

Sauf qu'à y regarder de plus près, les choses ne sont pas parfaites. Nous avons une bibliothèque 64 bits installée dans un répertoire pour bibliothèques 32 bits. Rien de bloquant mais cela pourrait poser problème à moyen ou long terme. Le mieux serait d'avoir libiperf installé dans /usr/local/lib64.

# file /usr/local/lib/libiperf.so.0.0.0
/usr/local/lib/libiperf.so.0.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped

Il serait possible de déplacer les fichiers manuellement, mettre à jour les liens symboliques et tout ce genre de choses, mais soyons clair, ce n'est pas la bonne méthode. Autant reprendre les choses depuis le début.

Désinstallons iperf :

# make uninstall

Nous allons reprendre à l'étape de configuration, qui est là où tout se décide. Demandons de l'aide.

# ./configure --help | less

Parmi la liste d'options se trouve celle qui permet de contrôler le répertoire dédié aux bibliothèques :

--libdir=DIR        object code libraries [EPREFIX/lib]

Utilisons donc cette option.

# ./configure --libdir=/usr/local/lib64/
# make
# make install

Vérifions où se trouve libiperf.so :

# ls /usr/local/lib64/libiperf.*

Et tout est correct pour exécuter iperf :

# ldd /usr/local/bin/iperf3
        linux-vdso.so.1 => (0x00007fffc1d50000)
        libiperf.so.0 => /usr/local/lib64/libiperf.so.0 (0x00007fdc5baef000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fdc5b71b000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fdc5bd0c000)

Le cas de iperf est un peu particulier, du fait que la bibliothèque est fournie avec le logiciel lui-même. Le cas le plus courant est d'avoir une bibliothèque fournie à part (ldns et unbound par exemple). Dans tous les cas configure vous permettra de spécifier l'emplacement des fichiers de configuration, d'activer certaines fonctions, ...

Lors d'une mise à jour il sera nécessaire de réutiliser ces même options (sauf indication contraire des développeurs, dans le cas d'un changement de version majeure par exemple). Vous n'avez pas besoin de noter celles que vous avez utilisé, elles se trouvent au début du fichier config.log qui conserve les résultats de la commande configure.

# head config.log
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.

It was created by iperf configure 3.0.11, which was
generated by GNU Autoconf 2.69. Invocation command line was

  $ ./configure --libdir=/usr/local/lib64/

## --------- ##
## Platform. ##

Cet article devrait vous fournir les bases pour compiler d'autres logiciels de manière similaire. Lorsqu'une installation "classique" ne fonctionne pas le "kit de premier secours" est souvent basé sur ldd, ldconfig et find. En ayant bien évidemment pris le temps de lire la documentation fournie en premier lieu.

publié le 27 novembre 2015

lien direct

LinuxVérification d'un enregistrement DNSSEC

Les enregistrements DNSSEC étant liés à des clés cryptographiques et ces clés ayant une durée de vie limitée, il peut être nécessaire de vérifier les dates de début et de fin de vie lorsqu'une erreur de validation se produit. Ce mécanisme a été décrit plus en détails dans un article précédent.

Il est bien sûr plus commode d'effectuer cette opération via un script, ce qui avait été proposé ici même. Toutefois, ce script comportait un bug : dans le cas où un domaine n'était pas signé par DNSSEC, le résultat retourné était basé sur l'enregistrement du domaine parent. Ce point a été corrigé, et quelques améliorations mineures on également été apportées.

La nouvelle version du script dnssec-checkdate est disponible, sous les même conditions (domaine public, sans garantie).

publié le 17 février 2015

lien direct