Je veux installer2) un nouveau logiciel (un jeu par exemple) : asciijump. Je me logue donc en root3) pour faire un :
apt-get update && apt-get install asciijump
L'installation se passe bien, je regarde dans le menu Applications
→ Jeux
et constate que ce nouveau jeu ne s'affiche pas.
Je décide donc de lancer mon jeu depuis la console :
asciijump
Problème, j'ai ce superbe message :
bash : asciijump : command not found
Le répertoire contenant l'exécutable de mon jeu n'est pas renseigné dans le $PATH du compte courant (en l'occurrence, root).
Qu'est-ce que le $PATH ?
Cette erreur arrive assez souvent, vous tapez une commande et vous avez un command not foud. C'est le cas pour les jeux en root par exemple. Pourquoi ?
Je vous invite à taper dans votre terminal :
echo $PATH
Vous obtenez une liste de répertoires. Par exemple chez moi :
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
A quoi ça sert ?
C'est simple, quand vous tapez une commande du genre
frozen-bubble
Le terminal va parcourir tous les répertoires présents dans le $PATH dans l'ordre afin de voir si il ne trouve pas un exécutable du nom que vous avez appelé.
Ici, avec frozen-bubble, il va chercher ici :
/usr/local/bin/frozen-bubble
si il ne trouve pas, il va regarder dans
/usr/bin/frozen-bubble
etc…
Le dernier répertoire contenu dans mon $PATH est le répertoire /usr/games, il va donc regarder si il trouve :
/usr/games/frozen-bubble
/usr/games/ étant le répertoire par défaut des jeux, il va bien y trouver l'exécutable :
/usr/games/frozen-bubble
et me lancer mon jeu favori :)
Le problème que j'avais était que je ne pouvais pas lancer mon jeu (asciijump) directement depuis le compte root, à moins bien sur de taper le chemin4) complet de l'exécutable asciijump5).
Je regarde donc ce que contient le $PATH root :
echo $PATH
J'obtiens :
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11
Je me rends compte que le dossier /usr/games n'est pas présent.
Voici comment l'ajouter :
Il y a deux solutions :
Je vous recommande la première solution bien évidemment.
Une autre explication simplifiée offerte par bendia sur le forum :
Si tu mets :.: dans le PATH, les exécutables sont aussi cherchés dans le répertoire courant, quelque soit l'endroit où tu es. Le problème se pose surtout pour les programmes setuid ou setgid car si ils ont été mal faits, on peut exécuter un autre programme avec les droits root.
Supposons que tu télécharges en tant qu'utilisateur un programme malicieux (un script qui rm -rf /n (Supprime toute la racine de ton système), par exemple), tu te trouves dans le répertoire de ce script qui porte le même nom qu'un utilitaire unix qui est utilisé par un programme setuid mal fichu.
Dans ce cas, si tu lances cette commande_setuid, la commande obtient les droits de root et peut donc s'engager sans que tu le saches.
La commande croit utiliser l'utilitaire unix et va exécuter le scripts mailicieux, et paf le / est effacé !
C'est pour cela, que dans les programmes setuid on vérifie systématiquement le PATH.
C'est une très vieille faille des système unix.
Sur les indications de enikar.
Que ses neurones baignent à jamais dans le parfum des roses et des jasmins…
Pour modifier le $PATH pour un utilisateur donné, éditez6) le fichier de configuration de votre terminal pour le compte utilisateur :
nano /home/utilisateur/.bashrc
Et j'y ajoute cette ligne :
PATH=$PATH:/usr/games
Pour ajouter le dossier /usr/games dans le $PATH du root.
J'édite en terminal root le fichier /root/.bashrc ainsi :
nano /root/.bashrc
Ajouter la ligne :
PATH=$PATH:/usr/games
Voila, désormais vous pouvez lancer votre jeu favoris depuis l'utilisateur root (Je sais, aucun intérêt pour un jeu,mais c'est pour donner un exemple quoi
Pour modifier le $PATH pour tous les utilisateurs, ajoutez la même ligne dans le fichier de configuration général de votre terminal qui doit se trouver ici : /etc/bash.bashrc.
nano etc/bash.bashrc
Idem, ajouter :
PATH=$PATH:/usr/games
Merci à Benjamin à qui je dédie les bisous de multiples générations d'utilisateur Linux pour la clarté de son exposé.