Inclassables - astuces Linux diverses

Changer momentanément d'identité

C'est possible, même sans se déloguer, même en mode graphique. Pour «devenir» root, il suffit de taper su ; pour «devenir» un autre utilisateur, su nom_d_utilisateur. Le mot de passe correspondant vous sera demandé. Ceci pour la console ou un Xterm.

Par su - nom_d_utilisateur, on récupère en plus les variables d'environnement dudit utilisateur. Pour passer en root, taper su -

su est indispensable avec une distribution qui interdit les connections root en mode graphique, c'est le cas de la Debian 3.1 Sarge et... c'est préférable quel que soit le système ! Si des applications graphiques doivent être lancés par root, il y a deux biais : soit taper la commande xhost + en tant qu'utilisateur normal avant d'utiliser su, soit utiliser le programme sux. Sous Debian, il est disponible mais pas installé d'office (dans ce cas, apt-get install sux).

Ne pas oublier l'existence d'interface graphiques à su ou à sux ; il y a Kdesu prévu pour KDE et Gksu pour GNOME, encore que tous deux puisse être utilisés quels que soit le bureau. Après, ce n'est qu'une question de choix. Si l'on ne souhaite pas toutes les dépendances liées à KDE par exemple.

Jokers ou caractères de substitution

* : prend la place de n'importe quelle chaîne de caractères, même vide ou constituée d'un seul caractère.

? : prend la place d'un unique caractère quelconque (N.B. : ne peut remplacer une chaîne vide).

!$ : rappelle le dernier argument, quel qu'il fut, commande, option ou fichier, de la ligne de commande précédente.

!! : rappelle la totalité de la ligne de commande précédente.

. : représente le dossier courant ; utile pour lancer un script si le dossier courant ne se trouve pas dans le PATH : ./script_a_lancer

.. : représente le dossier supérieur.

~ : représente le dossier personnel de l'utilisateur actuel ; en général /home/nom_d_utilisateur

-- : une option vide. Sert (pas si) accessoirement (que ça) à signaler la fin des options. Utile pour traiter des fichiers comportant un tiret en début de nom.

La touche TAB en console

Le shell Bash permet le complètement des éléments suivants et dans l'ordre suivant :

  1. aliases déjà définis,
  2. noms des exécutables présents dans le PATH,
  3. noms des fichiers et dossiers présents dans le dossier où est tapée la commande.

Ce qui correspond à l'ordre dans lequel on tape les commandes habituellement.

Ainsi, si vous hésitez sur la frappe d'un nom de programme ou de commande, tapez le début et pressez deux fois la touche TAB, des complètements vous seront proposés. S'ils sont trop nombreux, on vous demandera confirmation avant de les afficher (y ou n). Même chose pour les noms de fichiers ou de dossiers possibles.

Tout ceci est valable en console et dans un émulateur de terminal comme Xterm.

Raccourcis-clavier en console

Ctrl c : stoppe l'application console en cours. Astuce à connaitre : permet de stopper une requête DHCP au démarrage d'un système Linux. Utile pour éviter une recherche inutile, notamment avec une carte réseau sans fil. Conseil : ne pas taper ce raccourci plusieurs fois, afin d'éviter de perturber le démarrage d'un autre service.

Ctrl d : pour se déloguer, y compris suite à un changement d'utilisateur par su ; peut s'utiliser autant de fois que nécessaire s'il y a eu des su successifs.

Ctrl r : effectue une recherche dans les commandes précédentes. Très agréable pour retrouver ou se dispenser de réécrire en entier une commande longue. On peut lancer la recherche en tapant n'importe quelle partie de la commande voulue !

Ctrl w : effacement du mot précédent.

Ctrl u : effacement de la ligne complète.

Shift + ou Shift - : augmente la taille de la police dans un Xterm. Attention : + et - du pavé numérique (il faut combiner avec la touche Fn sur un portable).

La console ou le Xterm dans lequel vous travaillez semble inexplicablement bloqué ? Peut-être que vous avez inopinément pressé le raccourci Ctrl s qui stoppe le défilement. Pressez à tout hasard Ctrl q pour revenir à la normale. Si vous êtes en root, quittez sans plus rien taper... Enfin... C'est mon conseil...

Début, Home ou Ctrl a : aller au début de la ligne de commande.

Fin, End ou Ctrl e : aller à la fin de la ligne de commande.

Shift PagePréc. / Shift PageSuiv. : reculer/avancer d'une page.

Tous ces raccourcis sont fonctionnels tant en console qu'en Xterm, dans les distributions que j'ai essayées récemment : Slackware 10.1, SuSE 9.2, Debian 3.1 et Etch, (x)Ubuntu 5.10 et 6.06.

Interrompre une reqûete DHCP au démarrage

C'est faisable par l'habituel raccourci console pour stopper une application lancée à partir d'elle : Ctrl c. Conseil : ne le taper qu'une fois (le résultat devrait d'ailleurs être immédiat).

Succession de commandes

Premier cas : si vous souhaitez lancer commande1 suivie de commande2 sans vous soucier de l'échec ou de la réussite de commande1, il vous faut taper :

commande1 ; commande2 

Deuxième cas : si vous souhaitez exécuter commande1 suivie de commande2 seulement si commande1 réussit, il vous faut taper :

commande1 && commande2

Troisième cas : si vous souhaitez exécuter commande2 seulement si commande1 échoue, il vous faut taper :

commande1 || commande2

(utilisation de deux caractères pipe | obtenus sur un clavier PC français par AltGr 6 )

Garder le résultat de l'exécution d'une commande

L'exécution d'une commande vous jette à la gueule^W^W^Wsur la sortie standard un flot de texte que vous aimeriez bien examiner à tête reposée ? Là encore, deux solutions au moins.

Première solution : utilisation du pipe pour visualiser directement la sortie de la commande :

commande | less

Un inconvénient, toutefois : une fois le pager less quitté (touche q), vous n'aurez plus de trace de l'exécution de la commande.

Deuxième solution : envoyer la sortie de la commande commande vers le fichier en texte brut machin :

commande > machin
Il vous reste à examiner le contenu du fichier machin en texte brut soit avec l'éditeur de texte de votre choix, soit avec un pager comme more ou less (ce dernier est nettement plus riche en fonctions) :
less machin

On peut évidemment taper tout cela d'une seule traite :

commande > machin && less machin

Deuxième solution (bis) : par

commande >> machin
vous envoyez la sortie de la commande vers le fichier machin, non en le remplaçant mais en rajoutant la sortie standard à la fin du fichier en question. D'une seule traite encore,
commande >> machin && less machin

Utilisation avancée de less

Comme on va le voir, «less is more than more».

La fonction de base de less est la visualisation de fichiers texte. Principal avantage par rapport à more, less permet de revenir sur du texte déjà vu : soit par utilisation de la molette de la souris, soit par utilisation des flèches de déplacement, soit par les deux touches Page suivante et Page précédente ; on peut aussi aller en début de texte (taper Début ou g) ou en fin de texte (taper Fin ou G).

Recherche de texte : Pour chercher du texte en avant, taper / suivi du texte ou de l'expression régulière à chercher. Pour chercher du texte en arrière, taper ? suivi du texte ou de l'expression régulière à chercher. Une fois la recherche aboutie, on peut la relancer dans le même sens (taper n) ou en sens contraire (taper N). Nous retrouvons exactement la même façon de faire que dans Vim.

On quitte less ou more par la touche q.

Renommer des fichiers en série

Ancienne version de rename

On renomme des fichiers de la façon suivante :

rename motif1 motif2 *.mpeg

Ce qui veut dire que tous les fichiers MPEG du dossier seront renommés en remplaçant la première apparition de motif1 dans leur nom par motif2. C'est là la seule fonction de cette version de rename que je connaisse, version présente notamment dans les SuSE 7.3 et 9.2, à ma connaissance.

Version PERL de rename

Les possibilités sont beaucoup plus importantes et permettent l'utilisation d'expressions régulières. Cette version était déjà présente dans la Debian 3.0 Woody et sa syntaxe est sensiblement la même que celle utilisée pour effectuer des substitutions dans Vim. Commençons par décrire comment réaliser exactement le même travail que ci-dessus :

rename s/motif1/motif2/ *.mpeg
Tous les fichiers MPEG du dossier seront renommés en remplaçant la première apparition de motif1 dans leur nom par motif2. Par contre, si l'on tape :
rename s/motif1/motif2/g *.mpeg
toute apparition de motif1 dans leur nom sera remplacée par motif2.

Changement d'extension : si l'on veut changer toutes les extensions .txt des fichiers d'un dossier en .tex :

rename s/.txt/.tex/ *.txt

Suppression des espaces : dans tous les noms de fichiers PDF (extension .pdf ou .PDF) d'un dossier, on souhaite remplacer les espaces par des underscores (le «tiret 8» ou tiret bas) :

rename s/\ /_/g *.pdf *.PDF

La suppression des espaces sans les remplacer se ferait par :

rename s/\ //g *.pdf *.PDF

(espace remplacé par... rien !). Ne pas oublier l'option g car sans elle, vous ne remplaceriez que le premier espace dans chaque nom de fichier.

Noter que l'antislash empêche d'interpréter l'espace comme passage à l'argument suivant dans cette commande Unix. Il est conseillé de protéger les espaces et les caractères spéciaux : tirets de début (-machin peut signaler une option), doubles tirets isolés (-- , servent à signaler la fin des options dans une commande), ?, *, ^, >, <, |, &, ;, !, etc... En résumé, tout ceux qui jouent habituellement un rôle dans les lignes de commandes.

Passage en minuscules : (sur tous les fichiers possédant une extension, quelle qu'elle soit)

rename 'y/A-Z/a-z/' *.*

Passage en majuscules : (sur tous les fichiers possédant une extension .tif ou .PNG)

rename 'y/a-z/A-Z/' *.tif *.PNG

Cette modification est applicable à n'importe quel couple d'ensemble de symboles. Par exemple, pour remplacer chacune des lettres a, b, c et d par w, x, y et z respectivement, on taperait :

rename 'y/a,b,c,d/w,x,y,z/' *.tif *.PNG

Impossible d'extraire votre CD ou DVD après utilisation ?

Il vous faut simplement connaitre le nom de votre périphérique CD/DVD : vous pouvez tester la commande eject /cdrom (ou /dev/cdrom ou /dev/dvd ou /dev/hdc ou /dev/hdd, etc...)

Si cela ne marche toujours pas (c'est peut-être un autre utilisateur qui s'est délogué en laissant le CD monté), tentez la même manœuvre sous le compte root.

Compter le nombre de fichiers dans un dossier

Par la commande ls, on liste le contenu d'un dossier ; par la commande wc (word count), on compte le nombre de mots d'un texte.

Donc, si en bon Unixien, vos noms de fichiers ne comportent pas d'espaces, vous aurez le nombre de fichiers de votre dossier par : ls | wc

Avec wc -l on compte le nombre de mots sans être perturbé par les espaces (parfait pour compter le nombre de fichiers, donc) ; avec wc -w, le nombre réel de mots, à éviter pour ce qui nous préoccupe.

De toute façon, à vous de voir ce qui vous convient le mieux, sachant que ls | wc donné sans argument vous donnera les deux résultats plus le nombre de lettres. Et wc tout seul donne dans l'ordre : le nombre de lignes, le nombre de mots d'un fichier, le nombre de mots sans compter les espaces.

Créer un fichier vide...

...vraiment vide. C'est à dire pas un fichier vide avec un éditeur de texte, qui ferait de ce fichier... un fichier texte ! Ni avec un logiciel de dessin qui donnerait aussi un type particulier à ce fichier.

Il faut taper dans une console ou un Xterm : touch nom_du_fichier

Effectuer une recherche par mot clé dans les pages de manuel

man -k motclé

Si cela ne convient pas, tentez aussi : apropos motclé

Trouver des fichiers... et en faire quelquechose

Inutile d'expliquer à quoi sert find. Il fonctionne de la façon suivante : find dossier_de_départ options_de_recherche motif_de_recherche. Ajoutez un pipe avec less si l'affichage défile sur plusieurs pages :

find dossier_de_départ options_de_recherche motif_de_recherche | less

Une des options les plus intéressantes est l'option -exec qui permettra d'exécuter une commande sur chacun des fichiers trouvés, la notation du fichier actuellement traité dans la commande étant alors {}. Voyons quelques exemples.

Pour copier les fichiers du dossier actuel ou d'un de ses sous-dossiers et dont les noms comprennent un tiret au début (par ex : -fichier.ext) dans un dossier a-renommeron les traitera plus tard :

find . -name "-*.*" -exec cp -- {} a-renommer \;

Mises en garde et précisions :

  1. ne pas oublier le premier point (caractère de substitution pour le dossier actuel),
  2. ne pas oublier les double quotes, à cause du caractère spécial *,
  3. ne pas oublier -- après cp pour signaler la fin des options, au cas où d'autres noms de fichiers bizarres seraient trouvés,
  4. ne pas oublier le point-virgule protégé par \ en fin de commande. En effet, si plusieurs fichiers sont trouvés, tout se déroulera comme si plusieurs commandes se succédaient, donc séparées par des points-virgules. La protection de ; par un antislash fait qu'il sera interprété comme séparateur dans la commande cp mais pas dans la commande find. Logique, non ?
  5. comme, par définition, vous ne savez pas au juste quels fichiers find vous retournera et donc sur lesquels il effectuera peut-être des commandes irréversibles, il peut être judicieux de taper d'abord la commande find sans l'option -exec, afin de voir la liste des fichiers trouvés. Si l'affichage comporte plusieurs pages, ajoutez less en pipe :
    find dossier_de_départ motif-de-recherche | less
    
  6. peut-être est-il judicieux de tester votre find blabla -exec avec une commande qui ne risque pas d'altérer lesdits fichiers, par exemple ls :
    find . -name "-*.*" -exec ls -- {} \;
    
  7. même si vous faites une conn^Wbêtise^Wcatastrophe, il est bon, si j'ose dire, de le savoir tout de suite : appliquez donc l'option -v (comme --verbose) aux commandes cp, rm, mv, etc... Vous verrez alors la catastrophe en question se dérouler devant vos yeux horrifiés. Un grand nombre de commande Unix possèdent une option «bavarde» ; cherchez dans les pages de manuel.

Variables d'environnement

Pour voir les variables systèmes ou variables d'environnement, taper set

Pour disposer des variables d'environnement de l'utilisateur visé par la commande su, taper su - nom_d_utilisateur (ne pas oublier le tiret).

Redirections

Tout reste à faire.