Lister les scripts utilisés lors d’un lancement de session

I. Présentation

Dans ce court tutoriel, nous allons voir comment utiliser la commande strace afin de lister tous les fichiers qui sont exécutés lors de l'ouverture d'une session.

En effet, nous avons vu dans le tutoriel précédent, .bashrc et .bash_profile, quelle différence ?, que lors de la création d'une session ou de l'ouverte d'un shell, plusieurs scripts sont exécutés :

  • Pour gérer les variables d'environnements
  • Pour gérer les alias
  • Pour gérer l'auto-complétion
  • etc.

Dans plusieurs contextes, et notamment lorsque l'on souhaite modifier l'un de ces fichiers, il peut être intéressant de connaître la liste exhaustive des fichiers exécutés lorsqu'un login script est exécuté

II. Utilisation de strace et grep pour surveiller les login shell

La commande strace est un outil de débogage sous Linux qui permet de surveiller les appels systèmes d'un programme. Il s'agit d'un outil très utile et efficace qui n'est pas aisé à manier lorsque l'on débute.

La possibilité de lister les fichiers exécutés lors  d'un lancement de session se déroule en trois étapes, nous allons dans un premier temps mettre la sortie de la commande "strace", généralement très verbeuse, dans un fichier nommé strace01.out :

strace -o strace01.out -e open -f bash --login -i

Le but de la commande précédente est de capturer tous les appels systèmes effectués lors de l'exécution de la commande "bash --login -i", qui permet elle de lancer l'exécution d'un login shell. Grâce à l'option "-o" de strace, nous écrivons toutes les sorties vers le fichier strace01.out. L'option "-e" permet elle de filtrer uniquement les appels systèmes qui nous intéressent, en l’occurrence ici, les ouvertures de fichier dans le système de fichier, donc l'appel système "open"

Note : Pour plus d'informations sur les appels systèmes, je vous oriente vers cet article : Appel système

La prochaine étape est donc d'épurer un peu notre fichier de sortie afin de récupérer uniquement les informations intéressantes. Plus précisément, nous allons exclure, parmi les appels systèmes effectués, ceux qui ont répondu un "ENOENT", c'est à dire "Error NO ENTry", quand le fichier n'existe pas. l'exclusion d'un terme est possible grâce à l'option "-v" de la commande "grep" :

grep -v ENOENT strace01.out | grep \"  | cut -d\" -f2  | egrep "/etc|$HOME"

Nous utiliserons également la commande "grep" afin de ne récupérer uniquement les commandes contenant un double quote, puis nous utiliserons "cut" pour couper les sorties restantes afin de ne récupérer que la partie après la double quote.

Note : Pour éviter les doublons qui peuvent complexifier la sortie à lire, je vous conseille de rajouter "|sort |uniq" à la fin de la commande précédente ;). Celles-ci permettent respectivement de trier par ordre alphabétique la sortie puis d'éliminer les doublons.

Enfin, nous utiliserons "egrep", qui n'est rien d'autre que la commande "grep" avec la possibilité d'utiliser des expressions régulières, afin de récupérer uniquement les lignes contentant "/etc" ou le contenu de la variable d'environnement "$HOME".

Note : Lors de l'ouverture d'une session, les variables d'environnement sont initialisées et elles peuvent alors être utilisées par d'autres scripts. La variable $HOME contient le chemin vers le home de l'utilisateur courant .

Bien ! Analysons maintenant la sortie d'une telle commande :

root@debian:~# grep -v ENOENT OUT | grep \"  | cut -d\" -f2  | egrep "/etc|$HOME" |sort | uniq
/etc/bash.bashrc
/etc/bash_completion.d/debconf
/etc/bash_completion.d/desktop-file-validate
/etc/bash_completion.d/grub
/etc/bash_completion.d/initramfs-tools
/etc/bash_completion.d/inkscape
/etc/bash_completion.d/insserv
/etc/bash_completion.d/libreoffice.sh
/etc/bash_completion.d/pon
/etc/bash_completion.d/pulseaudio-bash-completion.sh
/etc/bash_completion.d/pygmentize
/etc/bash_completion.d/unar
/etc/bash_completion.d/whiptail
/etc/group
/etc/inputrc
/etc/ld.so.cache
/etc/nsswitch.conf
/etc/passwd
/etc/profile
/etc/profile.d/bash_completion.sh
/etc/profile.d/vte-2.91.sh
/etc/profile.d/vte.sh
/root/.bash_history
/root/.bashrc
/root/.profile

Sans surprise, nous retrouvons par exemple /root/.bashrc qui est le premier fichier auquel on pense lorsque l'on veut déclarer une variable d'environnement. Également, nous retrouvons /etc/bash_bashrc qui n'est rien d'autre que .bashrc valable pour tous les utilisateurs.

Note: J'ai utilisé les commandes "|sort |uniq" pour trier et supprimer les doublons de la sortie. Sans utiliser ces commandes, nous pourrons voir quel fichier entre /root/.bashrc et /etc/bashrc est exécuté en dernier et donc lequel surcharge et "remplace" l'autre 😉

Nous voyons également, et cela dépendsdes installations, différents fichiers provenant de /etc/bash_completion qui permet de déclarer des raccourcis pour la complétion bash.

Plus généralement, si vous souhaitez savoir ce qu'un fichier listé effectue, il suffit de le lire via la commande "cat".

J'espère que ce tutoriel vous aura été utile. N'hésitez pas à utiliser les commentaires ou notre forum pour donnez votre avis ou poser des questions.

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Mickael Dorigny

Co-fondateur d'IT-Connect.fr. Auditeur/Pentester chez Orange Cyberdéfense.

Nombre de posts de cet auteur : 523.Voir tous les posts

One thought on “Lister les scripts utilisés lors d’un lancement de session

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.