Shell et awk

Notions abordées

Commandes supplémentaires

Commande type

La commande type permet de connaître le chemin d'accès d'un exécutable. Par exemple:

type systemd

Affiche le résultat suivant

systemd est /usr/bin/systemd

Options de la commande ls

L'option la plus utilisée est -l. Par exemple :

ls -l /usr/bin/systemd

Affiche le résultat suivant:

lrwxrwxrwx 1 root root 20 oct. 16 15:24 /usr/bin/systemd -> /lib/systemd/systemd

On s'aperçoit que /usr/bin/systemd est un lien vers /lib/systemd/systemd

Commande ldd - bibliothèque partagée

Un exécutable peut-être lié à plusieurs autres bibliothèques. Pour connaître l'ensemble de ces bibliothèques, on utilise la commande ldd. Par exemple nous allons voir quels sont les bibliothèques utilisées par systemd

ldd /lib/systemd/systemd

Sous Debian Buster, le résultat est le suivant

linux-vdso.so.1 (0x00007ffd705f1000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007eff3251e000)
libsystemd-shared-241.so => /lib/systemd/libsystemd-shared-241.so (0x00007eff3228e000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007eff3227e000)
libseccomp.so.2 => /lib/x86_64-linux-gnu/libseccomp.so.2 (0x00007eff3222e000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007eff32006000)
libmount.so.1 => /lib/x86_64-linux-gnu/libmount.so.1 (0x00007eff31fa6000)
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007eff31f8e000)
libaudit.so.1 => /lib/x86_64-linux-gnu/libaudit.so.1 (0x00007eff31f5e000)
libkmod.so.2 => /lib/x86_64-linux-gnu/libkmod.so.2 (0x00007eff31f3e000)
libapparmor.so.1 => /lib/x86_64-linux-gnu/libapparmor.so.1 (0x00007eff31f26000)
/lib64/ld-linux-x86-64.so.2 (0x00007eff32876000)
libcap.so.2 => /lib/x86_64-linux-gnu/libcap.so.2 (0x00007eff31f1e000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007eff31f0e000)
libcryptsetup.so.12 => /lib/x86_64-linux-gnu/libcryptsetup.so.12 (0x00007eff31eae000)
libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007eff31d8e000)
libip4tc.so.0 => /lib/x86_64-linux-gnu/libip4tc.so.0 (0x00007eff31d7e000)
libidn.so.11 => /lib/x86_64-linux-gnu/libidn.so.11 (0x00007eff31b46000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007eff31b1e000)
liblz4.so.1 => /lib/x86_64-linux-gnu/liblz4.so.1 (0x00007eff31afe000)
libblkid.so.1 => /lib/x86_64-linux-gnu/libblkid.so.1 (0x00007eff31aa6000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007eff31a7e000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007eff31a06000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007eff319fe000)
libcap-ng.so.0 => /lib/x86_64-linux-gnu/libcap-ng.so.0 (0x00007eff319f6000)
libssl.so.1.1 => /lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007eff3195e000)
libcrypto.so.1.1 => /lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007eff3166e000)
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007eff31666000)
libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007eff31656000)
libdevmapper.so.1.02.1 => /lib/x86_64-linux-gnu/libdevmapper.so.1.02.1 (0x00007eff315e6000)
libargon2.so.1 => /lib/x86_64-linux-gnu/libargon2.so.1 (0x00007eff315d6000)
libjson-c.so.3 => /lib/x86_64-linux-gnu/libjson-c.so.3 (0x00007eff315c6000)
libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007eff3159e000)
libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007eff31576000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007eff313ee000)

Utilisation de awk

Afin de manipuler awk, on va faire un petit exercice

Création et manipulation de répertoires

On crée un répertoire que l'on va appeler bidon afin de faire nos tests

mkdir bidon

On se déplace dans ce répertoire

cd bidon

On crée un deuxième répertoire appelé test à l'intérieur de bidon

mkdir test

On va créer une variable qui nous donne le chemin absolu du répertoire dans lequel on se situe

rep_dest=`pwd`

(Les symboles qui encadrent pwd sont obtenus avec la combinaison des touches AltGr+7)

On peut vérifier que cette variable contient bien le résultat de la commande pwd en affichant cette variable avec echo

echo $rep_dest

Combinaison du pipe et de awk

Si on exécute la commande suivante:

ldd /lib/systemd/systemd

On se rend compte qu'il y a quatre colonnes : le nom du fichier en ".so", le symbole "=>", le chemin d'accès de la bibliothèque et une adresse hexadécimal.

Si nous voulons le résultat uniquement du chemin absolu des ".so" (troisième colonne) on peut l'extraire grâce à la commande awk.

ldd /lib/systemd/systemd | awk '{print $3}'

Le symbole pipe "|" est obtenu grâce à la combinaison des touches AltGr+6. Elle permet de transférer le résultat d'une commande a une autre commande afin de traiter la première par la deuxième.

On peut mettre le résultat de cette commande dans une variable:

rep_src=`ldd /lib/systemd/systemd | awk '{print $3}'`

Et on peut afficher le résultat contenu dans cette variable:

echo "Repertoire source : $rep_src"

On peut ensuite utiliser les variables précédentes afin d'effectuer des manipulations. Par exemple, si je veux copier les ".so" partagé par l'exécutable systemd dans le répertoire test, il suffit de taper:

cp $rep_src $rep/test