Shell et awk
Notions abordées
- Commande type
- Options de la commande ls
- Commande ldd pour connaître les bibliothèques partagées d'un exécutable
- Création et utilisation des variables
- Utilisation du symbole pipe (|) afin d'envoyer et de traiter le résultat d'une commande
- Utilisation élémentaire de awk
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 suivantsystemd 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