LINUX NEWBIE ADMINISTRATOR GUIDE
ver. 0.150 2001-08-05 by Stan, Peter and Marie Klimas
The latest version of this guide is available at http://sunsite.dk/linux-newbie.
Copyright (c) <1999,2000,2001> by Peter and Stan Klimas. Your feedback, comments, corrections, and improvements are appreciated. Send them to linux_nag@canada.com This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0, 8 or later http://opencontent.org/openpub/ with the modification noted in lnag_licence.html.


Chapitre 3: FAQ Opérations de base


Sommaire :
3.1 Bases
   3.1.1 Noms de fichiers
   3.1.2 A quoi servent les différents répertoires ?
   3.1.3 Comment exécuter un programme ?
   3.1.4 Comment modifier la variable PATH ?
   3.1.5 Comment puis-je arrêter mon ordinateur ?
   3.1.6 Comment gérer un programme planté ?
3.2  Utilisateurs, mot de passe, permissions sur les fichiers, et sécurité
   3.2.1 Home directories, root, ajout d'utilisateurs
   3.2.2 De la sécurité des mots de passe
   3.2.3 J'ai oublié le mot de passe du root
   3.2.4 J'ai oublié mon mot de passe utilisateur
   3.2.5 Désactiver ou supprimer un compte utilisateur
   3.2.6 J'ai des problèmes de permissions fichiers. Comment fonctionnent les droits et l'appartenance des fichiers ?
   3.2.7 Mon mp3 player est saccadé. Le son es comme interromptu (ou comment régler le suid).
3.3 Gestion des tâche avec "&", "at", "batch", et cron
   3.3.1 Comment exécuter une commande en "tâche de fond" ?
   3.3.2 Comment exécuter une commande à une heure précise (en utilisant "at" ou "batch") ?
   3.3.3 Comment régler le cron ?
3.4  Shell
   3.4.1 Qu'est-ce qu'un shell, et pourquoi voudrais-je en utiliser un autre ?
   3.4.2 How do I customize my shell prompt?
   3.4.3 Colour in text terminal
   3.4.4 How do I print symbols on the console or in a text mode application?
   3.4.5 How do I write a simple shell script?
   3.4.6 Meaning of quotes
   3.4.7 Input/output redirection
   3.4.8 Shell special characters (metacharacters)
3.5  Package installation and rpm package manager
   3.5.1 How do I install a program I downloaded from the Internet?

3.1 Bases

3.1.1 Noms de fichiers

Linux est sensible à la casse des caractères. Par exemple: monfichier, MonFichier, et monFICHIER sont trois fichiers différents. Votre mot de passe et votre login sont aussi sensibles aux majuscules minuscules. (Traditionnellement depuis qu'UNIX et le langage C sont sensibles à la casse.)  Les conventions de nommage pour les fichies et les répertoires sont identiques. Tous fichiers ou répertoire que je crée (pour moi, en tant qu'utilisateur) sont en minuscules, sauf si il a une raison exceptionnelle de faire autrement. La plupart des commandes Linux sont aussi en minuscules.
Les noms de fichiers sous Linux peuvent avoir une taille jusqu'à 256 caractères et acceptent habituellement des lettres, des nombres, des "." (points), "_" (soulignés) et  "-" (tirets).  L'utilisation d'autres caractères est acceptée, mais déconseillée.  En particulier, il n'est pas recommendé d'utiliser des méta-caractères : "*" (asterisque), "?" (point d'interrogation), " " (espace),  "$" (dollar),  "&" (esperluete), autres signes, etc. Ceci car ces méta caractères ont un rôle paticulier pour le shell Linux (le shell est un programme comme COMMAND.COM, l'interpréteur de commandes du DOS).  Il est possible d'avoir une espace dans un nom de fichier, mais nous le déconseillons aussi-- nous préférons souligné "_" .
Il est totalement impossible d'avoir un '/' (slash) dans un nom de fichier parce que '/' est utilisé pour symboliser la racine de l'arborescence des répertoires , et en tant que séparateur dans les chemins (comme le '\' dans DOS).

De même que pour DOS, on ne peut avoir un fichier appelé . ou .. (point ou deux points)-- Ils signifient respectivement répertoire courant, et répertoire père, exactement comme dans DOS.

Traduction de quelques méta caractères:
*  = Remplace n'importe quelle suite de zéro à n caractères sauf pour  "." (le point) au début du nom de fichier.
?  = Remplace n'importe quel caractère.
[abC1]  = Remplace un caractère de la liste donnée. Dans cet exemple, la liste contient : 'a',  'b',  'C', et '1'.
[a-z] = Remplace n'importe quelle lettre en minuscule.
[A-F] = Remplace n'importe quelle lettre en majuscules, de A à F.
[0-9] = Remplace n'importe quel chiffre.
[a-zA-Z0-9] = Remplace n'importe quelle lettre (majuscule ou minuscule) ou n'importe quel chiffre.
Exemples. Cette commande listera tous les noms des fichiers du répertoire courant, à l'exception de ceux commençant par "." (point):
ls *
La commande suivante est équivalente ls  ou  dir (sans le "*").  Les fichiers dont le nom commence par "." sont omis car "."  en première position du nom de fichier n'est pas substitué par "*". Considérez que les fichiers dont le nom commence par "." comme l'équivalent des fichiers cachés du DOS.  Utilisez ls -a (lister avec l'option "tous(all)") ou ls .* pour lister ces   fichiers "point" (ou "dot" files).  Les fichiers "point" sont courant dans les répertoires "home" des utilisateurs et sont généralement utilisés pour stocker les préférences de celui-ci.
Cette commande va lister tout fichier(du répertoire courant) dont le nom contient un point:
ls *.*
Cette commande va lister tous les noms de fichiers qui contiennent deux points:
ls *.*.*
Veuillez bien noter que Linux n'utilise pas les "extensions du nom de fichier" à l'inverse de DOS, bien que vous puissiez toujours les utiliser. Par exemple, je peux nommer un fichier mon_texte.txt.zip. Par contre, d'autres comportements du nommage de fichiers DOS sont totalement absents (je pense notamment à "Micros~1.doc").
La commande suivante cherchera (dans tout le système de fichier) tous les fichiers ayant pour extension "htm", éventuellement suivi d'un autre caractère :

locate *.htm?

Cette commande affichera tous les noms de fichier du répertoire courant débutant par "a" ou "b", ou n'importe quelle lettre majuscule:

ls [abA-Z]*
Cette commande listera tous les fichier commençant par "a" et finissant par "n"

ls a*n

Auto complétion de la ligne de commande.  C'est un dispositif fabuleux offert par la ligne de commande-- J'utilise la touche [TAB] pour accélérer la saisie. Elle facilite la saisie de noms de fichiers longs et compliqués. Par exemple, gérer un nom de fichier comme celui qui suit en ligne de commande n'est vraiment pas un problème, si on utilise la complétion :

dir Eurosong\ 2000\ Olson\ Brothers\ -\ Fly\ on\ the\ wings\ of\ love\ \(denmark\).mp3

je saisis juste

dir Eu[Tab]

et s'il n'y a pas d'autre fichier commençant par "Eu", la fin du nom du fichier sera directement saisie pour moi. Dans le cas contraire, je consulterais les différents choix possible (qui seront listés à l'écran), et je compléterais avec un ou plusieurs caractères afin de résoudre l'ambiguité dans le nom du fichier.

Noms de fichiers bizarres.  La plupart de ces problèmes sont résolus en utilisant la complètion. De plus, pour manipuler des fichiers dont les noms contiennent des méta caractères, je peux utiliser une paire de ' ' (deux apostrophes) de façon à ce que ces méta caractères soient protégés, afin que le shell n'interprète pas leur sens. Par exemple, pour renommer un fichier mon fichier*(qui contient une espace et une astérisque), j'utiliserais :

mv 'mon fichier*' nomdefichier_sans_les_caracteres_bizarres.txt

Veuillez noter que j'utilise une paire de ' (apostrophe) pour protéger("quoting" en anglais). Le "quoting" avec une paire de "  " (guillemets) est moins protecteur que celui avec '  ' . Si vous vous servez de " (guillemets)  certains méta caractères sont interprétés.

Selon la tradition UNIX, sous Linux, on peut créer des fichiers dont les noms contiennent pratiquement n'importe quel caractère, tel que des caractères de contrôles (=non imprimables). C'est très rare, mais si vous tombez sur un tel fichier, vous serez peut être décontenancé. Je renomerais un fichier comme celui la en plaçant des méta caractères avec précaution. Je testerais d'abord avec ls, afin de vérifier que ma commande cible le bon fichier, puis je renomerais le fichier :

ls -l monfichier*y.html
mv monfichier*y.html monfichier.html

Afin d'illustrer un problème parmi les plus troublants que vous pourriez rencontrer lors de l'utilisation de caractères déconseillés dans un nom de fichier, essayez de créér un fichier dont le nom commence par un tiret, et supprimer le-- Cela semble impossible à faire (parce qu'un tiret indique normalement une option de commande).  E.g., la commande
dir > -junk

créera un tel fichier farfelu (comme en DOS, le signe">" redirige la sortie de la commande dir dans un fichier nommée ici -junk).  Puisque la commande habituelle de suppression du fichier -junk ne fonctionne pas, j'utilise:
rm ./-junk
le point slash au début signifie "le répertoire courant", et sert juste ici à éviter l'usage du tiret en début de nom de fichier, afin qu'il ne soit pas interprété en tant que demande d'une option de la commande rm .  Le fait est qu'il vaut mieux suivre à la lettre les conventions de nommage des fichiers, plutot que d'avoir à gérer de telles difficultés occasionnelles.

3.1.2 A quoi servent les différents répertoires ?

Ceci est très bien expliqué dans le "Guide de l'Administrateur System Linux" (le SAG) qui doit etre disponible sur votre machine. Essayez:
cd /usr/doc/LDP/sag
lynx sag.html
Cette commande lancera le navigateur mode texte "lynx" qui affichera cette documentation html. Vous pouvez aussi utiliser n'importe quel autre navigateur, comme Netscape pour Linux ou Windows, pour consulter ce livre. Ce livre, et tous les autres livres du LDP sont généralement assez facile à lire.
En résumé, Linux contient cinq systèmes de fichiers. Ces systèmes de fichiers peuvent être implémentés sur un ou plusieurs disques durs physique et/ou partitions de disques dur, selon la taille ou les besoins du système. (un système de fichier seul peut aussi etre réparti sur plusieurs périphériques différents, si besoin est.)
Le système de fichiers racine ("root") "/" contient la base du système d'exploitation, et les outils de maintenance. Le contenu de ce système de fichiers doit permet de démarrer le système, d'éxecuter la maintenance en cas d'urgence, et de réparer si c'est nécessaire.
Le système de fichier /usr contient toutes les commandes, bibliothèques, documentations et autres fichiers qui ne sont pas modifiés en utilisation normale. Il contiendra aussi les applications principales qui sont fournies dans votre distribution, comme par exemple Netscape.
Le file system/var héberge les fichiers qui sont modifiés :  répertoire de spool, fichiers de log (journaux), fichiers lock (verrous), fichiers temporaires, et les pages de manuel.
le file system /home contient les fichiers des utilisateurs ( préférences, fichier de personnalisation, documents, données, courrier, caches, etc.). Le contenu de ces répertoires doit être sauvegardé lors de la mise à jour du système d'exploitation.
Le système de fichier/proc contient des pseudos fichiers. Ils n'existent pas réellement sur le disque, et ne consomme absolument aucun espace disque, bien que ls -l affiche une taille). En visualisant leurs contenus, vous accédez directement aux informations stockées en mémoire. Cela sert à accéder aux informations concernant le système d'exploitation.
/lib--bibliothèques partagées pour les programmes du système de fichiers root, et modules du kernel.
/boot--fichiers utilisés par le loader de boot (LILO ou GRUB), c'est à dire ce qui est chargé en premier lors du démarrage de l'ordinateur, et qui parfois vous donne la possibilité de choisir le système sur lequel vous voulez booter, si vous avez plusieurs OS sur votre machine. Il contient habituellement le kernel linux (fichier compressévmlinuz), mais qui peut etre stocké ailleurs, du moment que LILO sait ou le trouver, grâce à sa configuration.
/opt--grosses applications optionnelles, par exemple kde sous RedHat 5.2 (sous RedHat 6.0, kde est distribué comme n'importe quelle autre distribution X-window, les programmes principaux étant dans le répertoire /usr/bin).
/tmp--fichiers temporaires.  Ce repertoire est parfois vidé automatiquement.
/lost+found--fichiers récupérés lors d'une réparation du file system.
Les parties les plus intéressantes du filesystem /usr sont :
/usr/X11R6--Le système X-window (version 11, release 6).
/usr/X11--comme /usr/X11R6 (c'est un lien symbolique vers /usr/X11R6).
/usr/X11R6/bin --plein de petites applications X-window, et eventuellement des liens symboliques vers les exécutables d'applications X-window plus importantes , qui sont elles stockées dans leur propre répertoires, à un autre endroit).
/usr/doc--La documentation Linux (sur les installations récentes, ce répertoire est /usr/share/doc).
/usr/share --Données indépendantes de l'architecture de votre machine, e.g., les dictionnaires de mots.
/usr/bin et /usr/sbin--similaires à leurs équivalents sur le système de fichiers root (/bin and /sbin), mais sans caractère d'obligation pour le démarrage de la machine (e.g. pour la maintenance d'urgence). La plupart des commandes sont stockées ici.
/usr/local--Les applications installées par l'administrateur (éventuellement chacune dans son propre sous répertoire). Lors de l'installation de base, ce répertoire est vide. Le contenu de ce répertoire devrait etre inchangé lors d'une réinstallation ou une mise à jour du système d'exploitation.
/usr/local/bin--Eventuellement des plus petits exécutables installatés par l'"utilisateur" , et des liens symboliques vers de plus gros programmes rangés dans des sous répertoires différents sous /usr/local .
Il est important de comprendre que tous ces répertoires apparaissent dans une seule arborescence, même si ces répertoires sont stockés dans différentes partitions, supports physique (ce qui comprend disques durs, disquettes, etc) voire même s'ils sont répartis sur un réseau. De ce fait, il n'y a plus de "lettre de lecteur" à la mode DOS sous Linux. Ce qui est un "lecteur" (C:, A:) sous DOS ou MS-Windows, est considéré comme le sous répertoires d'un "point de montage" sous Linux.

L'arborescence des répertoires est clairement définie et standard sur la plupart des distributions Linux (Les petites différences sont actuellement en cours de standardisation par le Linux Standard Base). C'est aussi très proche de ce que l'on trouve dans la majorité des systèmes UNIX commerciaux.

Un peu plus loin sur le filesystem /proc (pour les curieux uniquement).
The /procCe "pseudo" système de fichiers est un filesystem temps réel résident en mémoire qui suit l'état de kernel du système d'exploitation, et des processus qui tournent dans l'ordinateur.  Le système de fichier /proc est complètement virtuel, c'est à dire qu'il n'est pas écrit sur un disque ou un autre média, il n'existe que dans la mémoire de l'ordinateur, et est constament mis à jour afin de représenter les moindres changements du système. La taille du répertoire /proc est toujours de zéro, et sa date de dernière modification la date courante. Dans certains cas, il est possible de changer les réglages de votre système en modifiant manuellement le contenu des fichiers du répertoire /proc. Beaucoup d'utilitaires Linux utilisent le filesystem /proc pour obtenir leurs données, e.g., dmesg, ps, top.

Contenu du système de fichiers /proc.

Les répertoires dont le nom est numérique, par exemple "1" "170" "4908" sont les IDs ("IDentifiants") des processus tournant dans votre ordinateur. Chaque sous répertoire contient quelques fichiers, comme : cmdline (qui contient la ligne de commande complète qui servit à invoquer le processus) cwd (lien symbolique vers le cwd (répertoire courant) du processus), environ (les variables d'environnement définies pour ce processus en particulier, sous le format VARIABLE=valeur), exe (un lien symbolique vers le fichier exécutable auquel est lié ce processus), fd  (la liste des descripteurs de fichiers ouverts par ce processus),maps (un tube nommé ("named pipe") utilisable pour accéder à l'espace mémoire du processus), root (un lien symbolique vers le répertoire qui est la filesystem d'origine de ce processus), stat (Informations sur l'état du processus).

Les autres fichiers du filesystem /proc :
/proc/cpuinfo --Informations concernant le processeur, telles que sont type, fabriquant, modèle et performance.
/proc/devices --Liste de pilotes de périphérique configurés actuellement dans le kernel exécuté.
/proc/dma --Les canaux DMA actuellement utilisés.
/proc/filesystems --Types de système de fichiers supportés par le kernel.
/proc/interrupts --Interruptions en cours d'utilisation, et compteur d'appels de ces interruptions.
/proc/ioports --Ports d'E/S actuellement utilisés.

Par exemple, je peux lire les informations du processeur de ma machine grâce à la commande suivante :
cat /proc/cpuinfo

3.1.3 Comment exécuter un programme ?

Frapper le nom de l'exécutable sur la ligne de commande ne fonctionne pas ? Il y a trois possibilités.
Première possibilité :Vous n'avez pas correctement tapé le nom du programme. Vérifiez la casse--Linux est sensible à la casse !  Par exemple, la frappe de "Pico" ou "PICO" ne lancera pas l'éditeur pico.
Deuxième possibilité :Ce programme n'est peut être pas dans votre PATH .  Sous Linux (ou UNIX), pour pouvoir être lancé, un exécutable doit être dans votre PATH, et le répertoire courant N'EST PAS dans votre PATH. Ecrivez le chemin complet vers l'exécutable avant le nom de l'exécutable, ou utilisez :
cd le_répertoire_du_programme
./nom_du_programme
Vous devez mettre le point et le slash devant le nom du programme, sinon il ne S'EXECUTERA PAS.  (Ne pas mettre le répertoire courant dans le PATH est un dispositif de sécurité.  Cela protège des "chevaux de Troie (trojan horse)". Un "cheval de troie" est un programme nuisible qui prétend être autre chose que ce qu'il est réellement.)  Le point symbolise "le répertoire courant", et le slash "/" est le séparateur entre le nom du répertoire et le nom du fichier (exactement comme le "\" sous DOS).
Vous pouvez consulter votre PATH avec la commande :
echo $PATH
Pour apprendre comment changer votre PATH, ou lui ajouter le répertoire courant consultez la prochaine réponse.
Si vous avez perdu votre programme quelque part dans l'arborescence,  vous pourrez le retrouver grâce à (par exemple) :
find / -name "netscape"
sert à retrouver un fichier du nom de "netscape" en inspectant l'arborescence à partir de la racine "/". Vous pourriez obtenir la même réponse plus rapidement en utilisant :
locate netscape
(locate va plus vite parce qu'il consulte une base de données pré établie recensant les fichiers de votre ordinateur.  Cette base de données est mise à jour par un processus en tâche de fond (grâce à cron) qui est habituellement lancé la nuit. De ce fait, ne comptez pas sur locate pour retrouver un fichier si vous éteignez votre ordinateur la nuit, ou si vous cherchez un fichier que vous venez juste d'installer.)
Notez aussi que le PATH est traditionnellement différent pour le root et pour les autres utilisateurs (le PARTH du root contient /sbin et /usr/sbin a contrario des utilisateurs). De ce fait, les utilisateurs ne peuvent exécuter des commandes situées dans les répertoires "sbin" à moins qu'ils n'indiquent son chemin complet. De la même façon, si vous devenez le superuser grâce à l'emploi de la commande su, vous hériterez du PATH de l'utisateur, et vous devrez spécifier le chemin complet pour exécuter une commande stockée dans sbin.
Conversely,A l'inverse, si vous voulez savoir où un exécutable de votre PATH peut bien être rangé sur votre machine, (c.a.d le programme que vous lancez en tapant son nom à partir de n'importe quel répertoire du système, et dont vous voudriez bien savoir l'emplacement), vous pouvez utiliser quelque chose comme :
which netscape
qui vous affichera le chemin complet du programme exécutable "netscape".
Troisième possibilité : Le fichier n'est peut être pas exécutable.  S'il doit l'être, changez les permissions afin de le rendre exécutable. Par exemple (en tant que root, ou que l'utilisateur propriétaire du fichier) :
chmod a+x mon_fichier
rendra le fichier "mon_fichier" exécutable par tous. Vérifiez le bon fonctionnement par :
ls -l  mon_fichier
Consultez ceci si vous ne comprenez pas l' affichage de cette commande, ou cette "troisième possibilité" dans son intégralité.

Notez bien que sous Linux (ou UNIX), ce n'est pas l'extension du fichier (par exemple .exe ou .com ou encore .bat) qui rend un fichier exécutable.  Le fichier a besoin d'un "droit d'exécution du fichier", ce qui n'est pas sans rappeler les "attributs" des fichiers sous DOS.

3.1.4 Comment modifier la variable PATH ?

En général, vous n'avez pas à modifier votre PATH, mais il est très intéressant de comprendre ce qu'est le PATH.

le PATH est la liste des répertoires qui seront consultés quand vous demanderez l'exécution d'un programme. Vous pouvez interroger votre PATH grâce à la commande :

echo $PATH
ce qui, sur ma machine, indique que le PATH pour l'utilisateur "yogin" est :
/opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/yogin/bin
Les ":" sont le séparateur, de telle manière que le PATH ci dessus représente la liste des répertoires suivants :
/opt/kde/bin
/usr/local/bin
/bin
/usr/bin
/usr/X11R6/bin
/home/yogin/bin
Voici maintenant la sortie de la commande "echo $PATH" exécutée sur ma machine par le "root":
/opt/kde/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin
Vous pouvez modifier le PATH de tous les utilisateurs du système en éditant le fichier /etc/profile et en modifiant (en tant que root) la ligne commençant par "PATH=".  Pour ce faire, j'utilise l'éditeur pico (en tant que root):
pico -w /etc/profile
(l'option -w arrete le dispositif de coupure des lignes trop longues)
Relogguez vous pour prendre en compte la modification.  Pour modifier le PATH d'un seul utilisateur, éditer le fichier /home/nom_de_login_du_user/.bash_profile (Vérifiez bien le point avant le nom du fichier--Les fichiers qui commencent par un point sont habituellement invisible, il faut se servir de ls -a  pour les voir).
Si vous tenez vraiment à avoir le répertoire courant dans votre PATH, ajoutez "." (point) dans celui-ci. Utilisé en lieu et place du répertoire dans le nom complet du fichier, un point indique "le répertoire courant". La définition du PATH dans le fichier /etc/.bash_profile pourrait alors être de la forme suivante :
PATH="$PATH:$HOME/bin:."
export PATH
Cette commande utilise le contenu de la variable d'environnement PATH (comme elle est définie pour tous les utilisateurs dans /etc/profile), et lui ajoute "/bin" accolé au nom de votre home directory (telle qu'il est défini dans la varible HOME), puis un point. Ensuite, la commande affecte la chaine résultante de cette commande (ancien PATH, HOME/bin et .) en remplacement de l'ancienne variable PATH.  Il est nécessaire d'invoquer la commande "export" après avoir modifié PATH ou toute autre variable d'environnement, de façon à ce que la modification soit valide en dehors du script qui l'a effectuée.

3.1.5 Comment puis-je arrêter mon ordinateur ?

Dans un écran texte, pressez <Ctrl><Alt><Del> (le "three-finger salute", en pressant les trois touches en mme temps), patientez pendant l'exécution complète du processus d'arrêt, et éteignez votre machine seulement après que celle ci soit en train de redémarrer.  Si vous êtes sous X-window, basculez tout d'abord vers un écran texte en utilisant <Ctr><Alt><F1>  (les trois touches en même temps). N'éteignez pas votre ordinateur sans lancer un shutdown proprement, sinon vous risquez d'avoir des messages d'erreurs disques au prochain démarrage. (En général, les erreurs résultant d'un mauvais arrêt de la machine seront réparées automatiquement au prochain boot, mais parfois des problèmes plus graves se manifestent, et vous serez obligé de réparer les fichiers à la main ou de tout réinstaller !)
Si vous préférez que votre ordinateur s'arrête lorsque vous pressez <Ctrl><Alt><Del> (plutot que redémarrer), vous pouvez le définir en modifiant le fichier /etc/inittab. Ce fichier indique quelque chose comme :
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
En tant que root, remplacer l'option "-r" en "-h" de façon à obtenir :
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -h now
La ligne qui commence par # est un commentaire (à destination des humains, cela n'a aucun effet sur l'ordinateur). L'option "-t3" indique à la commande shutdown d'attendre 3 secondes avant de lancer le processus d'arrêt. Les options "-r" et "-h" signifient respectivement de "redémarrer" ou d'"arrêter (halt)", elles entrainent donc un arrêt ou un redémarrage du système.
Root peut aussi invoquer directement la commande shutdown. Cette commande peut être utilisée aussi bien en local que pour l'arrêt à distance de votre ordinateur, mais est plus souvent utilisée pour l'arrêt à distance lorsque le clavier de la machine ne répond plus, de telle manière que le <Ctrl><Alt><Del> n'est plus disponible. C'est aussi très pratique si un programme s'intérrompt, rendant le clavier inopérant.  Par exemple :
telnet nom_de_la_machine_au_clavier_planté
[logguez vous en tant qu'utilisateur]
su
[donner le mot de passe du root]
A présent, vous pouvez aussi bien lancer ps axu |more, repérer le process ID (PID) du proccessus bloquant dans la liste affichée, et faire

kill pid_du_processus_planté

ou alors redémarrez la machine avec

/sbin/shutdown -rn now

Cette commande arrêtera très rapidement l'ordinateur, en ignorant la (plus lente) procédure d'arrêt normal-- pratique quand le système devient vraiment instable (l'option -n demande à "shutdown de tuer tous les processus avant de redémarrer) .
Notez que pour raisons de sécurité, vous ne pouvez pas vous logguer directement à une machine distante en tant que root (par exemple, avec un telnet).  Vous devez d'abord vous logguer en tant que simple utilisateur, puis invoquer su et donner le mot de passe afin de devenir le super user (root).
La commande shutdown permet aussi de demander un arrêt différé. Exemple (en tant que root) :
/sbin/shutdown -r 23:59
rebootera la machine une minute avant minuit. J'aurais pu aussi utiliser
/sbin/shutdown -r +1

pour lancer l'arrêt de la machine dans une minute. Je peux annuler cet arrêt programmé avec :
/sbin/shutdown -c

Si la commande shutdown est trop longue pour vous, vous pouvez tester ces deux commandes, qui font exactement ce que leurs noms suggèrent (en tant que root)
reboot
halt
Une façon amusante d'éteindre votre ordinateur est de basculer votre système en runlevel 0 (pour arrêt) ou runlevel 6 (pour redémarrage). Essayez en tapant (en tant que root) :

init 0

Le rôle de chacun des runlevels est expliqué dans le fichier /etc/inittab et  ici.

3.1.6  Comment gérer un programme planté ?

Les programmes bogués se plantent sous Linux. Le crash d'une application ne devrait en aucun cas pertuber le système d'exploitation lui-même, de façon à ce vous ne soyez pas obliger de redémarrer l'ordinateur trop souvent.  Les serveurs Linux sont réputés pour tourner plus d'un an sans avoir à redémarrer. Par expérience, un système d'exploitation défaillant peut etre le signe de problème de configuration matérielle :  Nous avons fréquemment rencontré des problèmes avec des surchauffes du processeur Pentium (le ventilateur du processeur ne tournait pas aussi vite qu'il aurait du, ou était arrêté, la chaleur du processeur était captive de la poussière agglutinée), de barrettes mémoires défectueuses, de vitesses de chips mémoires différents (la réorganisation du montage de barrettes peut remédier au problème), de mauvais réglages du BIOS (il vaut mieux désactiver tout les options avancées ("advanced bios setup"), Linux gérant ces améliorations matérielles lui-même).  Le message d'erreur "Signal 11" est typiquement (99%) lié à des problèmes matériels, et est plus prompt à apparaitre des que vous exécutez des tâches "lourdes" : Réglage de Linux, compilation du noyau, etc.  Si votre Pentium a tendance à chauffer (notamment les premiers Pentium), voici quelques astuces pour le rafraichir, particulièrement pendant les fortes températures : Nettoyez la couche de poussière sur le processeur, remplacez le ventilateur, faites fonctionner la machine capot ouvert, ajoutez un ventilateur supplémetaire, augmentez les "wait state" dans le BIOS de l'ordinateur, n'"overclockez" pas, supprimez les tâches inutiles (par exemple, remplacez les supers-incroyables écrans de veilles par un écran noir).
Pas vraiment planté.Certains programmes donnent aux débutants l'impression qu'ils sont plantés, alors qu'ils attendent de celui-ci une saisie. Généralement, ceci arrive lorsque qu'un exécutable attend un nom de fichier en tant qu'argument sur la ligne de commande, et que l'utilisateur ne lui a pas donné, enclenchant alors pour le programme la lecture de l'entrée standard (qui est le clavier). Par exemple, cette commande
cat
peut sembler planté, alors qu'elle attend une entrée au clavier.  Essayez alors de taper <Ctrl>d  (ce qui signifie "fin de fichier") et vous verrez que la commande cat s'arrête. Autre exemple : J'ai lu beaucoup de questions dans les newsgroups à propos du tar "bogué", qui plante quand on essaye de décompresser un fichier télécharge, par exemple :
tar -zxv mon_fichier_tar [faux!]
Cette commande attend une saisie de l'utilisateur, puisqu'aucune option "-f nom_de_fichier" n'a été spécifié, de sorte que "nom_fichier_tar" n'est pas reconnue en tant que nom de fichier. La commande correcte est :
tar -zxvf mon_fichier_tar
Notez bien que le nom du fichier doit absolument être immédiatement dérrière l'option "f" (qui signifie "fichier"). La ligne suivante NE MARCHERA PAS (erreur très courante) :
tar -zxfv mon_fichier_tar  [faux!]
Tout programme (planté ou non) peut être tué.

Un programme en mode texte et en avant plan peut souvent être tué par les touches <Ctrl>c. Ca ne marchera pas avec de plus grosses applications qui bloquent le <Ctrl>c, de façon à ce que l'on ne puisse pas les utiliser par inadvertance Vous pouvez toujours reprendre le contrôle en envoyant ce programme en arrière-plan grâce à l'appui sur <Ctrl>z  (sans garantie...) ou alors en basculant sur un autre terminal, en utilisant par exemple <Ctrl><Alt><F2> et en vous loggant avec le même utilisateur que celui qui a planté le programme (cela marche toujours).  Une fois le contrôle retrouvé, trouvez le programme que vous voulez stopper, par exemple :

ps
Cette commande signifie "print status" et affiche la liste des programmes actifs actuellement controlés par l'utilisateur. Dans l'affichage de cette commande, je peux retrouver l'identifiant du processus (PID) du programme qui est planté, et je peux maintenant le tuer. Par exemple :
kill 123
tuera ("stoppera") le programme dont le process id (PID) est "123".
En tant que simple user, je ne peux tuer que les processus dont je suis propriètaire (c'est à dire, ceux que j'ai lancé).  Le root peut tuer n'importe quel processus. Pour voir tous les processus qui tournent sur une machine, essayez :
ps axu | more
Cela énumerera tous les processus qui tournent (option "a"), même ceux sans terminal de contrôle (option "x"), ainsi que le nom de login de l'utilisateur auquel ils appartiennent (option "u"). Puisque l'affichage risque de dépasser la taille d'un écran, je "pipe" dans un "more" de façon à ce que l'affichage s'arrête à chaque fois que l'écran est rempli.
La commande kill offre un raccourci nommé killall pour tuer les programmes par nom, par exemple :
killall netscape
tuera tous les programmes comportant "netscape" dans leur nom, alors que

killall pppd

arrêtera de façon fiable toute connexion par téléphone en tuant le démon (daemon=serveur) ppp.

Les programmes X-window n'ont pas de terminal de contrôle, et peuvent être plus facilement tués en utilisant ceci (dans un X term) :
xkill
qui transforme le curseur en une sorte de "tête de mort"; Pointez là sur une fenêtre du programme à tuer, et pressez le clic gauche. La fenêtre disparaitera pour de bon, et le programme associé sera arrêté.

Un raccourci pour cette dernière commande : <Ctrl><Alt><Esc>, transforme le curseur en tête de mort--Visez la fenetre du programme defectueux, cliquez la souris, et la fenetre se ferme, et le programme disparait.

Si votre système X-window se plante et devient irrécupérable, ou s'il devient instable, on peut facilement tuer le serveur X en tapant <Ctrl><Alt><BkSpace>. Après cela, lancer ps axu, trouver tous les programmes X qui tournent encore, et les tuer, est un assez bonne idée. Si vous ne le faites pas, et que c'est un programme très bogué qui a planté votre X-window, vous pourriez avoir encore des soucis.
Si vous avez des programmes en tâche de fond, le système d'exploitation interrompera toute tentative de déconnexion, et vous affichera un message du type "There are stopped jobs".  Pour outrepasser ce message et se délogger quand même, redemandez logout ou utilisez exit--Les programmes en background seront automatiquement arrêtés, et vous serez déconnecté.
Fichiers Core.Quand un programme se crash, il génére souvent un "core" dans votre home directory. Ceci accompagné d'un message circonstancié. Un "core" est une image de la mémoire (et des informations de débogage), et est destiné à un outil de débogage.  Si vous êtes un utilisateur qui ne désire pas essayer de débugger les programmes, vous pouvez tout simplement l'effacer :
rm core
ou encore ne rien faire (ce fichier core sera écrasé quand un autre core sera généré). Vous pouvez aussi désactiver le mécanisne de core en tapant :
ulimit -c 0
Vérifiez si cela a marché avec :
ulimit -a
(cela affiche les "user limits", l'option "-a" signifiant "all" (tous)). Pour désactiver cette option de façon permanente pour tous les utilisateurs, éditez le fichier /etc/profile (en tant que root), là ou ulimit est défini, puis modifiez son réglage. Relogger vous pour que les modifications de /etc/profilesoient prises en compte.
Si vous voulez voir à quoi peut être utile un fichier core, testez (dans un répertoire dans lequel vous avez un fichier core) :
gdb -c core
Cela lance le débugger du GNU (gdb) sur le fichier "core", et affiche le nom du programme qui a généré ce core, le signal qui a terminé ce programme, etc. Tapez "quit" pour sortir du débugger.  Pour en savoir plus à propos des différents signaux, essayez :
cat /usr/include/bits/signum.h |more

3.2 Utilisateurs, mot de passe, permissions sur les fichiers, et sécurité

3.2.1 Home directories, root, ajout d'utilisateurs

Le seul endroit (pratiquement) du disque sur lequel les simples utilisateurs (non root) peuvent écrire est leur home directory, qui s'appelle /home/nom_de_l_utilisateur.
Ce répertoire "home" sert pour tous les documents de l'utilisateur : réglages, fichiers de configuration des programmes, documents, données, cache de netscape, courrier, etc. En tant qu'utilisateur, vous pouvez créer des sous répertoires dans votre home directory afin de vous organiser. Les autres utilisateurs ne peuvent pas lire dans vos fichiers (??????????) ni écrire dans votre répertoire sans que vous ne leur donniez expressement la permission de le faire.
Les simples utilisateurs peuvent aussi voir, lire, et exécuter beaucoup d'autres fichiers du système (en plus de leur home), mais ils ne peuvent généralement pas les modifier ni les supprimer.
Le "root" (qu'on appelle aussi le "super user") est un compte administratif spécialisé qui a le pouvoir de modifier n'importe quel fichier du système.  C'est une très mauvaise idée de travailler en tant que root-- Si vous le faites, la moindre erreur pourra vous couter cher. Créez et utilisez plutot un compte utilisateur pour le travail de tous les jours, un autre compte pour votre fils, et encore un autre pour votre épouse. Le compte du root est en général le seul compte existant sous Linux après l'installation initiale. En conséquence, vous devez explicitement créer des comptes "users" pour l'utilisation de votre système Linux.
Un compte utilisateur sera créé par "root" en tapant, par exemple :
adduser joe
passwd joe
[ecrire le mot de passe de l'utilisateur joe]
[ré-écrire le mot de passe, afin de vérifier sa validité]
Prémièrement, je me loggue en tant que root. Puis, sur la ligne de commande, je tape la commande "adduser" avec "joe" en paramètre (ou argument). Ceci crée le compte "joe" sur ma machine Linux. Ensuite, j'utilise la commande "passwd joe" pour changer le mot de passe de l'utilisateur "joe" afin de le sécuriser. Enfin, je peux dire à "joe" son mot de passe, et il pourra se logguer et le modifier selon sa volonté. Notez bien que le nom du compte et le mot de passe sont sensible à la casse.

Root peut changer le mot de passe de n'importe quel user, mais il ne peut pas le lire. [les mots de passe sont cryptés selon un algorithme à sens unique, et seul le résultat encrypté est stocké dans le système, dans le fichier /etc/passwd (ancien système) or /etc/shadow (sur les versions plus modernes), le mot de passe "en clair" n'est jamais stocké.  Quand vous vous logguez, le password que vous tapez est crypté une nouvelle fois en utilisant le même algorithme non reversible, et le résultat est comparé à celui déjà crypté stocké dans /etc/passwd ou /etc/shadow.]

Le rempart entre le compte adminstrateur et les comptes users fait de Linux un système sécurisé et robuste--Cela complique même la réalisation de virus sous Linux (les programmes lancés par un utilisateur ne peuvent altérer que son propre home directory, et de ce fait ne peuvent atteindre les zones sensibles du système d'exploitation).
Le bon usage veut que l'utilisateur modifie tout de suite son mot de passe, dès son premier login :
passwd
(current) UNIX password:  pass_OLD
New UNIX password:  pass_NEW
Retype New UNIX password:  pass_NEW
En fait, le mot de passe n'apparait pas sur l'écran lorsque vous le saisissez (pour raison de sécurité). Prenez votre temps la première fois que vous changerez votre mot de passe-- Il est troublant de taper en "aveugle".

Sur un système Linux, le même mot de passe sert à :
- se logger sur un écran texte,
- se logger sur un interface graphique,
- débloquer un écran texte protégé,
- débloquer un écran de veille protégé sur un interface graphique (par exemple KDE ou GNOME).

3.2.2 De la sécurité des mots de passe

Les mots de passe trop simples sont certainement la source la plus fréquentes des problèmes de sécurité. Même chez vous, vous vous exposerez à de graves problèmes parce que quelqu'un pourra pirater votre ordinateur lorsque vous serez connecté à l'Internet, lire et effacer vos fichiers, ou encore utiliser votre ordinateur pour faire des actes illégaux en regard des lois régissant les réseaux informatiques. En conséquence, sécurisez tous vos comptes/ mot de passe, même à la maison. Dès que quelqu'un réussi à se logguer sur votre ordinateur (même en tant que simple user), il pourra plus facilement obtenir les droits du root (cela dépend de la bonne gestion du système, de la fréquence de ses mises à jour, et des capacités du hacker)

Voici quelques exemples de mots de passe dangereux :
- Pas de mot de passe (c'est possible !)
- Le mot "passwd" (ça, c'est vraiment très dangereux !).
- Votre nom de login (le login et le password identique ? Hmm.).
- Votre prénom ou celui de votre fille, votre fils, votre mari, épouse, petit(e) ami(e), ou n'importe quel prénom. Le nombre de prénoms usuels est assez limité-- Par simple curiosité, consultez un livre comme "le guide des prénoms". Ne pensez pas que le prénom que vous avez choisi puisse être sûr parce que vous êtes d'origine Indienne ou Canadienne -- L'internet est international, et les listes de noms couvrent toutes sortes de prénoms.
- Votre nom de famille, ou un autre nom de famille. Le nombre de noms de famille est étonnament réduit ! Vérifiez juste dans le bottin américain que votre "introuvable" nom de famille des iles abamamahaba est tout à fait représenté dans ce document de 30 000 noms de familles courants. Ou même simplement l'annuaire de Toronto. Une preuve de plus que nous ne formons qu'une seule famille :))
- Le sobriquet de votre chien, épouse, canari ou ordinateur (il y a très peu de surnoms).
- Le nom de votre équipe de sport favorite, d'un célébrité, d'une pate dentifrice, ou de lessive.
- Votre date de naissance, numéro de sécurité sociale, etc; Les séquences de chiffres sont facilement décryptables.
- Le nom de votre entreprise, service, groupe de travail, etc.
- Les mots de passe écrit sur le calendrier de votre bureau, ou sur le coté de votre ordinateur.
- Un mot de passe que vous utilisez aussi sur une zone public non sécurisée, telle qu'un magasin virtuel sur l'Internet, ou une mailing list. On doit en général utiliser autant de mots de passe que de systèmes informatiques.
- Tout mot contenu dans un dictionnaire anglais. Un dictionnaire anglais ne contient pas tant de mots que l'on pourrait croire. Un pirate peu chevronné peut facilement écrire un programme qui crypte tous les mots du dictionnaire (100 000 ? Cela fait moins d'1 Mo!) puis ensuite comparer toutes ces chaînes cryptés avec votre propre mot de passe crypté. Testez vous-même le programme crack pour en apprécier la simplicité.
- N'importe quel autre mot, nom de famille, prénom, sobriquet ou mot d'argot de n'importe quelle langue. Pour un pirate, passer en revue toutes les langues n'est qu'un peu de travail en plus s'il en a déjà achevé une. Combien y-a-t'il de langues différentes dans le monde ? 40 ?  Récupérez et ajoutez juste quelques fichiers à votre programme de crack. Le fait est que le nombre de mots que les humains utilisent couramment est infiniment moindre au nombre théorique de combinaisons aléatoires de caractères.
-N'importe quel mot interdit au dessus, avec un chiffre en début ou en fin. "youping1" est un mot de passe bien fragile.

Un bon mot de passe est relativement long (minimun 6 caractères), contient un mélange de lettres (majuscules et minuscules si possible), nombres et caractères spéciaux, et est changé régulièrement (8-16 semaines ?).

Malheureusement, plus le password est solide, plus il est difficile de s'en souvenir. J'ai personnelement réglé le problème en passant 10 minutes à concevoir mon propre "schéma" de mot de passe. Donc, j'utilise toujours deux mots reliés par un point d'exclamation, la dernière des lettres de chacun des mots étant en majuscules, ce qui donne "maisoN!blanchE".  Ce mot de passe semble robuste, et je peux facilement m'en rappeler dès que je connais la régle.

L'administrateur du système peut régler la politique de mot de passe (taille minimun, obligation d'utiliser des caractères spéciaux, expiration du mot de passe) grâce à l'utilitaire fourni dans le programme de configuration (à lancer en tant que root) :
linuxconf
Sous le menu "compte utilisateur"-"politique"-"mot de passe & politique des comptes" ("user account"-"policies"-"password & account policies").  Les simples utilisateurs ne pourront pas définir un mot de passe trop court, qui est un mot du dictionnaire, ou qui ne contient pas le nombre défini de caractères non alphanumériques (seul le root peut modifier un mot de passe à sa guise, il ne se verra gratifié que d'un simple avertissement).
Vérifiez bien aussi que tout fichier qui contient un de vos mots de passe (par exemple, /root/.kde/share/config/kppprc) dispose de bonnes permissions bien sécurisées, de façon à ce qu'il ne puisse être lu par quiconque. Par exemple, vous ferez certainement :
chmod 600 kppprc

Si vous utilisez une connexion Internet via le téléphone pour une ou deux heures par semaine, vous ne risquez pas grand chose avec un mot de passe peu fiable. Mais repensez toute la sécurité de votre dispositif si vous utilisez un modem cable, ou dès que vous vous connectez à l'Internet pour des durées plus conséquentes.

3.2.3 J'ai oublié le mot de passe du root

Bien que je n'oublie jamais mes mots de passe, j'étudie toujours cette partie en profondeur, car cela m'éclaire sur la façon dont ma mère pourrait consulter mes archives de chats ICQ :-)
Première méthode.La façon la plus simple pour résoudre le "mot de passe du root oublié" est de démarrer votre Linux en mode single user, (mono utilisateur), au moment du prompt du LILO (au boot), tapez :
linux single
Vous deviendrez le "root" sans avoir à fournir le mot de passe. Ensuite, en tant que root, vous pouvez changer son mot de passe  en utilisant la commande (la connaissance de l'ancien mot de passe n'est pas nécessaire) :
passwd
Si cela vous semble très dangereux, c'est parce de toute manière, aucun système informatique ne peut être sécurisé dès que quelqu'un peut accèder physiquement à la machine. Néanmoins, je n'aime pas le trou de sécurité "linux single" sur ma propre machine, et je l'ai donc corrigé en ajoutant les lignes suivantes dans mon fichier /etc/lilo.conf (à la fin de la partie "image=") :
password="mon_mot_de_passe"
restricted
[Ce mot de passe "lilo" est exigé dès que quelqu'un, au prompt de LILO lors du démarrage de la machine, tape le mot "linux" suivi de n'importe que parametre (le démarrage normal sans aucun paramètre est toujours possible sans le password).] Pour que les modifications de /etc/lilo.conf deviennent effectives, je dois relancer la commande lilo .  Puisque mon mot de passe lilo n'est pas crypté, je dois restreindre l'accès en lecture du fichier /etc/lilo.conf au seul root:
chmod 600 /etc/lilo.conf
Deuxième méthode.  Une autre façon de résoudre le problème de la "perte du mot de passe du root" est de booter votre machine à partir d'une disquette de boot Linux, de chercher la partition racine de Linux sur votre disque dur, de la monter, puis d'éditer le fichier /etc/shadow.  (C'est possible parce qu'en bootant à partir de la disquette, je deviens root sans avoir à fournir de mot de passe.)  Dans le fichier des mots de passe, j'efface le mot de passe crypté du root (en utilisant l'éditeur pico par exemple), de façon à ce qu'il soit vide.
Les données concernant les comptes utilisateurs sont sauvegardées dans des fichiers texte pur : /etc/passwd et /etc/shadow.

Le fichier /etc/passwd contient des données accessibles à tous concernant tous les comptes utilisateurs de ma machine. Chaque ligne de ce fichier contients des informations concernant un compte. Chaque ligne est séparée en 7 champs délimités par des deux points ":" - le nom de login, la lettre "x", le numéro (ID) de l'utilisateur, le numéro (ID) du groupe principal de l'utilisateur, un champ commentaire (par exemple, le nom complet de ce user), le home directory de l'utilisateur, le nom du shell (c'est à dire le programme qui sera éxécuté au login).

Le complément d'information concernant les comptes est stocké dans le fichier /etc/shadow sur ma machine. Ce fichier est bien plus sécurisé puisqu'habituellement, seul le root peut le lire. Dans ce fichier, chaque ligne indique les données "secrètes" d'un compte, et est composée de 9 champs séparés par des deux points ":" - le nom de login, le mot de passe crypté, la date de dernière modification du password (en nombre de jours depuis le 1er janv 1970), nombre de jours avant que l'on puisse le modifier, nombre de jours avant l'expiration du mot de passe, nombre de jours après lesquels le mot de passe doit être changé, nombre de jours avant l'expiration du mot de passe impliquant l'avertissement de l'utilisateur, nombre de jour depuis après expiration qui déclenche la desactivation du compte, nombre de jours (depuis le 1er janv 1970) depuis lequel le compte est désactivé, et un champ réservé.

Certains (anciens) systèmes UNIX ou Linux n'ont pas de fichier /etc/shadow et stockent le mot de passe crypté de l'utilisateur dans le deuxième champ de chacune des lignes du fichier /etc/passwd (le champ qui contient la lettre x sur les systèmes modernes).

Par exemple, la ligne /etc/shadow pour le compte "root" pourrait ressembler à :

root:$1$BuPbmLAz$1G7.evIChyqaEI0TlZp0F.:11071:0:99999:7:-1:-1:134540356

puis après l'effacement du mot de passe :

root::11071:0:99999:7:-1:-1:134540356

Maintenant, le compte root n'a plus de mot de passe, de telle manière que je puisse redémarrer l'ordinateur, et au login, taper "root" et valider le mot de passe (vide, il n'y a pas de mot de passe). Après ce login réussi, je vais immédiatement définir le mot de passe du root en tapant la commande :

passwd

Pour rendre l'"accès disquette" un peu plus complexe sur mon système j'utilise une machine sans lecteur de disquette ;-) Malheureusement, les CDs Linux sont maintenant bootables. J'ai réglé ma séquence de démarrage (boot sequence) dans le setup du BIOS de façon à ce que le système démarre en priorité sur le disque dur avant d'essayer la disquette et le CD-ROM, et j'ai défini un mot de passe "administratif" pour protéger les modifications du BIOS. Néamoins, je déplore que ces mot de passe du BIOS soient si facilement crackables, ou qu'on puisse aussi retirer la petite pile qui sauvegarde les données du BIOS. Quelqu'un pourrait aussi démonter mon disque dur et le remonter sur une autre machine afin de le consulter :-). Je pense installer le système de fichier "crypté" maintenant disponible sous Linux, mais à l'examen de tous les problèmes qui lui sont liés, je vais peut être plutot fermer ma pièce à clef :-) . Si tout ceci vous semble paranoiaque, vous avez surement raison-- Cela illustre juste à quel point, même sous Linux, la sécurité d'un ordinateur est réduite dès que le pirate potentiel dispose d'un accès physique à la machine.

3.2.4 J'ai oublié mon mot de passe utilisateur

Si un simple utilisateur (autre que le root) a oublié son password, c'est peu problèmatique puisque root peut changer n'importe quel mot de passe. Par exemple (en tant que root) :
passwd barbara
demandera le nouveau mot de passe pour l'utilisateur "barbara" ( la connaissance de son ancien mot de passe n'est pas requise). Si un user (non root) veut changer son propre mot de passe, on lui demandera d'abord l'ancien mot de passe. (C'est un dispositif de sécurité qui empeche la modification de votre mot de passe si vous laissez votre terminal sans surveillance).

3.2.5 Désactiver ou supprimer un compte utilisateur

Un compte utilisateur peut être désactivé temporairement, ou définitivement supprimé.

Pour désactiver (bloquer) temporairement un compte user, il est inutile de changer son password. Ajoutez juste une astérique "*" au début du second champ (avant le mot de passe crypté) du fichier /etc/shadow .  le "*" signifie qu'aucun login n'est possible pour ce compte. Lorsque vous voudrez réactiver ce compte, effacez simplement l'étoile et le compte utilisateur redeviendra actif, avec son ancien mot de passe.

Voici un exemple de ligne du fichier /etc/shadow pour l'utisateur "peter" dont le mot de passe est désactivé :

peter:*$1$narMEFm6$fhA1puOU422HiSL5aggLI/:11193:0:99999:7:-1:-1:134539228

Je peux aussi bloquer un compte utilisateur grâce à la commande suivante :
passwd peter -l

et le débloquer avec :
passwd peter -u

Pour détruire irrémédiablement un compte utilisateur sur ma machine personnelle, j'effectue les opérations suivantes :
- je me loggue en root
- je change d'identité pour devenir l'utilisateur à supprimer, afin de vérifier s'il n'a pas reçu de mails importants :

su nom_du_user_condamné
mail
logout

- j'efface le compte et le groupe de cet utilisateur

userdel nom_du_user_condamné
groupdel nom_du_user_condamné

Suppression de l'appartenance de ce user à d'éventuels groupes supplémentaires :

usermod -G nom_du_user_condamné nom_du_user_condamné

- j'efface (en mode forcé) tout le contenu du home directory de l'utilisateur, sous répertoires compris :

rm -fr /home/nom_du_user_condamné

3.2.6  J'ai des problèmes de permissions fichiers. Comment fonctionnent les droits et l'appartenance des fichiers ?

Linux (comme n'importe quel UNIX) est un système d'exploitation multi-utilisateur sécurisé, d'ou le niveau de complexité des "permissions fichiers". Des problèmes de droits sur les fichiers peuvent engendrer des erreurs inattendues et sournoises. La compréhension des droits d'accès sur les fichiers est de la plus haute importance si l'on veut être capable d'administrer un système d'exploitation multi utilisateurs (que ce soit UNIX, WinNT, ou Linux). Mon conseil est le suivant ; apprenez les conventions de permissions fichiers de Linux (ou n'importe quel UNIX); vous ne le regretterez pas.
Propriétaire des fichiers.  Chaque fichier (ou répertoire) appartient à un propriétaire (normalement un nom de login) et à un groupe. Le propriétaire est généralement celui qui à créé (ou copié) le fichier . Le groupe est souvent composé d'une personne--le propriétaire, et porte le même nom que celui-ci, mais ce n'est pas obligatoire. Un fichier ne peut être supprimé (effacé) que par son propriétaire, ou par un membre du group à qui appartient ce fichier, ou encore par le root. Les autre users peuvent éventuellement modifier ou supprimer le contenu du fichier si on leur a donné les droits de le faire--voir plus loin. On peut connaitre le propriétaire et le groupe possédant un fichier grâce à la commande ls -l (="lister avec toutes les informations (long)). Par exemple, la commande:
ls -l junk
donnera cette sortie à l'écran :
????????????????????????????????????????????????
Droits d'accès aux fichiersLe propriétaire d'un fichier peut rendre son fichier accessible selon trois modes : lecture (r pour read), écriture (w pour write), et exécution (x) aux trois types d'utilisateurs : propriétaire (u), les membres du groupe (g) et les autres (o). Vous pouvez consulter les droits actuels du fichier grâce à :
ls -l nom_du_fichier
Si un fichier est accessible à tous les utilisateurs (propriétaire, group et les autres) dans chacun des trois modes (lecture, écriture, exécution), la commande ls affichera :
-rwxrwxrwx
Ignorons le premier "-" (il indique "d" pour répertoires ("directory"), "-" pour un fichier régulier (normal), "l" pour les liens, "c" pour les périphériques caractères, "b" pour les périphériques en mode block, et "p" pour les pipes nommés tels que les fichiers FIFO). Après ce caractère donc, la première triplette de caractère indique les droits du propriètaire du fichier, la seconde triplette les droits du group gérant le fichier, et la troisième triplette les permissions des autres utilisateurs. Une "non" permission est affichée grâce à "-". Voici l'affichage de la commande ls -l sur un fichier appartenant à root, pour lequel celui ci (root) a toutes les permissions, et seulement lecture et exécution pour le groupe et les autres :
drwxr-xr-x   2 root     root        21504 Apr 24 19:27 dev
La première lettre "d" indique que ce fichier est en fait un répertoire.
Vous pouvez modifier les droits d'accès d'un fichier dont vous êtes le propriétaire en utilisant la commande chmod (="change mode). Par exemple, cette commande va donner le droit de lire le fichier "junk" à tous (a pour "all", propriétaire+groupe+autres="user+group+others") :
chmod a+r junk
Dans la commande ci dessus, à la place de "a" (pour tous, "all"), j'aurai pu utiliser "u", "g" ou "o" (pour "user" (=propriétaire), "groupe" et "autre" (=others)). A la place de "+" (="ajouter la permission"), j'aurai pu utiliser "-" ou "=" ("supprimer la permission", ou "définir la permission"). A la place de "r" (permission lecture, "read"), j'aurai pu choisir "w" ou "x" (permission d'écriture "=write", ou d'exécution).
Deuxième exemple. Cette commande va retire aux autres ("others") les droits d'exécution sur le fichier "junk" :
chmod o-x junk
Au lieu de lettres, on peut aussi utiliser des nombres pour définir les permissions. Pour comprendre comment ça fonctionne, regardez ceci :

execute=1 (exécution)
write=2 (écriture)
read=4 (lecture)

La permission résultant pour un type d'utilisateur est la somme des trois. D'ou :

0 = aucune permission (ni lecture, ni écriture, ni exécution)(commun)
1 = exécution seule (semble inhabituel)
2 = écriture seule  (semble inhabituel)
3 = exécution et écriture (semble inhabituel)
4 = lecture seule (commun)
5 = lecture et exécution (commun)
6 = lecture écriture (commun)
7 = lecture, écriture et exécution (commun).

La permission pour les trois types d'utilisateurs (propriétaire, groupe et les autres) est obtenue en assemblant les trois chiffres les uns à coté des autres. Par exemple la commande
chmod 770 junk
donnera au propriétaire et au groupe toutes les permissions, alors que les autres ne s'en verront accorder aucune. La commande :
chmod 666 junk
donne à tous les types de users (owner, group et others) la permission de lire et d'écrire, mais pas d'exécuter le fichier "junk". Notez bien le "666". C'est assez souvent utilisé, et pour au moins une personne de mes proches, c'est la preuve que Linux (et tous les UNIX dans ce cas précis) est la création du diable >:-0.
La commande :
chmod 411 junk
donnera au propriétaire le droit de lire uniquement, et au groupe et aux autres le droit d'exécuter seulement. Ceci n'a que peu d'utilité, mais est rigolo, au moins pour les utilisateurs Linux américains qui font le 411 (numéro de téléphone) pour obtenir de l'aide. Ecrivez moi si vous trouvez d'autres permissions marrantes (comme 007 ?).
Cette méthode numérique de représentation des droits des fichiers est appellée "octal", car les nombres sont en base 8 (le système décimal est lui basé sur 10). Le plus grand chiffre du système octal est 7 (le système octal a 8 chiffres : 0 a 7, de même que le système décimal en a 10 : 0 à 9). La représentation octal est vraiment une notation pratique pour la représentation binaire des permissions des fichiers, dans laquelle chaque permissions est "définie" ou "refusée" grâce à un un ou un zéro, et le total est représenté en tant que chaine de zéros et de uns, comme dans ce diagramme :
type d'users:                              propri.  groupe autres
exemple de permissions:                       rwx    rw-    r--
permissions absentes:                         ---    --x    -wx
representation binaire des permissions:       111    110    100
representation octale  du binaire:             7      6      4
 
Permissions des répertoires.
Le sens des permissions pour les répertoires est différent de celui des fichiers "normaux". Pour un fichier normal : r=permission de lire le contenu du fichier, w=droit de modifier le contenu du fichier, et x=permission d'exécuter le fichier.
Pour les répertoires : r=droit de lister les noms de fichiers contenus dans le répertoire, w=droit de créer ou de supprimer les fichiers de ce répertoire, et x=permission d'accéder au répertoire. Ensuite, les permissions sont réglables de la même manière pour les répertoires que pour les fichiers.

Permissions par défaut avec umask Quand on crée un nouveau fichier, il reçoit les droits par défaut. Sur ma machine, il s'agit de :

-rw-r--r--
Cela signifie que les fichiers créés par un utilisateur peuvent être lu et modifié par ce user; le groupe et les autres ne peuvent que lire ce fichier. Ceci dit, sur mon système RedHat d'origine, les utilisateurs ne peuvent pas lire les fichiers présent dans les répertoires home des autres users, car les droits des homes directories sont :
drwx------
Je peux consulter les permissions de fichiers données par défaut sur les nouveaux fichiers en utilisant :
umask -S
(L'option "-S" veut dire "symbolic" et dit à umask d'afficher les permissions dans un format "lisible", au lieu du mode numérique habituel.)
Je peux modifier les permissions de fichiers par défaut pour tous les nouveaux fichiers créés en tapant une commande telle que :
umask u=rw,g=,o=
qui donnera au propriétaire le droit de lire et d'écrire sur les nouveaux fichiers (r+w), et aucun droit au groupe et aux autres.
L'utilisation de nombres pour définir les droits par défaut avec umask est plus délicate. Le nombre indique les droits que vous retirez aux utilisateurs (inverse de chmod).  D'ou :
umask 000
qui donnera tous les droits à tout le monde sur les nouveaux fichiers créés. L'exemple suivant donne les droits de lire et d'écrire au propriétaire, et zéro permission à tous les autres (c'est souvent ce que l'on peut vouloir) :
umask 177

Pour rendre ce réglage permanent pour tout le monde, modifiez la(les) ligne(s) appropriée(s) du fichier /etc/profile .

3.2.7 Mon mp3 player est saccadé. Le son est comme interromptu (ou comment régler le suid).

Le player MP3 n'a pas accès à suffisament de ressouces processeur (il en nécessite beaucoup). Peut être que votre système est limite. Ou vous avez lancé trop de programme consommateurs de cpu en même temps. Ou, plus plus simplement, vous avez besoin de donner un plus grande priorité au player. (La priorité d'un programme peut être réglé avec la commande nice -- voir man nice ou info nice). Essayer de lancer le programme en tant que root -- les programmes lancés par root ont une plus grande priorité que ceux lancés par les simples utilisateurs. Si cela résoud le problème de "musique saccadée", donnez le "suid" à l'éxécutable de façon à ce que tous les utilisateurs récupérent le "user id" du propriétaire du fichier (root, normalement) lors de l'exécution, par exemple :
chmod a+s /usr/bin/xmms
appliquera cette astuce sur le programme xmms. L'affichage de
ls -l /usr/bin/xmms
sur ma machine est à présent:
-rwsr-sr-x  1 root  root  908k Feb 22  2000 /usr/bin/xmms
Le premier "s" indique le bit de substitution de l'id du user (suid) est activé. Le second "s" indique que le bit de substitution de l'id du groupe est aussi activé. Alors, toute personne qui exécute xmms se voit attribué l'id réelle du propriétaire du programme, et l'id effectibe du group du fichier, qui dans notre exemple est l'utilisateur "root" et le groupe "root".
Donner le suid à un programme peut engendrer des trous de sécurité dans votre système. C'est peu probable dans un réseau à la maison, et lorsque l'on donne le suid à un programme dont l'origine est bien traçable. De toutes façons, même à la maison, je ne donnerai jamais le suid à un bout de code dont l'origine est incertaine, même si le programme d'installation insistait pour que je le fasse. De plus, c'est véritablement une très mauvaise idée de "suider" plein d'exécutables sur votre système -- c'est en complète violation du concept général de la sécurité UNIX.
Certains programmes toutefois réclament le suid pour bien fonctionner, par exemple kppp (le célèbre utilitaire de connexion "ppp" modem du bureau de l'interface graphique KDE). C'est parce qu'il a besoin d'accéder directement au matériel -- c'est quelque chose que seul le root à le droit de faire.

Si vous avez continuellement des problèmes avec les piétres perfomances de votre système, ou que certains "périphérique temps réel" (graveurs de CD par exemple) ont tendance à se planter, essayez de réduire le nombre de démons (serveurs) de votre système Linux. Lancez (en tant que root) ma commande setup (spécifique à RedHat), et désactiver tous les "services" dont vous n'avez pas besoin. En dernier recours, basculez vers un écran texte, arrétez l'interface graphique (commande init 3 en tant que root), et les perfomances seront certainement encore meilleures .

3.3 Gestion des tâche avec "&", "at", "batch", et cron

3.3.1 Comment exécuter une commande en "tâche de fond" ?

En tapant "&" à la fin de la commade. Par exemple, ceci va lancer licq (un client icq) en tâche de fond dans mon terminal X, de telle façon qu'après la frappe de la commande, mon terminal X n'est pas bloqué

licq &

Le numéro d'identification du processus, le job_number, est affiché à l'écran, afin que vous pussiez l'utiliser avec les commandes concernées. Ces commandes sont fg job_number (="foreground" (avant-plan), ramène sous votre controle direct le processus qui était en arrière plan, et le redémarre si il était stoppé, bg job_number (="background" (arrière plan), envoie le processus en tâche de fond, le redémarre s'il était interrompu, exactement comme si il avait été lancé avec &), <Ctrl>z (envoie le processus d'avant plan courant en tâche de fond et l'interrompt), jobs (liste les taches actives), kill process_ID (arrete et termine le processus, vous récupérerez le process_ID du processus à tuer grâce à la commande ps.

Pour qu'un processus en tâche de fond continue de s'exécuter après votre déconnection, utilisez la commande nohup (="no hungup"), par exemple :

nohup make &

qui compilera un programme certainement imposant.

3.3.2 Comment exécuter une commande à une heure précise (en utilisant "at" ou "batch") ?

La commande at exécutera la (les) commande(s) spécifiées à la date et à l'heure de votre choix. Par exemple, je peux declencher la lecture d'un CD musical dans mon CDROM à 7 heures du matin :
at 7:00
cdplay<Ctrl>d
Dans l'exempce ci-dessus, j'ai entré la première ligne "at 7:00" en ligne de commande, et j'ai appuyé sur ENTER. Après cela, la commande at a affiché un prompt ("une invite") "at>". A cette invite, j'ai entré ma commande "cdplay" puis j'ai appuyé sur les touches "control" et "d" en même temps. Si au lieu d'appuyer sur <Ctrl>d j'avais tapé "ENTER", une nouvelle invite "at>" serait apparue, grâce à laquelle j'aurais pu saisir la commande suivante, à exécuter juste après le "cdplay", à 7:00 aussi. Et ainsi de suite, je pourrais programmer à 7:00 l'exécution successive d'un grand nombre de commandes. Après la saisie de la dernière commande, je finirais par <Ctrl>d. Imaginez vous le $lt;Ctrl>d comme un "fin de fichier" sur la l'entrée standard. N'appuyez pas deux fois sur <Ctrl>d, car cela vous délogguerais -- C'est ce que fait <Ctrl>d directement saisi sur la ligne de commande Linux.
Vous pouvez lister les jobs dont vous avez demandé l'exécution différée grace à :
at -l
qui vous donnera une liste numérotée de jobs en attente.
Si vous changez d'avis, vous pouvez supprimer un job de cette liste. Par exemple,
atrm 8
supprimera de la liste le job dont le numéro est huit.
Je peux aussi différer un job pour une exécution beaucoup plus lointaine, par exemple :
at 23:55 12/31/00
startx
qui lancera mon système X-window juste à temps pour le nouveau millénaire (5 minutes avant minuit, le 31 décembre 2000).
Si vous n'arrivez pas à exécuter la commande at, vérifiez si le démon ("atd") est lancé (en tant que root, tapez ntsysv). Si vous n'arrivez pas à lancer la commande at en tant que simple user alors que cel fonctionne pour root, vérifiez le fichier vide /etc/at.deny existe, et qu'il n'y a pas de fichier /etc/at.allow. C'est le réglage par défaut, et il permet à tous les utilisateur d'exécuter at.  Si vous désirez que seuls certains users puissent utiliser at, créez un fichier /etc/at.allow et listez-y ces utilisateurs.
Pour les autres options, consultez :
man at
Si vous voulez lancer en arrière-plan un processus grand consommateur de ressources processeur lors que la charge de votre système est faible, vous pouvez choisir d'utiliser la commande batch; Je peux par exemple lancer setiathome (un programme qui scrute des données afin d'aider à la recherche d'intelligences extraterrestre, le SETI) en tapant
batch
at>setiathome<Ctrl>d
Dans cet exemple, j'ai entré la commande batch puis, au prompt du "at>", j'ai tapé la commande que je voulais exécuter en différé. Le job essaye de démarrer immédiatement, puis continue seulement lorsque la charge du système est inférieure à 0.8. Vous pouvez consulter la charge du système en interrogeant le contenu du fichier (virtuel) /proc/loadavg . Par example:
cat /proc/loadavg
Quand une tâche en batch arrive à son terme, sa sortie m'est communiquée via un e-mail.

3.3.3 Comment régler le cron ?

Cron (un processus Linux qui exécute le travail différé, sous la nuit) est défini par défaut sur votre système RedHat. De telle manière que vous n'aurez pas à y toucher, sauf lorsque vous voudrez ajouter quelques tâches à faire exécuter à votre système de manière régulière, ou si vous voulez changer l'heure à laquelle cron lance ses travaux.
Notez bien que certains des travaux du cron peuvent être majeur pour le bon fonctionnement à long terme de votre système. Cron peut entres autres :
- reconstruire la base de données des fichiers, qui est utilisée quand vous rechercher des fichiers avec la commande locate,
- faire le ménage dans le répertoire /tmp,
- reconstruire les pages de manuel,
- faire les rotations ("rotate") des fichiers de logs, c'est à dire effacer le plus vieux fichier de log, renommer les logs intermédiaires, et créer les nouveaux fichiers de logs,
- exécuter d'autres vérifications, comme ajouter les polices que vous avez récemment copiées dans votre système.
De ce fait, ce n'est peut être pas l'idée la plus géniale que d'éteindre votre machine Linux la nuit-- dans ce cas, cron n'aura jamais la possibilité de faire son travail. Si vous voulez éteindre votre ordinateur pour la nuit, vous voudrez certainement modifier le cron afin qu'il réalise ses tâches à d'autres moments.
Pour découvrir quand cron se réveille pour exécuter ses travaux, jetez un oeil dans le fichier /etc/crontab, par example:
cat /etc/crontab
il pourrait contenir quelque chose comme :
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
Vous pouvez voir qu'il y a quatre catégories de jobs cron : exécuté chaque heure, chaque jour, chaque semaine et mensuellement. Vous pouvez modifiez celles-ci, ou ajouter vos propres catégories. Voici comment cela fonctionne.
Les colonnes dans l'ordre indiquent : les minutes (0-59), les heures(0-23), le jour du mois (1-31), le mois de l'année (1-12), le jour de la semaine (0-6 -- de dimanche à samedi). Le "*" correspond à "n'importe quelle valeur possible".
D'ou, dans l'exemple plus haut, les travaux de chaque heure sont lancés chaque fois que l'horloge de l'ordinateur indique "et zero une minute", ce qui arrive une fois par heure, à l'heure pile et une minute. Les travaux journaliers sont exécutés à 4 heures et 2 minutes, ce qui arrive une fois par jour. Les jobs hebdomadaires sont exécutés à 4 heures passées de 22 minutes dans la matinée du dimanche. Les jobs mensuels sont lancés à 4 heures et 42 minutes le premier jour de chaque mois. Le répertoire des fichiers scripts qui contiennent les commandes à exécuter est donné en dernier sur chacune des lignes.
Si vous voulez que vos jobs soient exécutés à midi plutot qu'à 4 heures du matin, changez simplement les 4 en 12. Cron se réveille toutes les minutes et vérifie si le fichier /etc/crontab a changé, il n'y a donc aucune nécessité de le redémarrer après que vous ayez effectué vos modifications.
Si vous désirez ajouter une tâche à votre cron, mettez un script qui lance votre job (ou un lien vers votre script) dans le répertoire /etc/cron.hourly ou cron.daily ou /etc/cron.weekly, ou /etc/cron.monthly .

Voici un exemple de saisie dans /etc/crontab qui oblige l'exécution d'une tâche trois fois la semaine (Lun, Mer et Ven) :

02 4 * * 1,3,5 root run-parts/etc/cron.weekly

Un exemple vu sur usenet montrant comment automatiquement mailer un fichier de log (réarrangé pour cause de place...)

Re: Aide sur crontab
From: Dean Thompson <Dean.Thompson@csse.monash.edu.au> Date: 2001-03-03 16:35
Newsgroups: comp.os.linux.admin,comp.os.linux.networking,comp.os.linux.security
> Comment puis-je lancer le job mail abc@abc.com < /var/log
> chaque jour dans /etc/crontab -e file ?
Essayez la ligne suivante, et vérifiez si cela fonctionne bien:
0 0 * * * (/bin/mail abc@abc.com < /var/log/messages) > /dev/null 2>&1

3.4  Shell

3.4.1 Qu'est ce qu'un Shell, et pourquoi voudrais-je en utiliser un autre ?

Un shell est un programme qui interprète ce que vous tapez en ligne de commande, et qui decide de ce qu'il faut en faire. Un shell peut aussi bien être invoqué en mode non interactif, pour éxécuter par exemple une liste de commandes pré-saisies dans un fichier texte (un "shell script"). Associez le shell à un équivalent du "command.com" du DOS (l'interpréteur de commandes), et les fichiers shell script comme équivalent aux fichiers batch du dos (*.bat). Comparés à leurs cousins DOS, le shell Linux et les scripts semblent sous dopants (!!).
There are several shells available on the Linux system (if you installed them):  bash ("Bourne Again" shell), sh (Bourne shell, standard on many UNIX systems), csh (C shell, with a syntax akin to the "c" programming language, available on most UNIX systems), pdksh (public domain Korn shell), tcsh (tiny C shell, often used on small systems), sash (stand-alone shell, could be used when libraries are not available), ash, zsh, and perhaps a couple more.
The default shell on my system (and most probably on yours too) is bash , which is an excellent and standard shell, and I really cannot see a reason why a newbie like myself would want to change it.  bash is fully backwards-compatible with the Bourne shell (the most popular shell on UNIX) and incorporates many enhancements and best features from other shells.  From a newbie perspective, the different shells are included with Linux for historical reasons and backwards-compatibility of shell scripts that may require a particular shell to run. [Some shells may be useful if you write programs targeted for specialized "embedded" devices, that might run a "tiny" shell.]

You  can determine the shell you are running using:

echo $SHELL

If you wanted to try another shell, type, for example:
tcsh
which will start the tiny c shell.  When done, type
exit
which will return you to the previous shell (using exit on your first shell will log you out). You can find out how many shells you stacked on each other by displaying the "shell level" environmental variable:

echo $SHLVL

In the above command, the "$" means "expand the value of a shell environment variable", "SHLVL" is the variable name, and "echo" is a command that prints things.

The shell for each user is specified as the last field in the password file /etc/passwd .  If you really wanted to change it, edit (as root) this file and replace the "/bin/bash" with the shell of your choice.

3.4.2 How do I customize my shell prompt?

On my machine, the prompt may look like this:

[stan@marie stan]$ _

Here "stan" is my login name, "marie" is the name of the computer, the second "stan" is the name of my current working directory, and "_" represents the cursor.

The prompt is set by the environmental variable called PS1.  To display the current setting, I can use:

echo $PS1

The system-wide setting of the prompt (for all users on the system) is in the file /etc/bashrc which on my system contains such a line:

PS1="[\u@\h \W]\$ "

To customize the prompt, I can edit the file /etc/bashrc (as root) and insert almost any text inside the quotation marks. Here is the meaning of some special codes I may also choose to use:

\u   -    username of the current user (= $LOGNAME),
\h   -    the name of the computer running the shell (hostname),
\H   -    entire hostname
\W   -    the base of the name of the current working directory,
\w   -    the full name of the current working directory,
\$   -    display "$" for normal users and "#" for the root,
\!   -    history number of the current command,
\#   -    number of the current command,
\d   -    current date,
\t   -    current time (24-hr),
\T   -    current time (12-hr) - bash 2.0 only,
\@   -    current time (AM/PM format) - bash 2.0 only,
\s   -    name of the shell,
\n   -    new line,
\\   -    backslash,
\[   -    begin a sequence of non-printable characters,
\]   -    end a sequence of non-printable characters,
\nnn -    the ASCII character corresponding to the octal number nnn.
$(date) - output from the date command (or any other command for that matter).

Here is an example on how to add colour. See the next chapter for details about colour:

PS1="\[\033[1;32m\][\u@\h \W]\$\[\033[0m\] "

There is also the second-level prompt, set by a variable called PS2. The shell uses the second level prompt when it expects additional input, and on my system the secondary prompt is "> ". I don't worry too much about PS2, but if I did I could set it the same way as PS1. There are even PS3 and PS4, but these are really rarely seen.

3.4.3  Colour on text terminal

Colour on the text terminal can be produced using the "ANSI escape sequences". For example:

echo -e "\033[44;37;5m ME \033[0m COOL"

The above sets the background to blue, foreground white, blinking video, and prints " ME ", then resets the terminal back to defaults and prints " COOL".  The "-e" is an option specific to the echo command--it enables the interpretations of the special characters. The "\033[" introduces the escape sequence. The "m" means "set attribute" and thus finishes the sequence. The actual codes in the example above are "44;37;5" and "0".

Change the "44;37;5" to produce different colour combinations--the number/order of codes do not matter.  The codes to choose from are listed below:

Code  Action/Color
---------------------------
 0    reset all attributes to their defaults
 1    set bold
 2    set half-bright (simulated with color on a color display)
 4    set underscore (simulated with color on a color display)
 5    set blink
 7    set reverse video
22    set normal intensity
24    underline off
25    blink off
27    reverse video off
30    set black foreground
31    set red foreground
32    set green foreground
33    set brown foreground
34    set blue foreground
35    set magenta foreground
36    set cyan foreground
37    set white foreground
38    set underscore on, set default foreground color
39    set underscore off, set default foreground color
40    set black background
41    set red background
42    set green background
43    set brown background
44    set blue background
45    set magenta background
46    set cyan background
47    set white background
49    set default background color

Other interesting codes:

\033[2J      clear screen
\033[0q      clear all keyboard LEDs (won't work from Xterm)
\033[1q      set "Scroll Lock" LED
\033[2q      set "Num Lock" LED
\033[3q      set Caps Lock LED
\033[15;40H  move the cursor to line 15, column 40
\007         bell (beep)

LEDs (="Light Emitting Diods) are the lights on the keyboard which indicate if <CapsLock>, <NumLock> and <ScrollLock> are engaged.

See man console_codes for more.

3.4.4 How do I print symbols on the console or in a text mode application?

The procedure described here gives me fast access to the PC extended character set (codes 128-255) and is quite portable in the PC world:  it works in MS Windows, DOS (if you have an ANSI driver installed), and inside any text mode Linux application (including on the command line),  but it does not work in X-windows (don't ask me why).  I found it was worth my time to memorize the codes for the few characters I tend to use the most.
It works like this. Make sure that <NumLock> is on. Then press <Alt> and hold it. While <Alt> is pressed, key in on the numeric keypad these four digits: 0181. Now release <Alt> and the Greek letter mu "µ" appears.   I find quite useful these characters from the PC character set encoding: 176 ° (degree), 177 ± (plus minus), 178 ² (square), 179 ³ (power 3), 181 µ (Greek mu), 0183 · (multiplication sign), 232 è  (French accent agrave), 233 é (French accent aigu) 228  ä (German a-umlaut), 243 ó (Polish u-zamkniete), 248 ø (Scandinavian o-bar) 252 ü (German u-umlaut). Some other characters are also possible, here is the full listing:

128 ? 147 ? 166 ¦ 185 ¹ 204 Ì 223 ß 242 ò
129 ? 148 ? 167 § 186 º 205 Í 224 à 243 ó
130 , 149 * 168 ¨ 187 » 206 Î 225 á 244 ô
131 f 150 - 169 © 188 ¼ 207 Ï 226 â 245 õ
132 ? 151 - 170 ª 189 ½ 208 Ð 227 ã 246 ö
133 ? 152 ~ 171 « 190 ¾ 209 Ñ 228 ä 247 ÷
134 ? 153 ? 172 ¬ 191 ¿ 210 Ò 229 å 248 ø
135 ? 154 s 173 ­ 192 À 211 Ó 230 æ 249 ù
136 ^ 155 > 174 ® 193 Á 212 Ô 231 ç 250 ú
137 ? 156 ? 175 ¯ 194 Â 213 Õ 232 è 251 û
138 S 157 ? 176 ° 195 Ã 214 Ö 233 é 252 ü
139 < 158 ? 177 ± 196 Ä 215 × 234 ê 253 ý
140 ? 159 Y 178 ² 197 Å 216 Ø 235 ë 254 þ
141 ? 160   179 ³ 198 Æ 217 Ù 236 ì 255 ÿ
142 ? 161 ¡ 180 ´ 199 Ç 218 Ú 237 í
143 ? 162 ¢ 181 µ 200 È 219 Û 238 î
144 ? 163 £ 182 ¶ 201 É 220 Ü 239 ï
145 ? 164 ¤ 183 · 202 Ê 221 Ý 240 ð
146 ? 165 ¥ 184 ¸ 203 Ë 222 Þ 241 ñ

3.4.5 How do I write a simple shell script?

Create a text (ASCII) file which will contain the shell script. For example, I would use the pico editor to write a script that runs the program tar with all the parameters usually necessary to uncompress tarballs downloaded from the Internet (I never seem to remember the tar options). I decided to call my script "untar":
pico untar
Since the file "untar" did not exist in my current directory, it was created by the pico text editor.  Now, I type in the content of my script:
#!/bin/bash
echo this is the script file $0
echo untarring the file $1
# this calls tar with options -xvzf (extract,
#    verbose, filter through gzip, input filename)
tar -xvzf $1
I save the file with <Ctrl>o and exit with <Ctrl>x
The first line of the script, starting with "#!" (called pound-bang), is special--it tells the shell what program should be used to interpret my script. In this example, the script is to be interpreted by the bash shell /bin/bash .  The first line must start with #!  or the script will never run (the file will be interpreted as just a text file).  Other lines starting with # are comments for the author (readers, users) of the shell and are totally ignored by the computer.
The $0, $1, $2 ... in my script are the parameters passed to my script.  For example, if I ran a script called "myscript" with seven parameters like this:
myscript a b c d e f g
then $0 would be seen inside "myscript" as having the value "myscript", $1 would have the value "a",  $2 would be "b",  $3 would be "c", etc.
On the second and third line of my example script, the command echo prints on the screen everything that follows on the same line, expanding $0 and $1 to the values of the parameters passed to the script.  The fourth and fifth line contains a comment I wrote to myself to remind myself what I was trying to achieve, just in case I ever had to modify my script. The last line performs the actual work.
Once the script is written, I make the file executable to the file owner ("u"=user):
chmod u+x untar
and my script is ready to run like this:
./untar my_tar.tar.gz
Linux scripting is definitely rich, flexible, powerful and can be complex. However, it does not require special knowledge to write simple scripts for automation of common tasks. You just put together a group of often used commands, one by one, into a file.  I use scripting because I am too lazy to type the same groups of commands over and over again.

A really simple sequence of commands can also be typed into a text file and passed to shell for straight execution using:

source my_file

[No need for the initial "pound bang" or executable permission.]
 

3.4.6 Meaning of quotes

Normally, these characters are special to the shell:

\ ' " ` < > [ ] ? | ; #  $  ^ & * ( ) = <Space> <Tab> <Newline>

There are four different types of quotes: backslash (\), single quotes (apostrophes, '), double quotes (quotation marks, "),  and backquotes (`).

The backslash \ means: disable the special meaning of the subsequent character.

Quoting with '' (two apostrophes) means:  quote exactly, disabling any special characters inside the quotes.

Quoting with "" means:  disable the special characters inside the quotes except for $ ` \

The pair `` (two backquotes) means:  do a command substitution inside the backquotes first. So what is inside the backquotes is executed by the shell first, and then the output is passed to the command outside the quotes.  The same can also be acomplished with $(command) which nests better than backquotes.

Examples. I can create a funny directory called "*" by either \ quoting or '' quoting:

mkdir \*
mkdir '*'

This hides the special meaning of the "*" from the shell (without the quote it would mean "all files in the current directory").

3.4.7 Input/output redirection

There are three important  input-output streams: standard input ("stdin"), standard output ("stdout"), and standard error output ("stderr"). They all default to the console ("console" means the keyboard for the input and the screen for the output), but they can be redirected.

To redirect the standard output I use ">". For example:

dir my_dir > filelisting.txt

will redirect the standard output of the dir command into the textfile filelisting.txt and nothing should appear on my screen. The file can be subsequently edited (e.g. with pico filelisting.txt) or embedded into a document.

To redirect the standard error, I need to use the construct "2>". For example:

dir my_dir 2> errorlisting.txt

The above will send the normal output onto the screen and nothing to the file unless  dir produces an error. On error, nothing may go to my screen, and the file errorlisting.txt will contain the error message, which might be something like:

dir: my_dir: Permission denied

Finally, I can redirect both standard output and standard error to a file using:

dir my_dir > file_and_error_listing.txt 2>&1

which first redirects the standard output to a textfile, and then redirects the standard error to the same location as the standard output.  A bit twisted, how it works, but it works.

In the examples above,  if the file (to which to redirect) already existed, it will be overwritten. To append to an existing file, I use ">>" as in these examples:

dir my_dir >> filelisting.txt
dir my_dir 2>> errorlisting.txt
dir my_file >>file_and_error_listing.txt 2>&1

If you are puzzled by the "2>" symbol, here, briefly, is how to rationalize it. The standard streams have standard descriptors. "0" is standard input, "1" standard output and "2" is standard error.
dir my_dir > file.txt
is short for
dir my_dir 1> file.txt
and therefore the example below redirects the standard error:
dir my_dir 2> file.txt

One can also use the symbol "|" to send ("pipe") the output from one command as input for another command. In this popular example, the output from dir is piped to more (more pauses the display after each screenful):

dir | more

One can also split the output so it goes both to a file and the screen using "tee":

dir | tee filelisting.txt

It is called "tee" by the analogy to the "T"-letter-shape fitting that pipefitters use, and which divides flow.

This section so far dealt with redirecting standard output. Redirecting standard input is not nearly as useful as redirecting the output, but it can be done using a construct like this:

cat < my_file

There is also something called in-line redirection of the standard output, realized with "<<". Forget about it, seems of no use to me. Yet, here is an example if you really ever needed it  (here, the ">" stands for the secondary prompt):
cat << my_marker
> my_line_from_the_keyboard
> another line_from_the_keyboard
> my_marker  [the marker of my choice ends the in-line redirection].

Apart from redirection to regular files and "filters" (as shown in the examples above), one can redirect to/from devices and other special files. Some examples follow.

An example of redirection to a device file. The following command displays the listing of files on the fourth text terminal:

dir > /dev/tty4

An example of redirection to a special "FIFO" file. This command sends the message "you are lucky" to the lucky ICQ user UIN 77777777 (assuming you are connected to the icq server with your licq program):

echo message 77777777 "you are lucky" > ~/.licq/licq_fifo

The above works because the file "licq_fifo" in your licq directory is a special "fifo" (first-in-first-out) queue file.  How could the above ever be more useful than sending a message using the pretty licq GUI front-end? For example, you could write a short script to impress fellow icq users with multiple (identitcal) messages:

#!/bin/bash
echo Messaging UIN:  $1  Message:  $2   Times: $3
# The next command puts puts your licq in the status "on-line, invisible".
echo 'status *online' > ~/.licq/licq_fifdescribed before.

| pipes the output of the command to the left of the pipe symbol "|" to the input of the command on the right of the pipe symbol.

separates multiple commands written on a single line.

<Space> and <Tab>  separate the command words.

<Newline>  completes a command or set of commands.

( )  enclose command(s) to be launched in a separate shell (subshell). E.g. ( dir ).

{ } enclose a group of commands to be launched by the current shell. E.g. { dir }. It needs the spaces.

&  causes the preceding command to execute in the background (i.e., asynchronously, as its own separate process) so that the next command does not wait for its completion.

*   when a filename is expected, it matches any filename except those starting with a dot (or any part of a filename, except the initial dot).

when a filename is expected, it matches any single character.

[ ]  when a filename is expected, it maches any single character enclosed inside the pair of [ ].

&&  is an "AND" connecting two commands.

command1 && command2 will execute command2 only if command1 exits with the exit status 0 (no error).  For example: cat file1 && cat file2 will display file2 only if displaying file1 succeeded.
||   is an "OR" connecting two commands.
command1 || command2 will execute command2 only if command1 exits with the exit status of non-zero (with an error).  For example: cat file1 || cat file2 will display file2 only if displaying file1 didn't succeed.
=  assigns a value to a variable.
Example. This command:
me=blahblah
assigns the value "blahblah" to the variable called "me". I can print the name of the variable using:
echo $me
$    preceeds the name of a variable to be expanded.
The variables are either assigned using  "="  or are one of the pre-defined variables (which cannot be assigned to):
$0  name of the shell or the shell script being executed.
$# number of the positional parameters to the command
$1  the value of the first positional parameter passed to the command. $2 is the second positional parameter passed to the command. etc. up to $9.
$*    expands to all positional parameters passed to the command
$@   expands to all positional parameters passed to the command, but individually quoted when "$@" is used.
See man bash if you really need more.

3.5  Package installation and rpm package manager

3.5.1 How do I install a program I downloaded from the Internet?

The answer depends on what kind of package you downloaded. You can avoid many installation headaches if you download programs in the form of Red Hat binary packages *.rpm (that's the format I select if given a choice).

INSTALLATION OF REDHAT BINARY PACKAGES
o If the program I want to install is a RedHat binary package (*.rpm),  I can use either a command line, or a GUI utility. I like to use the command-line utility because it is fast and trouble-free.  The RedHat package manager installation utility is called rpm . First I read the info on the package content (optional):

rpm -qpi my_new_file.rpm
This queries (mode "q", must be the first letter after the dash) the yet uninstalled package (option "p") so that it displays the info (option "i") which the package contains.  If I want to install the program, I run (as root):
rpm -ihv my_new_file.rpm
The above command does the installation job. It runs rpm telling it to install the package (mode "i", must be the first letter after the dash) while printing to the screen more information than usual (option "h"=display "hashes" to show the unpacking progress, option "v"  = be verbose).  The contents of the package are distributed to the directories where they belong (rpm knows where they belong).  After this installation, the program is ready to run, I just have to know the executable name and its location.  If I have trouble finding the executable, this lists all the files that the package contains together with their destination directories:
rpm -qpl my_new_file.rpm
This queries (option "q") the yet uninstalled package (option"p") so that it displays the listing (option "l") of all the files the package contains.
The GUI front-ends to rpm are: gnopro (the old version, that comes with RH6.0 is confusing, but newer versions are much improved), kpackage (available only with the more recent distributions), and the old glint (very slow, comes with RH5.2).

INSTALLATION FROM A SOURCE-CODE TARBALL
o If what I downloaded from the net is a Linux source code in the form of a compressed tarball (*.tar.gz or *.tgz), the installation procedure is longer and more troublesome than with the binary-only rpm. I typically install the program as root.

First, I change my current working directory to /usr/local  :
cd /usr/local
Second, I decompress the tarball that I downloaded from the net:
tar -xvzf /home/the_dir_where_the_tarball_is/my_tarball.tar.gz
This extracts (option "x") the contents of the *.tar.gz (or *.tgz) tarball, unzips it (option "z"), while talking to me more than usual (option "v" = verbose).  Please note that the option "f" means "file", so the filename must immediately follow the letter "f".  The contents of the tarball are extracted into a subdirectory which tar creates under my current working directory, which in the typical case is /usr/local/ .  The tarball knows what the new subdirectory should be called.
If the tarball is not compressed (e.g., *.tar), I may use:
tar -xvf /home/the_dir_where_the_tarball_is/my_tarball.tar
Third, I have a look at what the new directory is called, then I cd into it:
cd the_new_program_subdir
Since some of the directories have long names, I use the great autocompletion option to save on typing--I just type the first few letters and then press <TAB> .
Fourth, most programs are compiled by executing these three commands:
./configure
make
make install
The above commands can take some time to complete (0.5 h?). If any of them fail, it might be an idea to read the README or INSTALL or whatever info is provided with the new program. Some programs may require customization of the environment (e.g. addition of their directory to the PATH) or installation of an additional library, or yet something else. It can sometimes be a pain. Very simple programs might not need the "./configure" or/and "make install" step, in which case "make" alone will do.
Fifth, if everything goes well, I find the new executable that I just compiled. The names of executables display in green when running this command:
ls --color
Now, I can run the executable, for example:
./the_executable
Sixth, if I plan to run the program more often, I create a symbolic link to the executable from the directory /usr/local/bin :
cd /usr/local/bin
ln -s /usr/local/the_new_program_subdir/the_executable .
This way, the executable (actually, a symbolic link to it) is on my PATH and it can be run by simply typing its name (no need to type the full path to the executable any more). Some programs will put the executable (or a link to it) in a "bin" directory in which case you skip the last step.
INSTALLATION FROM SOURCE CODE RPM PACKAGE
o There are also programs distributed as "source code rpm" packages. They require installation of the *.rpm package with the "rpm" utility as described in the first part of this chapter. But since the "rpm" installs the source code (typically in the C language), I then have to compile the source code by executing the same: "./configure ;  make ; make install" sequence as for the sourcecode distributed as tarballs (see the previous answer).


Go to Part 4: Linux Newbie Administrator FAQ
Back to the Main Index