La Console
Transcription
La Console
La Console Mémoire sur la pratique du shell Bash sous Gnu Linux 1. La Console 2. Les Services 3. Le Networking Par Patrick Hautrive 2010 http://hautrive.free.fr La Console !© par Patrick Hautrive !;~) 2010 1 Table des matières UNIX......................3 LINUX....................6 SOURCE................8 LICENCE...............9 SYSTEM..............13 DESKTOP............23 INFORMATION. .25 SOCIETY.............31 GNUGPL..............37 STRATEGY.........40 INSTALL.............43 PARTITION.........47 LOADER..............55 BOOT...................57 LILO.....................61 GRUB...................64 INITRD................69 INITTAB..............70 SERVICES...........74 WRAPPERTCP....77 LOGIN..................83 SHELL..................87 VARIABLE..........98 COMMAND.......102 LANGUAGE......109 PROCESS...........114 TERMINAL.......125 HIERARCHY.....132 PERMISSION....143 PASSWORD......149 La Console !© par Patrick Hautrive !;~) 2010 2 ROOT.................159 PACKAGE.........168 SCRIPTS............170 EXEMPLES.......180 TOOLS...............205 FILES.................206 CARACTERS....207 DEFINITIONS...208 FORMULES.......209 UNIX La chronologie des systèmes 1968 MULTIX Projet d'un système d'exploitation multitâche (AT&T, MIT, General Electrics) Développement sur DEC PDP7 par Brian Kernighan et Ken Thomsom Programme d'un jeu “Space Travel” 1970 UNICS 1972 Unix™ Time Sharing (Bell Laboratory chez AT&T) 1977 BSD4.4 Berkeley university sous licence libre BSD (Berkeley Software Development) 1981 UNICES Conception du langage C et réécriture du code par Denis Ritchie TCPIP (Réseau Arpanet du DARPA) FreeBSD (Multiplateforme) NetBSD (Optimisation) OpenBSD (Sécurisation) Fermeture et hétérogénéisation du code par l'industrie informatique SYSTEM V 1984 Gnu GPL (AT&T) SOLARIS (Sun Microsystems) AIX (IBM) ULTRIX (Digital Equipment Corporation) HPUX (Hewlet Packard) TRUE 64 (Compaq) IRIX (Silicon Graphic Inc.) VENIX (Venture) XENIX (Microsoft et Santa Cruz Operation) Protection du code sous licence libre par Richard M. Stallman du MIT Création de la FSF (Free Software Foundation) et du projet Gnu Hurd 1987 MINIX 1989 Internet Mini système monolithique pour l'apprentissage par Andrew Tannenbaum Développement de l'hypertexte (HTML) par Tim BernersLee du CERN Ouverture du réseau et du protocole d'échange de données (World Wide Web) 1991 Linux 1999 Mac OS X Lancement du projet communautaire sur Internet par Linux Torwalds Réappropriation du code (Noyau BSD Mach patché) par Apple http://en.wikipedia.org/wiki/Linux La Console !© par Patrick Hautrive !;~) 2010 3 Le contexte historique La société AT&T distribua “gracieusement” son système UNIX™ (sans royalties exorbitantes, ni contraintes pénalisantes) auprès des universités américaines afin d'en favoriser la mise au point, d'encourager les développements et de susciter les vocations, mais aussi pour se prémunir contre la loi Anti Trust (monopole des télécommunications et de l'informatique). Les universités américaines furent dès le départ associées au développement d'un système d'exploitation multitâches, et contribuèrent à développer de nombreux outils et fonctionnalités. L'université de Berkeley en Californie intégra la pile TCPIP au noyau, et l'université du MIT développa le serveur graphique X. La société SUN Microsystem finança le développement de la suite bureautique Open Office. Le CERN (Centre Européen de Recherche Nucléaire) développa l'internet pour l'échange de données. De nombreux étudiants, chercheurs universitaires et professionnels poursuivent toujours leurs contributions pour un monde numérique libre. La société AT&T et l'université de Berkeley furent longtemps en procès pour la propriété du code BSD. La société AT&T est propriétaire du sigle “UNIX™” et le SYSTEM V (SVR4) est standardisé. Les systèmes “unices” propriétaires proviennent de la même souche commune et libre (BSD 4.4). Chaque système divergea ensuite jusqu'à l'incompatibilité, devenant de plus en plus dépendant du matériel pour lequel il était conçu et des utilitaires propriétaires qui permettaient de s'en servir. L'harmonisation des “unices” est orchestrée par le Consortium OSF (Open Software Foundation). Richard M. Stallman est en 1971 ingénieur système au laboratoire d'intelligence artificielle du MIT, et il a besoin du code source du pilote d'une imprimante laser Xerox installée dans une autre pièce afin de programmer une alerte en cas de panne. Pour des raisons de licence restreinte, ce code source lui est refusé, et il n'accepte pas cette situation... Le système de fichier des “unix like” est une arborescence hiérarchique en forme d'arbre inversé avec une seule et unique racine (root), mais où peuvent se greffer d'autres arborescences, d'autres systèmes de fichiers, locaux ou distants, et correspondant à de nombreux types de support de stockage. Le super utilisateur ou l'administrateur du système (l'utilisateur “root”) possède tous les droits et tous les privilèges sur tout le système. L'utilisateur “root” est responsable du système, de la maintenance, de la disponibilité, de la performance et de son évolution. La Console !© par Patrick Hautrive !;~) 2010 4 Le multi tâche Gnu Linux est un système multi tâches (multi threading), c'estàdire qu'il est conçu pour faire tourner indépendamment plusieurs programmes en même temps. C'est également un système multi utilisateurs, c'estàdire qu'il peut être utilisé simultanément par plusieurs personnes en même temps. L'utilisation du processeur ou CPU (Central Processing Unit) est gérée par un ordonnanceur (sheduler). Le temps processeur, est divisé en petites unités réparties équitablement entre chaque programme (time sharing). La rapidité de calcul donne l'illusion de la simultanéité à l'échelle humaine. Un système mono tâche n'exécute qu'un seul programme à la fois. Un système multi tâche collaboratif peut exécuter plusieurs programmes en même temps, mais c'est chaque programme qui décide quand il “rend la main” aux autres. Un système multi tâche préemptif répartie égalitairement le temps processeur alloué à chaque programme. La topologie des systèmes d'exploitation mono tâches multi tâches collaboratifs multi tâches préemptifs MSDOS Windows™ 3.x, Macintosh™ OS 7 (multifinder) Unix™ *BSD Windows™ 95 (couche 32 bits) Windows™ NT (mémoire non protégée) Macintosh™ OSX Gnu Linux La Console !© par Patrick Hautrive !;~) 2010 5 LINUX La philosophie Unix ™ Le système Gnu Linux est un “unix like” et sa conception est conforme aux critères retenus par les fondateurs d'Unix™ et il répond au principe de séparation des traitements et des données de Von Neumann. Dans un système “unice”, tout est fichier (stock or flow), tous les processus sont traités de façon égalitaire par le multi tâche (sheduler), tous les processus sont indépendants les uns des autres, mais ils peuvent communiquer entre eux (I/O), toutes les applications sont conçues dans le mode clients et serveurs, tous les programmes sont écrits dans un langage portable et toutes les spécifications des protocoles sont claires, disponibles et universelles (tcpip). Tous les utilitaires remplissent une seule fonction, mais sont compatibles entre eux, ce qui permet l'enchainement complexe des commandes, avec la circulation et la redirection des netrées et des sorties (pipeline). Les systèmes “unices” sont des systèmes d'exploitation multi tâches et multi utilisateurs, et sont conçus pour distinguer nettement les espaces mémoires du noyau (kernel zone) et les espaces des utilisateurs (user zone). Les systèmes «unices» intégrent au niveau des fichiers la gestion des droits d'accès. Les principes et les valeurs prônés par les acteurs de la communauté des Logiciels Libres sont la liberté et la responsabilité, la simplicité et l'efficacité. Issu du courant de la cybernétique après la seconde guerre mondiale, le traitement automatique de l'information repose sur la numérisation (codage en unité binaire, un ou zéro) et sur la systématisation des procédures (à la vitesse de la lumière). La conception des systèmes “unices” était au départ imprégnée de cette philosophie, avant que les appétits commerciaux n'altèrent la stratégie d'ouverture. Le monde numérique est une nouvelle “Terra Incognita” et les acteurs de “la scène du libre” ont conscience de ces enjeux, et affirment leur volonté d'y participer et d'y défendre la liberté numérique. “All is file” “Just for fun” “Free as freedom” “You can do it yourself” “One function, one program” “Small, simple and beautiful” “Do it here, do it everywhere” La Console !© par Patrick Hautrive !;~) 2010 6 La communauté du “libre” Gnu Linux est le fruit d'une collaboration de plusieurs milliers de volontaires à travers le monde, allant de l'expert à aficionados, du passionné au néophyte. Cette communauté internationale multi culturelle communique par Internet. Chacun met en commun gratuitement sa production pour le bien du plus grand nombre. Gnu Linux est un Logiciel Libre. Les Logiciels Libres représentent un modèle de croissance économique alternatif qui se caractérise par une très forte indépendance, un gout prononcé pour l'élégance du code et le raffinement des algorithmes, et une diversité prolifique, voire chaotique. Par essence démocratique et pratique, un bon programme est rapidement adopté et amélioré par la communauté. L'accès à l'information est à la base de la liberté et de la responsabilité individuelle. Les hackers sont considérés comme des virtuoses par leurs pairs (évaluation des compétences techniques) et comme des pirates anarchiques (projection d'intentions malveillantes) par les masses média avides de sensationnel et de messages caricaturaux. Pourtant, s'il existe réellement une “communauté internationale” dans le monde d'aujourd'hui, c'est celle des acteurs du libre. La communauté des Logiciels Libres a fait l'objet d'étude sociologique, voire anthropologique. Des similitudes et des points de comparaison se retrouvent dans les “sociétés tribales” au sens ethnologique. Par exemple, l'influence extérieure est faible, il est nécessaire de faire partie du groupe pour avoir son mot à dire. C'est en participant qu'un individu fait parti du groupe et devient reconnu par ses pairs. Il y aurait peutêtre comme une “chevalerie” des Logiciels Libres, et l'effervescence des activités sur le résau Internet n'est peutêtre que le reflet de notre “humanité”... La morphologie sociologique de la communauté des Logiciels Libres Un royaume : Des territoires : Des héros : Des acteurs : Un langage : Des valeurs : Une culture : Un folklore : Un mythe : Des règles : Des fléaux : Internet, le virtuel, la bande passante, le temps processeur, le cryptage Les sites communautaires, les News, les canaux Irc, les Mailing Listes Richard M. Stallman, Linus Torvalds, Les hackers, crackers, gurus, geeks, script kiddies, newbies, avatars Le jargon, les codes, les communications asynchrones, les scripts La liberté, le partage, la transparence, l'élégance du code, l'anonymat La science fiction, les voyages interstellaires, les jeux de rôle, les sushis Les blogs, les CMS, les abréviations (IMHO, RTFM), les smileys ;) La société égalitaire et futuriste de l'information, le pouvoir des masses La licence Gnu GPL, “L'éthique des Hackers”, l'autorité de la FSF Les spam, virus, logical bomb, popup, hoax, exploits, flames, trolls La Console !© par Patrick Hautrive !;~) 2010 7 SOURCE Le code source Le code source est la “matière” d'un programmeur et le résultat de son travail. Le code source est un texte ordonné qui rassemble les instructions écrites par l'informaticien programmeur. Ce texte est écrit dans un langage de programmation compréhensible par un être humain. Ce texte sera transformé pour devenir utilisable par un ordinateur. Le code source est la transcription lisible et opérationnel d'un algorithme (une suite séquentielle d'instructions logiques permettant d'obtenir un résultat certain à partir d'hypothèses connues). L'accès au code source permet de contrôler la qualité d'un programme, et la capacité de le transformer conduit à son amélioration. L'élaboration de l'algorithme et sa transcription en code source sont régies par l'imagination, la conception et la réflexion humaine, toutes les autres phases, dont la compilation du code source, sont accomplies par des traitements automatiques programmés pour la machine. Le langage machine Le code source est traduit en langage machine par un outil qui s'appèle un compilateur afin être exécuté par un ordinateur. Le compilateur utilisé (gnu GCC) dépend du langage de programmation utilisé (langage C) et de l'architecture du processeur pour lequel il est destiné (processeur Intel 32 bits par exemple). Cette opération de transformation du langage de programmation en langage machine s'appèle la compilation. Ainsi, l'algorithme (l'idée) se transforme petit à petit, tout d'abord en programme source (le texte écrit dans un langage de programmation), puis en programme compilé (une suite d'instructions écrites dans un langage machine), puis en exécutable (avec le droit d'exécution “x” attribué au fichier), et en commande (quand l'utilisateur lance le programme, en double cliquant sur une icône, ou en validant la ligne de commande saisie dans un interpréteur de commande), ensuite en processus (qui rassemblent les instructions de code, et qui sont gérées, en mémoire, par l'ordonnanceur du système d'exploitation), et enfin en binaire (une suite de bits, abréviation de l'anglais “binary digit”, représentés par des zéros, et des uns et qui traverseront les circuits d'un processeur). Le cycle de vie d'un programme (from mind to paper to digit) Algorithme Code Source Compilation Exécutable Binaire Commande Processus La Console !© par Patrick Hautrive !;~) 2010 8 Résultat LICENCE La licence ouverte La licence Gnu GPL est une licence dite ouverte parce qu'elle octroie à l'utilisateur l'accès et la transformation du code source d'un programme. A contrario, les licences dîtes fermées n'autorisent que l'utilisation du programme compilé (traduit et compacté en langage machine et illisible pour un être humain). Les licences dites fermées ne permettent pas de savoir ce que fait réellement un programme, et ne permettent aucune modification. Ces licences dites fermées imposent un secret obscur, tandis que les licences dites ouvertes proposent une claire franchise. Les licences dites fermées ne protègent que les intérêts des éditeurs, et cellesci instaurent une dépendance de l'utilisateur vis à vis de son fournisseur. L'éditeur contrôle ainsi indirectement l'utilisation de son produit et les besoins de sa clientèle. Il dispose de plus d'un moyen de pression financier par la mécanisme de facturation lié à la vente des licences. Enfin, les formats de fichiers propriétaires dont les spécifications sont abusivement cachées et souvent arbitrairement modifiés (pour contraindre à l'achat des nouvelles licences) entravent la circulation et la durée de vie de l'information. La liberté numérique Le système Gnu Linux est un logiciel qui peutêtre librement et gratuitement téléchargé depuis Internet, soit sous la forme d'une archive source, soit sous la forme d'une archive compilée. Le système Gnu Linux est livré sous la protection juridique internationale d'une licence d'utilisation, la licence Gnu GPL de la FSF (Free Software Foundation). Richard M. Stallman affirme que les Logiciels Libres défendent les principes de liberté, d'égalité et de fraternité. Les Droits de l'Homme Numériques (homo digitalus) pour tous sans distinction, sans condition et sans limitation. Les quatre libertés La licence Gnu GPL (General Public Licence) est une licence dîtes “libre” qui protège et garantie les droits légitimes des utilisateurs. Ces droits sont formalisés dans l'expression de quatre libertés numériques fondamentales. Ces quatre libertés sont indissociables et permettent d'identifier, de qualifier et de pérenniser un programme dît “libre”. Il existe de nombreuses licences dîtes “libres” qui diffèrent les unes des autres, mais toutes satisfont à ces quatre libertés, ce qui permet en autres de rendre compatible les lignes de code, d'intégrer les projets les uns aux autres, et de mutualiser ainsi le travail de chacun dans la durée. La Console !© par Patrick Hautrive !;~) 2010 9 Les quatre libertés de la licence Gnu GPL La liberté d'explorer le code source La liberté d'adapter le code source La liberté d'exécuter le code source La liberté de conserver ces libertés (read) (write) (execute) (sticky) La position stratégique Tout d'abord, une certitude, sans Logiciels Libres, il n'y aurait pas d'Internet. Statistiquement, le noyau Gnu Linux représentait en l'an 2000 une position stratégique dans le monde de l'industrie informatique. La position stratégique de Gnu Linux dans le monde 30 Millions de ligne de code 30 années de recherche et développement Plus de 8000 heures de travail pour une valeur estimée à 1 milliard de dollars 10 millions d'utilisateurs et des milliers de contributeurs officiels dans le monde 2% du marché mondial des ordinateurs et 70% des serveurs Internet L'acronyme récursif Gnu Gnu est un acronyme récursif signifiant “Gnu is Not Unix™” en opposition aux pratiques propriétaires et mercantilistes des systèmes Unix™. Le système d'exploitation Gnu Linux est constitué du noyau Linux et des outils Gnu. Une distribution Gnu Linux est une distribution entièrement compatible avec la licence Gnu GPL, c'estàdire que tous les outils, tous les programmes et tous les pilotes sont “libres”. Par exemple, la distribution Debian défend une position “pure”, et a la réputation d'être à 100% Gnu et 100% libre. Les distributions Linux Une distribution est un ensemble regroupant un noyau (qui peut être patché, c'estàdire modifié pour les besoins de la distribution), les outils Gnu (Gnu tools) et les outils propres à la distribution, l'installeur et une sélection de Logiciels Libres. Une distribution est une sélection de programmes (packages) dont le but est de présenter un ensemble cohérent et directement opérationnel. Ces packages peuvent faire l'objet d'une commercialisation en magasin ou par l'intermédiaire de société qui vendent leur personnalisation, leur savoir faire, et les services de maintenance. La Console !© par Patrick Hautrive !;~) 2010 10 Les distributions Linux ne sont pas toutes intégralement compatibles avec la licence Gnu GPL. Souvent, les grandes distributions intègrent également des outils de configuration ou des pilotes binaires propriétaires. Les distributions Gnu Linux Gnu Linux = Kernel + Modules + Pilotes + Tools + Shell + X Server + Softwares Les outils Gnu Les outils, les utilitaires et les commandes Gnu sont nombreux parce qu'ils sont développés individuellement pour remplir une seule fonction. Grâce au mécanisme de redirection des entrées (STDIN) et des sorties (STDOUT & STDERR) d'un processus, les commandes peuvent être enchainées les une après les autres, l'une reprenant les résultats de la précédente. Ces “trains” de commandes constituent dès lors des traitements complexes. Par exemple, l'interpréteur de commande Bash (commandes builtin et scripts exécutables), le compilateur GCC ou l'éditeur EMACS sont des outils Gnu distribués sous licence Gnu GPL. Les outils sont classés en deux catégories. Il y a les outils utilisables par l'ensemble des utilisateurs, et il y a les outils réservés pour l'administration du système (protégés par le mot de passe root pour s'en servir). Ces deux catégories d'outils sont installées généralement dans des répertoires différents. L'emplacement des outils Gnu Pour les utilisateurs Pour le super utilisateur /bin/* sbin/* /usr/bin/* /usr/sbin/* /usr/local* /lib/* $HOME/bin/* /boot/* Les avantages de la transparence Les avantages de la transparence vont audelà de la simple curiosité. Les quatre libertés numériques d'accès au code source ont des conséquences pratiques qui tendent vers l'indépendance et l'efficacité du traitement de l'information. Après les phases de conception et de lancement les nouveaux projets “libres” aboutissent à des programmes qui sont plus lisibles, plus étudiés, plus critiqués et plus remis en question. La liberté laisse libre court à l'imagination de chacun, et l'émulation favorise la recherche de la perfection. En fin de compte, les programmes “libres” sont plus diversifiés et plus performants. La Console !© par Patrick Hautrive !;~) 2010 11 Ce sont toutes ces qualités induites par les quatre libertés numériques fondamentales qui sont intéressantes pour tous les utilisateurs d'ordinateur et d'Internet. De plus, les acteurs qui contribuent se sentent responsables des programmes qu'ils élaborent, et le suivi et la correction de bug sont de fait beaucoup plus rapides et précis que dans le monde fermé et propriétaire où chacune des actions est “gouvernées” par le critère de la rentabilité immédiate (objectif de maximisation des profits). Les avantages de la liberté et de la transparence Complet Propre Robuste Vérifiable Évolutif Indépendant Modulaire Puissant Normalisé Rapide Sécurisé Réactif La Console !© par Patrick Hautrive !;~) 2010 12 Portable Souple SYSTEM L'interface système Le système Gnu Linux est un logiciel qui a pour fonction de faire l'interface entre l'utilisateur et l'ordinateur. L'ordinateur est constitué de l'unité centrale, des périphériques et de logiciels. Un système d'exploitation ou OS (Operating System) est un programme d'instruction informatique permettant aux personnels (user) de configurer et de piloter le matériel (hardware), les équipements réseaux (middleware) et les logiciels (software). Le système Gnu Linux est un système d'exploitation réseau (network) multi tâches (multi thread) compatible avec de multiples architectures processeurs (user friendly). L'IHM (Interface Homme Machine) tend vers l'ergonomie, la transparence, la convivialité et l'automatisation. Les interfaces doivent être à tailles humaines. La formulation des messages du système et les choix proposés pour la configuration doivent être compréhensibles par un “individu moyen” et qui n'est pas informaticien. L'utilisateur devrait pouvoir se servir d'un ordinateur grâce à sa seule intuition. C'est à la machine de se mettre à la portée de l'être humain, et non l'inverse. L'ordinateur est un outil au service de l'utilisateur. Le rôle de la machine est de libérer du temps pour la créativité, non d'asservir les hommes dans les méandres indigestes et les tortueux labyrinthes de la malhonnêteté et de l'incompétence. L'interface entre l'homme et la machine User XServer Operating System Shell Software Hardware Middleware L'on parle indifférament de programme, d'application ou de logiciel. Quand il s'agit d'une application professionnelle propre à un corps de métier spécifique, l'on emploie le terme de progiciel. Le système d'exploitation est un programme particulier, en cela qu'il a pour fonction de faire l'interface entre l'utilisateur, les applications, les matériels constituants l'unité centrale, les périphériques et le réseau. Les zones de travail La mémoire de travail ou RAM (Random Access Memory) est scindée en deux zones distinctes, la zone réservée aux activités du noyau (Kernel Zone), et les zones réservées pour les activités des programmes lancés par les utilisateurs (User Zone). Chaque programme est identifié (id) par l'utilisateur qui l'a lancé. La Console !© par Patrick Hautrive !;~) 2010 13 La multiplicité du traitement La multiplicité était l'un des objectifs principaux lors de la conception d'un système d'exploitation multi tâches. Afin de traiter plusieurs requêtes simultanément, chacune devaient être conçu à partir de critères d'indépendance, et la gestion de la multitude de ces requêtes impliquait un équilibre dans la répartition des ressources et le traitement des instructions. Savoir faire une chose bien conduit à pouvoir faire plein de choses. «Free for the many» La multiplicité, l'indépendance et l'équilibre des traitements Multi tâches I/O, ordonnancement, sheduler, processus, mode préemptif, priorité, threads Multi utilisateurs 16 bits = 65 535 login, password, quota, nice, crontab Multi processeurs Core, SMP, Cluster, Grid Multi plateformes Intel ix86 compatible IBM PC, Pentium, AMD, PowerPC, 68000 Motorola, SPARC, ALPHA, Itanium 64 bits, ARM, MIPS, IBM S/390, Super H C, C++, Assembler, Basic, Pascal, Delphi, Fortran, Php, HTML, Java, SQL, Tcl Multi langages tk, Perl, Python, Lisp, Ada, Calm, Shell Multi protocoles TCPIP, FTP, HTTP, TELNET, SSH, SMB, NFS, DNS, DHCP, PPP, ADSL, POP, IMAP, SMTP, CVS, IRC, NEWS, JABBER, PEAR to PEAR Ext, Ext2, ext3, Reiserfs, NFS, Proc, Devfs, MSDOS, VFAT, NTFS, HPFS, Multi fichiers RAID, LVM, ISO 9660, Joliet serveur internet, routage, filtrage, pare feu, haute disponibilité, temps réel, station Multi usages bureautique, poste ludique, jeux réseaux, électronique embarqué, domotique, appareil électroménager, calcul scientifique, effets spéciaux cinématographiques, décryptage, encodage, mixage, modelage Les spécifications du noyau Les spécifications du noyau Gnu Linux sont multiples et parmi les meilleurs du marché et de l'état de l'art. Les caractéristiques de la conception et du développement libre et protégé par la licence Gnu GPL participent de cette excellence. La Console !© par Patrick Hautrive !;~) 2010 14 Les spécifications du noyau Gnu Linux Noyau monolithique modulaire compilable Adressage 32 bits et 64 bits Allocation mémoire en mode protégé Pagination virtuelle (SWAP) Standard POSIX, ANSIC, IEEE, OSI, IETF Normalisation internationale RFC (Request For Comment) Convention de nommage des fichiers de configuration LSB (Linux Standard Base) et ASCII Convention de la hiérarchie de l'arborescence FHS (Filesystem Hierarchy Standard) Serveur graphique déportable XWINDOW du MIT (Massachusetts Institute of Technology) Compatible RAID 5 (Redundant Array of Inexpensive Disks) Pile de protocole réseau IPV4 et IPV6 Traitement parallèle des tâches SMP (Symetrical Multiple Processors) Processus asynchrone (background) et détachable (nohup) Temps zéro: 1er janvier 1970 à 00h00 GMT (Greenwich Mean Time) Les versions du noyau Les numéros de version du noyau comportent plusieurs chiffres qui indiquent la branche (Major) et la phase (Minor) de développement, mais aussi la correction de bug (Révision) et le type d'architecture processeur (Arch). Les numéros de version du noyau Kernel version Stable Development (unstable) Exemple: 2.6.105686 = = = = MAJOR 2 + MINOR + + Pair (even) + + Impair (odd) + . 6 . REVISION «1005» + + + ARCH 686 Les numéros Major sont espacés de plusieurs années et représentent de grandes modifications dans la conception du noyau. Les numéros Minor sont espacés de quelques mois ou quelques années et représentent des avancées dans les fonctionnalités du noyau. Ces avancées sont des étapes de validation du travail collaboratif, les numéros Minor pairs sont attribués aux versions dîtes stables, et les numéros Minor impairs sont attribués aux versions encore en développement, c'estàdire où les dysfonctionnements peuvent être importants, du fait de la mise au point. Les versions stables sont celles qui peuvent être utilisées dans un environnement de production. La Console !© par Patrick Hautrive !;~) 2010 15 La ligne de commande L'interface graphique n'est pas indispensable pour se servir d'un système Gnu Linux. Quand un système est dédié à une utilisation bien précise, comme un serveur, un routeur ou un pare feu, il peut même être plus judicieux de ne pas installer le serveur graphique, qui occuperait des ressources inutilement. Toute l'administration du système passe alors par l'emploi de la ligne de commande et des scripts shell. Ce mode d'utilisation est presque le même pour toutes les distributions. L'administration en ligne de commande est un mode d'administration universel, pour les différentes distributions Gnu Linux et entre les systèmes de la famille Unix™. Un système Gnu Linux peut très bien fonctionner avec seulement quelques centaines de Méga Octets de mémoire vive (Random Access Memory), et quelques Giga Octets d'espace de stockage sur le disque dur (Permanent Memory). Pour une utilisation en poste de travail, l'interface graphique est bien sûr indispensable pour le traitement et la visualisation des images ou des vidéos, et de nombreux outils de configuration existent pour administrer le système. Ces outils graphiques sont construits sur la base des commandes Gnu. Connaitre l'utilisation de la ligne de commande permet de s'affranchir de l'interface graphique et des spécificités de chacune des distributions. En outre, la connaissance du shell, de la ligne de commande, des scripts et des fichiers de configuration permet à l'utilisateur averti non seulement d'affiner le paramétrage et les performances (tuning), mais aussi d'assurer efficacement la maintenance (hot line). L'interpréteur de commande (shell) permet de piloter le noyau (kernel) et de lancer des outils (tools) et des programmes (binaries), et des exécutables (scripts) en mode ligne de commande. Les outils réseaux (network) permettent d'administrer à distances des serveurs (remote). Les modes d'utilisation Le système Gnu Linux s'utilise selon plusieurs modes. Le mode d'utilisation peut être choisit dans la phase de démarrage avec l'invite (prompt) du chargeur de démarrage (loader), ou pendant l'utilisation du système avec la commande «init» qui permet de changer de niveau d'initialisation (runlevel). Les modes d'utilisation de Gnu Linux (runlevel) Le mode mono utilisateur Le mode sans interface réseau Le mode avec interface réseau Le mode en ligne de commande Le mode avec interface graphique Les modes configurables par l'administrateur single stand alone network terminal serveur X inittab La Console !© par Patrick Hautrive !;~) 2010 16 L'activité du système Toute l'activité du système est enregistrée dans les fichiers journaux (Log). La procédure d'initialisation ne déroge pas à la règle, et tous les évènements significatifs sont consignés dans un fichier journal. Pendant cette phase d'initialisation, de nombreuses commandes et scripts sont invoqués. Une fois le système démarré, de nombreuses commandes permettent de connaître l'état du système, et de modifier sa configuration. L'initialisation du système en mode single lance le système pour des opérations de maintenance avec la commande “sulogin” (single user login) qui présente un shell pour le super utilisateur (root). Pendant toute la durée d'utilisation du système, le système de fichiers virtuels “/proc” permet de connaitre directement les paramètres qui sont utilisés par le noyau. Le répertoire “/proc” donne une image “photographique” du contenu de la mémoire vive. Les données du répertoire “/proc” sont les données réelles et instantanées du noyau, et ne sont calculés qu'au moment de l'affichage. Certaines commandes sont des outils standards qui figurent dans toutes les installations Gnu Linux. Ces outils standards portent parfois le même nom que les outils Unix™ propriétaires, mais porter le même nom ne signifie pas être identique, ni faire la même chose. Ainsi, le contenu des exécutables peut différer selon les systèmes “unices”, de même les options disponibles ne sont pas toujours les même. Par ailleurs, de nombreux outils sont spécifiques à la distribution pour laquelle ils ont été développés. Les commandes systèmes Les commandes systèmes permettent d'interroger le système pour connaitre sa configuration, ou obtenir des informations sur les fichiers, les processus, les services, la machine, le réseau, les commandes, le système de fichier, les périphériques, le noyau ou sur les utilisateurs. Les commandes systèmes qui permettent de modifier la configuration du système ne sont accessibles qu'avec les droits root. Ces commandes sont les même pour tous les systèmes unices La Console !© par Patrick Hautrive !;~) 2010 17 Les commandes de navigation dans l'arborescence pwd ls cd vi cat less cp ln mv rm mkdir rmdir chown chmod lynx eog xterm afficher le répertoire en cours (print working directory) lister les fichiers du répertoire en cours (list) changer de répertoire en cours (change directory) éditer un fichier texte en mode ligne de commande (visual) pour lire le contenu d'un fichier (concatenate) pour afficher un fichier (more or less) copier un fichier (copy) créer un lien symbolique (link) déplacer un fichier ou le renommer (move) supprimer un fichier (remove) créer un répertoire (make directory) supprimer un répertoire (remove directory) changer l'appartenance d'un fichier (change ownership) changer les permissions d'un fichier (change mode) charger une page internet en mode ligne de commande visualiser une image (eye of gnome) lancer un terminal graphique (x terminal) Les commandes de gestion des commandes et des processus ps pstree top jobs bg fg nice strace time kill history alias exit logout reboot halt lister les processus en activité (process) afficher la hiérarchie des processus en cours (process tree) afficher un résumé de l'activité des processus (table of process) afficher les processus de l'utilisateur en tâche de fond (background) placer en tache de fond le processus en cours (background) placer en avant plan un processus (foreground) changer la priorité d'un processus afficher les appels systèmes d'une commande passée en paramètre (system trace) afficher l'utilisation des ressources systèmes d'une commande envoyer un message à un processus afficher l'historique des commandes (bash builtin) afficher les alias en cours sortir d'une session shell fermer une connexion sur un terminal virtuel redémarrer le système d'exploitation éteindre le système La Console !© par Patrick Hautrive !;~) 2010 18 Les commandes d'information sur le système dmesg hostname arch hwclock date cal tzconfig locale loadkeys uptime uname runlevel init telinit grub chkconfig sysctl env chsh lire les messages systèmes de syslogd (message) afficher le nom d'hôte de la machine afficher l'architecture du processeur (architecture) afficher l'horloge de la carte mère (hardware clock) afficher l'horloge du système afficher un calendrier (calendar) afficher la zone géographique du système (time zone configuration) affiche la langue du système charger une langue pour le système afficher la durée d'utilisation du système afficher les principaux paramètres du système (unix name) afficher le niveau d'initialisation changer le niveau d'exécution changer de niveau d'initialisation changer la configuration du chargeur de démarrage (grand unified boot manager) configurer les services des niveaux d'initialisation (check configuration) modifier les paramètres du noyau à chaud (system control) affiche les variables d'environnement du shell (environment) changer le shell (change shell) Les commandes d'information sur les utilisateurs et les groupes id logname last lastlog finger who su passwd usermod chage useradd groups groupadd groupmod sg chgrp afficher l'identité de l'utilisateur en cours (identity) afficher le nom de l'utilisateur en cours (login name) lister les dernières connexions des utilisateurs lister la dernière connexion de tous les utilisateurs (last login) lister les informations sur les utilisateurs connectés lister les utilisateurs connectés changer de compte utilisateur (switch user) changer le mot de passe dans «/etc/passwd» ou «/etc/shadow» (password) modifier les paramètres de compte d'un utilisateur (user modification) changer les informations d'âges des mots de passe (change age) ajouter un nouvel utilisateur afficher les groupes de l'utilisateur ajouter un groupe dans “/etc/group” modifier le nom et le GID d'un groupe changer de groupe principal (switch group) changer le groupe propriétaire d'un ou de plusieurs fichiers La Console !© par Patrick Hautrive !;~) 2010 19 Les commandes d'information sur les fichiers man info apropos locate whereis find file ulimit umask stat lsof lsattr chattr hd shred rpm dpkg aptcache aptadd aptget lp lpq cups afficher l'aide en ligne sur les commandes (manual) afficher l'aide en ligne complète sur les commandes (information) afficher les informations à propos du nom de la commande passé en paramètre afficher les chemins des fichiers correspondants au motif passé en paramètre afficher le chemin absolu d'une commande rechercher un fichier dans l'arborescence afficher le type de fichier passé en paramètre grâcee au magic number afficher les limites quantitatives d'utilisation (bash builtin) afficher le masque des permissions pour les nouveaux fichiers (bash builtin) afficher les statuts des fichiers ou du système de fichiers (status) lister les fichiers ouverts (list open files) lister les attributs des fichiers (list attributes) changer les attributs d'un fichier (change attributs) afficher le contenu d'un fichier binaire (hexa dump) supprimer définitivement le contenu d'un fichier gérer les packages au format rpm (red hat package manager) gérer les packages au format deb (debian package manager) interroger la base de données des packages debian ajouter une source de packages Debian dans «/etc/apt/sources.list» installer et désinstaller les packages debian (advanced packet tool) envoyer un fichier à l'impression (line printer) gérer la file d'attente d'une imprimante (line printer queue) gérer le système d'impression (common unix printing system) Les commandes de manipulation des fichiers grep diff uniq sort wc patch awk sed tr cut col groff expand unexpand pour sélectionner des lignes contenants une occurrence dans un fichier pour comparer deux fichiers ligne à ligne (differences) pour écarter les doublons à l'intérieur d'une liste pour classer des listes de lignes dans un ordre alphanumérique pour compter les lignes, les mots ou les caractères (word count) pour insérer des mises à jour dans un fichier pour manipuler et formater des expressions avec un langage de programmation pour d'extraire ou de remplacer des motifs un flux de texte (stream editor) pour traduire un caractère ou l'effacer (translate) pour sélectionner une colonne dans une ligne en fonction d'un séparateur connu pour renverser l'ordre d'un flux pour formater un flux de sortie pour convertir les tabulations en espace pour convertir les espaces en tabulation La Console !© par Patrick Hautrive !;~) 2010 20 Les commandes de gestion du réseau ifconfig route ping host exports ssh rsync wget ftp tcpdump inetd2xinetd afficher la configuration des interfaces réseaux afficher la table de routage du noyau demander une réponse de la part d'un hôte sur le même réseau interroger un serveur de noms de domaine ou DNS (Domain Name Service) partager un système de fichiers sur un réseau NFS (Network File System) demander une connexion distante sécurisée à un serveur (secure shell) copier des fichiers en mode sécurisé sur un autre serveur (remote synchronisation) télécharger des fichiers depuis internet demander une connexion pour transférer des fichiers (file transfer protocol) afficher les paquets tcp passant sur le réseau changer de super serveur internet (tcp wrapper) Les commandes de gestion du système de fichiers rdev mount umount fdisk fsck mkfs tune2fs hdparm df du sync afficher la partition racine du système de fichier (root device) afficher les systèmes de fichier qui sont montés dans l'arborescence principale démonter les systèmes de fichier qui sont montés afficher la table des partitions d'un périphérique passé en paramètre vérifier le système de fichier (file system check) créer un système de fichier sur une partition (make file system) ajuster les paramètres d'un système de fichiers ext2 (tune file system) paramétrer la géométrie d'un disque (hard disk parameters) afficher l'occupation de l'espace de stockage (disk free) afficher la taille des fichiers (disk usage) forcer l'écriture des tampons sur le disque (synchronisation) Les commandes d'information sur le matériel free vmstat lspci lsusb lsmod tty stty setleds kbdrate eject afficher l'occupation de la mémoire et de la partition de swap afficher les statistiques de la pagination (virtual statistics) lister les chipsets branchés au bus PCI de la carte mère (list pci) lister les périphériques USB (list usb) lister les modules (list modules) affiche le chemin du périphérique pour le terminal en cours (terminal type) affiche les capacités du terminal en cours afficher la configuration des lumières du clavier affiche la rapidité de transmission des codes du clavier (keyboard rate) ouvrir le tiroir d'un lecteur de cdrom La Console !© par Patrick Hautrive !;~) 2010 21 Les appels systèmes Les appels systèmes (system calls) du noyau sont les fonctions qui remplissent toutes les tâches à l'intérieur du système d'exploitation. La commande “strace” permet de suivre les appels systèmes d'un programme. Les appels systèmes exec() fork() read () write () wait () return () open() listen () receive () send () La Console !© par Patrick Hautrive !;~) 2010 22 DESKTOP L'interface graphique L'interface graphique n'est pas indispensable pour se servir d'un système Gnu Linux. L'interface graphique n'est généralement pas installée dans le cadre d'un système dédié à l'usage d'une application serveur. Une interface graphique se compose de plusieurs éléments et fonctionne en mode client serveur. Le serveur graphique s'occupe de l'affichage des fenêtres des clients sur l'écran. Les clients graphiques sont toutes les applications développées selon ce mode. Un environnement graphique complet est constitué du serveur (/usr/X11R6/bin/X), d'un gestionnaire de session pour la connexion des utilisateurs (login manager), d'un gestionnaire de fenêtres (window manager) pour gérer le pointeur de la souris et le placement des fenêtres actives, d'un gestionnaire d'affichage (display manager) pour personnaliser et uniformiser tous les éléments du bureau sous une même charte graphique, comme les couleurs, la taille et l'aspect des fenêtres, des boutons, des icônes, des barres, des ascenseurs et des autres menus, et enfin d'applications clientes qui seront plus ou moins intégrées au bureau (desktop). L'interface graphique Graphical Environment = X Server + Session + Window + Display + Desktop + X Clients Les bureaux intégrés Les deux principaux environnements de travail graphiques sont Gnome et Kde. Ces deux bureaux n'utilisent pas les même bibliothèques graphiques. Le bureau de Gnome emploi GTK qui a été distribué sous licence libre dès le départ, tandis que Kde se sert de QT qui était propriétaire et qui est devenu libre par la suite. Ces deux environnements gèrent le bureau, les icônes, les menus, et ils proposent chacun de nombreux outils propres. Il faut en choisir un selon ses gouts et ses préférences. Toute fois, un utilisateur de Gnome peut très bien se servir des applications de KDE, et vice versa. Ces deux bureaux sont des environnements intégrés, et ils requièrent quelques centaines de méga octet de mémoire vive pour un usage souple. Les autres interfaces graphiques sont beaucoup plus légères et moins gourmandes. La Console !© par Patrick Hautrive !;~) 2010 23 Les bureaux (Desktop) Les environnements graphiques intégrés Bibliothèques graphiques Le bureau Gnome Le bureau KDE Les environnements graphiques légers (GTK) (QT) Enlightenment Black Box WindowMaker SawFish TWM AfterStep FluxBox Le bureau Gnome Le bureau Gnome est un environnement graphique intégré et complet. La configuration du bureau Gnome man 1 gnome man 8 gnome gdm gdmchooser gnomewm gdmlogin gnomesession xsessionmanager default.session eog gconfigger gnomecontrolcenter gnomedesktopitemedit gnomedoc gnomepanel nautilus La Console !© par Patrick Hautrive !;~) 2010 24 FVWM INFORMATION Les sources d'information Les sources d'information et de téléchargement sont disponibles principalement sur Internet. L'on y trouve pléthore de sources, et il faut savoir chercher, trier et se méfier. Internet regorge d'information qu'il est possible de retrouver avec un bon moteur de recherche, et une bonne syntaxe pour la formulation de la requête. Les documentations, les images ISO (prêt à la gravure sur CDROM) et les archives des programmes (fichier compacté contenant le programme et sa documentation) sont abondamment disponibles sur Internet. Les librairies spécialisées et les magazines permettent de s'informer de l'actualité des Logiciels Libres. Les sites spécialisés dans Gnu Linux et les sites généralistes comme Wikipédia présentent de nombreuses informations accessibles avec un simple navigateur. Les serveurs USENET (news), l'abonnement aux listes de diffusion (mailing lists), la participation aux blogs, la collaboration à des sites de partage de contenu CMS (Content Management Software), constituent des moyens originaux pour participer aux débats de la communauté des Logiciels Libres. Les canaux (chanel) des serveurs IRC proposent quant à eux un dialogue en direct où il est recommandé de faire preuve de politesse (net nétiquette). Lors d'un téléchargement (download), il est important de vérifier l'adresse et la notoriété du site source, afin de s'assurer que les programmes sont bien les originaux et que le transfert de fichier s'est bien déroulé. Le calcul de la somme MD5 permet après un téléchargement de contrôler l'intégrité du fichier. La commande «md5sum» permet de générer une somme identifiant un fichier et d'en vérifier l'intégrité en comparant le résultat du calcul avec l'empreinte du fichier (fingerprint). Les cartes des Logiciels Libres La LSM (Linux Software Map) présente une carte des Logiciels Libres regroupés par fonctionnalité. Il n'existe pas un domaine d'activité qui ne soit pas couvert par les Logiciels Libres. De la bureautique à la conception assistée par ordinateur, de l'administration réseau à la conception graphique en trois dimensions, toutes les fonctions qui peuvent être remplies par un ordinateur, peuvent être réalisées à l'aide de Logiciels Libres. Les Logiciels Libres s'utilisent nativement sur un système Gnu Linux, mais de nombreuses applications populaires sont disponibles pour d'autres plateformes (Unix™, Windows™, Mac OS X). Une carte de LUG (Linux User Group) en France présente les associations régionales des utilisateurs de Gnu Linux. Ces associations proposent des réunions d'information, des install parties et une entraide précieuse pour les débutants qui souhaitent progresser rapidement dans l'apprentissage de Gnu Linux. La Console !© par Patrick Hautrive !;~) 2010 25 La documentation Chaque application peut présenter sa documentation, et chaque distribution peut présenter le système Gnu Linux. Les pages man qui s'affichent en ligne de commande sont le premier endroit pour chercher l'usage d'une commande et de ses options. La commande “man cmd” décrivent l'utilisation des programmes installés. Certaines page man ne sont plus “maintenues” que dans le format texinfo de la commande “info cmd”. La documentation HOWTO est une référence qui existe en de nombreuses langues et dans de nombreux format (TEXT, HTML, SGML, DOCBOOK, PDF, LATEX,...). Les FAQ (Frequently Ask Questions) et les METAFAQ sont de bons points de départ pour chercher une réponse à une question. Il est d'usage de chercher soimême une réponse avant de demander de l'aide, et de lire le manuel d'instruction (RTFM). Il est fréquent de trouver sur Internet “la” réponse que l'on cherche, parce qu'il est rare d'être le premier à se poser “la” question. Les pages man Les pages man sont généralement installées en même temps que le programme. Les pages man présentent une description succincte d'un programme ainsi que toutes ses options. Les pages man sont toutes formatées selon la même structure et présentées dans un afficheur en ligne de commande. Il existe des traductions dans de nombreuses langues. Les chapitres des page man NAME SYNOPSIS DESCRIPTION RETURN VALUE OVERVIEW DEFAULTS OPTIONS USAGE EXEMPLES FILES EXIT STATUS ERROR HANDLING ERRORS ENVIRONMENT DIAGNOSTICS HISTORY SECURITY CONFORMING TO AUTHOR REPORTING NOTES BUGS COPYRIGHT SEE ALSO La commande “man” représente la source d'information la plus directe pour connaitre l'utilisation d'une commande ou d'un fichier de configuration. La commande man s'emploie dans un terminal, et les pages man sont généralement automatiquement installées avec le programme. La commande “man man” permet de connaitre l'utilisation de l'aide en ligne, et la commande “man cmd” permet de connaître l'utilisation de la commande passée en paramètre. La touche “Q” du clavier permet de quitter l'afficheur et de revenir au prompt. Le programme “xman” montre l'arbre de toutes les man page disponibles. La Console !© par Patrick Hautrive !;~) 2010 26 Les sections des pages man Les pages man sont classées en 9 sections. Les sections permettent d'organiser les différents types d'information (commands, system, libraries, devices, formats, games, others, administration and kernel). Les différentes sections sont classées dans un ordre. Lors du lancement de la commande man, c'est la première occurrence correspondant à la recherche qui est affichée. L'ordre de recherche de ces sections peut être configuré. Le numéro de la section affichée par la page man est indiqué en haut de l'afficheur (pager). Par exemple, la commande “man 8 passwd” désigne explicitement d'afficher la page man des mots de passe de la huitième section. Les sections des pages man (man 8 cmd) 1 Commandes 2 Système 3 Bibliothèques 4 Fichiers spéciaux 5 Format de fichiers 6 Jeux 7 Autres 8 Administration 9 Noyau La configuration des pages man La configuration des pages man est immédiate, puisque les pages man sont automatiquement installées en même temps que le programme ou que le package. Les pages man sont reconstruites à partir de fichiers compressés, et elles sont généralement affichées en anglais, à moins que les traductions n'aient été également installées. La variable d'environnement MANPATH renseigne sur l'emplacement des pages man. La variable MANSECT permet de personnaliser l'ordre de recherche des sections des pages man. Des bases de données («mandb», «makewhatis» et «updatedb») permettent d'accélérer la recherche d'information. La Console !© par Patrick Hautrive !;~) 2010 27 La documentation en ligne de commande Commands man 1 man man k " " man a intro man k man man k passwd man f passwd man 7 undocumented man 7 man man 8 passwd man k man xman mandb manpath catman lexgrog info makewhatis updatedb locate slocate apropos whatis whereis whois set export Files /usr/man/ /usr/local/man/ /usr/share/man/ /usr/doc/ /usr/share/doc/ /usr/src/linux/Documentations /var/log/message /etc/man.conf /etc/manpath.config /usr/share/mandb/chconfig /var/cache/man/index.db /etc/whois.conf /etc/apt/sources.list Les commandes d'information La recherche d'information en ligne de commande La commande «catman» génère l'index des pages man («mandb»). La commande «makewhatis» construit l'index pour la commande «whatis». La commande «updatedb» scanne l'arborescence, classe et enregistre les chemins pour «locate». La commande «man 1 man» présente une description des pages man. La commande «man 7 man» présente le formatage des pages man avec l'outil «groff». La commande «man a intro» présente une description de l'utilisation de la ligne de commande. La commande «apropos» affiche toutes les lignes de SYNOPSIS qui contiennent le motif. La commande «whatis» montre les sections des pages man qui correspondent au motif. La commande «whereis» affiche les principaux chemins absolus qui contiennent le motif. La commande «locate» affiche tous les chemins absolus de l'arborescence qui contiennent le motif. La commande «whois» interroge un annuaire réseau pour s'informer sur les noms des serveurs. La commande «info info» présente l'utilisation de l'aide en ligne Textinfo, complète et intégrée. La commande «info coreutils» présente l'utilisation des commandes de base de Gnu Linux. La commande «aptcache search doc» interroge la base de données des packages Debian. La commande «aptcache show archive» affiche la description du package archive sous Debian. Les exemples de l'aide en ligne echo $MANPATH export MANPATH=”/usr/man:/usr/local/man” export MANSECT=”2:3:1:5:4:6:7:8:n:9” La Console !© par Patrick Hautrive !;~) 2010 28 set env MANPATH /usr/man /usr/local/man man man | less whatis printf man 3 printf man a intro ; man whatis info info | col b > info.txt info less ; whereis gcc La documentation Debian La distribution Debian propose de nombreuses documentations et traductions sur son site debian.org. Les cdroms d'installation et les miroirs de packages contiennent également un florilège de documentations que l'on peut installer sur un système Gnu Linux. La commande “aptcache search doc” répertorie les packages de documentations (dont la description comporte le motif «doc»). La commande “aptcache show archive” explicite l'utilisation du programme contenu dans l'archive. La documentation Debian docdebian doclinuxtext doclinuxhtml docdebianfr doclinuxfrtext debianinstallermanual debianreferencecommon debianreferenceen debianpolicy debianhistory ubuntudocs ubuntuquickguide docbase manpagesfr manpagesdev info linuxinfo texinfo juniordoc newbiedoc bashdoc linuxdoc debiandocsgml debmake dwww doxygen docbookutils dhelp docbookdefguide doc++ docgnomehig doccentral usermodelinuxdoc sysadminguide maintguide binutilsdoc bug developersreference hardenenvironment hardentools hardenclients hardendoc Les sites de documentation Documentation pathname.com linuxdoc.org fr.tldp.org audamooka.org metalab.unc.edu abcdrfc.free.fr rfc.editor.org gnulinux.com root66.net Guide framasoft.net traduc.org tutoriel.com commentcamarche.net linuxfromscratch.org formatsouverts.org freestandards.org linuxbase.org Help counter.li.org lealinux.org minet.net linuxcare.com ldh.datapower.com fr.lolix.org savannah.gnu.org missioncriticallinux.com La Console !© par Patrick Hautrive !;~) 2010 29 News toolinux.com theregister.co.uk linuxhq.com sans.org linuxsecurity.com Les sites d'information General Information Wikipédia Google Google Groups Howto Usenet News IRC Gopher Info Sheet Meta Faq Lug fr.wikipedia.org google.com/linux groups.google.com freenix.fr fr.comp.os.linux.* irc.freenode.net gopher.ens.fr eu.undernet.org faq.org ploug.eu.org Organisation w3c.org gnu.org fsf.org aful.org cnil.fr internic.net nic.fr april.org Association orbis.yale.edu net.guru.com Les sites de téléchargement Download ftp.lip6.fr kernel.org www.tucows.com linuxiso.org Paquetage slashdot.org freshmeat.net rpmfind.net sourceforge.net blackdown.org rpm.org linuxapps.com plf.zarb.com Distribution debian.org distrowatch.com rootlinux.org demolinux.org yellowdoglinux.com slackware.com redhat.com suze.com La Console !© par Patrick Hautrive !;~) 2010 30 Cdrom Live Tomsrtbt Knoppix Gnuwin Ubuntu Shynux Gentoo Slax Dlx Dsl Floppyfw Router Bitdefender Sme Trustx Linuxwar SOCIETY Les productions intellectuelles La production de données “intellectuelles” est généralement règlementée par les droits d'auteur. Les législations dépendent de chaque pays. A l'origine, l'objectif des droits d'auteur est de garantir un revenu aux auteurs (artistes, peintres, écrivains, compositeurs, découvreurs, inventeurs,...). Les logiciels sont des productions intellectuelles qui font parties des activités de service du secteur tertiaire de l'économie. Le mode de distribution d'une production intellectuelle dépend du choix de son auteur. Beaucoup d'artistes dans l'histoire culturelle des civilisations occidentales ont déplorés les conséquences catastrophiques des contraintes financières qui leur étaient imposées dans l'exercice de leur talent. Les auteurs de Logiciels Libres consentent librement de distribuer leur code source sous la licence Gnu GPL. Ils font ainsi partie de fait de la communauté des contributeurs, et profitent également de la mise en commun de ces ressources, soit dans le cadre d'une utilisation professionnelle (et là leurs compétences sont rémunérées), soit dans le cadre d'une utilisation privée. La distribution gratuite Les Logiciels Libres sont généralement d'accès gratuit, il suffit de les télécharger sur internet, sans contre venir au respect, ni de la licence Gnu GPL, ni des lois. Au contraire, l'esprit des Logiciels Libres et la communauté des contributeurs encouragent la copie et la distribution de leurs programmes. Toutefois, aucune restriction n'est stipulée quand à la vente, et certaines distributions commercialisent les modifications qu'elles apportent aux programmes en même temps que leurs compétences techniques et leur service après vente. La licence Gnu GPL est spécifique et se distingue des autres types de distribution par l'accès au code source. Le gratuiciel (freeware) est un mode de distribution gratuit, mais qui ne garantie pas nécessairement l'accès au code source. Le partagiciel (shareware) est un mode de distribution participatif. Les programmes sont distribués gratuitement, et une faible participation financière est demandée à postériori. Là aussi, il n'y a aucune garantie sur l'accès au code source. Le Domaine Publique est un mode de distribution “libre”. C'est un statut particulier qui concerne les œuvres intellectuelles d'un certain age. En France, les œuvres sont protégées par le droit d'auteur pendant les 70 premières années, ensuite, elles “tombent” dans le domaine public, ce qui permet à tous d'en avoir l'usage librement et respectueusement (les modifications caricaturales sont interdites par exemple). La Console !© par Patrick Hautrive !;~) 2010 31 Le mode de distribution Le choix d'un mode de distribution est stratégique pour une œuvre. La licence qui règlement la distribution et l'utilisation d'une production intellectuelle détermine l'univers dans lequel elle va évoluer (son mode de vie, son aura, et son entourage) et anticipe sur son cycle de vie et sa capacité d'intégration ou de mixité avec son environnement. De ce choix découle les contraintes juridiques, les intentions des intervenants, les perspectives commerciales. Par exemple, le code source du serveur graphique Xfree a été refermé par des sociétés commerciales, c'est pourquoi, la communauté a réagie en lançant le projet Xorg qui désormais équipe toutes les distributions de Gnu Linux. Le format MP3 est un format propriétaire dont les droits appartiennent à Thompson Multimédia, et cette société a fait valoir ses droits pour toucher des royalties sur les équipements permettant de lire ce format. La licence BSD est en quelque sorte “laxiste” ou “ultra libertaire” parce qu'elle permet de s'approprier le code et de le refermer, c'estàdire de le diffuser sous une autre licence, quel qu'elle soit. Il n'y a pas de continuité dans le temps, les contributions libres peuvent changer de licence. Un code sous licence BSD laisse la possibilité de se l'approprié, et peut n'être même plus accessibles par ceux la même qui ont contribué aux premières générations. Il est impossible de prouver juridiquement qu'un utilisateur a cliquer sur un bouton “j'accepte les termes de la licence”. Bien souvent même, rares sont les personnes qui prennent le temps de lire et de comprendre les tenants et les aboutissants d'un tel engagement. La plupart du temps, les licences propriétaires sont des décharges anticipées des responsabilités du producteur, et une acceptation présumée de la culpabilité des utilisateurs. La liberté de l'information La liberté de l'information est un pilier fondamental de la liberté. La liberté de penser, la liberté de s'informer, la liberté d'analyser et la liberté d'expression sont des caractéristiques essentielles de l'être humain. Le droit à la parole, le droit à l'écoute, le droit au silence, le droit au désaccord, et le droit de réponse sont des parties constituantes et indivisibles de cette liberté. La liberté de l'information présuppose également que l'information soit accessible, compréhensible, comparable, vérifiable, interprétable, critiquable et contestable. L'exercice de cette liberté nécessite de la curiosité, de la sensibilité, de l'intelligence, de la culture, de la réflexion, de l'organisation, des moyens, du temps, de la mémoire et de la vigilance, de la perspective et du recul. Les points de vues sont différents aussi parce personne n'a en tête les même informations. La liberté de l'information ne peut exister sans avoir un accès libre et transparent aux sources, aux contextes et aux techniques psychologiques et médiatiques. Enfin, la présentation, la réputation et La Console !© par Patrick Hautrive !;~) 2010 32 les intentions de l'informateur sont déterminantes dans le processus d'évaluation et d'intégration d'une information. L'internationalisation de l'information La tendance à la concentration des médias a été concomitante de l'internationalisation des échanges. La nature de l'information s'est bouleversée au 20ième siècle avec les techniques audio visuelles, numériques et informatiques qui sont de plus en plus complexes et de plus en plus couteuses. De nos jours son accélération, sa densité, et sa multiplicité rendent de plus en plus difficile son appréhension. Si une économie de l'information s'est construite, c'est qu'il y a un marché, un retour sur investissement, des profits attendus et des fortunes à amasser. Ainsi, le traitement de l'information n'a pu échapper à la prédation du capitalisme. Les réflexes et les habitudes ont étés analysés et confortées, les codes ont étés récupérés et détournés, le sens s'est perdu en cours de route, et les messages se sont parés d'un habillage qui est devenu le contenu même. La standardisation de l'information L'information se cache derrière une chatoyante et rassurante standardisation, qui n'est que la coquille vide d'une banale et hideuse uniformisation. Il y a un phénomène de privatisation, d'industrialisation, de marchandisation, de normalisation et de médicalisation de l'information. Les messages sont les même pour tous sous l'apparence d'une personnalisation. Le composé moléculaire de la pilule est identique, il nous reste encore pour quelque temps le choix de la couleur. Les gens sont considérés comme des clients à fidéliser, des cibles à verrouiller, des parts de marché à céder. Les produits sont présentés comme des valeurs d'appartenance et des signes de reconnaissance. D'ailleurs, le produit s'est d'abord transformé en emballage, et c'est le contrat qui maintenant prend sa place. L'entreprise capitaliste ne se suffit pas d'avoir des commandes et des clients, il lui faut un avenir planifié, et une croissance assurée. Et dans ces considérations financières de duration, la personne du client n'est pas vraiment prise ne compte. Les entreprises ne sont pas des assistantes sociales, elles travaillent à la marge pour des intérêts privés. La privatisation de l'information Pour atteindre ces objectifs, dictés par les investisseurs, l'entreprise est contrainte d'apporter des certitudes. Il lui faut se composer un profil affable, optimiste et paternaliste. Il lui faut échafauder ses meilleurs prévisions, minimiser ses risques et maximiser ses bénéfices. Derrière la satisfaction de sa clientèle, se cache la conservation de ses profits. En réalité, c'est sa rentabilité à elle qui lui est indispensable et dont elle doit rendre compte. Ainsi, presque mécaniquement, l'entreprise tente de sécuriser sa position, et de s'approprier un avenir La Console !© par Patrick Hautrive !;~) 2010 33 qui n'est pas le sien, mais celui d'individus qui juridiquement sont des personnalités distinctes. Nous n'achetons pas des services, nous vendons du temps de travail, sous la forme de crédits revolving, d'abonnements annuels, de cartes de membres, d'assurances à vie tout compris. Ne nous inquiétons pas, ce sont des professionnels, ils vont s'occuper de tout, c'est garanti, nous ne serons pas déçus. Une petite signature, et nous voilà parti espérant le meilleur et occultant le pire. Les engagements sont prévus sur le long terme pour profiter des économies d'échelle, et les pénalités de sortie sont dissuasives. Ensuite, quand le système pyramidal se fissure puis s'effondre, la facture privée est nationalisée. L'économie maffieuse de la drogue et de la prostitution est un modèle tellement performant. L'accès à l'information Et pourtant, la connaissance n'a jamais été aussi précise, aussi profonde et aussi diversifiée. L'homme universel, encyclopédique et omniscient du siècle des lumières laisse le flambeau aux spécialistes. Comme si le bon dictateur éclairé préférait désormais se dissimuler dans l'ombre. Les relations et les inter actions humaines sont «packagées» par les intermédiaires, les présentateurs, les représentants, les portes paroles et les avocats. L'avis de l'expert devient incontournable et c'est lui qui devient le responsable désigné. Les méandres, les lenteurs et les dysfonctionnements des administrations publiques sont jugés comme des maux nécessaires, qu'il faut pardonner avec une jovialité de bon aloi, et assumer avec une indulgence de rigueur. Certains profitent de cet éloignement cognitif pour se réfugier derrière cette apparente opacité. Les jargons deviennent méthodiques et folkloriques. Les discours deviennent rhétoriques et catégoriques. La circulation de l'information L'accès à l'information est bien sûr indispensable, mais aussi sa compréhension, parce que c'est la connaissance, la culture qui donne du sens à l'information. C'est la circulation de l'information, l'échange, le partage, la confrontation, et la liberté d'expression qui donne à l'information le statut de vérité consensuelle. La manipulation de l'information La masse critique de l'information, la place de la répétition dans la diffusion des messages, et les techniques subtiles de communication, de conditionnement, d'imprégnation et de sublimation sont largement supérieures aux capacités individuelles d'absorption, de perception, de sélection et de compréhension. Les cerveaux humains arrivent à saturation, et paraissent bien fragiles et vulnérables face au progrès de la machine. La Console !© par Patrick Hautrive !;~) 2010 34 La preuve symbolique de ce changement de paradigme fut apportée par la victoire de Deep Blue, la machine d'IBM, sur le champion des échecs Kasparov. Mais, il y a toujours quelqu'un derrière une machine. Ce n'est plus l'aiguille dans la botte de foin, mais l'aiguille dans une montagne d'aiguilles que chacun doit trouver pour s'y retrouver. Dans cette nouvelle société, tout le monde ne peut se prévaloir d'être un fakir, un lama, un avatar ou un gourou. La production d'information L'effort individuel qui cherche à se faire un point de vue indépendant représente un combat inégal avec les états, et plus encore avec les multinationales qui cherchent à imposer leur emprise et accroitre leur empire. Le public est devenu une masse indifférenciée, malléable, orientable, influençable, voire enfin amorphe et indifférente. L'information risque de devenir unilatérale, avec un seul producteur, un seul émetteur, un seul message, et une masse de consommateur. Le divertissement, le spectaculaire, la rumeur et le conforme viennent combler les besoins pulsionnels et remplacent les désirs d'apprendre et d'émancipation. Les satellites, les radars, les scanners, les systèmes experts, les aéroports, les centrales électriques, la monétique, la robotique, la domotique, les indices statistiques, les bases de données, les téléphones portables, les images virtuelles et les réseaux mondiaux participent de ce nouvel univers et de ces nouvelles formes d'échanges et de communication (numériques et nomades). Les particuliers doivent s'appropriés ces supports, ces codes et ces nouvelles techniques afin de ne pas être les dupes consentant, ni les victimes submergées par le «tsunami» de l'information. L'humanisation de l'information La production de l'information ne doit pas tomber sous les seuls critères de la rentabilisation et de la respectabilité. Les artistes ne sont plus les seuls à s'inquiéter de la censure. La créativité de la multitude doit faire face à la cupidité de quelques uns. L'information n'est pas seulement un atout stratégique ou un avantage économique, c'est avant tout la spécificité de la race humaine et du devenir de l'humanité. Les Logiciels Libres expriment cette volonté de libérer l'espace numérique. Ils représentent une contribution historique majeure pour qui souhaite s'approprier son propre espace informationnel, assurer son indépendance intellectuelle, et conserver un peu d'anonymat et de vie privée. Les réseaux sociaux manifestent cet effort collectif pour créer un autre monde, un monde participatif, communautaire, un autre monde que celui dans lequel certains privilégiés voudraient nous faire basculer pour toujours. La Console !© par Patrick Hautrive !;~) 2010 35 La qualité de l'information Le Copy Left est un jeu de mot avec l'expression anglophone de Copy Right, et peut se traduire en français par “gauche d'auteur”. Le Copy Left assure la pérennité de la liberté sur toute les générations de code qui suivent. Une copie des Logiciels Libres est laissée à la disposition des générations futures. Ainsi, un code source libre peut le rester. Il est bien sûr question de liberté , mais il est surtout question de qualité. En effet, seul l'accès au code source permet de vérifier les fonctionnalités réelles d'un programme, et seule la possibilité de le transformer librement permet véritablement de l'améliorer. La liberté ou la qualité de l'information, c'est un choix quotidien, un mode de vie, c'est une véritable qualité de vie, peutêtre même une morale de la vérité. La société de l'information La science a de tout temps progressé à partir des avancées de précurseurs, et la culture n'est que le fruit des échanges volontaires entre personnes. Le progrès et la richesse intellectuelle ne peuvent se concevoir sans la libre circulation de l'information. Aujourd'hui, la société industrielle se transforme en société de l'information. C'est donc du type de société que nous voulons dont il s'agit. Les Logiciels Libres sont le bien et la responsabilité des citoyens du monde. Les Logiciels Libres sont une affaire sociétale, et ils constituent la clé de voute de la liberté numérique. D'ailleurs, le système Gnu Linux fait l'objet d'une demande d'incorporation au patrimoine intellectuel mondial déclaré par l'Unesco. La Console !© par Patrick Hautrive !;~) 2010 36 GNUGPL La licence Gnu GPL Quatre libertés sont garanties par la licence Gnu GPL (General Public Licence). La licence Gnu GPL (General Public Licence) (fsf.org) (gnu.org) 1.La liberté d'utilisation et d'exécution des Logiciels Libres 2.La liberté d'étudier le code source des Logiciels Libres 3.La liberté d'adapter le code source des Logiciels Libres 4.La liberté de redistribuer ses modifications sous licence Gnu GPL execute read write sticky bit Il n'y a pas d'obligation concernant un éventuel prix de vente. Ce qui est essentiel et principal dans un Logiciel Libre, c'est l'accès au code source, non pas l'aspect monétaire qui est laissé à la responsabilité de chacun. Les termes de la licence sont disponibles à cette adresse: http://www.gnu.org/copyleft/gpl.html La licence Gnu GPL version 2 sur un système Gnu Linux: “/usr/share/commonlicenses/GPL2” “Free as freedom” La quatrième liberté est en fait une obligation, elle est qualifiée de “contaminante”, parce que tout programme utilisant du code sous licence Gnu GPL doit obligatoirement être distribué sous une licence garantissant ces quatre libertés. C'est cette quatrième liberté qui donne au travail collaboratif la valeur d'un travail communautaire. Ainsi les programmes sous licence Gnu GPL participent à l'accumulation du fond commun, et ne peuvent pas être “récupérés”. C'est cette quatrième liberté qui manque à la licence BSD. Cette différence est un parti pris stratégique, elle ne sépare pas les deux types de licence qui sont toutes les deux fondamentalement “libres”, mais elle instaure une contrainte qui n'est pas négligeable. Ce point est primordiale quand l'on considère la production des Logiciels Libres sur le long terme. Free to be “Free to be” “Free to change” “Free to use” “Free to make” “Free to have” “Free to give” “Free to stay” “Free to go” “Free to say” “Free to share” La Console !© par Patrick Hautrive !;~) 2010 37 Les licences “libres” Les licences dîtes “libres” sont compatibles entre elles et garantissent l'accès au code source (les trois premières libertés). Le site de la Free Software Foundation conserve une liste de toutes les licences compatibles et livre les explications complètes sur ces points juridiques et philosophiques. Les diverses licences “libres” matérialisent la convergence et la communauté d'esprit des nombreux acteurs qui contribuent aux Logiciels Libres. Les licences «libres» Le Domaine Public (propose un accès libre, mais sans droit de modification) X Consortium Artistic Creative Common BSD (sauf la quatrième liberté sur la conservation de la licence) Gnu GPL (Garanted Public for Life) Lesser GPL Mozilla Copy Left MPL QPL Libpng Zlib MIT Free Music Public Licence Le modèle économique Le modèle économique des Logiciels Libres est différent des autres modèles économiques générateurs de profits. La séparation n'est plus entre ceux qui possèdent (qui en ont les moyens monétaires) et ceux qui ne possèdent pas, mais entre ceux qui savent (qui ont pris le temps d'acquérir la connaissance) et ceux qui ne savent pas. L'acte de payer et celui d'étudier ne reposent pas sur les même pré requis. Avoir et savoir représentent des privilèges fondamentaux et fondamentalement différents. Et ce changement de perspective n'est que la conséquence de la libre circulation de l'information qui va bien audelà de la libre accumulation des capitaux. La matière de la planète et la connaissance de l'espèce humaine sont le bien de tous, la responsabilité de chacun, et en principe, n'appartiennent à personne. La propriété n'est qu'un critère d'organisation pour hiérarchiser les individus d'une société. Cette “loi” ou cette “valeur” a été instaurée par ceux qui se sont arrogé ce droit par la force, et qui se sont appropriés les ressources communes pour accroitre leur bien être et renforcer leur puissance. Cette règle est devenue la contrainte, le conditionnement dont se serve les générations de nantis pour imposer leur volonté aux autres. “Il n'y a de richesse que La Console !© par Patrick Hautrive !;~) 2010 38 d'hommes”. L'histoire du monde en récapitule les péripéties. Cette frontière est devenue petit à petit un mode de vie, un mode de pensé, une motivation première et une civilisation. Le modèle économique des Logiciels Libres est basé sur l'accès au code source, la mise en commun des ressources et la mutualisation des efforts et des résultats. Les Logiciels Libres sont le fruit d'un travail de collaboration, chacun contribue, et la production constitue le bien communautaire. C'est cette contrainte (la redistribution et le partage) qui devient un avantage économique par la masse et la diversité des contributions qui profitent à toute la communauté. Qualifiés également d'”économie du don”, les Logiciels Libres bénéficient des qualités qui découlent des libertés qu'ils garantissent. Les Logiciels Libres sont libres d'accès, mais les compétences pour les mettre en œuvre sont rétribuées. Les avantages de la liberté Il est intéressant d'approfondir sa propre réflexion sur les avantages de la liberté et de la transparence. Les avantages de la liberté et de la transparence La continuation de la chaine numérique (générations) et la portabilité (plateformes). La coopération, le partage et l'émulation, et la reconnaissance du mérite par la communauté. La transparence et l'indépendance et donc la qualité et la pérennité de l'accès du code source. Les faibles couts de production et d'utilisation, et la mutualisation des couts de maintenance. La souplesse et la réactivité de la communauté pour diffuser les améliorations ou les correctifs. La créativité dans la production et la dans la réalisation d'idées individuelles ou collectives. La connaissance exacte des algorithmes, des protocoles et des formats de fichiers. La décentralisation des acteurs et la centralisation des ressources avec internet. La pluralité de la production de code sans contrainte, sans hiérarchie, sans compromis. La récupération d'un code préexistant pour lancer un projet dans une nouvelle direction (fork). La prise de conscience d'appartenir à une communauté pour le bien du plus grand nombre. La Console !© par Patrick Hautrive !;~) 2010 39 STRATEGY Les stratégies d'installation Quand l'on commence à s'intéresser aux Logiciels Libres et au système Gnu Linux, il est recommandé de le faire progressivement. Comme tout est accessible, il est facile de se laisser submerger par la diversité et la complexité. Les Logiciels Libres peuvent se téléchargés gratuitement depuis internet sous différentes formes. Il y a les programmes compilés pour Windows™, les cdrom live et les cdroms d'installation. Les stratégies d'installation des Logiciels Libres (framasoft.net) Free software CDROM live FreeOS, WinLibre Images ISO, USB Multi boot Grub, Ubuntu Dedicate Debian, Red Hat Virtual [Gnu Linux[Linux]] Les autres plateformes De nombreux Logiciels Libres sont disponibles pour d'autres plateformes comme Windows™ ou Macintosh™ ou *BSD, et ils représentent un bon moyen pour se familiariser avec la communauté du “libre”. D'autan plus qu'ils sont très compétitifs, tant du point de vue des fonctionnalités que du prix. Les Logiciels Libres ne placent pas en porte à faux les utilisateurs qui téléchargent illégalement des versions pirates des programmes qui n'ont pas les moyens d'acheter. L'installation de Logiciels Libres disponibles pour d'autres plateformes que Gnu Linux est facile. La plupart des sites dédiés au développement d'un Logiciel Libre proposent des versions compilées pour, entre autres, les API win32, et ils sont téléchargeables sous la forme d'exécutable («.exe») qui automatisent l'installation. De nombreux sites proposent une version de leur application compatible avec Windows™. Des compilations de Logiciels Libres pour Windows™, téléchargeable en image ISO sont disponibles en français sur internet (Bureau FreeOS, WinLibre). Ces compilations se téléchargent, puis se gravent sur un CDROM vierge à l'aide d'un graveur et d'un logiciel de gravure. Des outils de gravure libres pour Windows™ sont également téléchargeables sur Internet. Certains sites comme framasoft.net présentent les Logiciels Libres et proposent des liens vers les programmes et les images. Les CDROM live Les CDROM live permettent d'avoir un aperçu des fonctionnalités d'un système Gnu Linux sans rien installer et donc sans danger d'écraser quoi que ce soit sur un autre système. Les images ISO de CD ROM live sont également téléchargeable depuis internet. Certains magazines spécialisés proposent La Console !© par Patrick Hautrive !;~) 2010 40 régulièrement des galettes inclues dans l'édition papier. L'installation en mémoire avec un CDROM live permet d'essayer une distribution sans toucher au disque dur. En plaçant un CDROM live dans le lecteur et en choisissant dans le BIOS le lecteur comme prioritaire au démarrage. Le système Gnu Linux se charge en mémoire vive ainsi que les applications utilisées. Une clé USB, par exemple, permet de sauvegarder les fichiers sur un support externe. Il suffit de rebooter sans le CDROM live pour retrouver le démarrage du système installé sur le disque dur. Le multi boot L'installation d'un système Gnu Linux sur le même disque dur ou sur un disque dur séparé constitue l'étape logique suivante. L'installation en multi boot permet de pouvoir passer d'un système à l'autre, et d'opérer un transfert progressif des habitudes et des fichiers. Le système Gnu Linux reconnait en lecture et en écriture les partitions et les systèmes de fichiers des autres systèmes d'exploitation (comme Windows™ ou Macintosh™, mais la réciproque n'est pas toujours valable). L'installation en multi boot permet de passer d'une installation à une autre en partageant le disque dur. Plusieurs systèmes sont alors installés successivement sur le ou les disques durs. Un gestionnaire de démarrage (boot manager) propose lors du démarrage de la machine le choix d'un des systèmes sous la forme d'un menu. Les différents systèmes sont installés sur des partitions différentes du ou des disques durs. Le secteur de boot du premier disque dur (MBR) est lu et exécuté par le BIOS. Le code du MBR (Master Boot Record) permet de charger en mémoire le gestionnaire de boot (Boot Loader). L'installation dédiée L'installation classique permet de réserver tout le disque dur pour Gnu Linux. Un seul système est installé, et celuici est chargé en mémoire au démarrage directement depuis le disque dur. L'installation dédiée peut ou non comportée le serveur graphique (X window). L'installation virtuelle L'installation virtuelle requiert l'installation d'une application de virtualisation sur le système principal (qui peut être Gnu Linux, Windows™ ou Macintosh™ OS X), puis de l'installation des systèmes sur les espaces virtualisés. De nombreux systèmes Gnu Linux servent de socle pour faire tourner d'autres systèmes d'exploitation ou même d'autres systèmes Gnu Linux dans un espace robuste et stable. La virtualisation (virtual machine) simule ou émule le comportement d'un autre système d'exploitation. Une machine virtuelle est un espace dédié à un autre système qui tourne à l'intérieur mais de façon indépendante. La Console !© par Patrick Hautrive !;~) 2010 41 La reconnaissance matérielle La reconnaissance matérielle est un défi pour la communauté des Logiciels Libres parce qu'elle doit généralement fournir par elle même les pilotes qui vont fonctionner sous Gnu Linux, et ce pour tous les matériels. En général, c'est le fabriquant de matériel qui met à la disposition de sa clientèle le pilote pour son produit. La part de marché de Gnu Linux était très négligeable pour les fabricants grand public, aussi le développement de pilote pour Gnu Linux n'était pas une de leur priorité. Les fabricants ont longtemps considéré qu'il était dans leur intérêt de conserver le secret sur leurs innovations techniques notamment pour les cartes graphiques indispensables pour les jeux vidéos. De plus, le grand public était habitué à ne pas rencontrer ce genre de problème avec Windows™, parce que des accords commerciaux étaient conclus en amont, que les pilotes étaient intégrés la plupart du temps avec le système d'exploitation, et que le public n'avait pas le choix (les machines sont commercialisées d'office avec le système d'exploitation Windows™, ce qui caractérise une vente liée illégale). Pour la communauté des Logiciels Libres, la difficulté provenait de la non divulgation des spécifications techniques exactes de chaque matériel. Des ingénieurs en rétro ingeniering faisaient leur possible pour suivre la course à l'innovation et distribuer rapidement les pilotes fiables et complets compatibles Gnu Linux. Ainsi, la plus part des pilotes pour Gnu Linux étaient disponibles quelques mois après la sortie du matériel. Avec le succès de Gnu Linux dans les entreprises, dans les administrations et chez les particuliers, les fabricants prennent de plus en plus conscience de leur intérêt à développer également les pilotes qui feront fonctionner leur matériel sous Gnu Linux. L'abandon des ententes monopolistiques, des stratégies de clientélisme, des politiques de la vente forcée et des manœuvres de lobbyisme sont des avantages pour les clients finaux qui peuvent dès lors faire fonctionner une véritable concurrence et choisir librement leur système et leur matériel. De plus en plus de fabricant de matériel pourvoient à cette nécessite, mais l'accès au code source de ces pilotes n'est pas encore systématique. Des sites font l'inventaire des compatibilités et proposent des “pilotes libres”. Certains sites sont même spécialisés dans tel ou tel type de matériel. Toutefois, la vérification de la HCL (Hardware Compatibility List) n'est plus désormais aussi indispensable qu'auparavant, parce que désormais, la plus part des matériels sont reconnus et fonctionnent parfaitement sous Gnu Linux (et sans intervention de l'utilisateur qui dispose d'un système opérationnel complet dès l'achèvement de la procédure d'installation). La Console !© par Patrick Hautrive !;~) 2010 42 INSTALL L'installation de Gnu Linux L'installation de Gnu Linux est devenue au fil du temps de plus en plus facile et rapide, non seulement parce que les machines sont plus performantes et équipées de plus de mémoire vive, mais aussi parce que les procédures d'installation des programmes sont de plus en plus standardisées (installer) et parce que l'installation et la mise à jours des applications (packages) recourent à des miroirs sur internet. Les types d'installation Plusieurs types d'installation sont possibles afin de satisfaire le plus grand nombre de situations. L'installation d'un système Gnu Linux peut se faire par duplication d'une image disque (ghost), ou en passant par une procédure d'installation standard qui va reconnaitre et configurer le matériel, et qui va installer les programmes. La procédure d'installation standard peut se faire à partir d'une source locale ou d'une source distante. L'installation locale peut s'effectuer avec des disquettes, un CDROM d'installation ou une copie locale de ces fichiers. L'installation distante peut utiliser différents protocoles réseaux. Free Software Installation Gnu Software Gnu Linux System Binaries Sources Duplication Local win32 Mac Unix™ Ghost Floppy Cdrom Live Usb/Flash HTTP Network NFS FTP SMB La duplication La duplication d'installation consiste en une copie bit à bit d'une image d'un disque dur préinstallé (ghost). Cette procédure requiert de disposer de machines qui ont les même caractéristiques techniques afin de ne personnaliser que les adresses réseaux, par exemple. La duplication est une procédure qui n'effectue aucune configuration, mais qui permet, par exemple, de faire une réinstallation identique d'un même poste très rapidement. L'installation locale L'installation locale est la procédure d'installation standard d'un système Gnu Linux. La procédure d'installation peut être lancée au démarrage de la machine (boot) ou manuellement à partir d'un système en état opérationnel. Les sources locales peuvent être de différentes sortes, comme les disquettes, les Cdrom ou les DVD qui sont des images ISO qui peuvent être librement téléchargées sur Internet puis gravées, ou des supports comme des disques USB Flash Drive, ou une partition locale. La Console !© par Patrick Hautrive !;~) 2010 43 Les installations standards suivent la procédure mise en place par la distribution choisie. Les distributions définissent leur propre procédure (installer). L'installation réseaux L'installation à distance, via le réseau, qui requiert une pré configuration de l'interface réseau avec le pilote de la carte réseau, et le lancement d'un client réseau (netinstall). Une fois démarré le client d'installation va rechercher le serveur sur le réseau LAN (Local Area Network). Les serveurs peuvent véhiculer les fichiers à l'aide de différents protocoles réseaux (HTTP, NFS, FTP, SMB). Les installeurs des distributions Chaque distribution dispose de son outil d'installation (installer) et de ces propres procédures. Par exemple pour Debian, l'installation se poursuit au reboot suivant pour décompacter les applications. Tandis que Red Hat propose un outil de pré configuration (Kickstart) pour automatiser et personnaliser les installations. En général, un seul reboot est nécessaire pour l'installation, ce qui rend la procédure beaucoup plus simple et directe que sous d'autres systèmes. Les installeurs des distributions Linux Distribution Debian Red Hat Installer setup Anaconda Rules Kickstart La procédure d'installation Les installeurs procèdent à l'installation plus ou moins automatisée de tout le système d'exploitation. Chaque distribution suit une procédure qui lui est propre. La procédure d'installation passe en revue les étapes fondamentales que sont le mode d'installation, le chargement d'un noyau provisoire pour l'installation, la reconnaissance du matériel, la configuration de la langue et du pays, le partitionnement et le choix d'un système de fichier. l'installation d'un chargeur, la sélection et la copie des applications, et la configuration du réseau, du mot de passe root et de l'interface graphique. La Console !© par Patrick Hautrive !;~) 2010 44 Les étapes de la procédure d'installation d'un système Gnu Linux Le mode La langue (locales) Le pays (time zone) Les périphériques d'entrées (mouse) Le chargement d'un système Le partitionnement et formatage La sélection et la copie des applications L'installation du chargeur de démarrage La configuration du réseau La création du mot de passe root La création d'un utilisateur La configuration de l'interface graphique Le périphérique de sortie (écran) text fr latin loadkeys Europe Keyboard AZERTY (generic 105 touches) Liaison COM1 (/dev/cua0 ou /dev/ttyS0) Liaison COM2 (/dev/cua1 ou /dev/ttyS1) Le port PS/2 (mini DIN ronde sur /dev/psaux) kernel fdsik ext2 cp grub mbr ifconfig route passwd useradd gdm Le balayage horizontal (31.5 à 38 Khz) Le rafraichissement vertical (50 à 90 Hertz) Les modes d'installation Les différents modes d'installation sont plus ou moins complexes. Les modes d'installation d'un système Gnu Linux Le mode graphique (par défaut) Le mode texte (quand le serveur graphique n'est pas opérationnel) Le mode rescue (pour la maintenance, le MBR et le mot de passe ROOT) Le mode expert (procédure d'installation détaillée) Le mode ligne de commande (qui propose un prompt sur un shell de base) Les écrans F1 à F12 (qui affichent des pages d'aide et d'exemple) Le mode cdrom live (qui charge un système sans installation) Les outils d'installation Les outils d'installation d'un système Gnu Linux sont les outils standards que l'utilisateur retrouve une fois l'installation terminée. D'ailleurs, il est possible d'installer Linux, soit même, manuellement à partir La Console !© par Patrick Hautrive !;~) 2010 45 des packages originaux. La documentation LFS (Linux From Scratch) donne pas à pas la procédure à suivre. Et comme pour une installation «normale», l'utilisateur averti doit passer par les phases incontournables de toute installation, mais en ligne de commande et le tout en anglais. C'estàdire, charger un noyau provisoire (boot), partitionner le disque (fdisk), y installer un système de fichiers (mkfs), créer la partition d'échange (mkswap) et l'activer (swapon), créer les répertoires de l'arborescence (mkdir) et les fichiers spéciaux pour les périphériques (mknod), installer le chargeur de démarrage sur le secteur de boot (grub), copier les utilitaires, les outils de base (coreutils), les bibliothèques (libc6) et les dépendances (cp), décompresser les packages (tar) et les installer, dans le bon ordre, au bon endroit (mv) et avec les bonnes permissions (chmod), compiler un noyau (make), configurer les interfaces réseaux (ifconfig) et la passerelle par défaut (route), installer le serveur graphique (xorg) et le gestionnaire d'affichage (gdm), et enfin créer l'utilisateur root et lui administrer un mot de passe (passwd). Installation Tools Partitioning & File system fdisk cfdisk sfdisk Disk Druide Qparted Parted Partimage Partition Magic Paragen fdformat hdparm rdev dmesg mount umount fsck dd mkfs mke2fs mkfs.ext2 mkfs.ext3 mkfs.vfat mkreiserfs mkswap swapon swapoff Packages rpm rpmdrake urpmi up2date yum autorpm rpm2cpio gnorpm alien apt4rpm aptget dpkg emerge Journal /tmp/install.log /root/anaconda.ks.cfg /mnt/cdrom/images/boot.img /mnt/cdrom/images/bootnet.img /mnt/cdrom/images/rescue.img /var/log/installer/messages La Console !© par Patrick Hautrive !;~) 2010 46 PARTITION L'espace de stockage L'espace de stockage est le lieu ou seront enregistrées toutes les données du système, des applications et des utilisateurs. C'est un espace de mémoire qui conserve la valeur des bits après l'extinction de l'alimentation électrique. Cet espace peutêtre une disquette, une clef usb, un cdrom, un dvd ou un disque dur. Chacun de ces dispositifs possède des caractéristiques techniques qui lui sont spécifique (taille, capacité, vitesse, durée, énergie, fragilité, prix). Les disques durs sont les supports qui proposent les meilleures caractéristiques pour une utilisation intensive. La structure de partitionnement et les types de système de fichiers installés sur chaque partition sont enregistrés dans un tableau que l'on appèle une table de partition. Les supports peuvent être de plusieurs sortes (IDEATAPI, SATA, SCSI, USB, FLOPPY, FLASH DRIVE). L'organisation de l'espace Avant toute installation, le support qui reçoit les fichiers doit être préparé. Le disque dur doit être structuré en partitions, dans un premier temps, et dans un deuxième temps, la ou les partitions doivent être formatées. Le formatage est une procédure qui consiste à installer un système de fichier pour organiser l'espace de stockage. Les partitions sont aussi appelées des volumes ou des tranches (slice). Ainsi, deux phases distinctes se succèdent pendant la procédure de préparation d'un disque. La première concerne le disque dans son entier, c'est le partitionnement de l'espace de stockage du disque (partitioning) qui va créer la table de partition (partition table). La seconde phase concerne l'organisation logique de chacune des partitions du disque. Chaque partition sera formatée selon les règles d'un système de fichiers (file system) qui peut être différent d'une partition à l'autre. Tous les disques durs possèdent un secteur de boot, le MBR (Master Boot Record) qui est placé sur les 512 premiers octets du disque. C'est le MBR qui enregistre la table des partitions et le code pour le chargeur de démarrage. La gestion des volumes d'un disque peutêtre gérée par une couche logique supplémentaire qui virtualise l'espace de stockage comme le système LVM (Logical Volume Manager). La table des partitions La création de la table de partition du disque dur est la première phase de préparation d'un disque. L'espace de stockage est structuré logiquement en partitions, en cylindres, en secteurs et en bocks en fonction du nombre de tête de lecture du disque (heads), du nombre de plateaux, et des adresses physiques. La taille minimale d'une unité physique de stockage peut varier d'un disque à l'autre. La Console !© par Patrick Hautrive !;~) 2010 47 Chacune de ces unités constitue ensemble ce que l'on appèle la géométrie d'un disque. La table de partition d'un disque est enregistrée sur le MBR et dans d'autres secteurs du disque. Des copies de la table de partition sont stockées régulièrement sur d'autres secteurs du disque. Quand le secteur de boot d'un disque est endommagé, ces copies permettent un dernier recours pour réactiver la table de partition. Le formatage L'installation d'un système de fichier pour chaque partition est indispensable pour pouvoir écrire et lire des données sur le support. L'installation du système de fichier est le formatage proprement dit. L'installation d'un système de fichiers sur chaque partition permet de conditionner les partitions, qui sont dès lors prêtes à recevoir des fichiers. Chaque partition peut avoir son propre système de fichiers. Les fichiers systèmes et les programmes sont copiés sur une ou plusieurs partitions pendant la procédure d'installation. Le système Gnu Linux requiert au moins deux partitions, la partition de pagination (swap) et la partition système ou partition racine (root) qui accueille l'arborescence principale, et à partir de laquelle peut être montées d'autres partitions contenants d'autres systèmes de fichiers. Les types de partitions Un disque dur peut contenir différents types de partitions. Le disque peut être structuré avec plusieurs partitions primaires et une partition étendue qui contiendra une ou plusieurs partitions logiques. Les partitions primaires et les partitions logiques forment les partitions qui recevront un système de fichiers. Chacune de ces partitions est identifiée dans la table de partition par une adresse physique de début et de fin, et chacune comporte un secteur de boot. Les 512 premiers octets de la partition qui constituent le secteur de boot de la partition ou le PBR (Partition Boot Record). La commande «fdsik l /dev/hda» permet d'afficher la structure des partitions du premier disque maître du premier contrôleur de disque IDE (hard disk) et de connaitre les partitions actives qui sont marquées par un astérisque (boot flag). Les partitions actives indiquent au BIOS que des fichiers de démarrage s'y trouvent pour lancer le chargement d'un système. Partition table («fdisk l /dev/hda») Disk Boot Sector MBR (512 Octets) Loader (446) Table (64) Magic Number (2) Primary (1) Primary (2) Primary (3) PBR hda1 PBR hda2 Partition Active (*) Pagination File system (root) Swap (/) (/boot) PBR hda3 Mounting Ext2 /usr Primary (4) Extended (hda4) Logical Logical PBR hda5 PBR hda6 /home /var La Console !© par Patrick Hautrive !;~) 2010 48 Free space Les partitions primaires Les partitions primaires sont au nombre de quatre au maximum compte tenu de la taille fixe de 512 octets du MBR. Elles sont numérotées de 1 à 4. Au minimum, le disque dur doit contenir une partition primaire qui peut ou non occuper tout l'espace de stockage. L'une des partitions primaires est choisie comme la partition active du disque dur (spécifiée par la présence d'un drapeau (flag) dans la table de partition, et le secteur de boot (PBR) de celleci peut être lancé automatiquement par le BIOS. La partition active est aussi une partition système, c'estàdire qu'elle contient les fichiers d'un système d'exploitation qui sont chargés en mémoire lors du démarrage. La partition étendue La partition étendue correspond à l'une des partitions primaires. Celleci contiendra un certain nombre de partitions logiques. La partition étendue permet de dépasser la restriction des 4 partitions primaires et d'étendre le nombre maximum de partition sur un disque dur à 63. Les partitions logiques Les partitions logiques sont réparties à l'intérieur de l'espace délimité par la partition étendue. Les partitions logiques sont numérotées à partir du numéro d'ordre 5 et peuvent contenir indifféremment, comme toutes autres partitions, des fichiers systèmes, des applications ou des données. Le mode LBA Dans les anciens BIOS, prévalait une limite dans l'adressage de l'espace disque, et il était nécessaire d'installer les fichiers de boot (/boot) dans une partition séparée et située en dessous du 1024° cylindre (qui correspondait approximativement à 8 Giga Octets d'espace). La première partition de taille réduite, et proche du MBR, servait à accueillir les fichiers de boot. Le mode LBA permit de dépasser cette contrainte quand la taille des disques durs dépassèrent le Giga Octet. Les secteurs de boot Les disques et les partitions contiennent toutes un secteur de boot qui est constitué par les 512 premiers octets. Les secteurs de boot (boot sectors) sont les premiers secteurs correspondants, soit au disque (MBR), soit aux partitions sur ce disque (PBR). Les disquettes de boot contiennent également un secteur de boot. Le MBR (Master Boot Record) est le secteur de boot maître du disque. La taille du MBR est de 512 octets. L'espace du MBR contient, le code du chargeur de démarrage (446 octets), la table de La Console !© par Patrick Hautrive !;~) 2010 49 partition (64 octets) et le Magic Number AA55 (2 octets). Le PBR (Partition Boot Record) est le secteur de boot de chaque partition. La disquette de boot La disquette de démarrage (disquette de boot ou de réamorçage) est enregistrée pendant ou après l'installation. La disquette de boot peut être insérée lors du démarrage de la machine pour lancer un système. La configuration de la séquence de boot du BIOS doit être dans un ordre de recherche adéquat (1Floppy 2Cdrom 3HardDisk). Une disquette de boot contient un chargeur de démarrage et une copie de la table de partition, qui permettent de sélectionner une partition sur le disque et de lancer le chargement d'un système. La disquette de boot peut être utile quand l'on ne souhaite pas installer le chargeur sur le MBR et quand l'on procède à une maintenance. Des images préparées pour les disquettes 1,44 Mo (boot.img, bootnet.img et rescue.img) sont généralement disponibles sur les cdroms d'installation. Les cdroms d'installation permettent également d'accéder au disque et de procéder à des tâches administratives. Les disquettes de boot permettent de démarrer et de dépanner le système. La commande «mkboot» permet de créer une disquette de boot qui contient le noyau et la table de partition. Selon la place disponible, il est possible de rajouter des utilitaires sur une disquette de boot personnalisée. Des disquettes de dépannage préparées sont téléchargeables depuis Internet comme TOMSRBT (Tom Ocher's Root Boot Disk). Les partitions actives Une partition active est marquée par un drapeau, le «boot flag» qui indique au BIOS que des fichiers de démarrage s'y trouvent pour lancer le chargement d'un système. La commande «fdisk» permet de positionner les drapeaux de boot. Une partition active est souvent la partition système parce qu'elle contient les fichiers systèmes qui permettent le démarrage du système (boot) et son administration (tools). Toutefois, une partition active, peut n'être qu'une partition de boot. La partition de boot (/boot) peut ne contenir que les fichiers systèmes qui permettent le démarrage du système (l'image Ramdisk et le noyau). La partition racine de Gnu Linux est la partition qui contient la racine de l'arborescence des fichiers. La répartition du système La répartition du système en plusieurs partitions dépend du type d'utilisation de la machine (serveur ou poste de travail). En fait, cela dépend de l'activité et de l'évolution de certains répertoires. Un système de fichier est composé d'une seule racine, mais sur celleci peut se greffer plusieurs partitions selon les besoins. Dans ce cas, les espaces sont segmentés et chacun peut disposer de son propre système de La Console !© par Patrick Hautrive !;~) 2010 50 fichiers. Par exemple, un système peut requérir plusieurs espaces de swap parce que l'utilisation de la mémoire est très fluctuante. Un autre système peut exiger de séparer l'espace pour les binaires, parce que les mises à jour des applications sont très fréquentes. Un autre système peut être vulnérable si la partition contenant les fichiers temporaires et variables est amenée à stocker de grande quantité de fichiers, comme pour un serveur Internet ou un Proxy par exemple. Un autre système peut obligatoirement être construit de la même façon qu'un autre, parce que des procédures de réinstallation automatique sont prévues, que les machines sont dupliquées (ghost), ou parce que les postes sont standardisés. Enfin, un autre système peut comporter plusieurs partitions pour les utilisateurs, parce que ceuxci sont nombreux et que leurs données personnelles sont volumineuses. Les besoins dépendent des situations et des contraintes, et le rôle de l'administrateur est de choisir la configuration qui sera la plus adaptée et la plus conforme au budget alloué, aux performances attendues et au niveau de sécurité retenu (sachant que les besoins sont très rapidement exponentiels). La racine “/” (root) du système de fichier et ses points de montage Swap /boot /home /root /usr /etc /var /tmp La pagination sur une partition Le noyau (vmlinuz) et le chargeur de démarrage (grub ou lilo) Le répertoire des utilisateurs Le répertoire pour l'administrateur root qui réserve 5% de l'espace Le répertoire des programmes, utilitaires et outils Gnu Le répertoire des fichiers de configuration ASCII Le répertoire du serveur internet (httpd) et des journaux de bord (log) Le répertoire temporaire et commun à tous Les outils de partitionnement Les outils de partitionnement sont plus ou moins complexes, mais ils sont tous à manipuler avec précaution, parce qu'une erreur peut provoquer la perte de la table des partitions, ce qui rend très difficile par la suite l'accès aux données sur le disque dur! Ces outils permettent de supprimer le MBR, de lire la table des partitions, de formater le disque dur, de créer une partition supplémentaire, et éventuellement de modifier la taille ou la place des partitions (redimensionnement) sans détruire les fichiers qu'elles contiennent. Certains de ces outils sont propriétaires et commercialisés avec des versions d'évaluation. En général, le partitionnement d'un disque dur est effectuée une seule fois lors de l'installation du système ou lors de l'installation d'un nouveau disque dur. C'est pourquoi, il est nécessaire de prévoir à l'avance le nombre et la taille des partitions. La commande «fdisk» permet de partitionner un disque. La Console !© par Patrick Hautrive !;~) 2010 51 Sous Gnu Linux deux partitions sont au minimum nécessaires. La partition racine du système de fichier qui contient le système (root). La partition de swap (swap) qui permet de paginer la mémoire sur le disque dur. Le menu de la commande fdisk La commande «/sbin/fdisk /dev/hda» permet de partitionner le premier disque dur ATAPI (master) de la première nappe IDE. Un menu présente les différentes commandes internes de fdisk en appuyant sur la touche M. Le menu de la commande fdisk m p d q w n t a l menu print delete quit write new type active list v x verify extra (show this menu) (show partition table) (suppress the selected partition) (exit without saving changes) (changes the partition table) (create a new partition) (select the file system type) (mark the bootable flag for the partition) (show all the file system type) 83 for Linux Native 82 for Linux swap 85 for Linux extented (check the partition table) (show another expert menu) Un exemple de table de partition Voici un exemple de table de partition montrée avec fdisk. La Console !© par Patrick Hautrive !;~) 2010 52 Un exemple de table de partition (fdisk /dev/hda) Command (m for help): p Disk /dev/hda: 6495 MB, 6495068160 bytes 15 heads, 63 sectors/track, 13424 cylinders Units = cylinders of 945 * 512 = 483840 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 3184 1504408+ 6 FAT16 /dev/hda2 3185 3316 62370 82 Linux swap / Solaris /dev/hda3 * 3317 8483 2441406 83 Linux Partition 3 does not end on cylinder boundary. /dev/hda4 8484 13424 2334592 5 Extended /dev/hda5 10551 13424 1357933+ 83 Linux /dev/hda6 8484 10540 971901 83 Linux Partition table entries are not in disk order Les exemples de partitionnement mount a ; fdisk l fdisk /dev/hda mkswap c /dev/hda3 ; swapon /dev/hda3 mke2fs c /dev/hda2 ; mount av dd if=/mnt/cdrom/images/boot.img of=/dev/fd0 apropos disk e2fsck f b 8193 /dev/hda2 /sbin/dump2fs /dev/hda | more fsck /dev/hda lilo u vi /boot/grub/menu.lst vi /boot/grub/grub.cfg ls l /boot/vmlinuz2.6.105686 dmesg | head 1 Les outils sous Windows™ delpart.exe killhd.com msd.exe fdisk.exe /MBR dir X:\dosutils\autobat.bat X:\dosutils\raw.exe boot.img rawrite.exe D:\images\boot.img dir X:\dosutils\fips.exe La Console !© par Patrick Hautrive !;~) 2010 53 dir X:\dosutils\fips.doc Le redimensionnement avec fips.exe format A: /s cd X:\dosutils\fips.exe xcopy restorb.exe fips.exe error.txt A: attrib R H S C: scandisk defrag.exe delete (Fichier d'échange de Windows™) panel (Désactivation de la mémoire virtuelle) Ctrl + Alt + Del (Reboot) fips.exe La Console !© par Patrick Hautrive !;~) 2010 54 LOADER Le chargeur de démarrage Le chargeur de démarrage (boot loader) est un programme de petite taille qui permet de présenter, au démarrage de la machine, les différents systèmes installés sous la forme d'un menu. Quand la machine est mise sous tension, le BIOS de la carte mère procède à une vérification (POST), puis recherche et charge en mémoire les instructions et les informations du secteur de boot qui se présente en premier (1floppy, 2cdrom, 3disk). Le chargeur de démarrage peut être installé sur le MBR du disque, sur le secteur de boot de la partition système (PBR), ou bien sur une disquette de boot. Grâce à la table de partition, le chargeur connait les adresses physiques des différentes partitions du disque dur, et lesquelles sont actives. Ainsi, le chargeur peut présenter à l'utilisateur un menu, puis charger en mémoire les fichiers de démarrage de la partition système correspondant au système que l'utilisateur aura choisit. A chaque démarrage de la machine, l'utilisateur pourra choisir le système qu'il souhaite démarré. Le menu de démarrage Lors de la mise sous tension d'une machine, le chargeur de démarrage présente à l'utilisateur un écran avec un menu proposant en général tous les systèmes installés. En fait, le chargeur présente les entrées qui lui ont été indiquées. Une fois le choix validé, le chargeur lance les fichiers de démarrage du système (l'image Ramdisk ou le noyau). Parfois, deux menus correspondants à deux chargeurs différents se succèdent (chain loading). L'enchaînement des chargeurs Parfois, un chargeur principal présente un menu succinct qui permet de lancer un deuxième chargeur plus conséquent, c'est ce qui s'appèle l'enchaînement des chargeurs (chain loading). Ainsi, par exemple, le chargeur primaire (NTLOADER) peut être installé sur le MBR (pour des raisons de compatibilité avec un système Windows qui exige d'occuper le MBR), tandis que le chargeur secondaire (LILO) est installé sur le PBR. Les types de chargeurs Il existe de nombreux chargeurs différents et ils dépendent de la plateforme sous laquelle ils fonctionnent. Certains sont même des produits commercialisés pour combler les carences de certains éditeurs. Les chargeurs de démarrage comme Lilo (LInux LOader) et Grub (Grand Unified Boot manager) de Gnu Linux reconnaissent les partitions des autres systèmes d'exploitation, et proposent les entrées correspondantes dans les menus de démarrage, mais ce n'est pas forcément le cas pour les autres La Console !© par Patrick Hautrive !;~) 2010 55 gestionnaires de démarrage des autres systèmes d'exploitation qui excluent la présence des autres systèmes. Les types de chargeurs de démarrage (boot loader) Gnu Linux OS/2 Macintosh™ Windows™ Windows™ NT Lilo (Linux Loader) Grub (Grand Unified Boot Manager) Boot Manager XOSL Syscom.sys Syslinux Loadlin.exe System Commander BootMagic NTLOADER La Console !© par Patrick Hautrive !;~) 2010 56 BOOT La procédure d'initialisation d'un système Gnu Linux RESET BIOS POST BOOT LOADER RAMDISK KERNEL MODULES FILESYSTEM PROTOCOLS INIT SYSINIT RUNCOMMAND SINGLE MODE SERVICES LOCAL GETTY XWINDOW Alimentation Basic Input Output System Power On Self Test Le secteur de boot du disque (MBR) Le chargeur de démarrage et chaînage Le chargement de l'image disque Le noyau du système Les modules et pilotes du noyau Le système de fichiers racine (/) La pile réseau intégrée au noyau Le processus initial (PID=1) L'initialisation du système Les scripts d'initialisation (Initdefault) L'initialisation en mode single Les serveurs du niveau d'exécution INTERNET (wrapper tcpd) NETWORK (interfaces) HOSTNAME (DNS) MEMORY (/proc) HARDWARE (PCI, IDE, SCSI) DEVICES (/dev) CLOCK LIMITS PAGING BINARIES SYSLOGD POLICES Les initialisations locales spécifiques Les consoles virtuelles Ctrl+Alt+F1F6 LOGIN (prompt & authentification) SHELL (de connexion) Le serveur graphique Ctrl+Alt+F7 (X) Power Press Del or F2 (PROM on CMOS) Séquence de boot du Bios (1cdrom 2disk) Disquette de boot (floppy) Partition (PBR) (lilo grub) (initrd) (/boot/vmlinuz*) (kerneld kmod) fsck mount /etc/fstab Tcpip & Adsl (ppp ppoeppoa) /etc/inittab Ctrl+Alt+Del Powerfail /etc/init.d/rcS ==> /etc/rcS.d/* /etc/init.d/rc (runlevel)>/etc/rc5.d/[KS??]* /sbin/sulogin /etc/init.d/* (daemon) Le super démon internet (inetd xinetd) Le réseau (eth0 @ip netmask route gv) La machine (hostname /etc/host.conf) L'image de la mémoire (pseudo filesystem) La détection matérielle (hotplug) Les fichiers périphériques (MAKEDEV ) L'horloge système (date) Les restrictions (quota ulimit umask) La pagination de la mémoire (swap) Les chemins des exécutables ($PATH) Les fichiers journaux du système (/var/log) Les polices de caractère (fonts) /etc/rc.d/rc.local /etc/rc2.d/s99local Terminaux virtuels (/etc/tty) L'invite de connexion (/etc/passwd) L'interpréteur de commande (/bin/bash) startx xinit xinitrc xdm xmodmap xorg La Console !© par Patrick Hautrive !;~) 2010 57 La séquence de boot du BIOS Le menu de configuration du BIOS (setup menu) est accessible, selon les types de BIOS, en appuyant dès le démarrage sur la touche DEL ou F2. Le nom de la touche appropriée est indiqué sur le premier écran affiché. La séquence de boot du BIOS (ou séquence d'amorçage) peut être modifiée à l'intérieur du menu du BIOS. Une séquence conventionnelle va rechercher les secteurs de boot et la présence d'un chargeur de démarrage successivement dans le lecteur de disquette (floppy), le bus usb (usb), le lecteur de cdrom (cdrom) et enfin sur le disque master de la première nappe IDE (disk). Parfois, les menus du BIOS sont protégés par un mot de passe qui permet justement d'empêcher les utilisateurs d'en modifier les paramètres. La seule méthode pour contourner le mot de passe (qui peut être oublié) est d'enlever la pile sur la carte mère, afin de réinitialiser le BIOS. La séquence d'amorçage du BIOS BIOS Boot Sector Sequence (Press Del or F2) 1floppy 2usb 3cdrom 4disk Les nappes des disques durs Deux disques durs ATAPI peuvent être branchés sur la même nappe IDE (ou le cordon SATA), l'un est considéré comme le disque maitre et l'autre comme le disque esclave. Des cavaliers sur les disques ou à coté des contrôleurs de disques permettent de configurer la relation (auto, master, slave) des deux dispositifs sur la même nappe. Le disque master est prioritaire pour le contrôleur de disque, aussi les transferts de données (en lecture et en écriture) sont plus efficient, quand les deux disques sont installés comme master sur les deux nappes (par exemple pour un RAID 1 mirroring). Les disques SCSI sont branchés sur une chaîne SCSI de sept dispositifs qui doit être terminée par un bouchon (terminator), et qui est gérée par les contrôleurs SCSI. En général, une carte mère (mother board) présente deux contrôleurs de disques, et donc quatre disques peuvent être installés sur les deux nappes. Les cartes contrôleurs de disques supplémentaires sont branchées sur les bus PCI de la carte mère. Ces cartes d'extension sont disponibles sur le marché pour éventuellement augmenter la capacité de stockage. La procédure d'initialisation La séquence de boot ou procédure d'initialisation d'une machine peut suivre deux méthodes. Voici détaillées, les étapes du démarrage d'un système Gnu Linux. Ces étapes consistent en une succession d'exécution, de chargement en mémoire, de contrôle et d'affichage. Le résultat de toute cette procédure peut être vérifié dans des fichiers journaux et à l'aide de commandes. Les commandes «man 7 boot» et «man 7 bootscripts» présentent une description de la séquence de démarrage du système Gnu Linux. La Console !© par Patrick Hautrive !;~) 2010 58 La documentation HOWTO BOOT PROMPT détaille la procédure d'initialisation du système. Les méthodes ou les procédures d'initialisation du système La méthode établie par l'UNIX™ SYSTEM V d'AT&T La méthode établie pour les systèmes de la famille BSD La séquence d'initialisation est lancée par le chargeur de démarrage et se déroule exclusivement dans la Kernel Zone. C'est un pseudo processus de PID égal à zéro qui effectue le chargement du noyau et le montage de la racine du système de fichier. Ce pseudo processus s'appelle aussi le swapper (kswapd) ou processus noyau (kernel process). La commande «man 7 bootparam» décrit les options qui peuvent être passées au noyau avant le lancement de l'initialisation. La procédure d'initialisation du système Gnu Linux Bios Post Boot Loader Ramdisk Kernel Init Sysinit Services Internet getty passwd Window phœnix reset mbr grub initrd vmlinuz inittab sulogin syslogd xinetd login bash gdm Par exemple, la machine démarre, le BIOS charge le MBR qui charge GRUB qui charge l'image Ramdisk INITRD qui charge VMLINUZ qui lance INIT qui lance SYSINIT et le script RC, lesquels lancent les SERVICES dont le super serveur INTERNET et l'interface graphique X, et qui lance les consoles virtuelles TTY. Les séquences de boot réseaux sont utiles quand les postes ne disposent pas de leur propre disque dur. Ces séquences utilisent un protocole réseau pour recevoir une adresse IP et trouver le serveur qui leur enverra tous les fichiers d'initialisation (DHCP, TFTP, PXE, Etherboot). Le rescue boot avec un CDROM d'installation Le rescue boot avec un CDROM d'installation (chroot) Reboot Press F1 Rescue Prompt Shell fdisk l mkdir /mnt/hda5 mount /dev/hda5 /mnt/hda5 cat /mnt/hda5/etc/lilo.conf chroot /mnt/hda5 vi /etc/lilo.conf lilo reboot La Console !© par Patrick Hautrive !;~) 2010 59 les fichiers d'initialisation Les fichiers d'initialisation système Logging /etc/syslog.conf /etc/logrotate.conf /tmp/install.log /var/log/sulog /var/log/boot.msg (Suze) /var/log/boot.log (Red Hat) /var/log/dmesg (Debian) /var/log/message /boot/bootmsg.txt /proc/kmsg /var/log/installer/messages How to Boot Prompt Init /dev/initrd /etc/inittab /etc/init.d/rc /etc/rc.d/rc.local /etc/default/rcS /etc/initlog.conf /etc/init.d/netbase /etc/rc.d/rc.sysinit /etc/rc.config Network /etc/inetd.conf /etc/xinetd.conf /etc/services /etc/protocols /etc/hosts /etc/host.conf /etc/host.allow /etc/host.deny /etc/nsswitch.conf /etc/security /etc/network/interfaces Les exemples de boot ps pid 1 ls /etc/init.d ; ls /etc/rc* ls /etc/rc.d/init.d runlevel ; telinit 3 kill HUP 1 init 6 who r man 8 inetd ls la /etc/rc2.d/S20inetd ls la /etc/rc.d/rc5.d/S99local cat /etc/init.d/inetd | less ls /etc/rc.d/init.d/inetd ls /usr/sbin/in.fingerd ls /usr/sbin/in.ftpd ls /proc sh x rc.inet1 ntsysv level 23 rctab l man hosts_access /etc/init.d/networking restart /etc/rc.d/init.d/network restart La Console !© par Patrick Hautrive !;~) 2010 60 Environnement /etc/sysctl.conf /etc/fstab /etc/mtab /etc/modules.conf /etc/environment /etc/manpath.config /etc/locale.alias /etc/locale.gen /etc/gdm/locale.conf /etc/localtime /etc/timezone /etc/X11/xdm/xdm.config LILO Le chargeur LILO Le chargeur LILO (Linux Loader) peutêtre installé sur le MBR, sur le PBR de la partition système (racine) ou sur une disquette de démarrage. La commande «/sbin/lilo» permet de réécrire sur le MBR le code du chargeur quand le fichier de configuration «/etc/lilo.conf» a été modifié. La commande «lilo C /etc/lilo.conf» permet de spécifier le fichier de configuration. Lors du lancement du chargeur, les lettres «LILO» s'affichent progressivement à l'écran pour attester du bon déroulement de la procédure. Quand ce n'est pas le cas, certaines lettres seulement apparaissent, indiquant le type de difficultés rencontrées (LI signifie, par exemple, que la limite du 1024ième cylindre est atteinte). Ces codes erreurs sont documentés sur Internet. La configuration de LILO La configuration de LILO Files Commands /etc/lilo.conf /boot/lilo.conf /etc/lilo/lilo.conf /boot/map /boot/boot.b /boot/chain.b /boot/boot.0300 MAJOR+MINOR (MBRIDE) /boot/boot.0800 MAJOR+MINOR (MBRSCSI) /boot/boot.message.txt /boot/message /usr/share/doc/lilo*/doc/ lilo v t lilo b /dev/hda1 lilo C /etc/lilo.conf lilo u /dev/hda lilo r /mnt dd if=/boot/boot0300 of=/dev/hda bs=446 count=1 mkinitrd /boot/initrd.img L'invite de LILO Des options peuvent être passées au noyau lors du démarrage, à partir du prompt «liloboot». L'invite de paramétrage de lilo est présentée avec les touches Shift+Ctrl+Tab. Ces options peuvent également être renseignées dans le fichier de configuration de lilo. liloboot linux single liloboot linux 3 Pour démarrer en mode single. Pour démarrer dans le niveau 3 d'init. La Console !© par Patrick Hautrive !;~) 2010 61 liloboot rescue liloboot linux b emergency liloboot linux ether=10,0x210,eth0 liloboot linux verbose=5 liloboot mediacheck Pour démarrer en mode de dépannage avec un shell root. Pour démarrer en mode secours. Pour démarrer en paramétrant une carte réseau. Pour démarrer en affichant tous les messages. Pour vérifier l'état du cdrom d'installation (Red Hat). Les options de LILO Les options de lilo sont nombreuses, elles peuvent être renseignées à l'invite de lilo ou dans le fichier de configuration «/etc/lilo.conf». Les options de lilo (/etc/lilo.conf) et le prompt de lilo (liloboot) rw Pour monter un système de fichier en lecture/écriture (read write). ro Pour monter un système de fichier en lecture seule (readonly). mem=128M Pour fixer à 128 Méga Octet la mémoire vive (memory). append=«mem=128M» Pour fixer à 128 Méga Octet la mémoire vive (memory). append=«mem=130496K» Pour fixer à 128 Méga Octet la mémoire vive (memory). root=/dev/hda5 Pour indiquer la partition pour le système de fichier racine (root). boot=«/dev/hda2» Pour indiquer la partition système à activer. ether=9,0x300,0,1,eth0 Pour paramétrer la première carte réseau (IRQ, I/O,,, alias eth0). append=«ether=10,0x210,eth0 Pour paramétrer la première carte réseau (IRQ, I/O, alias eth0). append=«single» Pour démarrer en mode single user. append=«hd=683,16,38» Pour fixé les paramètres du disque (cylinders, heads, sectors). append=«hd=64,32,202» Pour fixé les paramètres du disque (cylinders, heads, sectors). password=«secret» Pour demander un mot de passe au démarrage. init=«/bin/bash» Pour lancer le shell Bash après le démarrage. append=«init=/bin/zsh» Pour lancer un shell Z après le démarrage. initrd= «/boot/initrd.img» Pour indiquer le fichier de l'image disque (initrd). ramdisk_size Pour fixer la taille de l'image disque (initrd). ramdisk=1024ko Pour fixer la taille de l'image disque (initrd). panic=30 Pour indiquer le niveau de panique debug Pour afficher les informations de débogage du démarrage. nosmp Pour désactiver le traitement parallèle multi processeurs. prompt Pour proposer l'invite liloboot. lba32 Pour gérer les disques de grande capacité. vga=normal Pour indiquer la capacité d'affichage. vga=extended Pour indiquer la capacité d'affichage. linear compact rescue verbose La Console !© par Patrick Hautrive !;~) 2010 62 Le fichier lilo.conf Le fichier «/etc/lilo.conf» est composé de deux parties, la première partie rassemble les options générales pour toutes les images, et la seconde partie est constituée des différentes images qui apparaîtrons dans le menu de démarrage. Un exemple de fichier de configuration de lilo (/etc/lilo.conf) boot install map timeout delay default message verbose password = = = = = = = = = /dev/hda /boot/boot.b /boot/map 100 20 linux /boot/message 5 «secret» image = = = = = = = /boot/vmlinuz2.4.2 linux /dev/hda5 ask /boot/initrd.img «devfs=mount» «verbose=5» = = = = /dev/hda1 windows /dev/hda /boot/chain.b label root vga initrd append append readonly other label table loader La Console !© par Patrick Hautrive !;~) 2010 63 GRUB Le chargeur GRUB Le chargeur GRUB (Grand Unified Boot Loader) est le chargeur de la génération suivante pour Gnu Linux. Écrit par Éric Boeym en 1995. Dans le cas d'une mise à jour, il est conseillé de prévoir la désinstallation de l'ancien Grub et de surtout de sauvegarder le fichier de configuration «/boot/grub/menu.1st». Le gestionnaire de démarrage Grub est compatible avec de nombreux systèmes de fichiers qu'il reconnait et propose spontanément dans son menu de démarrage (MSDOS, FAT16, FAT32, MINIX, EXT2, REISERFS, JFS, XFS, UFS) et il gère parfaitement le chainages des chargeurs. Enfin, Grub propose une invite de commandes interactives au démarrage qui permet de modifier la configuration avant l'initialisation du système (#grub + TAB). Les fichiers de configuration sont placés dans le répertoire «/boot/grub/*». Les numéros de volume identifiant les disques et les partitions commencent à partir de zéro. Les modifications apportées au fichier de configuration seront automatiquement prises en compte lors du prochain redémarrage de la machine. La correspondance entre les nomenclatures des périphériques des disques et celle de Grub /dev/hda1 == > hd0,0 /dev/hda2 == > hd0,1 /dev/hda3 == > hd0,2 La configuration de grub La configuration de grub s'effectue, soit en utilisant la commande «grub» qui présente l'invite de commande, soit en modifiant directement l'un des fichiers de configuration «/boot/grub/menu.1st» ou «/boot/grub/grub.conf». La Console !© par Patrick Hautrive !;~) 2010 64 La configuration de Grub Files /boot/grub/menu.1st /boot/grub/grub.conf /usr/share/doc/grub /usr/share/doc/grub/* */examples/menu.lst /boot/grub/stage1 /boot/grub/stage2 Prompt grub> help kernel (hd0,0) root (hd0,0) boot chainloader (hd0,0) +1 quit grubinstall /dev/hda Commands locate grub /sbin/grub updategrub grubinstall grubfloppy grubmd5crypt locate /grub/i386pc Installation tar xzvf grub0.5.96.1.tar.gz cd grub0.5.96.1 ./configure make make install updatedb cp /boot/vmlinuz /floppy/boot Le fichier grub.conf Le fichier de configuration est soit «/boot/grub/menu.1st» (lire l'extension first avec le chiffre un), soit «/boot/grub/grub.conf». Un exemple de fichier de configuration de Grub (/boot/grub/grub.conf) defaults 0 timeout 10 splashimage= (hd0,4) /boot/grub/splash.xpm.gz color white/blue blue/green # title linux root (hd0,4) kernel /boot/vmlinuz2.4 root=/dev/hda5 ro quiet splash devfs=nomount initrd /boot/initrd.img savedefault boot # title linuxinitrd root (hd0,0) kernel /boot/bzImage root=/dev/loop0 initrd=/initdisk.gz initrd /initdisk.gz # title Other operating systems: root title dos root (hd0,0) makeactive savedefault chainloader +1 La Console !© par Patrick Hautrive !;~) 2010 65 Un autre exemple de fichier de configuration de Grub (/boot/grub/grub.conf) # defaults 0 timeout 10 splashimage= (hd0,4) /boot/grub/splash.xpm.gz color white/blue blue/green # title linux root (hd0,4) kernel /boot/vmlinuz2.4 root=/dev/hda5 ro quiet splash devfs=nomount initrd /boot/initrd.img savedefault boot # title win98 hide (hd0,0) hide (hd0,1) unhide (hd0,2) hide (hd0,3) root (hd0,2) makeactive chainloader +1 # title windows2000 hide (hd0,0) hide (hd0,1) hide (hd0,2) unhide (hd0,3) root (hd0,3) makeactive chainloader +1 # title floppy root (fd0) chainloader +1 # Le prompt de Grub Le prompt de Grub («grub>») s'obtient dans un terminal virtuel en lançant la commande «grub» ou en pressant la touche C quand le menu du chargeur se présente à l'écran lors du démarrage du système. La Console !© par Patrick Hautrive !;~) 2010 66 Les commandes internes à Grub sont affichées en pressant la touche Tab ou à l'aide de la commande interne «grub> help –all». #La création d'une disquette de boot pour Windows avec Grub. reboot #Press C éditing the Grub command line hide (hd0,0) hide (hd0,1) #Insert Floppy for Boot chainloader (fd0) +1 reboot #L'installation de la partition Windows dans Grub reboot root (hd0,2) makeactive chainloader +1 boot reboot #L'installation du chargeur Grub sur le PBR après l'installation d'un nouveau Gnu Linux reboot Press C for the Grub prompt root (hd0,4) kernel /boot/vmlinz2.4.19 root=/dev/hda5 boot quit reboot #Reboot sur l'ancien Gnu Linux pour modifier le fichier de configuration «/boot/grub/menu.1st». vi /boot/grub/menu.1st title linuxnew root (hd0,4) kernel /boot/vmlinuz2.4.19 root=/dev/hda5 ro quiet chainloader (hd0,4) +1 La disquette stage de Grub Le «stage1» correspond au secteur de boot de la disquette (les 512 premiers octets) et le «stage2» s'installe à la suite pour constituer une disquette de boot avec une image préparée. Les «stages» sont aussi présent dans le répertoire de démarrage de Grub «/boot/grub/stage1» et «/boot/grub/stage1». La commande «setup» de Grub installe le chargeur sur le MBR. La Console !© par Patrick Hautrive !;~) 2010 67 locate /grub/i386pc cd /lib/grub/i386pc hd /boot/grub/stage2|less dd if=stage1 of=/dev/fd0 bs=512 count=1 dd if=stage2 of=/dev/fd0 bs=512 seek=1 reboot grub help –all find /boot/grub/stage1 root (hd0,0) setup (hd0) reboot fdisk l La disquette de boot de Grub La disquette de boot est créer, puis la configuration de Grub est replacé dans l'état initial. mke2fs /dev/fd0 mkdir /mnt/floppy ; mount /dev/fd0 /mnt/floppy mkdir p /mnt/floppy/boot/grub cp /lib/grub/i386pc/stage1 /mnt/floppy/boot/grub cp /lib/grub/i386pc/stage2 /mnt/floppy/boot/grub grub root (fd0) setup (fd0) quit reboot grub root (hd0,0) kernel /boot/vmlinuz root=dev/hda1 ro quiet boot quit La Console !© par Patrick Hautrive !;~) 2010 68 INITRD Le démarrage INITRD Le démarrage du système peut être accéléré en chargeant en mémoire une image disque (Ram Disk) contenant un noyau provisoire, une racine et les modules appropriés pour piloter les disques (SCSI) ou les systèmes de fichiers (EXT3). Le chargeur de démarrage est configuré pour retrouver sur le disque cette image et la charger en mémoire. C'est la procédure «initrd» (Init Ram Disk) qui ensuite charge en mémoire le véritable noyau et monte le véritable système de fichier et présente l'invite de connexion. Le démarrage du système avec Initrd une image disk en mémoire (Ram Disk) Le fichier spécial de périphérique «/dev/initrd». L'image initrd «/boot.initrd.img2.6.105686». La carte du système «/boot/System.map2.6.105686». La configuration des options de compilation pour le noyau «/boot/config2.6.105686». Le noyau Gnu Linux «/boot/vmlinuz2.6.105686». Le répertoire «/usr/share/initrdtools» rassemble des fichiers. La commande «mkinitrd» permet de créer l'image initrd avec «/etc/mkinitrd/mkinitrd.conf». La commande «mkcramfs» permet de créer un système de fichiers compressés pour la mémoire. Les fichiers pour initrd sont placés dans le répertoire de démarrage. Le Map Installer renseigne le chargeur sur les adresses physiques des blocs du disque. Ces adresses physiques dépendent de la géométrie et du partitionnement du disque. Les exemples initrd mkdir /ramdisk cat /etc/lilo.conf image=/boot/vmlinuz label=linuxramdisk ramdisk=60 ls l /dev/ram* mke2fs /dev/ram1 mount /dev/ram1 /ramdisk ; mount df /ramdisk La Console !© par Patrick Hautrive !;~) 2010 69 INITTAB Le pseudo processus Le processus init est lancé par le pseudo processus de PID zéro qui a pris la main après le chargeur de démarrage (grub) et qui a déjà chargé en mémoire les bases du système Gnu Linux, dont le noyau (vmlinuz), les modules et les pilotes intégrés au noyau (kmod), le système de fichier principal (root) et la pile de protocole réseau (tcpip). C'est donc le pseudo processus qui s'est occupé du chargement du noyau (kernel), et qui passe le relais en lançant le processus init pour la phase d'initialisation du système. Le processus init consulte son fichier de configuration “/etc/inittab” et poursuit l'installation et la configuration du système. L'initialisation du système L'initialisation du système utilise largement les scripts pour la configuration et le lancement d'exécutable. Tous les processus du système sont lancés à partir du processus “init” qui porte toujours le PID 1. Le processus “/sbin/init” est en quelque sorte le parent de tous les autres processus. Comme les processus enfants sont interrompus quand le processus parent qui les a générés est arrêté, si le processus “init” est stoppé, alors tous le système est stoppé. Selon les distributions, les scripts d'initialisation et les fichiers de configuration ne sont pas toujours placés au même endroit (/etc, /etc/init.d, /etc/rc.d ou /etc/rc.d/init.d), mais ils figurent toujours dans le répertoire de configuration (/etc). En effet, chaque distribution crée l'arborescence qui lui semble la plus appropriée, et souvent les fichiers ne sont que des liens symboliques vers d'autres fichiers dans d'autres répertoires. Le processus “init” Le processus init lance le script «sysinit» («/etc/init.d/rcS») qui lance les scripts systèmes («/etc/rcS.d/*»), puis, il lance éventuellement le mode single user (sulogin), ou les scripts Run Command correspondant au niveau d'initialisation, et enfin il lance la procédure de connexion (getty) qui présentera un prompt de login sur les terminaux virtuels (Ctrl+Alt+F1 à Ctrl+Alt+F6). Le fichier «/etc/inittab» définit le niveau d'initialisation (initdefault), la séquence de contrôle des touches Ctrl+Alt+Del qui renvoi à la commande «/sbin/shutdown», le comportement en cas de perte d'alimentation (power) et le basculement vers une éventuelle alimentation de secours (onduleur). La Console !© par Patrick Hautrive !;~) 2010 70 La procédure d'initialisation du système Gnu Linux init sysinit single run command services Ctrl+Alt+Del powerwait TTY /etc/inittab /etc/init.d/rcS /etc/init.d/rc powerfailnow getty initdefault /etc/rcS.d/* sulogin /etc/rc5.d/[KS]??* /etc/init.d/* sbin/shutdown powerokwait login Les méthodes inittab Les méthodes inittab permettent de configurer le comportement des commandes définis dans «/etc/inittab». Les méthodes sont placées dans la troisième colonne d'une ligne de configuration. Les méthodes du fichier /etc/inittab initdefault sysinit ctrlaltdel respawn once boot bootwait wait kbrequest powerfail powerwait powerokwait powerfailnow ondemande off Si la valeur est absente, le processus init demandera le niveau a appliquer La méthode pour lancer le script sysinit La méthode pour configurer le comportement des touches Ctrl+Alt+Del La commande est relancée quand celleci s'est terminée (prompt de login) La commande n'est exécuté qu'une seule fois à chaque initialisation La commande n'est exécuté qu'au démarrage du système La commande n'est exécuté qu'au démarrage et init attend le signal de fin La commande est exécuté et le processus père attend le signal de fin La commande qui permet de configurer certaines touches (Keyboard Magic Keys) La méthode pour envoyer le signal SIGPWR à init en cas de perte d'alimentation La méthode pour basculer l'alimentation sur un onduleur (UPS) La méthode pour rebasculé l'alimentation en mode normal Le fichier inittab Le fichier «/etc/inittab» est le fichier de configuration du processus init. Ce fichier fonctionne ligne à ligne, c'estàdire qu'à chaque ligne correspond une configuration. Les éléments d'une même ligne sont séparés par le caractère séparateur conventionnel du deux points («:»), déterminant ainsi des colonnes. Chaque colonne est constituée du même type de données. Dans la première colonne, un ou deux caractères forment un identifiant unique pour la ligne (identificator). Dans la deuxième colonne, les chiffres correspondent aux niveaux d'initialisation concernés (runlevel). Quand cette deuxième colonne est vide, cela signifie que tous les niveaux sont concernés par cette ligne. Dans la troisième colonne, figure les méthodes appliquées (method). Dans la La Console !© par Patrick Hautrive !;~) 2010 71 quatrième colonne s'inscrit éventuellement le chemin absolu de la commande (command). L'administrateur peut définir d'autres lignes de configuration, afin d'automatiser certaines tâches à chaque démarrage. La commande «telinit Q» permet une relecture du fichier «/etc/inittab». Le fichier /etc/inittab Identificator id si 0 c1 1 T1 ~~ l5 z6 ca cx pf pn po pr px ud x runlevel 3 S 0 12345 2345 23 S 5 6 12345 12345 12345 5 method initdefault sysinit wait respawn respawn respawn wait wait respawn ctrlaltdel ctrlaltdel powerwait powerfailnow powerokwait powerokwait powerfail once respawn command /etc/init.d/rcS /etc/rc.d/rc /sbin/mingetty tty1 /sbin/getty 38400 tty1 /sbin/getty L ttyS1 9600 vt10 /sbin/sulogin /etc/init.d/rc 5 /sbin/sulogin /sbin/shutdown t1 a r now /sbin/shutdown t3 Rf now /etc/init.d/powerfail start /etc/init.d/powerfail now /etc/init.d/powerfail stop /sbin/shutdown c /sbin/shutdonw h f +2 /sbin/update /etc/X11/prefdm Les niveaux d'exécution Le niveau d'initialisation (ou niveau d'exécution) est choisi au boot ou définit dans le fichier «/etc/inittab». La commande «runlevel» permet de connaitre le niveau en cours. Les commandes «init» et «telinit» permettent de changer le niveau d'initialisation, sans rebooter, alors que le système a déjà démarré. A chaque niveau correspond une certaine configuration du système et des services qui sont généralement des serveurs ou DAEMON (Disk And Execution Monitor). La configuration des niveaux d'initialisation peut changer d'une distribution à l'autre, mais en général, le niveau 0 est celui de l'arrêt du système (shutdown), le niveau 1 est dédié au dépannage (single), le niveau 5 est celui du mode graphique (xserver), et le niveau 6 celui du redémarrage de la machine La Console !© par Patrick Hautrive !;~) 2010 72 (reboot). Les niveaux 4, 7, 8 et 9 sont laissés libres pour la personnalisation de l'initialisation, et les niveaux correspondants à des lettres (S, s, a, b, c) sont des pseudo niveaux. Les niveaux d'initialisation (runlevel) /etc/inittab (initdefault) 0 1 2 3 4 5 6 7 8 9 S, s a b c shutdown single multiuser network Pour arrêter le système Pour démarrer en mode single user sans montage de file system (console) Pour démarrer en mode multi utilisateurs, mais sans le réseau (console) Pour démarrer en mode multi utilisateurs, mais avec le réseau (console) xwindow reboot Pour lancer le serveur graphique en mode multi utilisateur avec le réseaux Pour redémarrer la machine single Synonyme du niveau 1 pour démarrer en mode single user (console) Les exemples init uptime ; update ; runlevel updatedb ls /etc/init.d ; ls /etc/rcS.d ; ls /etc/rc5.d find /etc name "*boot*" find /etc name "*rc*" | less find /etc name "*S*" | less find /etc name "*K*"|less /etc/init.d/rc 2 init 2 telinit 2 chkconfig –list httpd start sysctl A telinit t 10 3 telinit Q grep ^id: /etc/inittab shutdown r 6 ; shutdown h now La Console !© par Patrick Hautrive !;~) 2010 73 SERVICES Le niveau d'initialisation Chaque niveau d'initialisation (1, 2, 3, 4, 5 ) est configuré pour lancer des scripts (Start ou Kill). Le script «rc» récupère le niveau d'initialisation (initdefault) et les noms des fichiers dans le répertoire d'initialisation correspondant (/etc/rc5.d/*), puis il lance les différents services qui s'y trouve dans l'ordre alphabétique. L'exécution du script «rc» conduit au lancement des services correspondants au niveau d'initialisation. Ainsi, à chaque niveau correspond une certaine configuration du système et des services (daemon). Selon le niveau d'initialisation, choisit au boot avec le prompt du chargeur ou paramétré dans le fichier «/etc/inittab», le système ne présentera pas les même caractéristiques, et certains services seront automatiquement lancés tandis que d'autres ne le seront pas. Les scripts d'initialisation Le comportement du processus “init” est défini dans le fichier “/etc/inittab” qui permet de configurer le niveau d'initialisation du système (runlevel). Le fichier «/etc/inittab», définit le lancement des scripts d'initialisation («sysinit», «rc» et «rc.local») qui vont s'occuper du chargement des différents services, et aussi, le lancement de la procédure de connexion de l'utilisateur au système. Les scripts d'initialisation sont aussi appelés les scripts RC (Scripts Run Command) parce que ce sont essentiellement des scripts qui permettent de sélectionner les commandes qui vont être lancées pour le niveau d'initialisation choisit. Parmi les différents services qui sont lancés par les scripts d'initialisation se trouvent éventuellement, le super serveur internet (inetd ou xinetd) et l'interface graphique (xinit). La centralisation des scripts Les scripts d'initialisation sont centralisés dans un seul répertoire («/etc/init.d/*»). Chaque niveau d'initialisation possède sont propre répertoire, identifié par le chiffre correspondant à son niveau («/etc/rc5.d/*»). A l'intérieur de chacun de ces répertoires d'initialisation figurent des liens (link) qui pointent vers le script d'initialisation qui lui correspond. C'est le processus «init» qui lance le script «/etc/init.d/rc», lequel en fonction du niveau d'initialisation choisit (initdefault), va lancer les uns après les autres les scripts d'initialisation se trouvant dans le répertoire d'initialisation. La Console !© par Patrick Hautrive !;~) 2010 74 Le script run command Les noms des liens figurant dans chacun des répertoires d'initialisation commencent soit par un K (kill), soit par un S (start) pour indiquer au script Run Command («/etc/init.d/rc») si le service correspondant doit être, pour ce niveau d'initialisation, respectivement arrêter ou démarrer. Ensuite, le nom des liens est composé de deux chiffres indiquant la priorité d'exécution. Par exemple, dans le niveau zéro d'une distribution Debian («/etc/rc0.d/*»), le script correspondant au gestionnaire d'affichage (gnome display manager) K01gdm sera stoppé en premier, et le script correspondant à l'arrêt du système (/sbin/halt) S90halt sera lancé en dernier. En général, les scripts de désactivation d'un service (K) sont placés avant les scripts d'activation d'un service (S). Il faut prendre en considération que l'administrateur peut changer le niveau d'initialisation avec la commande «init». Le passage d'un niveau à l'autre doit suivre la logique que les services du niveau précédent sont d'abord désactivés (avec les scripts K), et qu'ensuite seulement, sont activés les services correspondants au niveau demandé (avec les scripts S). L'enchainement des scripts d'initialisation init Run Command /etc/inittab > initdefault 5 > /etc/init.d/rc > /etc/rc5.d/* > K01 → S99 Services > /etc/init.d/* L'emplacement des scripts Selon les distributions, l'organisation des scripts Run Command est différente. Les chemins des répertoires d'initialisation contenant les liens et l'ordre dans lequel sont lancés les services sont susceptibles de varier selon les distributions. L'emplacement des scripts (Run Command) /etc/rc.d/* /etc/rc.d/init.d/* /sbin/init.d/* /etc/init.d/* Slackware Red Hat SuSE up to 7 Debian, SuSE 8 Le lancement des services Les scripts de chaque niveau d'initialisation ne sont lancés qu'une seule fois, lors du démarrage ou lors du changement de niveau. Chaque script va lancer une commande correspondant au service qu'il propose, et cette commande peut être, soit une commande de configuration du système, soit une commande lançant un serveur en tâche de fond. Les services constitués de serveurs (daemon) sont aussi appelés des sous systèmes, et ils attendent de pouvoir rendre service au système ou aux La Console !© par Patrick Hautrive !;~) 2010 75 utilisateurs. Le lancement des services utilisent les scripts Run Command qui acceptent selon les cas plus ou moins de paramètres (start, stop, status, restart, reload, forcereload). Les scripts Run Command sont lancés à l'initialisation avec le paramètre stop quand le nom commence par un K (kill), et avec le paramètre start quand le nom commence par un S (start). Ainsi, la commande «/etc/init.d/networking restart» permet d'arrêter le réseau (stop) et de le relancer (start) tout de suite, prenant en considération la nouvelle configuration des interfaces réseaux. La commande «chkconfig» permet de configurer le démarrage des services. La commande «service» chez Red Hat permet également de gérer l'activation des services. La commande «redhatconfigservices» chez Red Hat permet de gérer la configuration des services. Chez SuSE chaque service peut être relancé ou arrêté avec un script dédié qui se trouve dans un répertoire spécialisé, lequel figure dans le PATH de l'utilisateur root («/usr/sbin/rcnfs restart»). La Console !© par Patrick Hautrive !;~) 2010 76 WRAPPERTCP Le service Internet Le service internet est lancé par le script run command du processus «init». Le service internet est aussi appelé le démon internet. Un démon (francisation de l'anglais “daemon”) est un serveur qui en permanence est à l'écoute d'une demande de service. C'est un programme qui tourne en permanence en tâche de fond (background) et qui vérifie régulièrement si une demande lui est adressée. Le démon internet est un serveur qui reste à l'écoute de toutes les demandes de connexion réseau et qui surveille les ports des requêtes tcp provenant de toutes les cartes réseaux. Quand une demande de connexion est détectée, le serveur internet l'examine et la redirige vers le service approprié, en l'occurrence, vers un autre serveur spécialisé dans le type de connexion en question. Ainsi, le service internet est aussi appelé le wrapper tcp, parce qu'il écoute toutes les connexions tcp et les redirige vers le serveur approprié en fonction du port et du protocole de la demande. Les serveurs réseaux qui ne sont pas gérés par le démon internet doivent être protégés par un pare feu (firewall) comme iptables qui assure un filtrage des requêtes au niveau des ports (STATEFULL INSPECTION). Un serveur réseau peut avoir plusieurs numéros de port et plusieurs protocoles, et les numéros de port des services standards peuvent être changés («/etc/services»). Les conventions d'attribution des numéros de ports aux services réseaux sont maintenues par l'organisation IANA. Le wrapper tcp Le service internet (internet daemon) est aussi appelé le wrapper tcp. Le démon Internet est appelé “wrapper TCP” parce qu'il enveloppe toutes les demandes de connexion de la pile de protocoles réseaux TCP (Transport Control Protocol). Le démon internet surveille les demandes de connexion provenants de l'extérieur et les redistribuent aux services ou serveurs réseaux correspondants. Une liste des correspondances entre le type de services réseaux et le numéro de port est consultée dans le fichier «/etc/services». Par exemple, le démon internet est à l'écoute sur une interface réseau et capte une demande de connexion FTP, il lance alors une instance de serveur FTP en mémoire, puis, il répercute la demande de connexion au serveur FTP qui la traite. Ainsi, un seul démon est perpétuellement en attente de demande de connexion (un seul processus), et les serveurs ne sont lancés que quand ils sont nécessaires. La Console !© par Patrick Hautrive !;~) 2010 77 Le mécanisme de Wrappertcp Le Wrappertcp gère la plupart des types de connexion provenant de l'extérieur. En fait, cela dépend si le service a été intégré au Wrappertcp, ou s'il est lancé séparément. Les connexions distantes permettent de se connecter à un service sur un système à distance (remote), via le réseau. C'est très pratique pour l'administration et la configuration à partir d'un seul poste, sans se déplacer physiquement. Le mécanisme de Wrappertcp Socket + Port (Requête client) Inetd Wrapper TCP (Ecoute serveur) (Redirection) Service Exif (Lancement du démon) (Fin de connexion) Les communications réseaux Les communications réseaux utilisent les socket et les RPC. Les sockets sont des fichiers spéciaux qui permettent l'échange de données dans une connexion réseau entre un client et un serveur (communication inter processus distant). Les RPC (Remote Procedure Call) qui utilisent le format XDR permettent également un échange de données réseaux. Par exemple, le service NFS (Network File System) de partage de fichiers utilisent le Portmapper et emploient les RPC. Les communications réseaux RPC (format XDR) Socket (remote process) TCPIP (pile de protocoles) La commande «rpcinfo» permet d'interroger les serveurs RPC. Le fichier «/etc/rpc» est un fichier qui associe les noms et les numéros des programmes RPC. Le fichier «/etc/portmap» L'initialisation des interfaces Au démarrage du système, l'initialisation des interfaces réseaux s'effectue juste avant le lancement du service Internet. La commande «ifconfig» permet la configuration des interfaces réseaux (les cartes réseaux Ethernet qui portent le nom de eth0, eth1). Les fichiers de configuration des interfaces réseaux diffèrent selon les distributions Gnu Linux. Par exemple, la configuration des interfaces réseaux peut provenir du script «/etc/rc.d/rc.inet1» et le lancement du démon internet «inetd» peut provenir du script «/etc/rc.d/rc.inet2». La Console !© par Patrick Hautrive !;~) 2010 78 Les instances de serveur Selon les configurations, le démon Internet peut être “multithread”, c'estàdire qu'à une demande de connexion correspond le lancement d'une instance du service (un processus par demande). A contrario, le démon Internet peut être configuré en «singlethread» pour lancer une instance lors de la première demande, puis transmettre à la même instance, les demandes suivantes (un processus par service). Les démons internet Deux démons internet se sont succédés, le démon «inetd» qui est communément appelé le serveur internet, et le démon «xinetd», qui est plus récent, et qui est aussi appelé le super serveur internet. Les deux services internet proposent le même principe d'écoute et de redirection des demandes de connexion (wrapper tcp). Le démon internet «inetd» Le démon internet «inetd» est un service qui lance le serveur «tcpd», lequel s'occupe de rediriger les demandes de connexions (wrapper tcp). Le fichier de configuration de «inetd» est «/etc/inetd.conf». La commande «man inetd» donne une description du service internet. La commande «man updateinetd» explique comment ajouter des services réseaux au démon internet. La configuration du démon Internet Inetd Commands /usr/sbin/inetd /usr/sbin/tcpd updateinetd Files /etc/inetd.conf /etc/init.d/inetd Le super démon internet «xinetd» Le super démon internet «xinetd» (extended inetd) est un service qui redirige lui même les requêtes tcp, et qui intègre le wrapper tcp, il est compatible IPV6 et il gère les journaux (log). Le fichier de configuration de «xinetd» est «xinetd.conf». La commande «inetd2xinetd» permet d'évoluer du démon internet vers le super démon. La Console !© par Patrick Hautrive !;~) 2010 79 La configuration du démon Internet Inetd Commands xinetd inetd2xinetd Files /etc/rc.d/xinetd.conf /etc/rc.d/xinet.d/* Le fichier services Le fichier «/etc/services» fait la correspondance entre le nom du service réseau et le numéro de port qui lui est attribué officiellement par l'IANA (Internet Assigned Numbers Authority). Les requêtes peuvent utiliser les protocoles tcp ou udp. La Console !© par Patrick Hautrive !;~) 2010 80 Les principaux services réseaux tcp et leur numéro de port attribués par l'IANA (/etc/services) daytime netstat ftpdata ftp ssh telnet smtp time nameserver whois domain bootps bootpc gopher finger www link kerberos hostnames rtelnet pop3 sunrpc auth sftp uucppath nntp ntp imap2 mailq irc ipx imap3 rpc2portmap clearcase ldap https isakmp 13/tcp 15/tcp 20/tcp 21/tcp 22/tcp 23/tcp 25/tcp 37/tcp 42/tcp 43/tcp 53/tcp 67/tcp 68/tcp 70/tcp 79/tcp 80/tcp 87/tcp 88/tcp 101/tcp 107/tcp 110/tcp 111/tcp 113/tcp 115/tcp 117/tcp 119/tcp 123/tcp 143/tcp 174/tcp 194/tcp 213/tcp 220/tcp 369/tcp 371/tcp 389/tcp 443/tcp 500/tcp ipp exec biff login who shell syslog printer talk ntalk route timed tempo courier conference netnews netwall gdomap uucp klogin kshell nntps ldaps webster rsync ftpsdata ftps telnets imaps ircs pop3s 631/tcp 512/tcp 512/udp 513/tcp 513/udp 514/tcp 514/udp 515/tcp 517/udp 518/udp 520/udp 525/udp 526/tcp 530/tcp 531/tcp 532/tcp 533/udp 538/tcp 540/tcp 543/tcp 544/tcp 563/tcp 636/tcp 765/tcp 873/tcp 989/tcp 990/tcp 992/tcp 993/tcp 994/tcp 995/tcp socks kazaa nessus lotusnote ingreslock kermit radius unixstatus logserver remoteping cvspserver venus mon dict mysql nut radminport rfe xmppclient xmppserver postgresql x11 gnutellasvc fontservice hkp 1080/tcp 1214/tcp 1241/tcp 1352/tcp 1524/tcp 1649/tcp 1812/tcp 1957/tcp 1958/tcp 1959/tcp 2401/tcp 2430/tcp 2583/tcp 2628/tcp 3306/tcp 3493/tcp 4899/tcp 5002/tcp 5222/tcp 5269/tcp 5432/tcp 6000/tcp 6346/tcp 7100/tcp 11371/tcp La Console !© par Patrick Hautrive !;~) 2010 81 kerberos4 swat linuxconf poppassd spamd xtel frox fax hylafax rplay nsca mrtd canna sane ircd zopeftp webcache tproxy xinetd zope amanda xpilot 750/tcp 901/tcp 98/tcp 106/tcp 783/tcp 1313/tcp 2121/tcp 4557/tcp 4559/tcp 5555/tcp 5667/tcp 5674/tcp 5680/tcp 6566/tcp 6667/tcp 8021/tcp 8080/tcp 8081/tcp 9098/tcp 9673/tcp 10080/udp 15345/tcp Les exemples de inetd less /etc/services man 8 inetd man 8 tcpd man 8 updateinetd man 8 xinetd man 5 xinetd.conf man 5 xinetd.log man 5 host_access less /etc/init.d/inetd ls l /usr/sbin/in.telnetd itox echo ALL:ALL EXCEPT localhost > /etc/hosts.deny cat /etc/hosts.allow grep ^ftp /etc/inetd.conf /etc/rc.d/init.d/inet restart echo telnet stream tcp nowait root /usr/bin/tcpd in.telnetd >> /etc/inetd.conf tail f /var/log/secure telnet localhost echo in.telnetd: ALL EXCEPT LOCAL >> /etc/host.deny echo in.telnetd: .free.org >> /etc/host.allow La Console !© par Patrick Hautrive !;~) 2010 82 LOGIN L'invite de connexion A l'issue de l'initialisation, le système présente en générale une invite de connexion. L'invite de connexion peut être, soit une invite de connexion sur un terminal, soit l'affichage graphique d'ouverture de session. L'utilisateur renseigne alors son “login” (le nom de connexion ou de son compte figurant dans le fichier “/etc/passwd”), puis le mot de passe associé (conservé dans le fichier “/etc/shadow”). Quand c'est toujours le même utilisateur qui se sert de la même machine, le gestionnaire de session graphique peutêtre configuré de telle sorte que l'ouverture de sa session soit automatique, et que le bureau s'affiche directement. Les modes de connexion Les modes de connexion dépendent du niveau d'initialisation et de la localisation du système. Au login, le noyau ouvre automatiquement les fichiers spéciaux pour le clavier et l'écran (respectivement l'entrée et la sortie par défaut des processus). Les modes de connexion (login) La connexion en mode terminal avec la commande “getty” La connexion en mode graphique avec le Display Manager (“gdm”) La connexion à distante (remote) en mode client serveur avec la commande “ssh” La connexion en mode terminal Au démarrage, le processus initial lance tous les scripts qui sont attachés au niveau d'initialisation (“runlevel”). La conduite du processus “init” (PID=1) est définie dans le fichier “/etc/inittab”. En fin de parcours, le processus “init” lance la procédure de connexion avec la commande “getty” qui présente l'invite de connexion. Le processus de la commande “getty“ sera automatiquement relancé pour proposer de nouveau l'invite de connexion si celleci échoue ou si l'utilisateur se déconnecte (directive respawn du fichier “/etc/inittab”). La commande “getty” passe la main à la commande “login” qui procèdera à l'authentification de l'utilisateur, et qui elle même passera la main au shell (le shell de l'utilisateur définit dans le fichier “/etc/passwd”). La commande “login” récupère le nom de l'utilisateur et le mot passe saisi qu'elle va crypter avec la commande “crypt” pour le comparer avec celui qui correspond au nom de l'utilisateur (“/etc/shadow”) à l'aide de la commande “diff”. Si la vérification est probante (et passés les autres contrôles sur l'accès La Console !© par Patrick Hautrive !;~) 2010 83 au terminal, comme les fichiers “/etc/securetty”, «/etc/nologin» et «/etc/login.defs» ;), la commande “login” continue en affichant le message du jour (“/etc/motd” pour message of the day et «/etc/issue»), l'avertissement mail si la boite contient un message non lu, et enfin, s'ils existent, la commande “login” interprète l'environnement contenu dans le fichier de profile standard («/etc/profile») et les fichiers de profile personnels de l'utilisateur (“~/.profile”, «~/.bash_profile» et “~/.bashrc”). Le shell “bash” prend le relais en affichant le prompt dont l'aspect est défini dans les variables d'environnement $PS1, $PS2 et $PS3. Le shell “bash” est le shell par défaut de Gnu Linux. Le shell reste en attente des commandes de l'utilisateur jusqu'à ce que celuici frappe Ctrl+D pour interrompre le processus du shell ou saisisse la commande “exit” qui produit le même effet. Toutes les commandes validées par l'utilisateur sont des gérées par des processus enfants de shell, et tous les processus enfants du shell sont stoppés si le processus du shell est stoppé. La procédure d'authentification à la base des comptes init /etc/inittab getty /etc/passwd login /etc/shadow crypt /etc/motd bash ~/.profile exit ~/.bashrc Le contrôle des connexions Le contrôle des connexions va bien audelà de l'authentification à la base des comptes et de la vérification du mot de passe dans les fichiers «/etc/passwd» et «/etc/shadow». D'autres contrôles ont éventuellement lieu selon la configuration. En fait, souvent des contrôles supplémentaires se produisent quand le fichier correspondant est présent au bon endroit dans l'arborescence. Quand le fichier n'existe pas, le contrôle n'est pas effectué. La procédure d'authentification est également le moment propice pour configurer l'environnement de l'utilisateur. La procédure de connexion et de configuration de l'environnement de l'utilisateur Password Terminal Environment Locale /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/netgroup /etc/nologin /etc/login.access /etc/porttime /etc/pam.d/login /etc/security/* /etc/securetty /etc/usertty /etc/terminfo /etc/termcap /etc/gettydefs /etc/ttytab /etc/issue /etc/motd /boot/bootmsg.txt /usr/games/fortune /etc/shells /etc/bash_completion /etc/login.defs /etc/environment /etc/sysctl /etc/profile /etc/bash.bashrc /etc/limits /etc/skel /etc/aliases /etc/sudoers /etc/locale.alias /etc/locale.gen /etc/gdm/locale.conf /etc/profile.d/lang.sh /etc/localtime /etc/alternatives /etc/magic /etc/timezone La Console !© par Patrick Hautrive !;~) 2010 84 Profile ~/.login ~/.bash_profile ~/.bash_login ~/.bash_history ~/.profile ~/.bashrc ~/.Xsession ~/.Xdefaults ~/.Xinitrc ~/.signature ~/.bash_logout Les journaux de connexion Les journaux de connexion sont en général enregistrés dans le répertoire «/var/log/*». Ils permettent de conserver une trace des tentatives de connexion et devraient être régulièrement consultés par l'administrateur du système. Lors d'une première connexion, à la suite d'une installation, l'administrateur peut profiter de la consultation des journaux qui retracent le déroulement de la procédure d'installation. De même, à chaque démarrage du système, des journaux de boot ont enregistrés les évènements de la procédure d'initialisation du système. Les journaux d'installation, de démarrage et de connexion Installation Boot /var/log/installer/messages /tmp/install.log /root/anaconda.ks.cfg /proc/kmsg /var/log/message /var/log/boot.msg /var/log/boot.log /var/log/dmesg Login Gnu Linux Suze RedHat Debian /var/log/wtmp /var/log/secure /var/log/lastlog /var/log/sulog /var/log/dmesg /var/log/utmp /var/log/btmp (last) (login) (lastlog) (su) (dmesg) (who) (lastb) Les paramètres locaux Les paramètres locaux sont le temps, l'heure ou la date, la zone géographique TZ (Time Zone), la langue (locales)... Les commandes pour les paramètres locaux Commands date timeadmin times clock hwclock cal Zone tzconfig tzfile tzsetup tzselect zdump zic Time ntp ntpkeygen ntpdate ntpdc ntpq ntpsweep Language echo $TZ loadkey fr Les exemples de login loadkey fr uname a ; runlevel echo $SHELL ; echo $PS1 ; echo $BASH_ENV chsh env La Console !© par Patrick Hautrive !;~) 2010 85 Profile logname ; id ; who ; lastlog sync umount a free init 6 & touch file ; echo «hello world» > file cp file copy echo «good bye world» >> file diff h file copy wc < file df h ; du h ; ps $$ umask ; ulimit ; exit wall % message to all users (write all) La Console !© par Patrick Hautrive !;~) 2010 86 SHELL L'interface avec le noyau Le shell est l'interface privilégiée entre l'utilisateur et le noyau. C'est le shell qui reçoit les commandes de l'utilisateur sur son entrée standard (KEYBOARD) et qui restitue les résultats sur sa sortie standard du terminal (DISPLAY 0.0). La sortie standard correspond en général au premier écran de l'ordinateur, mais celleci peut être redirigée vers l'entrée d'un autre processus ou vers un fichier. C'est le shell qui analyse la syntaxe des commandes et qui lance les appels systèmes (system calls). Les appels systèmes sont les fonctions du noyau. Le shell est un processus qui est lancé, soit par la procédure d'initialisation, soit par l'utilisateur. L'interpréteur de commande Le shell est un interpréteur de commande. Le shell est un programme qui interprète les commandes passées par l'utilisateur. Le shell est l'interface entre l'utilisateur et le noyau. Le shell peut être un shell de connexion qui est lancé à l'issue de la procédure d'initialisation, ou un shell interactif qui est lancé par l'utilisateur depuis l'interface graphique. Après la validation d'une ligne de commande, le shell en contrôle la syntaxe et lance les différents processus enfants qui seront gérés par le noyau et qui accompliront les tâches demandées par l'utilisateur. Les processus enfants sont des processus clonés sur le modèle que le processus parent, c'estàdire qu'ils partagent le même environnement de travail (les droits, les variables d'environnement, etc.). Les processus sont en général lancés avec l'identité (user) et les droits de l'utilisateur (permissions). Le shell Bash Le shell Bash (Bourne Again Shell) est le shell par défaut des distributions Gnu Linux. C'est un shell complet, fonctionnel, performant et personnalisable. Le shell Bash est conforme à la norme POSIX. Par défaut, c'est le shell Bourne (“/bin/sh”) qui est attribué à un nouvel utilisateur (“useradd”) qui ne possède pas de répertoire personnel. La commande «echo $» affiche les options actives du shell Bash. La commande «man bash» présente les différentes options du shell Bash (option flags). http://en.wikipedia.org/wiki/Bash_%28Unix_shell%29 La Console !© par Patrick Hautrive !;~) 2010 87 Les options du shell Bash Le shell bash est lancé au boot comme un shell de connexion (login shell), et de manière interactive (interactive shell) lorsqu'un terminal graphique est lancé. La commande «man bash» présente la façon d'invoquer un shell bash (invocation) de manière non ineractive. Un shell non interactif ne lira pas les fichiers habituels pour les profiles, mais les fichiers «/etc/bash.bashrc» et «~/.bashrc». La commande «bash norc cmd» permet de lancer un shell de manière non interactive sans aucune lecture de fichier d'environnement. La commande «echo $» montre les options actives pour le shell en cours (active bash option). La commande «bash –help» montre un résumé des options du shell bash (bash option). La commande «bash c help» présente les commandes internes au shell bash (builtin commands) La commande «bash c "help set"» présente la signification des différentes options (bash options). La commande «bash c «cmd»» permet de lancer une commande dans un nouveau shell non interactif. La commande «bashbug» permet de faire un rapport de bug auprès des développeurs de Bash. La commande «bash rcfile bashconfigfile» permet de lancer un shell non interactif avec pour seule configuration le fichier passé en argument. La Console !© par Patrick Hautrive !;~) 2010 88 Les options du shell Bash (man bash) Options Fonction c Lancer un shell de façon non interactive (non interactive shell) i Lancer un shell de manière interactive (interactive shell) l Lancer un shell de connexion (login shell) r Lancer un shell dans un environnement restreint (restricted shell) s Lancer un shell qui reçoit ses commandes depuis l'entrée standard (stdin) v Lancer un shell qui affiche les commandes qu'il reçoit depuis l'entrée standard (print stdin) x Lancer un shell pour le débogage qui affiche les commandes quand elles sont exécutées (print exec) D Lancer un shell afin d'extraire des chaines de caractères pour les traduire (non interactive shell) [+]O Lancer un shell avec ou sans les commandes internes à Bash (builtin options shopt) Lancer un shell en indiquant la fin des options et le commencement des arguments Lancer un shell en mode résolution avec l'option function tracing (extdebug option) debugger dumppostrings Equivalent à D avec le format Gnu gettext (portable object) dumpstrings help Equivalent à D Affiche les principales options (help) initfile file rcfile file login Lancer un shell non interactif avec pour seule configuration le fichier passé en argument (configuration file) Equivalent l (login shell) noediting Lancer un shell interactif sans utiliser la librairie Gnu readline pour lire les commandes (no readline gnu library) noprofile Lancer un shell sans aucune lecture de fichier de profile (no «/etc/profile», «~/.bash_profile», «~/.bash_login», or «~/.profile») norc Lancer un shell interactif sans aucune lecture de profile (no «~/.bashrc») posix Lancer un shell avec le comportement d'un shell POSIX (posix mode) restricted Equivalent à r (restricted shell) verbose Equivalent à v (verbose) version Affiche la version du shell Bash (bash version) La Console !© par Patrick Hautrive !;~) 2010 89 L'environnement du shell L'environnement du shell correspond en générale à l'environnement de l'utilisateur. Toutefois, l'environnement d'un utilisateur peut être restreint à une partie du système seulement (“rbash”), limité à une partie de l'arborescence (“chroot”) et à une partie des commandes. Ces environnements particuliers (nesting) sont parfois des leurres pour tromper l'ennemi (honey pot). Lors d'une connexion à distance, un utilisateur se connecte à un serveur sur lequel il dispose d'un compte (login et password) qui lui donne accès à un shell distant (remote shell). Un shell de connexion est généralement “attaché” à un terminal (“tty”). Un shell interactif est “attaché” à un pseudo terminal. Les terminaux sont des périphériques qui sont utilisés pour capter les entrées du clavier (STDIN) et afficher les sorties sur l'écran (STDOUT et STDERR). Le shell est l'interpréteur de commandes La connaissance de la ligne de commande La connaissance de l'environnement La connaissance des variables d'environnement L'affichage des variables d'environnement La connaissance de la table de codage La connaissance des signaux envoyés aux processus La liste des commandes internes (builtin) La recherche d'un motif dans l'afficheur des pages man L'environnement shell restreint L'arborescence limitée (“man a intro”) (“man environ”) (“info coreutils env”) (“env”) (“man ascii”) (“man signal”) (“man bash”) (“/motif”) (“rbash”) (“chroot”) Les shells POSIX La norme POSIX permet d'uniformiser les fonctionnalités des Shells et de rendre compatibles les scripts. Les shells qui satisfont à la norme POSIX (Portable Operating System Interface) remplissent un cahier des charges en commun, ce qui rend les scripts compatibles. Le shell Gnu Bash est compatible POSIX. La norme POSIX définit des critères fonctionnels précis pour la rédaction d'une ligne de commande, la définition de l'environnement et les communications entre les processus. La Console !© par Patrick Hautrive !;~) 2010 90 Les caractéristiques du shell Bash et la norme POSIX L'édition de la ligne de commande (prompt, historique, colorisation, complétion) L'analyse syntaxique de la ligne de commande (mots, variables, chemins, validation) Le traitement séquentiel (nohup, background) L'expansion des variables (internal, environment) L'interprétation des séquences (escape, control) L'évaluation des expressions (special, meta, separator, operators, jokers, regex, octal, hexa, expr) La programmation (structures, fonctions, passage par valeurs, l'interaction, scripts) L'héritage de l'environnement (variables, permission, root, pwd, tty) La filiation des processus (descriptor, PPID) Les commandes et les variables internes (chemins absolus et relatifs, commandes builtin, alias) Les variables d'environnement (env, export, set, unset) Le contrôle des permissions (special bits) La personnalisation et/ou la restriction de l'environnement (rbash, profile) La communication inter processus (signal) Les I/O standard (stdin, stdout, stderr, redirections, concaténation) Le contrôle des tâches et des priorités (jobs, fg, bg, nice) Le shell de connexion Le shell de connexion (login shell) est le shell qui est proposé à l'utilisateur lors de sa connexion au système Gnu Linux en mode terminal. Le shell de connexion est issue de la procédure d'initialisation (“init”) et de la commande “login”, qui ne fonctionne qu'avec les terminaux virtuels (Ctrl+Alt+F1 à F6). A l'issue de la procédure d'initialisation du système (“/etc/inittab”), un prompt de login est présenté à l'utilisateur. Commence alors, la procédure de connexion (“/etc/passwd”). Quand l'authentification a réussie, un shell de connexion est lancé, lequel présente son prompt dans le répertoire de connexion de l'utilisateur («~/»). Par contre, quand la procédure d'initialisation du système lance automatiquement l'interface graphique (Xserver), l'utilisateur s'authentifie dans une fenêtre de session, et s'il lance un shell dans un pseudo terminal (“xterm”), ce n'est pas un shell de connexion, c'est un shell interactif. Le shell de connexion est toujours lié à un terminal virtuel du système (“/dev/tty4”) dont il est possible de connaitre les caractéristiques avec la commande “tty”. La commande “bash –noprofile” invoque le shell sans la lecture des fichiers de lancement. Les fichiers de lancement, de configuration ou de personnalisation du shell de connexion sont lus dans un ordre très précis, le dernier pouvant annuler une configuration antérieure. La Console !© par Patrick Hautrive !;~) 2010 91 Le shell de connexion (login) La procédure d'initialisation Le prompt de connexion Le terminal du shell de connexion Les fichiers de lancement du shell de connexion Le lancement du shell de connexion vierge Le terminal d'un shell de connexion (“init” et “/etc/inittab”) («login» et “/etc/passwd”) (“tty”) (“/etc/profile”) (“~/.bash_profile”) (“~/.bash_login”) (“~/.profile”) (“~/.bash_logout”) (“bash –noprofile”) (“/dev/tty4”) Le shell interactif Le shell en mode interactif (interactive shell) n'est pas un shell de connexion, le shell bash est lancé au cours de session et ne lit que les instructions contenues dans le fichier «/etc/bash.bashrc», puis celles contenues dans le fichier «~/.bashrc» (si celuici existe avec les permissions adéquates pour le lire). Le shell interactif est lié à un pseudo terminal (“/dev/pts/0”) du système qui simule la présence d'un terminal. L'ordre de lecture et les fichiers de configuration de Bash en mode interactif ne sont pas les même que pour le shell de connexion. La commande “bash –norc” invoque le shell interactif sans la lecture des fichiers de lancement. Le shell interactif (session) Les fichiers de lancement du shell interactif Le lancement du shell interactif vierge Le pseudo terminal d'un shell interactif (“/etc/bash.bashrc”) (“~/.bashrc”) (“bash –norc”) (“/dev/pts/0”) Le chemin absolu et relatif Le chemin absolu d'un fichier s'écrit en entier depuis la racine du système de fichier. Le chemin relatif d'un fichier ne commence jamais par le slash (“/”) indiquant la racine de l'arborescence. Le chemin relatif s'écrit en tenant compte de l'emplacement de travail en cours (“pwd”). Ainsi, depuis son répertoire personnel (“cd”), un utilisateur peut utiliser le chemin relatif pour faire référence à un fichier (“ls ../.bashrc”). Dans chaque répertoire se trouvent des liens indestructibles pointant vers le répertoire parent (“..”) et vers le répertoire courant (“.”). Le caractère tilde (“~” ou Altgr+2) est synonyme du répertoire personnel de l'utilisateur (“$HOME”). Les liens dans chaque répertoire permettent de remonter La Console !© par Patrick Hautrive !;~) 2010 92 l'arborescence (“../../”). Ces caractères spéciaux ont une signification particulière pour le shell Bash. Les chemins absolus et relatifs au répertoire courant Le répertoire de travail (print working directory) Le chemin absolu depuis la racine Le chemin relatif au répertoire courant Le lien symbolique vers les répertoires parents Le lien symbolique vers les répertoires courants Le répertoire personnel de l'utilisateur («pwd») (“/”) (“../..” et “./script”) (“..”) (“.”) (“cd”, “$HOME”, “~” ou Altgr+2) L'imbrication des shells L'imbrication de shell consiste à ouvrir un shell à l'intérieur d'un autre shell (un sous shell dont le processus est le fils). La commande “echo $SHLVL” permet de connaitre la profondeur des imbrications. Chaque niveau est doté de son propre environnement et se comporte de façon indépendante. Il convient de clore chaque niveau méthodiquement les uns après les autres. La restriction du shell La restriction du shell permet de lancer un shell comportant de nombreuses restrictions dans les fonctionnalités. Un shell restreint permet de contrôler au plus juste l'environnement d'un processus ou d'un utilisateur. Un shell restreint est lancé avec la commande “rbash” ou la commande “bash r”. A l'intérieur d'un shell restreint certaines opérations ne sont alors plus autorisées. La restriction et l'imbrication de shell L'imbrication de shell La restriction du shell Le changement de répertoire La modification de variables Les commandes contenant la racine L'utilisation des fonctions du système Le changement des options autorisées La redirection des entrées sorties L'utilisation de la commande interne d'exécution La modification des commandes internes Le contournement des restrictions “echo $SHLVL” (“rbash” ou “bash r”) (“cd”) (SHELL PATH ENV BASH_ENV) (“/”) (system calls) (SHELLOPTS) (pipe) (exec) (builtin) (“set +r” et “set +o”) Les principaux shell Il existe différents types de shell et chacun possède ses caractéristiques propres. Pourtant, deux familles se distinguent, les shells qui sont très influencés par le langage de programmation C, et les shells La Console !© par Patrick Hautrive !;~) 2010 93 descendant de Bourne. Ainsi, l'affichage du prompt pour les utilisateurs n'est pas le même selon la famille de shell que l'on utilise. Les binaires de Bash (“/bin/bash”) et du shell de Bourne (“/bin/sh”) peuvent être retrouvés à l'aide de la commande “whereis bash”. Pareillement, les commandes pour gérer l'environnement du shell (“set” et “env”), c'estàdire les variables exportés (“export”) communes aux processus ne sont pas les même. Les fichiers de configuration non plus ne sont pas les même. Quand les shells sont lancés, chacun exécutent les commandes à l'intérieur du ou des fichiers de configuration qu'il prend en compte (“~/.login” et “~/.profile”). Les principaux shell Shell Name Prompt csh tcsh ksh C Shell TC Shell Korn Shell sh bash zsh vsh Bourne Shell $ Bash Shell Z Shell Visual Shell Root Profile % ~/.login # Environnement $VAR= VAL set unset printenv env export ~/.profile Les séquences de contrôle Les séquences de contrôle permettent de gérer le shell et le terminal virtuel avec le clavier. Les séquences de contrôle sont effectuées en maintenant deux touches (parfois trois) appuyées en même temps. Ces séquences commencent parla touche contrôle (CTRL) suivie d'une autre touche du clavier. Toutefois, d'autres types de séquences, commençant par les touches SHIFT, MAJ ou ALT (anciennement META) peuvent être configurées, comme les touches magiques (Magic Keys), et deviennent significatives pour le système. Ces séquences forment des raccourcis clavier qui permettent de gérer la ligne de commande, d'appeler des menus contextuels ou d'envoyer certains signaux à certains processus. Les processus qui peuvent être concernés par les séquences de contrôle sont le processus en cours ou en avant plan (foreground), le processus initial (init) ou les processus qui gèrent l'affichage des terminaux virtuels et celui de l'interface graphique. Les applications graphiques acceptent également des séquences de contrôle qui permettent d'éviter de naviguer avec la souris dans les menus. La Console !© par Patrick Hautrive !;~) 2010 94 Les commandes “man stty” et “man console_codes” donnent une description des séquences de contrôle. Les séquences de contrôle du shell Bash (stty console_code) Ctrl+A Ctrl+C Ctrl+D Ctrl+E Ctrl+H Ctrl+L Ctrl+M Ctrl+O Ctrl+R Ctrl+U Ctrl+V Ctrl+W Ctrl+Z Ctrl+Alt+F1 à F6 Ctrl+Alt+F7 à F8 Ctrl+Alt+Del Ctrl+Backspace (Curseur en début de ligne) (Interruption du processus en cours) (Terminaison du processus shell) (Curseur en fin de ligne) (Efface en arrière) (Efface l'écran) (Validation) (Validation) (Historique alphabétique) (Efface la ligne) (Nouvelle page dans un afficheur) (Efface le dernier mot avant le curseur) (Suspension du processus en cours) (Affichage des six terminaux) (Affichage de l'interface graphique) (Suppression du processus initial) (Suppression du serveur graphique) (SIGHUP) (SIGTERM) (EOL) (BACKSPACE) (RETURN) (RETURN) (REPRINT) (SIGINT) (TTY) (DISPLAY) (INIT) (X) Les exemples du shell vi ~/.profile noclobber=1 export PATH=$PATH:$HOME/bin alias ll=”ls la” echo “Hello world, the date today is $(date)” !1 sh x scriptdebug alias X=`{startx > /dev/null &}; clear; logout` Les exemples du C shell vi ~/.login set noclobber setenv PATH “${PATH}:${HOME}/bin” set PATH=($PATH ~/bin) alias ll=”ls la” Les exercices du shell La Console !© par Patrick Hautrive !;~) 2010 95 Voici quelques exercices pour pratiquer... script fileforstudy.txt man signal man env man environ man bash ps ps aux echo $SHELL chsh Crtl+D bash logout exit Ctrl+Alt+5 (login + password) logout pwd cd / pwd su (root password) pwd cd pwd exit cd ~ id cd .. pwd cd touch one.txt ls ln one.txt two mkdir TEXT ls la mv two TEXT ls TEXT cd /usr/bin ls; cd env | grep HOME ls la $(HOME)/one.txt echo $PATH echo “Hello ?” echo “Hello ?”> one.txt cat one.txt echo “How ?”>> one.txt cat one.txt ls ld alias ld=”ls ld” ld unalias ld ld ls R / ls id ~ ls id / mkdir tic tac toe ls rmdir tic tac toe mkdir p bring/my/wife cd bring/my/wife mkdir p won/der/full cd ls R rm Rf bring ls R echo “cinq” > newline ls l newline wc l newline cp newline saveline ls i *line mv saveline oldline ls i *line rm i *line touch link ln link hardlink ln s link symlink ls i *link ls l *link ls */* rm f *link mkdir tmp; cd tmp touch .hiden ls man sudo rm Rf * su ls a id rm .* pwd ls a exit cd su rmdir tmp id touch file1 file2 file3 pwd touch File4 file4 exit rm file[23] touch paper ls ls la paper ls [Ff]ile? chmod go+rw paper ls [AZaz]* ls la touch file{0123456789} chmod 700 paper ls ls la paper touch chmod arw file{0,1,2,3,4,5,6,7,8,9} ls la paper !! chown noone paper !$ rm paper history echo $PATH HI=”Hello world” cd echo $HI mkdir ~/bin echo “un deux trois” | wc ls bin ls s | sort n PATH=$PATH:~/bin ls R / export PATH ls R | sort | uniq | wc l STAY=stay head n5 /etc/hosts FOLLOW=follow cat /etc/passwd | grep export FOLLOW $USER echo $STAY tail n5 /var/log/message echo $FOLLOW su bash adduser noone echo $STAY exit echo $FOLLOW passwd noone exit cat /etc/passwd | grep unset FOLLOW noone echo $STAY su noone echo $FOLLOW id bash pwd echo $STAY cd echo $FOLLOW pwd exit La Console !© par Patrick Hautrive !;~) 2010 96 unset STAY echo $SHELL FOO=”” set |grep ^FOO exit su find / user “noone” userdel r noone find / user “noone” cd echo $? top& jobs fg nice n 7 xeyes ps u | grep xeyes renice p PID renice +9 PID info coreutils env env tty stty vi /etc/inittab cat /etc/shells ls /etc/skel CTRL+D (ending fileforstudy.txt) cat fileforstudy.txt kill 9 1 ls / | tee $HOME/root.txt La Console !© par Patrick Hautrive !;~) 2010 97 VARIABLE Les variables Les variables peuvent être de plusieurs types et être qualifiées de différentes épithètes. Les variables internes sont intégrées au shell, et elles servent à gérer les paramètres d'une ligne de commande. Les variables d'environnement sont propres à l'environnement du shell, ou à l'environnement de l'utilisateur ou à celui d'un processus. Les variables d'environnement exportables sont transmises d'un processus à l'autre. Les variables prédéfinies sont les variables d'environnement d'un shell qui sont attribuées automatiquement lors du lancement d'un shell. L'on parle de variables locales quand elles sont propres à un seul environnement, et de variables globales, quand elles sont partagées par un groupe de processus. Les utilisateurs peuvent définir leurs propres variables quand ils ouvrent une session. Cellesci peuvent être enregistrées dans leurs fichiers de personnalisation («~/.profile»). Les variables internes, prédéfinies, d'environnement, interactives, exportables L'affectation directe dans un environnement L'affectation par substitution de commande (reverse quote) La transmission avec passage par fonction La transmission avec passage par valeur L'expansion de la valeur d'une variable L'échappement de l'expansion d'une variable La protection par l'apostrophe (single quote) La protection par les guillemets (double quote) L'invitation interactive à la saisie Les variables d'environnement du processus Les variables internes du shell Les variables prédéfinies du shell Les variables exportées La visualisation des variables d'environnement La visualisation des variables systèmes La définition de variable d'environnement Les variables locales Les variables globales (VAR=VAL) (VAR=`cmd`) (“FONCTION (VAR)”) (“script VAR”) (“echo $VAR”) (“echo \$VAR”) (“echo '$VAR') (“echo ''$VAR'') (“read VAR”) (“env”) (“$0”) (“set”) (“export PATH=$PATH:~/bin”) (“env”) (“set”) (“typeset”) La valeur d'une variable Les variables sont des mots auxquels sont affectés une valeur (VAR=VAL). L'on parle d'affectation quand une valeur est affectée à une variable. La commande “echo $VAR” permet de connaitre la La Console !© par Patrick Hautrive !;~) 2010 98 valeur d'une variable. A l'intérieur d'un script ou d'une commande, l'on parle d'expansion d'une variable quand c'est, non pas le nom, mais la valeur de la variable qui est pris en compte. L'expansion peut être annulée avec l'apostrophe (“'”) ou les guillemets (“””), et empêché avec l'échappement (“\”). L'exportation des variables Les variables constituent un moyen de passer des informations communes d'un processus parent à un processus enfant. Par exemple, les valeurs des variables d'environnement sont héritées d'un processus à l'autre. D'autre part, les variables peuvent être exportées d'un environnement à l'autre avec la commande “export”. La valeur de ces variables communes ne change pas. Les variables internes Les variables internes (special parameters) au shell sont des variables utilisées par le shell pour gérer les différents éléments de la ligne de commande. Une ligne de commande simple est en générale constituée de la commande suivie de ses paramètres (paramètres, arguments, options, swithches, flags). Une ligne de commande plus compliquée sera constituée de plusieurs commandes reliées ou imbriquées entre elles par des caractères spéciaux (jokers, séparateur, méta caractères, opérateurs de contrôle, séquence d'échappement, expressions, structures de contrôle,...). Le shell interprète ces différents éléments et en vérifie la syntaxe avant d'en lancer l'exécution. La commande “man bash” donne une description des variables internes. Les variables internes du shell Bash (man bash) La ligne de commande (le nom du shell, du script ou du fichier placé en argument) La valeur des paramètres selon leur positionnement (positional parameters) Le nombre de paramètres contenus dans la ligne de commande (commande incluse) La chaine des paramètres de la ligne de commande (string positional parameters) La liste des paramètres de la ligne de commande (table positional parameters) Le code retour de la dernière commande exécutée en avant plan (fg) Le numéro de processus du shell (PID) Le numéro de processus (PID) de la dernière tâche de fond (bg) Les options du shell (option flags) Le chemin absolu pour l'invocation d'un shell “$0” “$1” à “$9” “$#” “$*” “$@” “$?” “$$” “$!” “$” “$” Les variables d'environnement Les variables d'environnement sont aussi appelées variables prédéfinies. Un certain nombre de variables prédéfinies sont plus ou moins présentes dans l'environnement d'un processus. Dans un shell La Console !© par Patrick Hautrive !;~) 2010 99 restreint, elles ne peuvent être modifiées. Par convention, les noms des variables d'environnement sont écrites en majuscule. La commande “env” permet d'afficher les variables d'environnement actives et la commande “set” permet d'afficher toutes les variables. La variable d'environnement BASH_ENV permet de gérer l'environnement pour les nouvelles instances de shell. Les variables d'environnement du shell Bash (man bash) ALIAS BASH BASHOPTS BASHPID BASH_ALIASES BASH_ARGC BASH_ARGV BASH_CMDS BASH_COMMAND BASH_ENV BASH_EXECUTION_STRING BASH_LINENO BASH_SOURCE BASH_SUBSHELL BASH_VERSINFO BASH_VERSION BASH_XTRACEFD CDPATH COLUMNS COMPREPLY COMP_CWORD COMP_KEY COMP_LINE COMP_POINT COMP_TYPE COMP_WORDBREAKS COMP_WORDS DESKTOP_SESSION DIRSTACK DISPLAY EDITOR ENV EMACS EUID FCEDIT FIGNORE FORWARD FUNCNAME GDMSESSION GID GLOBIGNORE GROUPS HISTCHAR HISTCMD HISTCONTROL HISTFILE HISTFILESIZE HISTIGNORE HISTSIZE HISTTIMEFORMAT HOME HOSTFILE HOSTNAME HOSTTYPE IFS IGNOREEOF INPUTRC LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES LC_NUMERIC LESSCLOSE LESSOPEN LINENO LINES LOGNAME LS_COLORS MACHTYPE MAIL MAILCHECK MAILPATH MAILTO OLDPWD OPTARG OPTERR OPTIND OSTYPE PAGER PATH PIPESTATUS POSIXLY_CORRECT PPID PRINTER PROMPT PROMPT_COMMAND PROMPT_DIRTRIM PS1 PS2 PS3 PS4 PWD La Console !© par Patrick Hautrive !;~) 2010 100 RANDOM REPLY SECONDS SHELL SHELLOPTS SHLVL SSH_AGENT_PID SSHAUTH_SOCK TERM TIMEFORMAT TIMOUT TMPDIR TTY TZ UID UMASK ULIMIT USER USERNAME VISUAL WINDOWID XAUTHORITY auto_resume histchars La transmission de valeurs La valeur d'une variable peut être modifiée en cours de session. La valeur d'une variable peut être différente d'un processus à l'autre. Pour transmettre automatiquement une valeur qui change d'un processus à l'autre, il existe deux moyens, le “passage par fonction” (la valeur est le résultat d'une fonction) et le “passage par valeur” (la valeur est un des paramètres d'un script). L'invitation interactive Une invitation interactive permet également de récupérer la valeur saisie au clavier (STDIN) avec la commande “read”. La Console !© par Patrick Hautrive !;~) 2010 101 COMMAND Les commandes internes Les commandes internes sont intégrées dans le shell (builtin). Ainsi, la commande “cd” (change directory) ou la commande “pwd” (print working directory) sont des commandes intégrées au shell Bash. Les commandes internes sont lancées à l'intérieur du même processus que le shell. Le shell ne crée pas de processus fils, il exécute les instructions wait() et read(), et s'occupe lui même de la tâche. En général, les commandes internes ne disposent pas de page manuel puisque ce ne sont pas des commandes indépendantes du shell. Les conditions d'utilisation sont spécifiées dans la page man du shell avec la commande “man bash” dans laquelle il est facile de faire une recherche avec l'opérateur “/motif” à l'intérieur de l'afficheur. Les commandes internes du shell Bash (builtin) (man bash) source command disown fg local read times alias compgen echo getops logout readonly trap bg complete enable hash mapfile return type bind comptopt eval help readarray set ulimit break continue exec history popd shift umask builtin declare exit jobs printf shopt unalias caller typeset export kill pushd suspend unset cd dirs fc let pwd test wait Les commandes externes Les commandes externes sont toutes celles qui peuvent être lancées dans un système Gnu Linux. Les commandes externes sont des exécutables ou des scripts avec le droit d'exécution (“x”). Les commandes externes peuvent être invoquées en spécifiant le chemin absolu (“/bin/bash”) ou le chemin relatif (“./script”) dans l'arborescence du système de fichier. Quand le chemin n'est pas spécifié, le shell recherche l'emplacement de la commande dans les répertoires spécifiés dans la variable PATH, et seulement dans ces répertoires (“echo $PATH”). Les commandes externes sont lancées dans le cadre d'un processus enfant du shell. Le processus père (le shell) exécute les instructions fork() et wait(), tandis que le processus fils (la commande à l'intérieur d'un sous shell) exécute l'instruction exec(). Cette filiation des processus implique l'héritage de l'environnement du shell. Les commandes externes sont définies par opposition aux commandes internes, et concernent par conséquent tout ce qui peut s'exécuter sur un système. Les commandes externes sont les outils et les utilitaires Gnu, les La Console !© par Patrick Hautrive !;~) 2010 102 scripts exécutables qui sont interprétés et qui peuvent contenir une succession de commandes, les programmes compilés et autres applications sources installées. Les commandes externes au shell L'affichage des droits et des types de fichiers Les commandes, les outils et les utilitaires Gnu Les scripts exécutables interprétés Les programmes compilés Les applications sources installées L'évaluation d'une ligne de commande (“ls la /bin/bash”) (“echo $PATH”) (“./script”) (“gcc”) (“./configure; make; make install”) («type cmd») L'analyse d'une commande Le shell analyse la syntaxe et procède à l'évaluation des expressions de la ligne de commande, puis il lance l'exécution de la commande, soit à l'intérieur de son propre processus (builtin), soit dans le cadre d'un processus fils (sous shell). Dans le cadre d'une exécution par un processus fils, le shell ouvre éventuellement les descripteurs de fichier pour les redirections, et se met en attente du signal que lui envoi le processus fils quand il a terminé sa tâche (sauf quand la commande est lancée en background auquel cas, le shell représente immédiatement le prompt à l'utilisateur). Quand le sous shell a terminé, le shell peut alors lancer un autre sous shell et traiter séquentiellement une succession de commandes. La commande interne “type” permet de vérifier l'évaluation par le shell des mots d'une ligne de commande. 1. Le shell récupère la ligne de commande avec l'instruction read() 2. Le shell analyse la syntaxe et évalue les mots de la ligne de commande Opérateur de contrôle Substitution des jokers Expansion des variables Traduction des alias Placement des méta caractères Évaluation des séquences d'échappement 3. Le shell recherche les commandes dans les chemins des binaires par défaut (/bin et /usr/bin), puis dans les chemins de la variable PATH de l'utilisateur 4. Le shell exécute les commandes internes BUILTIN 5. Le shell lance la commande externe dans un sous shell Création du processus fils avec l'instruction fork() Ouverture des fichiers descripteurs avec l'instruction open() Décalage des fichiers descripteurs en cas de redirection (3>0 et 4>1) La Console !© par Patrick Hautrive !;~) 2010 103 Attente du processus père (le shell) avec l'instruction wait() Exécution par le processus fils de la commande avec l'instruction exec() Communication de redirection avec les instructions write() et read() Communication inter processus du fils au père avec l'instruction return() Terminaison du processus fils (sous shell) avec l'instruction exit() 6. Le shell enchaîne les blocs de commande en traitement séquentiel 7. Régulation des flux par le pipeline et les filtres L'analyse, l'évaluation et l'exécution d'une commande Analyse syntaxique space operator escape chain tty bloc pipe quote control background rwxst Valuation des mots joker Exécution interne builtin special export env variable alias Lancement sous shell fork() open() meta bin root path regex expr boulean set link host ascii nohup fonction wheel display wait() read() for nice suid octal sticky descriptor signal Exécution extérieure exec() write() return() exit() if test case while until substitution prompt L'exécution détachée du terminal L'exécution d'une commande peut être détachée du terminal du processus parent qui la générée. La commande “nohup cmd” (pour “no hang up”) permet au processus fils de ne pas hériter du terminal de son père. Les commandes détachées du terminal ne seront pas interrompues quand la session de l'utilisateur sera stoppée. Un fichier spécial sera créé pour stocker toutes les sorties “nohup.out”. L'exécution détachée du terminal Le terminal attaché au shell L'exécution détachée du (“tty” et “stty”) (“nohup cmd” et “nohup.out”) La gestion des alias La gestion des alias avec les commandes internes “alias” et “unalias” permet de donner des noms à des lignes de commandes longues et souvent utilisées. Les alias sont généralement générées pour une seule session, c'est pourquoi leur définition sont souvent placées dans un fichier de lancement du shell. La gestion des alias dans le shell Bash L'activation d'alias La désactivation d'alias La définition des alias de session (“alias”) (“unalias”) (“~/.profile” et “~/.bashrc”) La Console !© par Patrick Hautrive !;~) 2010 104 Le traitement séquentiel Le traitement séquentiel des commandes permet de faire suivre plusieurs commandes les unes à la suite des autres. L'enchainement d'une commande est conditionné à la réussite de la précédente. Le shell attend la fin de l'exécution de la première commande pour vérifier son code retour puis lancer la deuxième commande. Une commande est jugée réussie quand son code retour est égale à zéro. Le code retour d'une commande peut être connue avec la commande “echo $?”. Les trains de commandes pour un traitement séquentiel sont toutes sur la même ligne de commande, séparées les unes des autres par l'opérateur de traitement séquentiel “;”. Le traitement séquentiel permet d'enchainer l'exécution de plusieurs commandes, tout en conditionnant leur exécution à la réussite de la précédente. Quand l'une des commandes échoue, les autres qui suivent ne sont pas exécutées. Le traitement séquentiel des commandes L'opérateur de contrôle de traitement séquentiel des commandes (“cmd;cmd”) Le code retour zéro pour la réussite de la commande précédente (“echo $?”) La Console !© par Patrick Hautrive !;~) 2010 105 La formulation d'une commande Le lancement d'une commande prend une multitude de formes selon les besoins ou les situations. La formulation d'une commande : cmd arg option source target Commands cmd cmd ; cmd cmd | cmd cmd `cmd` cmd $(cmd) cmd & cmd && cmd cmd || cmd cmd; \\n cmd nohup cmd type cmd echo “text” echo '$VAR' echo \$HOME echo '`cmd`' echo e “\120” batch (Ctrl+D) at now (Ctrl+D) crontab cmd | tee > cmd !! !num /usr/bin/cmd Fonction Validation (enter) Traitement séquentiel (train) Redirection (pipe) Substitution en sous shell Substitution POSIX Background (jobs) Conditionnement Vrai (AND) Conditionnement Faux (OR) Échappement Eol (Escape) Détachement du terminal (tty) Évaluation de la syntaxe (test) Protection littérale (sauf `,\,$) Annulation de toute expansion Échappement d'un caractère Protection de l'évaluation Évaluation Escape Sequence Execution séquentielle (FIFO) Execution programmée (atd) Execution régulière (crond) Execution et duplication (fork) Execution last command Execution from history Chemin absolu (Absolut Path) Commands Fonvtion (cmd ; cmd) {cmd ; cmd} cmd > file.txt cmd >> file.txt cmd < file.txt cmd 2> error.txt cmd 1&2> ouput.txt !cmd alias cmd=”cmd option” unalias cmd time cmd su root c “cmd” sh c cmd ssh v user@host cmd ln s /bin/bash ~/myshell echo $? batch < script.txt source script.sh . script.sh ./script.sh declare_function Sous shell (fils distincts) Bloc (un seul processus) Écrasement Concaténation Passage de paramètres Déviation STDERR Déviation des sorties Inversion du code retour Définition d'un alias Suppression d'un alias Minutage de l'exécution Lancement en root Lancement en sous shell Lancement à distance Lien symbolique (link) Dernier code retour Execution d'un script Execution shell Bash Execution shell Bash Execution sub shell Bash Execution d'une fonction L'édition des commandes L'édition des commandes permet de “circuler” à l'intérieur d'une ligne de commande afin d'en modifier une partie (avec les touches FLECHE GAUCHE et FLECHE DROITE du clavier). L'historique des commandes La Console !© par Patrick Hautrive !;~) 2010 106 L'historique des commandes permet de rappeler au prompt toutes les commandes qui ont étés déjà validées (avec les touches FLECHE HAUT et FLECHE BAS du clavier). Les commandes “history”, “!!” et “!4” permettent d'afficher dans l'ordre toutes les commandes de l'historique, de relancer la dernière ou la quatrième en partant de la dernière. Les commandes mémorisées dans l'historique sont enregistrées dans un fichier caché (“~/.bash_history”) dans le répertoire personnel de l'utilisateur (“echo $HOME”). La configuration de l'historique est personnalisable à l'aide des variables adéquates. La coloration syntaxique La coloration syntaxique permet de colorier dans le terminal les réponses du shell en fonction du type de fichier par exemple. La Console !© par Patrick Hautrive !;~) 2010 107 La complétion des commandes La complétion des noms de commande permet de ne saisir que le début d'une commande (et de compléter la formulation avec la touche de tabulation (TAB). Le shell complète automatiquement les éléments manquants ou propose une liste des commandes ou des fichiers qui correspondent avec la saisie. La liste des commandes proposées dépend des répertoires déclarés dans la variable PATH pour la recherche des exécutables, et la liste des fichiers proposés dépend du répertoire courant ou du chemin absolu. La complétion des options des commandes est particulier au shell Z et à sa configuration. L'édition, la complétion et l'historique des commandes La coloration syntaxique des fichiers L'édition de la ligne de commande La circulation dans l'historique des commandes L'historique des commandes Le lancement d'une commande Le lancement de la dernière commande lancée Le fichier de stockage de l'historique Les variables historiques La coloration syntaxique La complétion des commandes Les chemins de recherche des exécutables La complétion des options ARROWS LEFT RIGHT HOME END ARROWS UP DOWN (“history”) (“!NUMCMDHIST”) (“!!”) (“~/.bash_history”) (HISTFILE et HISTFILESIZE) (“color”) (TAB) (“echo $PATH”) (shell Z) La redirection de commande La redirection d'une commande s'effectue avec les opérateurs de redirection (pipe). La commande «cmd | tee file.txt» permet de dupliquer la sortie standard (stdio) et de la rediriger vers un fichier ou une autre commande. La Console !© par Patrick Hautrive !;~) 2010 108 LANGUAGE Le langage de programmation Le shell contient un langage de programmation. Ce langage est dit “interprété” et permet la rédaction de scripts complexes. Le langage de programmation inclue l'évaluation des expressions et l'interprétation des caractères spéciaux (méta, joker, separator, operator, special, escape, octal, hexa), l'affectation, la déclaration, l'expansion, et l'exportation de variables, la définition de fonctions et la transmission de valeur d'un environnement à l'autre, la substitution du résultat d'une commande, l'utilisation de structures de contrôle comme l'itération (les boucles) et les décisions (tests), et l'interaction avec l'utilisateur. Les structures de contrôle Les structures de contrôle du langage de programmation du shell Bash sont, soit des structures itératives et conditionnelles (boucles), soit des structures décisionnelles ou de contrôles (tests). Les structures de contrôle du langage de programmation interprété du shell Bash La boucle itérative à compteur fixe La boucle conditionnelle à compteur variable au début de tour Les boucles conditionnelles à compteur variable en fin de tour Les structures décisionnelles (branchement et tests) Les choix multiples (for in do done) (while do done) (until do done) (If then else fi) (case in esac) L'évaluation des expressions Le shell assure l'évaluation des expressions arithmétiques et alphanumérique. Ces évaluations permettent de ne pas indiquer de valeur précise en “dur” à l'intérieur d'un script, mais de construire une expression qui sera évaluée et/ou calculée le moment venu avec la commande “expr”. Les méta caractères Les méta caractères sont des caractères spéciaux qui séparent et relient les commandes entre elles. Les méta caractères comprennent, les jokers, le séparateur interne des mots (IFS) et les opérateurs de contrôle. La Console !© par Patrick Hautrive !;~) 2010 109 L'évaluation des expressions et des méta caractères par le shell Bash L'évaluation des expressions arithmétiques Les méta caractères qui séparent ou relient les commandes Les jokers ou expressions rationnelles ou régulières (regex) Le séparateur interne (IFS) Les opérateurs de contrôle L'opérateur de (BACKGROUND) L'opérateur logique (AND) L'opérateur logique (OR) L'opérateur d'enchainement des commandes (DOT COMA) L'opérateur de redirection (PIPE) L'opérateur de concaténation (SUPERIOR INFERIOR) L'opérateur de regroupement dans un sous shell L'opérateur de regroupement dans un bloc shell L'opérateur d'évaluation d'expression (BRACKETS) L'opérateur de fin de ligne de script L'opérateur de passage à la ligne (“expr”) (| ? * & ; () {} [] <> IFS) (?, *, [,]) (SPACE TAB) (& && | || ; ;; <> <<>> CR NL) (“cmd &”) (“cmd && cmd”) (“cmd || cmd”) (“cmd ; cmd”) (“cmd | cmd”) («cmd >> file») (“(cmd;cmd)”) (“{cmd;cmd}”) (“[cmd;cmd]”) (“;;”) (RETURN et NEWLINE) Les jokers Le shell assure également la traduction des expressions rationnelles (expressions régulières). Ces expressions emploient les caractères spéciaux du shell et permettent de définir des ensembles de valeurs à l'intérieur d'une formulation courte et générique. L'utilisation des jokers (?, *, [,]) par exemple remplace dans un mot un ou plusieurs caractères présents mais inconnus. Les jokers sont des caractères spéciaux qui, comme d'autres caractères sont significatifs pour le shell. Ces caractères spéciaux peuvent être compris comme des raccourcis pour désigner un ensemble de valeur (les “regex” qui est la contraction de regular expression). Le séparateur interne Par convention, le séparateur interne ou IFS (Internal Field Separator) est le caractère d'espace frappé avec la barre d'espace (SPACE) ou la touche de tabulation (TAB). Le séparateur interne est un méta caractère qui permet de distinguer les options entre elles. Les opérateurs de contrôle Les opérateurs de contrôle sont des méta caractères qui opèrent une fonction de contrôle de la ligne de commande. Un opérateur de contrôle termine toujours une ligne de commande. Les opérateurs de contrôle permettent de relier deux commandes entre elles et d'effectuer des contrôles avant leur exécution. La Console !© par Patrick Hautrive !;~) 2010 110 Les caractères spéciaux Les shell reconnait un ensemble de caractères spéciaux. Les caractères spéciaux désignent tous les caractères visibles du clavier (figurant à l'intérieur de la table de codage des caractères ASCII) qui ont pour le shell et les scripts une signification particulière. L'ensemble de ces caractères spéciaux font l'objet d'une standardisation. Les méta caractères qui se composent des jokers, du séparateur interne (IFS), et des opérateurs de contrôle sont des caractères spéciaux, auxquels s'ajoutent les caractères d'échappement qui protègent une expression de l'évaluation par le shell ou une variable de son expansion, comme l'antislash, les guillemets simples (apostrophe) ou doubles. Le guillemet inversé (Altgr+7 ou reverse quote ou back quote ou backtick) est le caractère spécial de substitution du résultat d'une commande. Les caractères spéciaux du shell Bash Le séparateur interne (IFS) Le joker caractère Le joker multiple Le séparateur de valeur L'intervalle de valeur La substitution du résultat d'une commande La redirection de la sortie en entrée L'échappement du passage à la ligne Le lancement de commandes en sous shell Le regroupement de commandes en bloc shell Le regroupement d'expression La protection contre toute évaluation L'échappement d'un méta caractère La protection contre l'expansion des variables L'enchaînement de commandes Le lancement en tâche de fond « » “?” “*” “[a,c]” “[az]” “`” “|” “\” “()” “{}” “[]” “”” “\” “'” “;” “&” (barre d'espace et tabulation) (interrogation) (étoile) (virgule) (hyphen) (Altgr+7 ou quote) (Altgr+6 ou pipe) (backslash) (parenthèse) (accolade) (crochet) (guillemet) (backslash) (apostrophe) (point virgule) (esperluette) Les séquences d'échappement Les séquences d'échappements spéciales permettent d'inscrire un caractère associé à une touche du clavier ou à une valeur de la table de codage des caractères ASCII sur 8 bits dont la liste est donnée avec la commande “man bash”. La commande “man ascii” donne une description de la table de codage ASCII. Les séquences d'échappement sont interprétées avec l'option “e” (escape) de la commande echo. La Console !© par Patrick Hautrive !;~) 2010 111 Les séquences d'échappement (escape) (echo e) (man ascii) L'interprétation des séquences d'échappement “echo e "\120\115\114\110"” La clochette \a (alert bell) La touche backspace \b (backspace) Désactication de l'affichage du message \c (produce no further output) Un espace \e (escape character) La touche \f (form feed) Le caractère ASCII nouvelle ligne \n (new line) La touche ENTRE \r (carriage return) La tabulation horizontale \t (horizontal tab) La tabulation verticale \v (vertical tab) L'échappement du symbole d'échappement \\ (backslash) L'échappement de l'apostrophe \’ (single quote) L'échappement du guillemet \” (double quote) L'échappement de l'apostrophe inversée \` (reverse quote) La valeur octale d'un caractère ASCII 8 bits \NNN (octal value) La valeur hexadécimale d'un caractère ASCII \HHH (hexadécimal value) Le caractère de contrôle \cx (controlx character) Les options de la commande echo (man echo) L'interprétation des séquences d'échappement La désactivation de l'affichage nouvelle ligne La désactivation de l'interprétation (by default) e n E (echo e « \n Hello ») (echo ne « Hello \n) (echo E « \t\n\c HELLO ») Les scripts shell Les scripts shell sont des fichiers exécutables contenants des commandes. Les scripts permettent d'automatiser les tâches d'administration. Un script shell sera interprété par le shell dans lequel il s'exécute. Les scripts doivent avoir le droit d'exécution (“x”) pour l'utilisateur qui souhaite l'exécuter. A l'intérieur d'un script, le caractère dièse permet d'afficher des commentaires. L'exécution d'un script peut faire l'objet d'une interprétation spécifique. Le type d'interprétation est alors indiqué en début de script par la référence au chemin du binaire de l'interpréteur de commande. Les scripts shell L'attribution du droit d'exécution Les commentaires à l'intérieur d'un script Les scripts Bourne Shell Les scripts Bourne Again Shell Les scripts C shell Les scripts Perl Les scripts Php (“chmod +x script”) (“#” avec Altgr+3) (#! /bin/sh) (#! /bin/bash) (#! /bin/csh) (#! /usr/bin/perl) (#!) La Console !© par Patrick Hautrive !;~) 2010 112 L'interaction avec l'utilisateur L'interaction entre l'utilisateur et le processus peut s'effectuer avec l'appel système “read()” ou la commande interne au shell “read” qui permettent de redonner la main à l'utilisateur afin qu'il saisisse une donnée, laquelle sera stockée dans une variable interne et utilisée par la suite par la fonction ou le script. L'interaction avec l'utilisateur L'interaction avec la commande interne L'interaction avec la fonction du système (“read”) (“read ()”) La Console !© par Patrick Hautrive !;~) 2010 113 PROCESS Les processus Les processus représentent les commandes, les applications ou les serveurs en mémoire vive (memory). Tous les exécutables qui tournent sur un système Gnu Linux sont identifiables par un processus. Les processus portent le nom de la commande avec ses options. Le système attribue un numéro séquentiel unique à chaque processus, pouvant aller de 2 à 30 000. Le numéro d'identification d'un processus ou PID (Process Identification) permet de faire référence au processus et de lui envoyer des signaux (signal). Les processus peuvent communiquer entre eux et échanger des données, soit localement, par le mécanisme des IPC (Inter Process Communication) et des redirections des entrées sorties ou I/O (Input Output), soit à distance, via le réseau, par l'intermédiaire des sockets TCP/IP ou des RPC (Remote Procedure Call). Tous les processus sont les descendants d'un autre processus, et forment ainsi une filiation (pstree) qui remonte jusqu'au processus init. Le processus init est le premier processus du système. Le processus init a été lancé par le noyau lors de la procédure d'initialisation, et porte le numéro d'identifiant un. Les processus héritent de leur processus parent le même environnement (variables, droits, racine). Par exemple, tous les processus d'un utilisateur qui s'est connecté sur un terminal virtuel, sont les descendants de son shell de connexion. Tous les processus appartiennent à un utilisateur du système. Le propriétaire d'un processus est généralement l'utilisateur qui a lancé la commande. Les processus partagent les permissions de l'utilisateur et du groupe qui en sont les propriétaires. Les processus peuvent être exécutés en avant plan (foreground) ou en arrière plan (background). Le contrôle des tâches (job control) consiste à gérer les processus. Les processus peuvent être détachés du terminal auquel il sont relié (nohup). Un processus détaché n'a plus de lien de filiation avec son processus parent. Les serveurs ou DAEMON (Disk And Executive Monitor) sont des processus qui tournent en tâche de fond, qui sont détachés de leur terminal, et qui restent à l'écoute d'un évènement grâce à une structure de code en boucle infinie. La procédure d'initialisation du système (init) démarre de nombreux services ou serveurs, dont le super démon internet (xinetd). Les processus sont regroupés par groupes de processus. Les shells de connexion sont initialisés avec un nouveau numéro de groupe (SESSION). Les commandes «ps», «top» et «pstree» permettent de visualiser les processus en cours. La vie d'un processus La vie d'un processus se déroule en mémoire vive. Le noyau réserve un espace en mémoire vive pour chaque processus (core image), et l'ordonnanceur du noyau (sheduler) distribue le temps processeur (time sharing) à chacun des processus en fonction de leur priorité (nice). Les processus exécutent ainsi La Console !© par Patrick Hautrive !;~) 2010 114 à tour de rôle les tâches, les instructions ou le code qu'ils contiennent. Par exemple, un processus remplit l'espace mémoire qui lui est attribué par le code binaire de la commande qu'il représente, et le code binaire est régulièrement chargé, puis exécuté par le processeur. L'exécution des tâches de chaque processus s'effectue au fur et à mesure, et en fonction de la répartition des tâches par l'ordonnanceur (multi threads). C'est l'ordonnanceur qui décide, quand et quel processus s'exécute (multi tâches préemptif). Les activités des processus sont contrôlées par le système. L'espace mémoire des processus est protégé, et les processus ne peuvent faire que ce qui est autorisé par leurs permissions. Si un processus tente de faire quelque chose que ne lui permet pas ses permissions, alors un message d'erreur est envoyé à la sortie standard pour prévenir l'utilisateur de l'arrêt de sa commande. Toutefois, il est possible qu'un processus soit programmé pour changer le code qu'il contient. Quand tout se déroule bien, le processus fait exécuter toutes ses tâches par le processeur et se termine. La terminaison d'un processus La terminaison d'un processus peut être due à un arrêt brutal de son exécution, soit parce qu'il ne détient pas les permissions suffisantes, soit parce qu'un dysfonctionnement l'empêche de continuer (bug). En général, un processus se termine quand il a fait exécuter toutes ses tâches par le processeur. Quand un processus enfant se termine, il en informe son processus père en lui envoyant son code retour (return code). Le code retour d'un processus est toujours égal à zéro quand sa tâche s'est déroulée sans encombre, et que son exécution fut une réussite (success). La terminaison d'un processus libère le PID. Les processus constituent des groupes de processus qui ont le même ancêtre. La terminaison d'un processus entraine la terminaison de tous ces descendants. Ainsi, la terminaison du shell de connexion d'un utilisateur entraine la terminaison de tous ses processus, sauf ceux qui ont été détachés (nohup) et pour lesquels le lien de filiation a été rompu. La commande ps La commande «ps» permet de visualiser l'activité des processus. La commande «ps» est commune a tous les systèmes Unices, mais l'emploi de ses options peut légèrement varier d'un système à l'autre. Par exemple, les Unix™ AT&T propriétaires utilisent les options en plaçant devant un tiret (hyphen ou dash), les systèmes libres BSD utilisent les options sans préfixe, et les systèmes Gnu Linux utilisent les options longues et explicites (gnu long option) en plaçant devant deux tirets continus (double dashes). Les systèmes Gnu Linux acceptent également les options formulées à la façon des autres systèmes. En général, les options des commandes Gnu sont beaucoup plus nombreuses, parce que les programmes sont développés librement par des membres de la communauté des Logiciels Libres (free software). La commande «man ps» donne une description complète des options de la commande, des attributs et des codes d'état des processus, des correspondances avec d'autres systèmes Unices, ainsi que le nom La Console !© par Patrick Hautrive !;~) 2010 115 des variables susceptibles d'en modifier le comportement ou l'aspect (personality). Par exemple, le champ SESSION correspond à un groupe de processus. Le champ STAT indique l'état d'activité d'un processus. Le champ RSS (Resident Set Size) correspond à la taille de l'espace réservé en mémoire vive. Certaines options possèdent plusieurs alias. Les options de la commande ps et les attributs des processus (man ps) %cpu command fgroup ni psr sgi_p start_time tpgid %mem cp flag nice rgid sgid stat tt args cputime flags nlwp rgroup sgroup state tty blocked egid fname nwchan rss sid suid ucmd bsdstart egroup fuid pcpu rssize sig suser ucomm bsdtime c eip esp fuser gid pending pgid rsz rtprio sigcatch sigignore svgid svuid uid uname caught etime group pgrp ruid sigmask sz user class euid ignored pid ruser size thcount vsize cls euser label pmem s spid tid vsz cmd f lstart policy sched stackp time wchan comm fgid lwp ppid sess start tname Les états d'un processus Selon l'ordonnancement des processus (sheduler), les processus passent d'un état à l'autre (STAT). Les processus sont créés par un processus parent (fork), puis passent successivement dans les états d'attente (sleeping), de réveil et d'élection au processeur (running), d'arrêt (stopped), de pagination (swapping), et de semi terminaison après avoir envoyé un signal à leur père (zombie). La Console !© par Patrick Hautrive !;~) 2010 116 Les états d'activité des processus (man ps) Code D R S T W X Z < N L s 1 + Meaning Damned Running Sleeping Stopped Swapping Dead Zombie English French Uninterruptible sleep (usually IO) Dormance Running or runnable (on run queue) Processeur Interruptible sleep (waiting for an event to complete) Attente CPU Stopped, either by a job control signal or because it is being traced Arrêt Ctrl+Z Paging (not valid since the 2.6.xx kernel) Pagination Dead (should never be seen) Mort Defunct ("zombie") process, terminated but not reaped by its parent Zombie Format BSD Not nice Highpriority (not nice to other users) Nice Lowpriority (nice to other users) Locked Pages locked into memory (for realtime and custom IO) Session Session leader Multi thread Multithreaded (CLONE_THREAD, NPTL pthreads) Foreground Process is in the foreground process group Le temps processeur Le temps processeur se mesure de différentes façons. La commande «time cmd» expose trois temps, le temps réel écoulé (REAL), le temps d'utilisation du processeur en zone utilisateur (USER) et le temps d'utilisation du processeur en zone kernel (SYS). La communication inter processus La communication inter processus est un mécanisme global de communication des processus. La communication inter processus ou IPC (Inter Process Communication) utilise le concept de sémaphores (sem.h) et de fichiers descripteurs (file descriptor) pour transmettre des données d'un processus à l'autre. La communication inter processus comprend également l'envoi de signal à un processus. Par exemple, un processus enfant peut envoyer un signal à son processus parent lui indiquant qu'il a terminé sa tâche (SIGTERM). Par ailleurs, un utilisateur peut envoyer un signal à l'un de ses processus avec la commande “kill”. Enfin, deux processus peuvent communiquer entre eux par l'intermédiaire des entrées sorties (pipe). Chaque processus possède son propre environnement, et dispose d'une entrée et de deux sorties standards (I/O standard pour input et output). Certains programmes sont appelés des filtres parce qu'ils récupèrent un flux de données qu'ils transforment et restituent en sortie. La Console !© par Patrick Hautrive !;~) 2010 117 La communication inter processus (sémaphores IPC) L'envoi d'un signal à une commande L'envoi d'un signal à la dernière commande lancée La connaissance du PID d'une commande L'envoi d'un signal SIGKILL à un processus L'information sur les signaux et la communication IPC (“kill NUMSIG %cmd”) (“kill %%”) (“ps aux | grep cmd”) (“kill 9 NUMPID”) («man signal» et «man ipc») Les fichiers descripteurs Tous les processus sont dotés d'une entrée (STDIN) et de deux sorties standards, la sortie pour l'affichage normal (STDOUT) et la sortie pour l'affichage des erreurs (STDERR). Les entrées et les sorties standards d'un processus transitent par des fichiers spéciaux appelés des fichiers descripteurs (file descriptor). Les fichiers descripteurs de chaque processus sont numérotés de zéro à quatre. Comme chaque commande est exécutée dans le cadre de son propre processus, chaque commande dispose des moyens de communication standards pour recevoir des signaux et échanger des données avec d'autres processus. Les sorties peuvent être redirigées vers un fichier sans fond (“/dev/null”). Quand il y a une redirection, les deux derniers fichiers descripteurs (3 et 4) des deux processus sont ouverts pour recevoir ou dispenser les données. Les redirections utilisent les fichiers spéciaux “/dev/stderr”, “/dev/stdin” et “/dev/stdout” pour transmettre les flux. Par exemple, le processus père (le shell) transmet au processus fils (la commande) ces cinq fichiers descripteurs en héritage (numérotés de zéro à 4), mais un décalage est opéré quand il y a une redirection entre les deux. Les redirections des entrées sorties (pipeline) L'entrée standard d'un processus (clavier) La sortie standard d'affichage des résultats (écran) La sortie standard d'affichage des erreurs (écran) Les communications entre fichiers descripteurs Les communications entre fichiers descripteurs 0 =STDIN (“/dev/stdin”) 1 =STDOUT (“/dev/stdout”) 2 =STDERR (“/dev/stderr”) 3 ==> 0 (sortie du père vers l'entrée du fils) 4 ==> 1 (entrée du père reçoit la sortie du fils) Les pipelines Deux processus peuvent être reliés entre eux par l'intermédiaire d'un tunnel (pipeline). Une connexion est établie entre deux processus quand la sortie standard de l'un est reliée à l'entrée standard de l'autre. Un flux de données transite de l'un à l'autre. Le flux sortant (STDOUT) d'un processus alimente l'entrée standard (STDIN) de l'autre. Ce mécanisme de redirection est appelé pipeline et permet de former des trains de commandes. Les opérateurs de redirection (>, <, >>, << et le pipe “|” avec Altgr+6) établissent les tunnels où transite le flux d'information entre une sortie et une entrée. La Console !© par Patrick Hautrive !;~) 2010 118 Les opérateurs de redirection Les opérateurs de redirection sont des caractères spéciaux du shell, ce sont des méta caractères qui ont la fonction d'opérateurs de contrôle. Les opérateurs de redirection peuvent s'utiliser vers un fichier ou vers un fichier descripteur (file descriptor) correspondant à l'entrée d'un processus. Quand la redirection concerne deux processus, l'on dit que les opérateurs de redirection établissent des tunnels ou des canaux de communication entre les deux processus. Un tunnel permet de faire transiter le flux de sortie d'un processus vers l'entrée d'un autre processus. Un opérateur de redirection simple écrase et remplace toute information préexistante, tandis qu'un opérateur de concaténation permet de placer à la fin d'un fichier le nouveau flux qui devient un stock. Les opérateurs de redirection (flow & stock) (man bash) Les opérateurs de contrôle de redirection simples Les opérateurs de contrôle de concaténation La redirection de l'entrée standard STDIN 0 (clavier) La redirection de la sortie standard STDOUT 1 (écran) La redirection de la sortie des erreurs STDERR 2 (écran) La redirection des sorties standard STDOUT et STDERR La redirection des sorties standard STDOUT et STDERR (>, <, et le pipe “|” avec Altgr+6) (>>, <<) (0>) (1>) (2>) (2>&1) (>&) L'envoi de signal aux processus L'envoi de signaux aux processus permet de gérer l'activité des processus en mémoire. La liste des signaux disponibles est donnée avec la commande “man signal”. Les signaux sont envoyés aux processus avec la commande “kill SIG PID” qui prend pour paramètres le type de signal adressé et le numéro d'identification du processus (PID). Chaque processus est identifié par un numéro d'ordre unique qui lui est attribué au lancement de son exécution, le PID (Processus Identifier). Les numéros de PID des processus en activité sont indiqués dans la commande “ps aux”. Les signaux SIGKILL(9) et SIGSTOP(17) ne peuvent être ni interceptés, ni bloqués, ni ignorés par les processus qui les reçoivent. La Console !© par Patrick Hautrive !;~) 2010 119 L'envoi de signal aux processus (man signal) (kill l) SIGHUP SIGINT SIGQUIT SIGILL SIGTRAP SIGABRT SIGFPE SIGKILL SIGSEGV SIGPIPE SIGALRM SIGTERM SIGUSR1 SIGUSR2 SIGCHLD SIGCONT SIGSTOP SIGTSTP SIGTTIN SIGTTOU 1 2 3 4 5 6 8 9 11 13 14 15 30,10,16 31,12,17 20,17,18 19,18,25 17,19,23 18,20,24 21,21,26 22,22,27 (hangup or death process) (reload) (interrupt) (Ctrl+Alt+Del) (quit) (core) (illegal instruction) (trap) (abort signal) (floating point exception) (kill signal no interception) (invalid memory reference) (segment) (broken pipe) (timer alarm) (termination) (default) (userdefined) (userdefined) (child stopped or terminated) (continue if stopped) (stop with no interception) (stop typed at tty) (stop tty input) (stop tty output) L'héritage de l'environnement Tous les processus engendrés héritent de l'environnement de leur processus père. Comme tous les processus dépendent du processus initial (init), tous disposent apriori du même environnement. L'environnement d'un processus est constitué de toutes les informations que lui a transmises son père (PPID), comme les variables et les fonctions d'environnement (“env”). Toutefois, une commande peutêtre lancée dans un environnement spécifique. Les variables d'environnement sont dites globales quand elles sont exportées d'un processus à l'autre, et sont dites locales quand leur influence reste confinée à l'intérieur d'un seul processus. Une description de l'environnement est donnée par les commandes “man environ”, “man env”, “info coreutils env”. La filiation des processus L'héritage de l'environnement représente tous ce qu'un processus père lègue à ses processus fils. Cette transmission entre processus est un partage et une attribution des mêmes informations. Cette filiation se matérialise avec la commande “pstree” qui liste et classe tous les processus. Pour lancer une commande, le processus du shell va, en règle générale, demander au noyau de créer un clone de lui même (fork). Le système va créer en mémoire un processus séparé mais ayant le même La Console !© par Patrick Hautrive !;~) 2010 120 environnement que le shell, et va lancer la commande à l'intérieur de ce nouveau processus. Le processus père ne s'occupe pas de la réalisation des tâches relatives à la commande. C'est le processus fils qui réalise de façon indépendante les tâches de la commande. Quand le fils a terminé son travail, il rend compte à son père (SIGTERM). Quand la commande a accomplie son travail, celleci transmet au shell les résultats qui les affiche à l'écran. C'est pourquoi parfois le prompt du shell ne réapparait pas tout de suite. Quand certaines commandes prennent un certain temps pour terminer les tâches qui leur incombent, alors le shell attend pour afficher les résultats et présenter de nouveau le prompt. Par contre quand une commande est lancée directement en tâche de fond (background), le shell n'attend pas la fin de l'exécution de celleci et présente le prompt immédiatement. Dans certain cas, le travail est réalisé à l'intérieur même du processus du shell, comme par exemple l'exécution d'une commande interne au shell. L'héritage de l'environnement entre les processus La connaissance des filiations des processus Le répertoire courant (print working directory) Les variables d'environnement issues du processus initial Les variables exportables du processus père La place de la racine dans le système de fichier visible Le masque de création des fichiers Les limites quantitatives d'usage des ressources Les permissions de l'utilisateur parent (rwx) Le numéro d'identification du processus père (PPID) Les variables les fonctions globales La définition des alias La position du bit qui empêche l'écrasement de données Le terminal s'il n'y a pas de détachement (TTY) (“pstree”) (“pwd”) (“init”) (“export”) (“chroot”) (“umask”) (“ulimit”) (“ls la”) (“ps aux”) (“env”) (“alias”) (“noclobber=1” «set noclobber») (“tty”) Le contrôle des tâches Le contrôle des tâches (job control) permet de gérer l'avant et l'arrière plan des processus. La commande “jobs”. Les jobs sont ordonnés par numéros. Les commandes peuvent être lancées en arrière plan (ou autrement dit en tâche de fond) à l'aide de l'opérateur esperluette (“cmd&”) et à l'aide de l'interruption au clavier (Ctrl+Z) qui permet d'interrompre le processus en cours, puis de le basculer en tâche de fond avec la commande “bg” (background). Un travail en tâche de fond peutêtre rebasculé à l'avant plan avec la commande “fg” (foreground). Pour le lancement d'une commande en tâche de fond, le shell (le processus père) n'exécute pas l'instruction “wait()” afin d'afficher le prompt immédiatement. La Console !© par Patrick Hautrive !;~) 2010 121 Le contrôle des priorités Le contrôle des priorités permet de ralentir ou d'accélérer l'exécution relative d'une tâche (“nice” et “renice”). Les processus sont lancés par défaut avec la priorité zéro, c'estàdire qu'ils sont tous traités sur le même pied d'égalité. Toutefois, la priorité d'un processus peut être modifiée (de +19 à 20). Un processus gentil (nice) est un processus qui laisse la priorité aux autres pour l'accès au temps processeur. Les valeurs positives ralentissent le travail d'un processus, tandis que les valeurs négatives (not nice!) accélèrent le traitement des tâches d'un processus. Le contrôle des tâches et des priorités Le lancement d'une commande BACKGROUND L'affichage des tâches en BACKGROUNG Le basculement en BACKGROUND Le basculement en FOREGROUND L'envoi de signal à une tâche L'interruption du processus en cours L'attribution d'une priorité La modification d'une priorité (“cmd &”) (“jobs”) (“bg”) (“fg %NUMJOB”) (“kill NUMSIG %NUMJOB”) (Ctrl+Z) (“nice” de +19 à 20) (“renice”) L'identité des processus L'identité du propriétaire d'un processus est renseignée par la variable UID (User ID) et l'identité effective sous laquelle sera exécuté le processus est renseignée par la variable EUID (Effective UID). Généralement, ces deux identités sont les même, mais l'utilisation des bits SUID et SGID permettent l'usage de cette distinction. L'identité de l'utilisateur peut être modifiée afin de lancer une commande avec les droits d'un autre utilisateur. Le changement d'identité Le changement d'identité peut s'opérer ponctuellement (“sudo cmd”) ou bien pour un certain temps avec la commande “su” pour “switch user”. Dans le premier cas, il faut faire partie des utilisateurs autorisés (“/etc/sudoers”), et dans le deuxième cas, il faut connaitre le mot de passe de l'utilisateur (le mot de passe “root” quand la commande “su” est lancée sans paramètres). La commande “su ” permet de basculer dans l'environnement de l'utilisateur root. Les utilisateurs faisants partie du groupe wheel possèdent les mêmes droits que le super utilisateur. La commande “id” permet de connaitre l'identité de l'utilisateur en cours. La Console !© par Patrick Hautrive !;~) 2010 122 Les permissions spéciales Dans d'autres cas, les commandes sont prévues pour s'exécuter avec les droits de leurs propriétaires et non pas les droits de l'utilisateur qui lance la commande. Par exemple, pour la commande “/usr/bin/passwd” dont le bit SUID est activé, cette procédure est indispensable afin de permettre aux utilisateurs de changer leur mot de passe. Toutefois, d'un point de vue sécuritaire, la prolifération des binaires ayant le bit SUID ou SGID n'est pas conseillée. Les bits SUID et SGID sont respectivement les bits attribués au propriétaire et au groupe propriétaire d'un binaire. Ces binaires seront respectivement lancés automatiquement avec les droits de leur propriétaire ou avec ceux de leur groupe propriétaire. De même, les Sticky Bits sont attachés aux droits des répertoires et permettent de conserver la propriété de tous les fichiers qui y sont créés sous l'identité du propriétaire du répertoire. Un Sticky Bit attaché à un fichier binaire stipule au système de conserver son code exécutable en mémoire. Les bits SUID et SGID sont représentés avec un “S” majuscule (quand il n'y a pas le droit “x” d'exécution) ou avec un “s” minuscule (quand il y a le droit d'exécution). Pour être exécuté un binaire doit posséder le droit d'exécution, mais celuici n'a pas besoin d'être placé partout (ugo). Pareillement, les Sticky Bit sont représentés avec un “T” majuscule (quand il n'y a pas le droit “x” d'exécution), et avec un “t” minuscule (quand il y a le droit d'exécution). Les permissions spéciales et le changement d'identité L'identité de l'utilisateur en cours (UID et EUDI) Le basculement dans l'environnement d'un utilisateur Le changement d'identité Le lancement d'une commande avec d'autres droits Les utilisateurs habilités pour sudo Les bits SUID et SGID des binaires Les Sticky Bits des répertoires ou des binaires Le groupe des utilisateurs habilités root (“id”) (“su – root”) (“su”) (“sudo cmd”) (“/etc/sudoers”) (“S” ou “s”) (“T” ou “t”) (wheel) La Console !© par Patrick Hautrive !;~) 2010 123 La configuration des processus La configuration des processus ps top pstree pgrep ls env umask ulimit Commands man ps pidof id jobs man bash nice fuser bg man signal renice lsof fg man environ nohup watch kill man env su time killall info coreutils sudo init pkill man ipc alias pwd cmd& set xargs Files at /proc/* /etc/at.allow atq /proc/kcore /etc/at.deny atrm /dev/mem /etc/cron.d/cron.allow batch /etc/sudoers /etc/cron.d/cron.deny crontab /etc/toprc /var/spool/cron/atjobs cron ~/.toprc /var/spool/cron/crontabs export /dev/stderr /usr/include/asm/signal.h chroot /dev/stdin /dev/stdout Packages procps psmisc coreutils Les exemples de processus killl ; killall httpd hd /proc/kcore ps e o uid,pid,ppid,session,%mem,nice,stat,tty,cmd ps aux | grep httpd | grep v grep | awk '{print $2}' | xargs kill 9 ps aux ; ls /proc/1 ; pstree p ; urpmi procps ; ps wax ; ps C httpd pidof bash ; nice n 15 bash ; nice n 10 emacs & jobs ; gedit ; Ctrl+Z ; bg ; fg 1 ; Ctrl+C ; gedit & ; jobs ps alux ; ps –pid 1 ; kill HUP PIDNUM ; kill 9 PIDNUM ; kill SIGHUP 'cat /var/run/syslogd.pid' renice 10 PIDNUM ; ps t "1 2" ; time gzip file ps u root (Gnu Linux) ; ps fu root (Unix System V) crontab todo.txt at 1:23 lp /usr/* echo «programmes» | mail s «Job OK» root Ctrl+D at 10:00 < todo.txt ; at l ; atrm ATNUM nohup ls | nohup sort set ignoeof (Ctrl+D) batch sort /usr/* | lp echo «yes» | mailx s «Job OK» root Ctrl+D La Console !© par Patrick Hautrive !;~) 2010 124 TERMINAL Les types de terminal Les terminaux sont soit physiques, soit logiques. Les terminaux physiques (pupitres) sont des équipements matériels constitués d'un clavier et d'un écran relié à un ordinateur central. L'on parle de terminaux passifs quand aucun traitement ne s'y déroule et que l'unique fonction dont ils sont chargés est de transmettre et de recevoir les données. Tandis que les terminaux logiques (émulateurs) sont des logiciels qui imitent le comportement d'un terminal physique. Les terminaux logiques peuvent être de plusieurs sortes, notamment les terminaux virtuels (consoles) accessibles avec les touches Ctrl+Alt+16 et les pseudo terminaux (fenêtres) qui sont affichés par le serveur graphique. L'on parle alors de terminal X. Les types de terminal Les terminaux physiques Les terminaux logiques Les terminaux virtuels (Ctrl+Alt+F1) Les pseudo terminaux (“xterm”) ou terminaux X (pupitres) (émulateurs) (consoles) (fenêtres) L'émulation de terminal Les systèmes Gnu Linux sont capables d'émuler de nombreux types de terminaux dont ceux qui correspondent à la norme ANSI. Les terminaux d'un système Gnu Linux sont des émulations d'un “antique” terminal vidéo de type Télétype (d'où l'appellation de la commande “tty”). Une émulation signifie que le comportement du terminal physique historique qui permettait de se connecter à un ordinateur central distant (le terminal Dec VT100) est imité par les terminaux du système Gnu Linux. La commande “xterm” est un émulateur de terminal pour le serveur graphique. La commande “ls la /usr/share/terminfo/” permet de visualiser les terminaux reconnus par Gnu Linux. IBM 3101 IBM 3270 HPterm Dec VT52 Dec VT100 Dec VT102 Dec VT220 Tektronix 4014 La Console !© par Patrick Hautrive !;~) 2010 125 Les terminaux virtuels Les terminaux virtuels sont les terminaux présentés à l'issue de la procédure d'initialisation en mode ligne de commande (sans interface graphique). Les six terminaux virtuels par défaut sont accessibles après le démarrage du système avec les touches Ctrl+Alt+1 à Ctrl+Alt+6. Depuis un terminal virtuel, les touches Alt+FLECHEDROITE et Alt+FLECHEGAUCHE permettent de basculer d'un terminal à l'autre. Les touches Ctrl+Alt+7 (DISPLAY=0) et Ctrl+Alt+8 (DISPLAY=1) permettent de revenir à l'interface graphique. Les terminaux virtuels sont aussi appelés consoles. Le premier terminal virtuel (/dev/tty1 ou Ctrl+Alt+1) est le terminal par défaut où sont envoyés par défaut les messages du système. Le premier terminal virtuel est aussi appelé la console maitresse qui est généralement réservée à l'administration du super utilisateur (root). Une console distante désigne le terminal virtuel d'une connexion à distance. La console La console est un terminal virtuel pour l'administrateur root. Les pseudo terminaux Les pseudo terminaux sont des terminaux présentés dans le cadre d'une fenêtre affichée par le serveur graphique Xwindow. L'on parle de fenêtre de terminal ou de terminal graphique. La commande “xterm” affiche dans une fenêtre un pseudo terminal. Les périphériques caractères Un terminal est un périphérique de type caractère. Les périphériques de type caractère (character device) sont des périphériques qui acceptent la transmission d'un flux de données, caractère par caractère. Tandis que les périphériques de type bloc (bloc device) accepte la transmission par bloc entier. La commande “ls la /dev/” indique les types de fichiers et permet donc de visualiser tous les périphériques prévus par le système. Les périphériques caractères sont distingués par la lettre “c” et les périphériques blocs par la lettre “b”. Les fichiers spéciaux des périphériques (device) sont généralement automatiquement créés par le système et ils se trouvent dans le répertoire “/dev/”. L'administrateur peut toutefois les générer à l'aide du script “/sbin/MAKEDEV” ou de la commande “mknod”. Un numéro MAJOR et un numéro MINOR sont attribués à chaque fichier spécial. Le système Gnu Linux peut gérer jusqu'à 63 consoles virtuelles. Ces périphériques de type caractère reçoivent le numéro 4 pour le MAJOR et un numéro allant de 1 à 63 pour le MINOR. Les consoles virtuelles portent le nom de “/dev/tty*”. La console en cours d'utilisation porte le nom de “/dev/tty0” (MAJOR 4 et MINOR 0). La Console !© par Patrick Hautrive !;~) 2010 126 Les terminaux fonctionnent en mode “fifo” (first in first out), c'estàdire que les caractères transmis en premier arrivent en premier. Le flux de transmission des caractères peut aller jusqu'à 9600 baud (unité de vitesse de transmission approchant le bit par seconde), et chaque flux comporte un bit d'amorçage, un bit de parité et un bit d'arrêt. Lors de son activation, un terminal signale sa séquence d'échappement qui lui est propre (^] ou Ctrl+]). Les terminaux utilisent la bibliothèque “ncurses” pour gérer l'affichage des caractères. La fenêtre active d'un terminal peut montrer le curseur soit en surbrillance, soit en clignotement. La chasse de la police de caractère peut être fixe ou variable. Le point d'insertion des caractères peut être avant ou après le curseur. Une sélection peut s'effectuer à l'aide de la souris avec un double clic pour un mot, et un triple clic pour toute la ligne. Un copier coller peut être réalisé (paste) à partir d'une sélection en surbrillance en utilisant le clic du milieu (ou à défaut de molette, un clic simultané sur les boutons gauche et droit). La Console !© par Patrick Hautrive !;~) 2010 127 Les fichiers du terminal Les fichiers du terminal (library ncurses) Commands xterm uxterm kvt rxvt gnometerminal konsole fgconsole xconsole screen tty stty set reset export installkeymap codebreaker mknod MAKEDEV Configuration tic loadkeys dumpkeys showkey showrgb xev setkeycodes setleds setmetamode xmodmap charmap setxkbmap setterm tset resize chvt hexdump hd od xcolor dircolors codepag Information Variables /etc/secutty info coreutils echo $TERM /etc/usertty man termcap echo $TERMCAP /etc/terminfo man curses echo $LS_COLOR /etc/termcap man terminfo /etc/gettydefs man term /etc/login.defs man termios /etc/issue man console /etc/motd man console_code /usr/games/fortune man consolechars ~/.signature man charset /dev/console man stty /dev/error man termwrap /usr/share/terminfo/ man baseconfig /usr/lib/X11/app man ascii defaults/XTerm man charsets /usr/lib/terminfo/ man utf8 / man unicode usr/lib/kbd/keymaps/i386/azert man latin1 y/frlatin1.map.gz man locale / man stty usr/share/keymaps/i386/azerty/f rlatin1.map.gz /etc/profile.d/lang.sh /etc/rc.config /etc/console/boottime.kmap.gz /usr/X11R6/lib/X11/rgb.tx Les tables de caractères Une table de caractères (table code) est un tableau qui donne la correspondance entre les évènements du clavier (la pression sur les touches) et les caractères alphanumériques. Les caractères alphanumériques sont l'ensemble des caractères de l'alphabet en majuscule (de A à Z) et en minuscule (de a à z), mais aussi, les chiffres décimaux (de 0 à 9), la ponctuation (de la virgule au point d'intérogation), les opérateurs numériques (du plus au supérieur), les unités monétaires (comme le dollar ou la livre sterling), les caractères spéciaux (comme le slash, le dièse, l'espace ou le pipe), les touches de fonction (de F1 à F12), les touches de navigation (PAGEUP, PAGEDOWN, HOME, END La Console !© par Patrick Hautrive !;~) 2010 128 et ARROWS), les touches de gestion de l'écran (comme l'impression écran ou la pause du défilement), les touches de gestion du clavier (comme la touche VERNUM et les touches Ctrl, Alt et Maj) et les caractères attribués à certaines séquences spéciales (comme la touche de validation ou de tabulation). Les caractères alphanumériques sont classés à l'intérieur d'une table, et ils sont ordonnés selon des codes qui permet de les identifier (de zéro à 127 pour un chiffrage sur 7 bits comme la table ASCII). Ces codes peuvent être écrits en octal, en décimal ou en hexadécimal. Le codage des caractères peut être réalisé sur 7 bits ou 8 bits (ASCII), voire sur plusieurs octets, selon l'ampleur de la table de codage et le nombre de caractères différents à prendre en compte. La table de caractères dépend bien évidemment de la langue choisie pour le système, puisque certaines langues utilisent d'autres caractères que ceux du monde occidental. L'affichage des caractères est complété par la police de caractères qui permet de choisir le style de l'écriture et le rendu (gras, italique, souligné). Les évènements du clavier et de la souris sont captés grâce aux interruptions systèmes (IRQ). L'on parle de clé (keycode) pour indiquer la traduction de chaque caractère en décimal (base 10), en octal (écrit avec 3 chiffres) et en hexadécimal (base 16), et l'on parle de mappage (mapping) pour indiquer la translation de ces clés vers chaque caractère de la table de code (keymap). Les tables de caractères (charmap) sont propres à chaque langue. Les commandes “charmap” et “zcat /usr/share/i18n/charmaps/ISO88591.gz” permet de visualiser la table de code “ISO Latin1” qui est la table de caractère utilisée par défaut par le système Gnu Linux. La commande “locale” permet de définir la langue du système. La table de code de base est la table ASCII (American Standard Code for Information Interchange) codée sur 7 bits (pour 128 caractères) et sur 8 bits (pour 256 caractères). Seuls les tables codées sur 8 bits peuvent afficher les caractères accentués des langues non anglophones. La table de code universel est l'Unicode (universal code) qui permet de représenter tous les caractères de tous les langages, mais elle requiert un encodage sur des entiers de 32 bit (ou deux fois UTF16). La table de code ISO est un standard international. La table ISO 10646 correspond à la table Unicode. La table ISO 88591 ou latin1 est de facto la table qui remplace la table ASCII et dont les 256 premiers caractères sont identiques à la table Unicode. La table de code UTF8 (Unicode Transformation Format sur 8 bits) représente pour Gnu Linux le standard pour l'affichage des caractères. L'encodage UTF8 utilise un octet (byte) pour coder un caractère de 7 bits (0xxxxxxx), deux octets pour coder un caractère jusqu'à 11 bits (les deux premiers bits du premier octet sont annonciateurs d'une suite de deux octets: “110xxxxx 10yyyyyy” est assemblé en “00000xxx xxyyyyyy”), etc. Ainsi le passage de la table ASCII à la table UTF8 ne fait progresser la taille des fichiers que de 2% en moyenne, parce la plus part des langues se servent principalement des 128 premiers caractères (sauf le russe et le grec dont les fichiers doublent de taille). Le code UTF8 est traduit en Unicode et puis le glyphe correspondant est stocké en mémoire vidéo avant d'être affiché. La Console !© par Patrick Hautrive !;~) 2010 129 Les tables de code ASCII Unicode ISO UTF8 man ascii man unicode (ISO 10646) man latin1 (ISO 88591) man utf8 Les commandes “man ascii” et “man unicode” et “man latin1” et “man utf8” décrivent les tables de codage des caractères. Les séquences de contrôle Les séquences d'interruption sont des séquences de touches maintenues qui ont une signification spéciale. Les commandes “man stty” et “man console_codes” et “info coreutils stty” donnent une description des séquences de contrôle. La commande “stty a” affiche les valeurs des séquences de contrôle. Les séquences de contrôle du terminal (stty a) susp intr eof eol erase eol2 flush start rprnt stop kill lnext werase quit swtch dsusp Sequence Ctrl+Z Name susp Signification Suspension Ctrl+A Fonction Stop le processus en avant plan Commande Signal stty susp ^Z Curseur en début de ligne Ctrl+C intr Interruption Abandonne le processus en cours stty intr ^C Ctrl+D eof End Of File Termine le processus en cours stty eof ^D Ctrl+E eol End Of Line Curseur en fin de ligne stty eol ^E Ctrl+H erase Erase Character Backspace one Column Ctrl+L Clear Screen Ctrl+M Carriage Return Validation de la ligne stty erase ^H Efface l'écran Ctrl+O flush Flush Line Validation de la ligne stty flush ^O Ctrl+R rprnt Reprint Historique alphabétique inversé stty rprnt ^R Ctrl+U kill Kill Line Efface la ligne de commande stty kill ^U Ctrl+V lnext Line Next Nouvelle page dans un afficheur stty lnext ^V Ctrl+W werase Word Erase Efface le dernier mot de la ligne stty werase ^W La Console !© par Patrick Hautrive !;~) 2010 130 SIGTERM La personnalisation du terminal La personnalisation du terminal permet de modifier la configuration par défaut. La personnalisation du terminal Les touches magiques Les touches mortes Les séquences de contrôle Le prompt Les couleurs syntaxiques La police de caractère La table de code des caractères Les exemples de terminal stty a loadkeys fr set o vi set o noclobber xterm Isl 2000 xterm fg red xterm geometry 80x40+10+100 fg green bg red fn 7x13bold QUOTE=”Les chaînes libres” ; PS1="$QUOTE \a \n[\u@\h:\w]" Ctrl+L stty erase '^?' kill '~x' hd /usr/share/terminfo/x/xterm | less strace echo e "\120" number 555 clear numlock ls /usr/lib/magic zcat /usr/share/i18n/charmaps/LATINGREEK1.gz La Console !© par Patrick Hautrive !;~) 2010 131 HIERARCHY L'espace de stockage L'espace de stockage du système est ordonné de telle sorte qu'il n'y ait aucune ambigüité. Il ne faut pas confondre l'arborescence (racine) qui présente la hiérarchie des fichiers, et le système de fichiers (file system) qui organise le support de stockage (disque). Sous la forme d'un arbre inversé, la hiérarchie du système de fichier ne comporte qu'une seule racine (root). La racine est son propre répertoire parent (“..”). Par contre, de nombreux points de montage peuvent y être greffés, soit en local (partition), soit à distance (nfs), et chacun peut disposer de son propre formatage (système de fichiers). Ces points de montage peuvent être automatiquement montés lors de l'initialisation du système (mount). La théorie des graphes explique que d'autres types d'organisation sont envisageables, mais que celleci est rapide et souple. Le FHS (File System Hierarchy Standard) correspond à une volonté d'harmoniser la structure hiérarchique des fichiers à l'intérieur de l'arborescence d'un système Gnu Linux. Le LSB (Linux Standard Base) marque la volonté de conserver une seule convention de nommage pour les fichiers de configuration du système Gnu Linux. Ces volontés sont le signe du besoin de convergence quand les distributions Linux s'éloignent petit à petit les unes des autres (du simple fait de l'indépendance de leur développement). En générale, la compatibilité est maintenue, mais il n'est pas rare de devoir rechercher et identifier un fichier, puis de vérifier son contenu. Souvent un système de liens symboliques permet de satisfaire aux exigences de chacun. Les partitions de swap Les partitions swap sont des espaces séparées de l'espace de stockage des fichiers. Les partitions swap permettent de libérer de la mémoire vive (ram) en copiant son contenu. Ce procédé de transfert de pages entières de la mémoire vers le disque, et du disque vers la mémoire s'appèle la pagination. La swap est généralement enregistrée dans une partition, c'est le cas le plus courant, le plus rapide avec les accès disques et le plus sûr parce qu'il s'agit d'une partition séparée. Toutefois, il est également possible de gérer la swap à l'intérieur d'un fichier dans une partition du système de fichier. La taille de la swap dépend des besoins et du type d'utilisation, mais une bonne moyenne est le double de la taille de la mémoire. Comme pour les autres partitions, les partitions de swap sont généralement créée pendant la phase d'installation du système, mais, l'administrateur peut à tout moment ajouter, modifier ou supprimer des partitions. Les commandes “fdisk”, “mkswap”, “swapon” et “swapoff” permettent de gérer les partitions swap. La Console !© par Patrick Hautrive !;~) 2010 132 L'arborescence L'arborescence peut être répartie dans plusieurs partitions de plusieurs disques durs, montés en local ou par le réseau. La commande “ls R / | less” permet de visualiser récursivement toute l'arborescence. L'outil Midnight Commander qui se lance avec la commande “mc” propose une interface succincte pour naviguer à l'intérieur de l'arborescence depuis le shell en mode terminal. L'arborescence du système de fichier d'un système Gnu Linux La swap / La racine de l'arborescence (root file system, “fdisk l “) /bin Les outils, commandes et utilitaires de base (tools, commands, binaries) /boot Les fichiers d'amorçage du système (grub, lilo, vmlinuz, maps, initrd) /dev Les fichiers spéciaux de périphériques (device) /etc Les fichiers de configuration du système et des applications (ASCII) /etc/skel Le modèle de répertoire pour les nouveaux utilisateurs (“useradd m”) /etc/rc3.d Les liens vers les services du niveau d'initialisation du système (Kill et Start) /etc/init.d Les scripts d'initialisation des services de tous les niveaux d'initialisation (“init”) /etc/X11 Les fichiers de configuration du serveur graphique (“xorg.conf”) /home Les répertoires personnels des utilisateurs ($HOME) /lib Les bibliothèques de fonctions pour le compilateur C (shared library) /lib/modules Les modules du noyau (modprob) /lost&found Le répertoire où sont placés les fichiers perdus ou les liens cassés (orphan) /media Le répertoire pour le montage des lecteurs (cdrom, floppy) /mnt Le répertoire pour le montage des autres systèmes de fichiers (“mount”) /proc Le répertoire permettant d'interroger l'image volatile du noyau (PID) /pub Le répertoire public pour les téléchargements et les connexions anonymes /root Le répertoire personnel du super utilisateur (root) /sbin Les commandes d''initialisation du système réservées au super utilisateur (root boot) /tmp Le répertoire des fichiers temporaires accessibles à tous (chmod o=r+w) /usr Les applications installées sur une machine et accessibles à tous les utilisateurs /usr/bin Les binaires (“chmod o=x”) /usr/doc La documentation /usr/games Les jeux /usr/include Les entêtes de programmation C (headers “*.h” et #include) /usr/lib Les bibliothèques des applications (*.so) /usr/local Les applications installées pour le poste /usr/sbin Les commandes d'administration du système réservées au super utilisateur (root) /usr/share Les fichiers partagés des applications comme des images ou de la documentation /usr/share/manLes pages man /usr/src Les fichiers sources du noyau (kernel source) /usr/X11R6 Les fichiers du serveur graphique /var Le répertoire des fichiers à taille variable (log, httpd, mail, spool) La Console !© par Patrick Hautrive !;~) 2010 133 Le nommage des fichiers L'arborescence est répartie en répertoires, en fichiers standards et en fichiers spéciaux. Pourtant, l'on dit que dans un système Gnu Linux, tout est fichier. C'est parce que un répertoire est un fichier dans lequel est enregistré la liste des fichiers qu'il contient. Les répertoires sont des fichiers conteneurs. Les noms de fichiers ne peuvent contenir certains caractères spéciaux (“/”, “.”, “..”) qui ont une signification particulière pour l'arborescence. Les noms de répertoires, les noms de commandes ou les mots réservés sont sujets à ambigüités pour le nommage des fichiers. Il faut garder à l'esprit que les noms de fichiers peuvent être amenés à faire partie d'une ligne de commande, et qu'ils devront être évalués et interprétés par le shell. Pourtant, le caractère d'échappement (backslash) permet la création de fichiers qui commencent par des caractères spéciaux. Il n'y a pas de règle, ni de convention, mais le bon sens et l'anticipation suggèrent d''éviter les accents, les espaces et les caractères spéciaux pour assurer aisément la gestion, la portabilité et la migration. Une nomenclature explicitant le contenu des fichiers peut en outre faciliter le traitement en grand nombre. Les noms de fichiers des premiers systèmes Unix™ ne pouvaient comporter que 14 caractères, et les noms des premiers systèmes BSD étaient limités à 64 caractères. Le système Gnu Linux accepte les noms longs de 256 caractères. Le système Gnu Linux tient compte de la casse (minuscules ou majuscules), et n'exige pas une extension pour les noms de fichier. Les fichiers cachés dont le nom commencent par un point ne sont pas répertoriés par la commande “ls” sans l'option “a”. En règle générale, les fichiers sont triés selon l'ordre alphabétique de la table de code ASCII, c'estàdire que les chiffres s'affichent en premier, puis les majuscules qui précèdent les minuscules. Le numéro d'inode d'un fichier Dans un système Gnu Linux, tout les fichiers sont identifiés par un numéro d'inode et tous les fichiers portent des droits d'appartenance à l'un des utilisateurs du système. La table d'inode référence les adresses physiques de l'espace de stockage, et est propre au système de fichier installé sur la partition. La suppression d'un fichier libère son numéro d'inode, mais n'écrit rien sur le disque. La taille maximale d'un fichier dépend bien sûr de la taille de la partition, mais celleci dépend également du système de fichiers employés et de la taille de ses secteurs (sectors). Les types de fichiers L'arborescence est constituée de fichiers de types différents. Le répertoire racine se situe tout en haut de la hiérarchie et son nom est un slash “/”. Placé en début de chemin absolu, le slash indique la racine La Console !© par Patrick Hautrive !;~) 2010 134 de l'arborescence, par contre, quand il est placé ailleurs, le slash est un interprété comme le caractère séparateur des répertoires. La commande “ls la” permet de visualiser les types de fichiers et les droits afférant à chacun d'entre eux. Les types de fichiers (ls la) Les répertoires (directory) Les fichiers standards (file) Les fichiers spéciaux des liens symboliques et des alias (symlink) Les fichiers spéciaux des périphériques en mode bloc (bloc device) Les fichiers spéciaux des périphériques en mode caractère (caracter device) Les fichiers spéciaux des sockets TCPIP (socket) Les fichiers spéciaux des tubes nommés (pipe) pour les redirections (fifo) d l b c s | La commande “ls F” permet d'afficher les fichiers avec une extension symbolique (append) indiquant une caractéristique. La coloration syntaxique (LS_COLORS) permet de configurer la commande “ls” afin de voir les types de fichiers apparaitre avec une certaine couleur. La commande “readlink” permet de suivre les liens. La classification des types de fichiers (ls F) Les fichiers Les liens brisés Les répertoires Les liens Les exécutables et les images Les pipes (fifo) Les sockets / @ * | = (blanc) (rouge) (blue) (turquoise) (green) (blanc) (violet) Les magic number Certains fichiers sont particuliers comme le fichier “/dev/null” qui est toujours vide, ou les fichiers “/dev/zero” ou “/dev/random”. La commande “file” évalue le type de format d'un fichier en examinant le formatage qu'il contient. Les fichiers peuvent être identifiés à l'aide d'un identifiant numérique magique (magic number). La commande “man magic” et les fichiers “/etc/magic” et “/usr/share/mime/magic” donnent une description de l'utilisation de ces identifiants. Les liens symboliques Un lien (link) peut être, soit un raccourci (soft), soit un synonyme (hard). Dans le cas d'un lien symbolique (symlink), le fichier pointe vers un autre fichier. Le fichier est de type “l”, le lien est un lien vers le nom du fichier et quand la cible est supprimée, le lien est cassé, et le fichier est dît orphelin, il y a deux noms de fichiers, mais le fichier symbolique est presque vide puisqu'il ne contient La Console !© par Patrick Hautrive !;~) 2010 135 que le nom auquel il fait référence, et chacun des fichiers est référencé sur le disque avec son propre numéro d'inode. Les liens symboliques peuvent faire référence à un fichier appartenant à un autre système de fichiers. Dans le cas d'un lien en dur (hardlink), les deux fichiers sont représentés par le même numéro d'inode. Le fichier est du même type, le lien est un lien vers le même numéro d'inode et quand l'un est supprimé, l'autre existe toujours, et il est toujours possible d'accéder au fichier, les fichiers sont identiques et de même taille, toutefois, à l'intérieur d'une même partition, l'espace de stockage n'est pas doublé puisque c'est le même numéro d'inode qui les identifie. La commande ls La commande “ls la” indique dans l'ordre le type, les permissions, le nombre de hardlink, l'utilisateur propriétaire, le groupe propriétaire principal, la taille exprimée en octets, la date et l'heure de la dernière modification (mtime), et le nom du fichier. Les champs de l'affichage long de la commande «ls l» type permission hardlink user group size date mtime name La table des inodes garde en mémoire les dates de création (ctime), d'accès (atime) et de modification (mtime) pour toutes ses entrées. Les commandes “ls –time=status” et “ls –time=use” montrent respectivement un affichage précis en fonction du statut ou de la date d'accès des fichiers, l'affichage par défaut étant la date de la dernière modification. Des recherches ciblées prenant en compte ces paramètres peuvent être entreprises avec l'outil “find”. La commande “touch” permet d'actualiser les dates d'accès et de modification du fichier. La recherche avec find L'outil find permet d'effectuer des recherches ciblées sur des fichiers de l'arborescence et d'enchainer une commande qui s'appliquera pour chaque occurrence. find / name “pattern” print find / name core exec rm {} \; find . name “*doc*” exec ls la {} \; find / name README* ok less {} \; find . name "*.jpg" exec ls>ls.txt {} \; find . \( name "*.jpg" o name "*.png" \) | less find /etc atime 1 size 8 print find $HOME mtime 3 find /tmp atime 2 exec rm {} \; find /usr/bin type l | less sudo find / \( \( perm 04000 a perm +011 \) o \( perm 02000 a perm +011 \) \) print La Console !© par Patrick Hautrive !;~) 2010 136 find . name \* mtime 0 find . mtime +0 mtime 3 find / type f size 50c exec ls l {} \; find / type f size 500k exec ls l {} \; Les alternatives de debian Les alternatives de Debian sont un système de liens symboliques permettant de faire correspondre des noms génériques de programme vers les binaires associés. Par, exemple, plusieurs éditeurs de texte peuvent être installés sur un système et les variables EDITOR peuvent ne pas être renseignées pour tous les utilisateurs, nonobstant, certains programmes proposent la fonctionnalité d'éditer un texte dans un éditeur, mais alors doivent faire un choix parmi tous ceux qui sont installés. Le programme pourra systématiquement faire référence à un lien symbolique lequel renverra vers le binaire choisit par défaut. Les liens symboliques sont créés dans le répertoire “/etc/altenatives”. La commande “man update alternatives” donne une description de cette méthode. Les exercices de navigation uname a; uptime ; runlevel ; hostname ; echo $SHELL ; stty ; ps ; id ; echo $PATH ; date ; pwd ls R / ; vi / ls la $HOME cd ; cd ~ ; cd .. cd /pub ; more wine touch blanc; ln s one two ; ls il ; touch one ; ls il ; ln one zerosameinode ; ls il echo “What is it ?” > ?? ; cat ?? xeyes center green ; xclock fg green bg blue & ; jobs l ; ps aux –forest >empty ; echo “Hello world” > notempty stat *empty ; hd notempty ; od notempty ; mc who uH stat f / tr d aeiouy < file.txt > consonnes.xxx tr d “\015” < dos.txt > unix.txt grep ^# /etc/fstab ; grep ^/ /etc/fstab date s 11:20:00 date s 070211201963 history 50 | grep man cat ~/.bash_history touch I\ love\ you grep i bash /etc/passw cat /etc/passwd | grep bash cat >> file.txt CTRL + D La Console !© par Patrick Hautrive !;~) 2010 137 La recherche sur internet La recherche sur internet peut être ciblée en formulant judicieusement ses requêtes sur un moteur de recherche. La formulation d'une requête dans un moteur de recherche sur Internet (google.com) Les noms propres en MASJUSCULE Les phrases exactes entre GUILLEMET Les mots acceptés avec un PLUS Les mots refusés avec un MOINS Les inclusions avec l'opérateur AND Les ensembles avec l'opérateur OR La négation avec l'opérateur NOT Les groupes de mots entre PARENTHESES Les adresses URL Les adresses internet URL (Uniform Ressource Locator) sont généralement formulées en indiquant dans l'ordre, le nom du protocole réseau, le nom du serveur , le nom de domaine, le nom du TLD, puis le numéro de port optionnel, et enfin le chemin absolu vers le fichier dans l'arborescence du serveur. Une adresse internet écrite en extension est conforme au FQDN (Full Qualified Domain Name). La formulation des adresses des serveurs internet URL (Uniform Ressource Locator) protocol://name.host.server.domain.tld:port//path/to/file FQDN (Full Qualified Domain Name) http:// https:// ftp:// gopher:// news:// telnet:// file:/// mailto: Le protocole hypertexte des pages web Le protocole hypertexte sécurisé Le protocole de transfert de fichiers Le protocole gopher Le protocole de Usenet Le protocole de connexion non sécurisé Le protocole référençant l'arborescence locale Le protocole pour indiquer une adresse mail Les domaines TLD Les TLD (Top Level Domain) sont les noms de domaine qui forment la cime de la hiérarchie sur Internet. Les TLD indiquent soit la nature de l'activité de l'organisation, soit le pays où se trouve la dite organisation. La Console !© par Patrick Hautrive !;~) 2010 138 Les noms de domaine de la hiérarchie d'internet TLD (Top Level Domain) .org .gouv .com .mil .asso .net .fr .uk .de Les organisations Les gouvernements Les sociétés commerciales Les administrations militaires Les associations Les sociétés internet L'extension pour la France L'extension pour le royaume uni (United Kingdom) L'extension pour l'Allemagne (Deutchland) Le format Unix ™ Les fichiers textes n'ont pas tous le même format selon le système sur lequel ils sont élaborés. Le format Unix™ se sert du caractère LF (Line Feed) pour opérer un passage à la ligne, tandis que le format Dos (Windows™) emploi les deux caractères LF et CR (Carriage Return). Ainsi, quand l'on visualise un fichier Unix™ dans un environnement Windows™, le texte semble écrit sur une seule ligne. Les formats texte chez Unix et Dos Le format Unix™ Le format Dos (LF) (LF + CR) code ascii en octal \012 code ascii en octal \012 et \015 Des utilitaires (recode, flip, d2u, u2u, dos2unix, unix2dos, fromdos, todos) permettent de faire la conversion entre les deux formats. La commande “recode ibmpc.latin1 < dos.txt > unix.txt” opère cette conversion. Le package “mtools” contient les outils pour manipuler les fichiers Dos (Disk Operating System). Les formateurs de fichiers et autres convertisseurs (troff, nroff, groff, ngroff, pr) permettent d'extraire des caractères à l'intérieur des fichiers. Certains éditeurs de texte sous Gnu Linux proposent la conversion. Les émulateurs (dosemu, wine, wabi) et les systèmes de virtualisation permettent également d'accéder aux fichiers Dos. Les formats de fichiers Les fichiers textes (ascii) sont aussi appelés des fichiers de textes bruts (raw). Ils sont très largement utilisé dans les systèmes Unices, parce que c'est un format simple, direct, natif, et standard. C'est le format pour les scripts interprétés dans un shell. C'est le format qui facilite les manipulations du contenu d'un fichier (extraction et modification). Tous les fichiers de configuration du répertoire “/etc” sont dans le format texte. Les fichiers textes (plaintext) sont les plus simples et les plus légers des formats de fichier. Avec un simple éditeur, l'on peut faire du copier coller, de la recherche et du La Console !© par Patrick Hautrive !;~) 2010 139 remplacement de motif. Un fichier texte ne comporte que très peut de formatage (tabulation, casse, indentation), à contrario d'un fichier RTF (polices, tailles, gras, soulignement, italique, listes numérotées, justification, tableau) ou d'un traitement de texte qui proposent de nombreuses fonctionnalités (insertion d'images, de desseins, de feuilles de calcul, colorisation, stylisation, correcteur orthographique, pied de page, numérotation des pages, sommaire, bibliographie, macro commandes, etc.). Un fichier texte peut être visualisé en ligne de commande dans un afficheur (pager), être manipulé avec un formateur (processor) et être édité dans un éditeur (editor) comme vi (visual). En mode graphique, le même fichier texte peut être visualisé en lecture seule (readonly), en mode WYSIWYG (What You See Is What You Get), être édité dans un éditeur graphique (gedit), être travaillé dans un traitement de texte (open office) et être finalisé dans un logiciel de mise en page (scribus). Les formats de fichiers sont très nombreux. Ces formats de fichiers peuvent être libres, ouverts, universels et gratuits, tandis que d'autres peuvent être propriétaires, fermés, spécifiques et payants. La communauté des Logiciels Libres privilégie l'utilisation des formats connus et diffusés sous licence libre, parce qu'ils permettent ainsi de pérenniser l'accès aux documents dans le temps. Souvent, le formatage utilisé dépend de la fonction (image, sons, vidéo, archive, impression, etc.) ou de la plateforme (Unix™, Windows™, Macintosh™, etc.) ou du programme qui la généré. En règle générale, les noms de fichiers sont dotés d'une extension qui correspond à l'application. Cependant, de nombreux Logiciels Libres sont compatibles avec d'autres formats que les leurs. Ainsi, l'on parle d'archives ZIP auto extractibles, de textes en RTF (Rich Text Format), de documents imprimables en PDF (Portable Document Format), de livres en LATEX, d'images au format PNG (Portable Network Graphic), de musique enregistrée en MIDI, de vidéo en OGG VORBIS, de feuilles de calcul (spreadsheets) de la suite bureautique (open office), de distribution distribuée en image ISO prête pour la gravure sur cdrom, de package RPM ou DEBIAN, de fichiers sources, de binaires ou d'exécutables... Les fichiers joints Les fichiers joints avec les mails sont appelés des pièces jointes. Ces fichiers sont transportés dans un format spécial afin d'être reconnus par les lecteurs de mail. Les formats UUENCODE et MIME (Multipurpose Internet Mail Extension) ont été successivement utilisés. Les caractères spéciaux Les shell reconnait et interprète un ensemble de caractères spéciaux. Les caractères spéciaux désignent tous les caractères du clavier (figurant à l'intérieur de la table de codage des caractères ASCII) qui ont pour le shell et les scripts une signification particulière. Les caractères spéciaux sont en quelque sorte La Console !© par Patrick Hautrive !;~) 2010 140 tous les caractères qui ne sont pas alphanumériques. L'ensemble de ces caractères spéciaux font l'objet d'une standardisation. Les jokers, le séparateur interne (IFS), les méta caractères et les opérateurs de contrôle et les opérateurs logiques sont des caractères spéciaux. N'importe quel caractère peut se substituer à un joker (wildcard globbing). L'ordre de recherche ou de remplacement correspond à l'ordre de la table de codage ASCII: les chiffres en premier, puis les majuscules et les minuscules dans l'ordre alphabétique. Les exemples d'utilisation des caractères spéciaux jokers (wildcards) “?” “??” “*” [14] [14] [AZ] [az] [AZ] & [az] Remplace un et un seul caractère (un) Remplace deux caractères (deux) Remplace une chaine de caractères qui peut être nulle (zéro, un OU plusieurs) Remplace deux valeurs (un ET quatre) Remplace quatre valeurs (de un A quatre) Remplace toutes les lettres majuscules Remplace toutes les lettres minuscules Remplace toutes les lettres La manipulation des fichiers Les caractères spéciaux sont abondamment employés dans les scripts et les recherches à l'aide des jokers et des expressions régulières (regex). Les caractères spéciaux permettent de former des motifs (pattern) de recherche qui seront évalués par le shell. L'outil “grep” (Globaly Research for Regular Expression) peut être combiné à d'autres (“find”, “diff”, “cut”, “sort”, “uniq”, “wc”, “awk”, “sed”, “tr”, “groff”, ...) pour effectuer des recherches ciblées et extraire de l'arborescence des fichiers, puis des lignes, et enfin des colonnes. Des lignes de commandes complexes peuvent être enchainées les unes aux autres pour former des trains de commandes reliés par des pipes, chacune recevant en flux d'entrée, le flux de sortie de la précédente. La Console !© par Patrick Hautrive !;~) 2010 141 Les commandes de manipulation des fichiers (filter) cat less vi find grep diff uniq sort wc patch awk sed tr cut col groff expand unexpand pour lire le contenu d'un fichier (concatenate) pour afficher un fichier pour éditer un fichier texte (visual) pour rechercher un fichier dans l'arborescence pour sélectionner des lignes contenants une occurrence dans un fichier pour comparer deux fichiers ligne à ligne (difference) pour écarter les doublons à l'intérieur d'une liste pour classer des listes de lignes dans un ordre alphanumérique pour compter les lignes, les mots ou les caractères (word count) pour insérer des mises à jour dans un fichier pour manipuler et formater des expressions avec un langage de programmation pour d'extraire ou de remplacer des motifs un flux de texte (stream editor) pour traduire un caractère ou l'effacer (translate) pour sélectionner une colonne dans une ligne en fonction d'un séparateur connu pour renverser l'ordre d'un flux pour formater un flux de sortie pour convertir les tabulations en espace pour convertir les espaces en tabulation Les exemples de recherche cmp file1 file2 diff file1 file2 sort file > filealpha sort file o sort b file o filealpha sort d file > filedico sort nr grep hda[18] /etc/fstab grep ^# /etc/iftab wget –limitrate=96k http://server.org/image.iso La Console !© par Patrick Hautrive !;~) 2010 142 PERMISSION Les attributs des fichiers Tous les fichiers possèdent des attributs. Ces attributs sont des caractéristiques propres à chaque fichier et ces caractéristiques sont consultables à l'aide des commandes «ls» et «lsattr» (nom, inode, hardlink, permission, user, group, dates, étiquettes). Les attributs peuvent être compatibles avec les ACL (Access Control List). Lorsqu'un fichier est transféré sur un autre système de fichier (file system), le fichier copié peut perdre certains de ces attributs parce qu'ils ne sont pas gérés. Le nom d'un fichier est unique à l'intérieur d'un même répertoire, mais il peut exister des fichiers différents, situés à des endroits différents, mais portant le même nom. Les numéros d'inode sont uniques, ils identifient un emplacement physique sur le disque, mais plusieurs noms différents peuvent pointer vers le même numéro d'inode, c'est le principe des liens (hardlink). Les permissions sur un fichier indiquent les opérations possibles pour l'utilisateur propriétaire, pour le groupe propriétaire, et enfin pour tous les autres utilisateurs qui ne sont, ni les premiers, ni les seconds. Les permissions normales sont appelées indifféremment les droits et les permissions spéciales sont qualifiées de droits d'endossement. La commande «chmod» permet de modifier les permissions d'un fichier ou de tout un répertoire avec l'option R (recursive). Les commandes «lsattr», «chattr» et «attr» permettent de connaitre et de modifier les attributs spécifiques d'un fichier. Le contrôle des permissions Les permissions sont les attributs d'appartenance d'un fichier. Tous les fichiers du système, quels qu'ils soient, appartiennent à un utilisateur ou à un autre, et à un groupe. Comme le système Gnu Linux est un système multi tâches et multi utilisateurs, toutes les opérations sur les fichiers sont contrôlées par le noyau afin de déterminer si ces opérations sont conformes aux permissions de l'utilisateur qui les demandes. La norme POSIX impose que les droits d'accès à un fichier soient toujours comparés aux droits de l'utilisateur sur le fichier. Les fichiers appartiennent à des utilisateurs et les commandes sont lancées sous l'identité d'un utilisateur (UID et EUID, GID et EGID). La comparaison entre les droits de l'utilisateur (effective) et les droits du fichier ou ceux d'une commande permet de contrôler si les opérations sont permises. La procédure de contrôle des droits passe par plusieurs étapes, et en dernier ressort, quand les droits pour l'utilisateur et ceux pour les groupes ont été examinés, ce sont les droits pour les autres utilisateurs qui s'appliquent. La Console !© par Patrick Hautrive !;~) 2010 143 Les catégories des utilisateurs Les permissions d'un fichier sont présentées par la commande “ls l” (listing au format long). Les permissions sont réparties en trois catégories de population, celle de l'utilisateur (user), celle du groupe (group) et celle des autres utilisateurs (others). Les permissions attribuées pour tous les utilisateurs (all) valent également pour l'utilisateur propriétaire. Une autre catégorie peut être ajoutée pour désigner les droits spéciaux (special). Dans l'ordre, les droits sont affichés en octal avec quatre chiffres (de 0000 à 7777) et dans leur forme symbolique, les droits sont affichés avec neuf lettres (rwxrwSrsT). Les utilisateurs peuvent faire partie d'un groupe ou de plusieurs groupes, auquel cas, ils possèdent indirectement les droits du groupe auquel ils appartiennent. Les droits de l'utilisateur propriétaire priment sur ceux du groupe propriétaire. Le super utilisateur ou l'administrateur du système (root) possède tous les droits et tous les privilèges sur l'intégralité du système, il peut donc accéder à tous les fichiers, et en modifier les droits à n'importe quel moment. Un utilisateur ne peut changer les droits que des fichiers dont il est l'utilisateur propriétaire. Aucun utilisateur (mis à part root) ne peut changer les droits d'un fichier appartenant à un autre utilisateur. Les membres d'un même groupe partagent les mêmes droits sur les fichiers appartenants au groupe propriétaire. Pour s'octroyer les droits sur un fichier, le moyen le plus simple consiste alors à essayer d'en devenir propriétaire, et par exemple de faire une copie du fichier, si c'est possible, puis de changer les droits sur la copie. Les fichiers copiés appartiennent à l'utilisateur qui les a copiés. Les droits se modifient avec la commande “chmod”. Les types de permissions Les permissions sont de plusieurs ordres. Un utilisateur peut avoir sur un fichier la permission de le lire (read) et donc de le copier, la permission d'y écrire (write) et donc de le modifier, et/ou la permission de l'exécuter (execute) et donc de lancer les instructions qu'il contient. Il existe également des permissions qui ont une fonction spéciale, comme les bits d'exécution d'une commande sous l'identité de son propriétaire (suid) ou de son groupe propriétaire (sgid), et les bits de conservation (sticky) qui permettent, pour les répertoires de rester propriétaire de tous les fichiers qui s'y trouvent, et pour les programmes de rester en mémoire après leur première exécution. Les permissions spéciales doivent être réservées aux binaires et aux programmes compilés, et ne doivent jamais être attribuées à des scripts, parce que l'insertion de shell ou de commande seraient La Console !© par Patrick Hautrive !;~) 2010 144 autorisée pour n'importe quel utilisateur. Les permissions et les attributs des fichiers Permission r w x s nothing read write execute special SUID SGID t sticky bit Directories Binaries File Directory Owner Operators Attributs Etiquette (ACL) u (user) Copy List g (group) Modify & Erase Create & delete o (other) Run Browsable a (all) Endossement s (special) EUID=owner EUID=group Conservation Heritage Memory “=” “+” “” A S a s c d i u e J T D Acces time Synchrone file (sync) Append mode writing Data at Zero if destroy Compressed by kernel No dump Immutable (lock no link) Undelete (récupération) Extents disk mapping Ext3 journal first Top hierarchy directory Synchrone dir (dirsync) Les permissions des répertoires Les répertoires sont également des fichiers et des droits y sont attachés. Pour un répertoire, le droit de lecture (read) signifie le droit de visualiser la liste des fichiers du répertoire, le droit d'écriture (write) signifie le droit d'y créer, d'y supprimer ou d'y renommer une entrée (un fichier dans le répertoire), et le droit d'exécution (execute) signifie le droit de parcourir (browsable) l'arborescence en traversant ce répertoire (avec la commande “cd” par exemple). Ainsi, un utilisateur qui a le droit d'écriture dans un répertoire (write) peut supprimer un fichier alors qu'il n'a aucun droit sur le fichier lui même. Les sticky bits sont des droits qui s'appliquent pour les répertoires quand un fichier y est placé. Par exemple, le répertoire conteneur qui possèdent les droits spéciaux (suid, sgid, sticky) prodigue aux fichiers son groupe propriétaire. L'expression des permissions Les permissions peuvent s'exprimer dans une forme absolue (avec la numérotation octale) ou relative (avec une expression symbolique). La forme absolue est la numérotation octale qui fixe tous les droits (7777) pour toutes les catégories (sugo). La forme relative est l'expression symbolique (rwxst) qui permet, grâce à des opérateurs (+=), de ne modifier que les droits qui changent pour une certaine catégorie. Par exemple, la commande “chmod 777 file” attribue tous les droits à toutes les catégories, tandis que La Console !© par Patrick Hautrive !;~) 2010 145 la commande “chmod orwx file” permet de supprimer sur ce fichier tous les droits à tous les autres utilisateurs, sans spécifier les autres droits pour les autres catégories, et sans prévaloir des droits antérieurs pour la catégorie concernée. Pour changer les droits d'un fichier, l'utilisateur doit en avoir la permission, c'estàdire qu'il doit en être le propriétaire ou passer par l'identité du super utilisateur (root). L'utilisateur qui copie (cp) un fichier doit posséder le droit en lecture (read) sur le fichier, mais comme il devient propriétaire de la copie, il peut donc la modifier (write) ou en changer les droits (chmod). Octale 3bits Values “111” “110” “101” “100” “011” “010” “001” “000” Endossement SUID 4 s s s s SGID 2 s s s s Décimale Sticky bit 1 t t t t 1digit 0 à 7 7 6 5 4 3 2 1 0 Permission read 4 r r r r write 2 w w w w execute 1 x x x x La numérotation octale La numérotation octale permet d'exprimer les droits d'un fichier sous une forme numérique. La numérotation octale est une base 3. C'estàdire que la valeur des permissions de chacune des quatre catégories d'utilisateur (sugo) sera exprimée pour chacune sur trois bits. Il faudra douze bits pour exprimer entièrement les droits d'un fichier en octal (4x3bits=12 bits pour exprimer toutes les valeurs possibles de 0000 à 7777). Les droits spéciaux (SUID, SGID et sticky bits) s'expriment en milliers, les droits des utilisateurs en centaines, les droits de groupes en dizaines, et les droits des autres en unités. La catégorie “user” peut prendre les valeurs de O à 7 (un bit peut avoir la valeur de un ou de zéro, et le résultat de 2 puissance 3 est égale 8 possibilités). La Console !© par Patrick Hautrive !;~) 2010 146 L'équivalence entre les expressions symboliques et la numérotation octale des permissions Les droits rwxrwxrwx Les droits rwx Les droits rwx x x Les droits rwrr Les droits Les droits rwsrxrx Les droits rxrSrx Les droits rwrwrwt Les droits rwsrwsrwt Les droits rwSrwSrw Les droits rsr rt sont égaux à 0777 sont égaux à 0700 sont égaux à 0711 sont égaux à 0644 sont égaux à 0000 sont égaux à 4755 sont égaux à 2545 sont égaux à 1667 sont égaux à 7777 sont égaux à 6666 sont égaux à 5555 La numérotation octale des permissions r 400 user w 200 r w x 100 SUID S (sans x) s (avec x) 4000 S/s r 40 r group w 20 w x 10 SGID S (sans x) s (avec x) 2000 S/s r 4 other w 2 r w x 1 Sticky bit special T (sans x) t (avec x) 1000 T/t Le masque des fichiers Lors de leur création, les fichiers peuvent être générés ou être copiés. Quand ils sont copiés, les nouveaux fichiers héritent des droits qui étaient attribués au fichier source, mais dans la limite des droits possibles selon le masque de l'utilisateur qui fait l'opération. Quand ils sont générés, les fichiers sont créés selon le masque de l'utilisateur (mais, sans tenir compte des droits d'exécution, à moins qu'ils ne soient des répertoires). Dans tous les cas le masque de l'utilisateur prévaut, sauf pour la création de liens symboliques. Ces droits attribués automatiquement sont calculés en fonction du masque de l'utilisateur. Le masque de l'utilisateur est indiqué avec la commande “umask”. En général, la valeur du masque est de 0022, mais le premier digit qui correspond aux droits spéciaux ne sera pas pris en compte. Seuls les trois derniers digits seront appliqués. Cette valeur de 022 pour le masque de l'utilisateur signifie que les fichiers qui seront générés se verront attribués les droits complémentaires à la valeur maximale possible de 777, mais sans tenir compte du droit d'exécution dans le cas des fichiers standards. Ainsi, avec un masque de 022, les droits seront de 644 (777022111=644 ou 666022=644) pour un La Console !© par Patrick Hautrive !;~) 2010 147 fichier standard, et seront de 755 (rwxrxrx=777022=755) pour les répertoires. La commande “umask 0022” peut être insérée dans le fichier de personnalisation de l'utilisateur “~/.profile”. Les exemples de permission ls la $HOME umask 023 ; umask p ; umask S ; ulimit a touch file ; ls l file chmod 754 file ; ls l file chmod ugo=rwx ; ls l file chmod r file ; ls l file chown R $USER:noone $HOME ; ls l /home/noone lsof u 500,501,502,1000 ps | grep bash ; lsof p PID ln s file filesoft ; ls l file chfn ; finger ; man usermod ls l /etc/passwd ; ls l /usr/bin/passwd ; ls l /bin/bash id ; whoami ; groups groups root daemon wheel chmod +x script.sh chmod u+s script.sh su mkdir /home/groupspace ; groupadd mygroup useradd noone ; usermod G mygroup noone ; groups noone chgrp mygroup /home/groupspace ; chmod g+s /home/groupspace chmod g+w groupspace/ ; ls ld /home/groupspace su noone id ; pwd ; touch /home/groupspace/filenoone ; ls l /home/groupspace/filenoone exit id ; pwd ; chmod 1775 /home/groupspace su noone touch /home/groupspace/filenoonetwo ; ls l /home/groupspace/filenoone* exit chmod 3775 /home/groupspace/ ; su noone su noone touch /home/groupspace/filenoonethree ; ls l /home/groupspace/filenoone* lsattr file.txt chattr file.txt chattr +Ss script.sh chattr Ss script.sh man attr La Console !© par Patrick Hautrive !;~) 2010 148 PASSWORD L'authentification La procédure d'authentification (authentication) sur un système informatique est essentielle, parce c'est elle qui octroie à l'utilisateur son identité pour le système, et par conséquent ses droits et ses permissions. Le contrôle de l'identité est assurée par la vérification du mot de passe (password) pour le compte (login). Sur un système Gnu Linux, il faut avoir un compte utilisateur pour se connecter au système. La fonction “getpass()” récupère le mot de passe saisie par l'utilisateur. Parfois, des comptes génériques pour les invités (guest et wild), pour les utilisateurs anonymes (anonymous), ou pour les inconnus (nobody) sont disponible pour se connecter. Normalement, ces comptes possèdent des droits restreints et n'ont accès qu'à une partie du système. Les systèmes Gnu Linux utilisent de plus en plus PAM (Pluggable Authentication Modules) pour gérer l'authentification des utilisateurs. Les autres systèmes d'authentification les plus courants utilisent des bases de comptes plus sophistiquées, comme NIS (Network Information Service), LDAP, ACL, KERBEROS, RADIUS. Les types d'authentification Il existe deux types d'authentification, l'une est basée sur le compte de l'utilisateur, et l'autre est basée sur la ressource. Dans le premier cas, la vérification a lieu lors de la connexion avec le mot de passe de l'utilisateur, et l'authentification est valable tout le temps de la session de l'utilisateur. Dans le deuxième cas, la vérification a lieu lors de chaque tentative d'accès à la ressource avec le mot de passe attaché au fichier par exemple. Les comptes des utilisateurs Les utilisateurs qui possède un compte sur un système Gnu Linux peuvent se connecter en présentant le nom du compte (login) au prompt de connexion, et en saisissant le mot de passe (password) correspondant. Le compte de l'utilisateur (UID et GID) renseigne le système sur ces droits, son appartenance à des groupes, sa configuration et ses préférences. Un utilisateur peut appartenir à plusieurs groupes, mais l'un d'entre eux sera désigné comme le groupe principal (ou groupe primaire). La configuration des règles des comptes utilisateurs est définie dans le fichier “/etc/login.defs”. Les systèmes Debian utilisent la commande “shadowconfig on” pour activer les mots de passe cachés (shadowing). Les utilisateurs lancent la commande “passwd” pour changer de mot de passe. La Console !© par Patrick Hautrive !;~) 2010 149 Les bases de comptes Les fichiers d'administration des comptes, des groupes et des mots de passe des utilisateurs constituent ce que l'on appèle la base de donnée des comptes utilisateurs. Les fichiers “/etc/passwd” et “/etc/group” sont les deux fichiers d'administration principaux, auxquels peut s'adjoindre deux autres fichiers de shadowing des mots de passe “/etc/shadow” et “/etc/gshadow”. Les systèmes Debian conservent une copie de ces fichiers dans “/usr/share/basepasswd/passwd.master” et “/usr/share/basepasswd/group.master”. L'accès au système peut être règlementé en fonction de l'hôte dans “/etc/login.access”, et en fonction de la date et de l'heure de connexion avec le fichier “/etc/porttime”. Certains autres fichiers sont importants pour les utilisateurs parce qu'ils définissent l'environnement de connexion comme “/etc/login.defs”, “/etc/environment”, “/etc/skel” et “/etc/default/useradd”. D'autres fichiers de configuration sont plutôt optionnels et permettent l'automatisation de l'administration des comptes comme “adduser.conf” et “deluser.conf”. Le service d'authentification PAM par modules se généralise sous les systèmes Gnu Linux. Les fichiers de configuration de PAM est “/etc/pam.conf”, mais ce sont les fichiers dans “/etc/security/*” et les scripts dans “/etc/pam.d/*” qui sont privilégiés pour affiner la configuration. Ainsi, le fichier “/etc/pam.d/login”. La commande “man 7 pam” donne une description de l'utilisation de PAM. Les fichiers de connexion De nombreux autres fichiers peuvent être consultés lors de la procédure de connexion. Les fichiers de configuration d'une connexion Password Host Network /etc/passwd /etc/inittab /etc/shadow /etc/fstab /etc/group /etc/securetty /etc/gshadow /etc/usertty /etc/login.defs /etc/terminfo /etc/nologin /etc/termcap /etc/login.access /etc/gettydefs /etc/porttime /etc/ttytab /etc/limits /etc/shells /etc/environment /etc/skel /etc/pam.d/login /etc/sysctl /etc/security/* Configuration Message /etc/services /etc/aliases /boot/bootmsg.txt /etc/protocols /etc/sudoers /etc/issue /etc/hosts /etc/locale.alias /etc/motd /etc/host.allow /etc/locale.gen /etc/profile /etc/host.deny /etc/gdm/locale.conf /etc/bash.bashrc /etc/host.equiv /etc/profile.d/lang.sh /var/log/boot.log /etc/netgroup /etc/localtime /var/log/dmesg /root/.rhosts /etc/alternatives /tmp/install.log /etc/ftpusers /etc/magic /proc/kmsg /etc/dialups /etc/timezone /var/log/secure /etc/dpasswd /etc/bash_completion /var/log/sulog /etc/modules.conf /var/log/dmesg La Console !© par Patrick Hautrive !;~) 2010 150 Profile ~/.login ~/.bash_profile ~/.bash_login ~/.bash_history ~/.profile ~/.bashrc ~/.Xsession ~/.Xdefaults ~/.Xinitrc ~/.signature ~/.rhosts ~/.bash_logout L'administration des utilisateurs L'administrateur et les utilisateurs utilisent ces commandes pour gérer les comptes des utilisateurs. Les commandes d'administration des utilisateurs USER PASS UID GID GROUPS INFO HOME SHELL LOCK UNLOCK STOP DELAY La commande “vipw” La commande “passwd” La commande “chage” La commande “useradd” La commande “userdel” La commande «su» La commande “usermod” pour éditer le fichier “/etc/passwd”. pour changer les mots de passe. pour changer les informations d'âges des mots de passe (change age). pour ajouter un nouvel utilisateur (HOME, SHELL, GROUP, STOP). pour supprimer un compte (la désactivation est moins dur!). pour changer d'utilisateur (switch user). pour administrer les comptes utilisateurs L'administration des groupes L'administrateur et les utilisateurs utilisent ces commandes pour gérer les groupes des utilisateurs. La commande “gpasswd” permet d'administrer le fichier “/etc/group”, et indirectement le fichier «/etc/gshadow» si la variable SHADOWGRP existe. Les commandes d'administration des groupes GROUP PASS GID ADMIN USERS La commande “vigr” La commande “groupadd” La commande “groupdel” La commande “groupmod” La commande “sg” La commande “newgrp” La commande “chgrp” La commande “gpasswd” pour éditer le fichier “/etc/group”. pour ajouter un groupe dans “/etc/group”. pour supprimer un groupe dans “/etc/group”. pour administrer le nom et le GID d'un groupe. pour changer de groupe principal (switch group). pour changer de groupe principal. pour changer le groupe propriétaire d'un ou de plusieurs fichiers. pour changer “/etc/group” et «/etc/gshadow» si SHADOWGRP. L'administration du shadowing Le shadowing consiste à placer les mots de passe cryptés des comptes et/ou des groupes dans des fichiers séparés inaccessibles. La Console !© par Patrick Hautrive !;~) 2010 151 Les commandes d'administration du shadowing La commande “pwck” vérifier la conformité et la concordance de “passwd” et de “shadow”. La commande “pwconv” convertir le champ PASS du fichier “/etc/passwd” en “/etc/shadow”. La commande “pwunconv” enlever le shadowing et réintégrer les mots de passe cryptés. La commande “grpck” vérifier la conformité et la concordance de “group” et de “gshadow”. La commande “grpconv” convertir le champ PASS du fichier “/etc/group” en “/etc/gshadow”. La commande “grpunconv” enlever le shadowing et réintégrer les mots de passe dans “group”. La commande “shadowconfig” activer le shadowing des comptes sous Debian. La commande “updatepasswd” générer des copies de la base des mots de passe sous Debian. Les groupes des utilisateurs La création des groupes est réservée au super utilisateur (root). Le nom d'un groupe doit être un nom unique, comme l'identifiant GID. Les utilisateurs possèdent en générale tous au moins un groupe, parfois plusieurs. Quand l'utilisateur fait parti de plusieurs groupes, l'un d'entre eux est le groupe principal (groupe primaire ou initial). Les groupes peuvent être administrés par un administrateur de groupe, qui n'a pas besoin de faire partie du groupe. Un groupe peut être protégé par un mot de passe, dans ce cas les utilisateurs qui n'en font pas partie, mais qui connaissent le mot de passe, peuvent utiliser la commande “newgrp” afin de faire partie du groupe temporairement. La commande “newgrp” permet de changer le groupe principal de l'utilisateur (moyennant l'appartenance au groupe ou le mot de passe du groupe s'il est défini). La commande “sg” (switch group) permet de lancer une commande avec l'identité d'un autre groupe. Les mots de passe Les mots de passe sont administrés avec la commande “passwd” qui appartient au super utilisateur (root) et qui porte le bit SUID. Les données des utilisateurs sont enregistrées dans le fichier “/etc/passwd”. Les mots de passe sont cryptés et stockés dans le fichier “/etc/shadow” qui ne doit pas être accessible aux utilisateurs pour prévenir les attaques par dictionnaires. La commande «man 5 passwd» L'appartenance aux groupes est administrée dans le fichier “/etc/group”. Les mots de passe afférant aux groupes s'ils existent sont conservés dans le fichier “/etc/gshadow”. La commande “man 3 crypt” présente les méthodes de cryptage des mots de passe. La Console !© par Patrick Hautrive !;~) 2010 152 Les mots de passe et l'appartenance aux groupes /etc/passwd /etc/shadow /etc/group /etc/gshadow USER USER GROUP GROUP PASS PASS PASS PASS UID 1970 GID ADMIN, GID INFO HOME SHELL LIVE DELAY ALERT STOP 1970STOP USERS, USERS, Certaines anciennes applications réseaux font passer les noms de login et les mots de passe en clair (rshd, telnetd, ftpd). Un sniffer de packet permet ainsi de les récupérer. Il est bien sûr conseillé d'utiliser les applications sécurisées comme ssh qui cryptent les mots de passe. Les utilisateurs sont invités à choisir un bon mot de passe et à le renouveler fréquemment. De plus, ils doivent le conserver pour eux seuls, et ne jamais l'écrire sur un postit collé à l'écran, ni de le divulguer à qui que ce soit et ce quelques soient les circonstances. Les mots de passe sont personnels et ils engagent la responsabilité de l'utilisateur. Le shadowing Le shadowing consiste à stocker les mots de passe cryptés dans un fichier séparé. Les fichiers de shadowing ne sont pas accessibles aux utilisateurs, afin d'empêcher l'éventualité d'une attaque de force brute avec un dictionnaire de mots de passe. Seuls l'utilisateur root et le groupe shadow ont la possibilité de lire les fichiers “/etc/shadow” et “/etc/gshadow”. Les commandes “pwck” et “grpck” doivent être lancées avant d'effectuer un changement de shadowing. Les commandes “pwconv” et “grpconv” permettent de passer au système des mots de passe cachés, respectivement dans “/etc/shadow” pour les comptes des utilisateurs et dans “/etc/gshadow” pour les groupes des utilisateurs. Tandis que les commandes “pwunconv” et “grpunconv” permettent de revenir en arrière, malgré la perte des informations sur les âges des mots de passe. Les champs de passwd /etc/passwd USER PASS UID GID INFO HOME SHELL Le champ USER contient le nom de compte de l'utilisateur (login). Le champ PASS du fichier “/etc/passwd” peut être renseigné de plusieurs façons. Le champ PASS est vide pour indiquer que le mot de passe est une chaine nulle. Le champ PASS est une croix (“x”) pour indiquer que le mot de passe est dans “/etc/shadow”. Le champ PASS est une étoile (“*”) pour indiquer qu'il y a un verrou sur le compte. Le champ PASS est deux points d'exclamation (“!!”) pour indiquer l'inexistence du mot de passe. Le champ UID contient l'identifiant unique de l'utilisateur. Le champ GID contient l'identifiant unique du groupe principal de l'utilisateur. La Console !© par Patrick Hautrive !;~) 2010 153 Le champ INFO est un champ libre ou peuvent se retrouver les informations GECOS utilisées par les commandes “finger” et «chfn», et la définition des quotas (nice, umask et ulimit) de l'utilisateur. Les quotas sont séparés par une virgule (pri= , umask= , ulimit= ). Les quotas peuvent être également définis dans les variables du fichier “/etc/login.defs”. Le champ HOME contient le répertoire personnel de l'utilisateur et la valeur de la variable HOME. Le champ SHELL propose l'exécutable lancé dès la connexion, souvent le shell “/bin/bash”, mais pour les comptes qui ne sont pas autorisés à se connecter, ce peut être “/bin/false” ou “/bin/nologin”. Les champs de shadow /etc/shadow USER PASS 1970 LIVE DELAY ALERT STOP 1970STOP RESERVE Le fichier «/etc/shadow» contient les informations d'âge. Le champ USER contient le nom de connexion de l’utilisateur (login). Le champ PASS contient le mot de passe chiffré en alphanumérique avec la commande “crypt”. Le champ PASS commence par un point d'exclamation (“!”) avec «passwd l user» (lock). Le champ 1970 contient le nombre de jours depuis le 1er janvier 1970 et le dernier changement. Le champ LIVE contient le nombre de jours pendant lesquels le changement est interdit. Le champ DELAY contient le nombre de jours après lesquels le changement est obligatoire. La date du dernier changement 1970 plus le champ DELAY donne la date d'expiration. Quand le champ LIVE est supérieur au champ DELAY, l'utilisateur ne peut pas changer son mot de passe. Le champ ALERT contient le nombre de jours d'avertissement avant l'expiration. Le champ STOP contient le nombre de jours de répit après la date d'expiration et qui fixe la date de désactivation du compte. Le champ 1970STOP contient le nombre de jours depuis le 1er janvier 1970 de désactivation. Le champ RESERVE est un champ qui n'est pas utilisé. Les champs de group /etc/group GROUP PASS GID USERS, Le champ GROUP contient le nom unique du groupe. Le champ PASS du fichier “/etc/group” peut être renseigné de différentes façons. Le champ PASS est vide pour indiquer qu'il n'y a pas de mot de passe. Le champ PASS est une croix (“x”) pour indiquer que le mot de passe est dans “/etc/gshadow”. Le champ PASS est un point d'exclamation (“!”) pour indiquer que le groupe est verrouillé. Le champ GID contient l'identifiant unique du groupe. Le champ USERS contient les noms des utilisateurs membres du groupe, séparés par une virgule. La Console !© par Patrick Hautrive !;~) 2010 154 Les champs de gshadow /etc/gshadow GROUP PASS ADMIN, USERS, Le champ GROUP contient le non du groupe unique et en accord avec le fichier «/etc/group». Le champ PASS contient le mot de passe crypté pour le groupe (s'il existe un mot de passe). Le champ ADMIN contient les administrateurs du groupe avec «gpasswd A user group». Le champ USERS contient les utilisateurs membres du groupe, séparés par une virgule. L'environnement de connexion Le fichier “/etc/login.defs” donne les paramètres définis pour les utilisateurs lors de la connexion. La commande “man login.defs” donne une description de la configuration de l'environnement de l'utilisateur, et des mécanismes de gestion des durées des mots de passe. La configuration des mots de passe consiste à affecter des valeurs pour les variables qui vont déterminer le comportement des mots de passe. Le module PAM (Pluggable Authentication Modules) prend le relais pour configurer l'environnement de l'utilisateur qui se connecte. MAIL_DIR /var/mail #Définition obligatoire de la variable $MAIL MAIL_FILE .mail #Fichier contenant les mails de l'utilisateur FAIL_DELAY 3 #Nombre de seconde d'attente après échec de la connexion FAILLOG_ENAB yes #Acceptation des échecs et log dans “/var/log/faillog” LOG_UNKFAIL_ENAB no #Acceptation des échecs avec login inconnus (unknown) LOG_OK_LOGINS no #Enregistrement dans les journaux des connexions réussies QUOTAS_ENAB yes #Acceptation des quotas (umask, ulimit, nice) (Gecos) SYSLOG_SU_ENAB yes #Log avec syslog de la commande “su” SYSLOG_SG_ENAB yes #Log avec syslog des commandes “newgrp” et “sg” SULOG_FILE /var/log/sulog #Log de la commande “su” TTYTYPE_FILE /etc/tty #Type de terminal FTMP_FILE /var/log/btmp #Log des échecs de connexion “lastb” SU_NAME su #Affichage du “su” pour la commande “ps” HUSHLOGIN_FILE .hushlogin #Acceptation du hush mode NOLOGIN_STR nologin #Refus de connexion ENV_TZ /etc/timezone #Définition de la variable d'environnement TZ ENV_HZ HZ=100 #Définition de la variable HZ ENV_SUPATH PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/X11:/usr/local/sbin:/usr/local/bin ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games TTYGROUP tty #Le groupe propriétaire pour le périphérique terminal TTYPERM 0600 #Les permissions attribuées au périphérique terminal ERASECHAR 0177 #Caractère d'effacement (backslash) pour system V KILLCHAR 025 #Caractère de suppression de ligne (Ctrl+U) pour system V La Console !© par Patrick Hautrive !;~) 2010 155 UMASK 022 #Définition du masque par défaut de création des fichiers ULIMIT 2097152 #Les limites (file, size, process, user, cpu, memory) PASS_MAX_DAYS 99999 #Nombre maximal de jours valides pour un mot de passe PASS_MIN_DAYS 0 #Nombre minimal de jour entre deux changements PASS_WARN_AGE 7 #Nombre de jour d'alerte avant l'expiration UID_MIN 1000 #Numéro d'ordre minimal pour l'attribution des UID UID_MAX 60000 #Numéro d'ordre maximal pour l'attribution des UID GID_MIN 100 #Numéro d'ordre maximal pour l'attribution des GID GID_MAX 60000 #Numéro d'ordre maximal pour l'attribution des GID LOGIN_RETRIES 5 #Nombre maximal de tentative de connexion LOGIN_TIMEOUT 60 #Nombre maximal de seconde pour se connecter PASS_MAX_LEN 8 #Nombre de caractères pour le cryptage du mot de passe CHFN_AUTH yes #Mot de passe pour les commandes “chfn” et chsh” CHFN_RESTRICT rwh #Champ de “chfn” (full name, room#, work#, home#) LOGIN_STRING %s password: #Prompt pour la demande de mot de passe DEFAULT_HOME yes #Acceptation des connexions sans cd $HOME USERDEL_CMD /usr/sbin/userdel_local #Commande automatique après “userdel” NO_PASSWORD_CONSOLE tty1:tty2:tty3:tty4:tty5:tty6 #Login sans mot de passe GETPASS_ASTERISKS 1 #Nombre d'astérix affiché à la place des caractères saisis USERGROUPS_ENAB yes #Acceptation de umask UID pour les GID égaux aux UID FAKE_SHELL /bin/fakeshell #Lancement d'un script avant le lancement du shell CLOSE_SESSIONS no #Acceptation de pam_close_session() de pam_unix.so Les variables suivantes sont obsolètes et sont maintenant gérées par les fichiers de PAM qui se trouvent dans le répertoire “/etc/pam.d/*”. MOTD_FILE DIALUPS_CHECK_ENAB LASTLOG_ENAB MAIL_CHECK_ENAB OBSCURE_CHECKS_ENAB PORTTIME_CHECKS_ENAB SU_WHEEL_ONLY CRACKLIB_DICTPATH PASS_CHANGE_TRIES PASS_ALWAYS_WARN MD5_CRYPT_ENAB CONSOLE_GROUPS ENVIRON_FILE NOLOGINS_FILE ISSUE_FILE PASS_MIN_LEN La Console !© par Patrick Hautrive !;~) 2010 156 Le choix d'un mot de passe Le choix d'un mot de passe est la clef d'une bonne sécurité. Souvent les systèmes sont infiltrés à cause d'un manque de discipline dans la gestion des mots de passe. Pour se connecter, pour ouvrir une session, ou pour utiliser la commande «sudo», le mot de passe sera demandé à l'utilisateur. Si le mot de passe est divulgué, si une compromission est suspecté, ou si l'utilisateur ne s'en souvient plus, alors seul l'administrateur (root) du système sera en mesure d'opérer le changement indispensable du mot de passe. Les mots de passe doivent avoir en principe une durée de validité et une certaine complexité. En général, un mot de passe doit être changé régulièrement, afin de ne pas laisser suffisamment de temps pour le trouver. L'usage des mots du dictionnaire ou des codes personnels de l'utilisateur sont à proscrire. Il est conseillé d'utiliser la palette de la table des caractères (minuscule, majuscule, ponctuation) avec un minimum de huit caractères pour agrandir le champ d'investigation. Le bon usage est de ne jamais écrire un mot de passe, de ne jamais le réutiliser, et de ne le confier à personne, quelque soient les situations ou le degré d'intimité. Certains programmes génèrent des mots de passe aléatoire. D'autres programmes, comme «crack» ou «john» (John the Ripper) essaye de casser un mot de passe. Ce peut être un bon moyen en interne pour mettre à l'épreuve la solidité des mots de passe. Le mot de passe peut être également appelé «pass phrase». Il existe différents moyens mnémotechniques pour trouver un bon mot de passe que l'on ne va pas oublier. Par exemple, un utilisateur peut choisir une phrase, et ne conserver que certaines lettres de chaque mot. Les exemples de password ls l /etc/passwd; ls l /etc/group ; ls l /etc/shadow chown root:root /etc/passwd chmod 4444 /etc/passwd chmod 755 /dev chmod 700 /lost+found chmod o+t /tmp sudo passwd root passwd i 3 user passwd l user passwd u user groupadd g 1010 PMLH usermod G PMLH user sudo echo noone:x:1020:1040:Mister no what:/home/noone:/bin/bash >> /etc/passwd sudo echo wild:x:99:99:Special Account::/bin/false >> /etc/passwd sudo echo noone:1€qGrl9GtV£wy/QoG/Re3xVRTjkwpuW01:14637:0:99999:7::: >> /etc/shadow sudo echo NOONE:x:1040:noone >> /etc/group vipw s La Console !© par Patrick Hautrive !;~) 2010 157 vigr s ls la /etc/skel mkdir /home/noone chown noone.NOONE /home/noone chmod orwx /home/noone chfn ; finger chage M 15 w 3 joe apropos md5 dpasswd npasswd yppasswd john crack La Console !© par Patrick Hautrive !;~) 2010 158 ROOT L'administrateur système L'utilisateur root est le premier utilisateur du système (UID=0 et GID=0). Les collaborateurs de l'administrateur travaillent sous sa responsabilité. Les utilisateurs qui appartiennent au groupe «wheel» ou qui ont le droit d'utiliser la commande «sudo», ont parfois les mêmes droits que le super utilisateur sans demande de mot de passe. Une personne qui a l'accès physique à une machine, peut en avoir très facilement le contrôle, soit en débranchant la machine, ce qui la rend inopérante, soit en redémarrant le système (reboot), en mode rescue, ou à l'aide d'un CDROM live. Les responsabilités de l'administrateur Le super utilisateur est la personne responsable du système. L'administrateur est omnipotent et possèdent tous les droits sur tous les fichiers du système. L'administrateur est chargé de la planification, de l'installation, de la configuration, de l'évolution et de la sécurisation du système. Il est responsable de la disponibilité des services (access), de l'intégrité des fichiers (data), de l'authentification des utilisateurs (permission) et de la confidentialité des échanges (privacy). L'administrateur doit respecter les législations en vigueur et la vie privée des gens. La sécurité La sécurité d'un système d'information peut être abordée de plusieurs points de vue. La sécurité du point de vue de l'intérieur du système d'information concerne essentiellement les utilisateurs (insiders), tandis que la sécurité du point de vue de l'extérieur concerne toutes les autres personnes qui ne font pas partie de l'organisation (internet). Ensuite, la sécurité peut être envisagée selon que la ressource est de type matérielle (hardware), logicielle (software), réseau (middleware) ou personnelle (userware). Personne ne peut garantir l'invulnérabilité, ni l'inviolabilité d'un système d'information. Ce n'est qu'après coup, que l'on peut attester qu'une infraction s'est produite. Et quand aucune intrusion n'est décelée, cela ne prouve pas qu'il n'y en ait pas eu. La seule sécurité absolue, c'est que tout soit accessible à tous. C'est ce qui fait la force et la fiabilité des Logiciels Libres. Aucun secret ne peut être découvert quand la vérité est connue de tous et que la transparence prévaut. L'obscurité du secret ne protège que ceux qui ne veulent pas voir ou qui ne souhaitent pas être vu. La transparence ne signifie pas la perfection, mais s'en est une condition de sinéquanone. La RFC 2196 et la documentation Linux Security HOWTO présentent les enjeux de la sécurité. La Console !© par Patrick Hautrive !;~) 2010 159 La géographie de l'administration système World People Association Hacker Cracker Politician Company Admin Robot Internet Provider Software System Kernel Program Scripts Tools Virus Power Industry Hardware Processor Router Cable Firewall Network Bios User Data Disk Les attaques Les attaques sur un système d'information peuvent être de plusieurs formes. A chaque attaque correspond une défense et à chaque parade correspond une riposte. Dans tous les cas, il est possible de mettre en place des solutions qui, soit répondent au problème, soit en permet la détection. Un attaquant peut chercher à obtenir l'identité d'un utilisateur (usurpation), il peut chercher à exploiter la faille d'un programme pour entrer dans le système avec les privilèges de l'administrateur (intrusion), il peut chercher à écouter les émissions sur le réseau (captation) ou jouer les intermédiaires dans les communications (interception), il peut chercher à copier des fichiers (indiscrétion) ou en modifier le contenu (falsification), il peut chercher à introduire un programme malicieux (insertion) ou à propager du code malveillant (inoculation), il peut aussi chercher à bloquer l'accès au système (saturation). Les attaques perpétrées par les crackers (casseur de code) ou les scripts kiddies sont appelées des exploits. Les attaques et les vulnérabilités d'un système d'information Dictionary Logger Force Social Trojan Rootkit Spoofing Middle Sniffing Xforwarding Dos Flood Defacing Cracking Spamming Bombs Virus Vorms Les organisations de régulation De nombreuses organisations, nationales ou internationales, publiques ou privées se donnent pour objectif l'organisation et le contrôle des réseaux informatiques. Ces organisations peuvent jouer le rôle d'une instance de régulation ou celui de référence quand à l'usage ou la définition de normes. Les organisations de régulation des systèmes d'information et des réseaux La CNIL (Commission Nationale Informatique et Libertés) Le SCSSI (Service Central de la Sécurité des Systèmes d'Information) Les audits de sécurité Les administrateurs freelance spécialisés dans la sécurité des systèmes et des réseaux se font parfois appelés des samouraïs. Des outils peuvent être mise en place pour surveiller un système et faire un audit des vulnérabilités (nmap, saint, nagios, satan, cops, nessus, ethereal, ipsec, tripwire, cryptographic, pgp, courtney, john the ripper, crack, rootkit, swatch, gshield, etc.). Le SUSHI (Super User Shell Interactive) est un shell interactif pour root. La Console !© par Patrick Hautrive !;~) 2010 160 Les audits de sécurité dits blancs n'utilisent que des outils autorisés et ils cherchent les vulnérabilités depuis l'extérieur, tandis que les audits de sécurité dits noirs cherchent également les vulnérabilités depuis l'intérieur, et tous les coups sont permis. Les outils de sécurité peuvent être employés avec de bonnes ou de mauvaises intentions. Il est indispensable d'obtenir une autorisation écrite officielle d'un responsable reconnu et en activité avant de se lancer dans l'étude d'un système d'information. Parfois, la simple utilisation de certains de ces outils est considérée comme une attaque susceptible de provoquer des contres mesures et d'engendrer des poursuites judiciaires. Les outils d'audit et de sécurité des systèmes d'information en réseaux nmap, saint, nagios, satan, cops, nessus, ethereal, ipsec, tripwire, cryptographic, pgp, courtney, john the ripper, crack, rootkit, swatch, gshield, rootkit Le contexte de l'administration Une machine informatique fait ce qu'on lui demande et de la façon dont on lui demande. Les programmes ne prévoient pas forcément tous les cas possibles, et la configuration d'un système n'est pas forcément la plus optimisée. De plus, les applications évoluent, elles doivent être mise à jours, mais les mises à jours ne sont pas forcément encore au point. D'autre part, les utilisateurs ne sont toujours formés aux outils qu'ils utilisent. Enfin, l'on ne sait jamais ce qui peut se passer dans un réseau, à l'autre bout d'un câble. Une machine réagit toujours de la même façon à une même situation, c'est qu'elle ne dispose pas de liberté de choix, elle exécute les instructions prévues par le programme. Une machine peut planter, mais jamais elle ne fera quelque chose qu'on ne lui a pas transmis. Tandis qu'un être humain peut réagir de différentes façons une même situation, c'est le facteur humain qui est imprévisible et incontrôlable, et qui peut engendrer des conséquences colossales, parce que le levier est celui de la machine qui peut répéter imperturbablement des milliards de fois la même erreur, et la propager à la vitesse de la lumière. Ainsi, la sensibilisation des utilisateurs au bon usage de l'outil informatique est primordiale. L'arbitrage de l'administration L'objectif principal d'un administrateur est d'assurer la disponibilité du système pour les utilisateurs autorisés et l'intégrité des fichiers des utilisateurs. Les choix de sécurité sont toujours le résultat d'un arbitrage, et l'administrateur doit toujours prendre en considération, la sensibilité des données, le coût de la réparation (en général la sauvegarde plus le temps de travail perdu) et le cout des infrastructures de sécurité. La qualité de service d'un système se mesure en QOS (Quality Of Service). La Console !© par Patrick Hautrive !;~) 2010 161 Un système sécurisé doit rester à la portée des utilisateurs, et trop de contraintes peut nuire à l'objectif de départ. Les utilisateurs recherchent la facilité, et c'est ce que doit leur apporter le système. Par ailleurs, une configuration trop souple peut être insuffisante pour l'objectif fixé. Ici aussi, l'arbitrage est de rigueur, et c'est tout le talent de l'administrateur, de mettre l'outil informatique à la bonne hauteur pour ses utilisateurs. L'arbitrage des objectifs, des contraintes, des coûts et des risques System Disponibility Files Intégrity Network Sécurity Secrets Sensibility Users Identity Adminsitrator Registry People Confidentiality L'activité d'administration Le rôle de l'administrateur est en quelque sorte ambivalent. Il possède tous les droits sur le système, et en même temps, il se doit de rester neutre et discret vis à vis des activités des utilisateurs. Et en même temps, l'administrateur doit être méthodique et vigilant. Un bon administrateur est invisible et semble inactif. Son rôle est de pourvoir aux besoins et de prévoir les situations d'urgences. Le rôle de l'administrateur n'est pas de satisfaire à toutes les exigences des utilisateurs, comme le besoin de formation ou le soutient psychologique, ni de pallier toutes les situations. Les systèmes d'information sont tellement intégrés aux activités humaines, qu'une simple panne de courant pourrait faire vaciller la civilisation. L'administrateur doit savoir rester ferme sur ces prérogatives, et en même temps, il doit savoir être souple pour s'adapter en permanence aux circonstances. Par exemple, l'aide aux utilisateurs (hot line) n'est pas du ressort de l'administrateur. Par contre, l'administrateur doit contrôler périodiquement le renouvèlement des mots de passe ainsi que le niveau de permission des utilisateurs. Un administrateur ne répondra jamais aux questions d'un inconnu au téléphone (social engeenering), et conservera en permanence son obligation de réserve. Les objectifs de l'administration L'administrateur travaille tous les jours à l'amélioration du système (audit), il envisage méthodiquement les besoins futurs (innovation), il évalue objectivement les performances (benchmark), il gère scrupuleusement les sauvegardes à l'extérieur du site (backup) et vérifie régulièrement leur utilité (restauration), il surveille l'activité du système (log), il contrôle l'utilisation et la capacité des machines (ressources), il vérifie les branchements réseaux (cable), il se tient informé des nouveautés (internet) et de la communauté (patch), il planifie les implémentations (test) et les mises à jours (update), il protège les infrastructures (firewall) et segmente les réseaux (dmz), il configure le noyau (kernel) et les services (server), il conduit le déploiement et le dépannage des matériels (hardware), il dirige l'installation des applications et des pilotes (software), il évalue les compétences des utilisateurs (formation), il organise le partage des fichiers (share) et des La Console !© par Patrick Hautrive !;~) 2010 162 périphériques (printer), il automatise l'administration (script), il documente la configuration (register) pour un éventuel successeur administre les utilisateurs (users) et ses collaborateurs (management), il conseille et il rend compte à ses supérieurs (consulting), enfin, il doit savoir rediriger les personnes qui lui soumettent des problèmes (organisation) et il doit anticiper les situations d'urgence (anticipation) avec la mise en place de règles strictes (rules), de procédures rigoureuses (procedures) et de sauvegarde des preuves d'intrusions ou de falsifications (proofs). Les principes de l'administration Pour faire bien son travail, l'administrateur doit faire preuve de bon sens et de rigueur. L'administrateur doit réaliser en permanence une veille technologique, faire les tests appropriés avant une mise en production, et mettre en place les parades qui conviennent avant que ne se produisent les situations d'urgences. Il n'est pas facile de garder son sang froid et de produire des idées innovantes en situation de stress, aussi, ce rôle peut être dévolu à un groupe qui sera séparé des autres au sein d'une cellule d'urgence. Quand tout va bien, l'administrateur semble n'avoir pas grand chose à faire, pourtant, c'est à ce moment là qu'il faut réfléchir et discuter des améliorations du système (tuning). Par contre, quand tout va mal et que les alertes retentissent, la priorité absolue est de rétablir le système dans les plus brefs délais. L'administrateur doit avoir prévu les dispositions adéquates et il doit sans attendre lancer les procédures pour réagir à la situation. Les meilleurs systèmes sont ceux qui restent stables, fiables et robustes, et pour lesquels les modifications sont toujours souhaitées et jamais imposées. Le temps d'utilisation d'une machine peut être un indice de cette qualité, MTBF (Mean Time Between Failure). Certains informaticiens considèrent souvent qu'il vaut mieux ne pas toucher à quelque chose qui fonctionne, l'intervention humaine étant la principale source de négligences, d'erreurs et de dysfonctionnement. Toutefois, les systèmes d'information évoluent perpétuellement, et plutôt vers une complexification, aussi, l'attentisme et le conformisme ne sont pas des attitudes efficaces, et l'administrateur ne doit pas attendre que la faille surviennent. Tous les changements de configuration devraient être consignés dans un registre et tous les journaux de surveillance devrait être sauvegardés dans un lieu séparé. L'administration des programmes Les programmes et le noyau constituent les éléments de code qui sont en activité dans la machine. Moins, il y aura de code, moins il y aura de source d'erreurs. Ainsi, un des principes de l'administration d'un système est d'interdire tout ce qui n'est pas indispensable, et de n'autoriser explicitement que ce qui est rigoureusement nécessaire. L'administrateur choisira de prendre son temps pour évaluer les besoins et les risques, et de n'installer que le minimum d'applications, de services et de serveurs, et il prévoira de désinstaller les packages obsolètes. La Console !© par Patrick Hautrive !;~) 2010 163 Toutefois, les mises à jour de sécurité font parties des priorités, parce que lorsqu'une faille est divulguée, il existe un temps de latence entre le moment de sa découverte et le moment où tous les systèmes sont mis à jours. Et pendant ce temps d'adaptation, la faille est connue, la solution est disponible, mais son application n'est pas encore mis en place. Un autre principe est de n'octroyer que les droits suffisants pour l'exécution d'une tâche. Ainsi, il n'est pas nécessaire que ce soit l'administrateur (root) qui lance le serveur graphique (xwindow). D'autre part, la présence et l'usage des droits SUID et SGID doivent être limités au strict nécessaire. Une bonne connaissance du code d'un programme est un facteur déterminant pour un bon usage. C'est pourquoi, les Logiciels Libres qui permettent l'accès au code source est primordial pour l'administration des systèmes d'information. La segmentation de l'administration La segmentation de l'administration consiste à séparer les choses (non pas diviser pour régner mais plutôt la séparation des pouvoirs). En effet, plus les activités sont dissociées, et plus il est facile de les hiérarchiser, de les superviser et de les contrôler. Les sous réseaux permettent de séparer les lieux et les communications de paquets TPCIP. L'interposition de pare feu et de zones démilitarisées (DMZ) permet de filtrer les connexions et les échanges. La création de groupes permet de rassembler les utilisateurs autour d'une même tâche, avec les même droits, et en même temps d'en exclure les autres. L'attribution de fonctions précises à certains utilisateurs permet de savoir exactement qui fait quoi, où, quand et pourquoi. La séparation des évènements systèmes dans des fichiers journaux spécifiques permet de remonter l'information directement. Le compte root doit être réservé à un seul utilisateur, clairement identifié (clearance). Le super utilisateur doit veiller à se déconnecter quand sa tâche d'administration est accomplie. Le mot de passe de l'administrateur doit être tenu secret (avec une ou deux copies de sécurité), et il doit être modifié régulièrement. L'identification des utilisateurs doit être unique et chaque compte doit avoir son propre identifiant (UID et GID). Les permissions doivent être les plus restrictives possibles. Les scripts shell ne doivent jamais porter un bit spécial (SUID et SGID). Les utilisateurs qui n'ont plus accès au système doit avoir leur compte désactivé. Les serveurs doivent évolués dans un environnement protégé (chroot). Les applications inutiles doivent être désinstallées. Les machines doivent être installées dans des salles fermées à clés. Les sauvegardes doivent être gardées dans un ou plusieurs autres lieux à l'abri des incendies et des vols. Le cryptage Le cryptage des données consiste en un calcul effectué sur une donnée. Généralement, le cryptage permet de rendre des données illisibles pour une personne ne possédant pas la clef permettant de les La Console !© par Patrick Hautrive !;~) 2010 164 décoder. Le cryptage apporte les avantages de la discrétion (la confidentialité des données et des messages, l'authenticité des interlocuteurs, et l'intégrité des données). La commande sudo La commande «sudo» permet d'octroyer des privilèges de l'administrateur à certains utilisateurs et pour certaines commandes. La commande «sudo» est compatible avec PAM. Il est conseillé de ne pas inclure d'outils interactifs, ni de scripts (échappement du shell) dans les exécutables autorisés à être lancé avec les droits root. La commande, exécutée une fois, donne une estampille temporelle (timestamp) de cinq minutes (ticket), c'estàdire que l'utilisateur peut lancer les commandes qu'il souhaite sans avoir à fournir à chaque fois son mot de passe. C'est le fichier «/etc/sudoers» qui définie les utilisateurs autorisés et leurs privilèges. La commande «man sudoers» donne une description de la syntaxe de ce fichier et de la grammaire EBNF (Extended BackusNaur Form). La commande «sudoedit» montre comment ajouter un utilisateur parmi les membres privilégiés. Les activités de sudo peuvent être enregistrées dans le journal «/var/log/sudo.log». Le fichier sudoers Un exemple de fichier /etc/sudoers defaults insult #login commande root ALL #%groupe commande %usersALL User_Alias ENSEMBLE Host_Alias MACHINE Cmd_Alias ARRETER CmdAlias MONTER joe ALL %mygroup ENSEMBLE noone ENSEMBLE %wheel ALL defaults joe !authenticate = (machine) identité de l'utilisateur (run as other user) = (ALL) ALL = (machine) identité de l'utilisateur (run as other user) = () ALL = joe, noone, phil = localhost = /usr/sbin/halt = /sbin/mount, /sbin/umount = HALT = ARRETER, MONTER = MONTER = (ALL) NOPASSWD: ALL Les exemples root ntpdate cd /root chmod R 700 /root La Console !© par Patrick Hautrive !;~) 2010 165 chmod R 700 /var/log chmod ow /etc/aliases chmod 700 /usr/sbin/chroot cat /etc/crontab vi /etc/profile umask 077 find /usr type f perm +6000 xdev exec ls l {} \; find /home name .rhosts exec cat {} \; find / user root perm 4000 exec ls la {} \; sudo find / nouser o nogroup print echo «» > /etc/nologin echo $PATH time ls / ulimit a cat /etc/hosts.allow cat /etc/hosts.equiv less /var/log/messages | grep root cat /etc/group | grep wheel useradd u 0 o admin cat /etc/group | grep root echo root:x:0:root, wheel, admin >> /etc/group passwd admin su admin ; id ; groups visudo c ; visudo s tar xvzf sudo.tar.gz cd sudo ./configure –withlogpath=/var/log/sudo.log withtimeout=10 withenveditor usepam disableshadow cat /proc/cpuinfo sudo cat /proc/kcore | less cat /proc/meminfo cat /proc/version ls /proc/sys/net/ipv4/tcp* vi /etc/sysctl.conf net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1800 net.ipv4.tcp_window_scaling= 0 net.ipv4.tcp_sack = 0 net.ipv4.tcp_timestamps = 0 /etc/rc.d/init.d/network restart La Console !© par Patrick Hautrive !;~) 2010 166 cat /proc/sys/net/ipv4/tcp_fin_timeout cat /proc/sys/net/ipv4/tcp_keepalive_time cat /proc/sys/net/ipv4/tcp_window_scaling cat /proc/sys/net/ipv4/tcp_sack cat /proc/sys/net/ipv4/tcp_timestamps La Console !© par Patrick Hautrive !;~) 2010 167 PACKAGE L'installation des packages Une fois le système installé et démarré, l'utilisateur peut installer ou désinstaller les applications qu'il souhaite. Les distributions se différencient selon le type de package qu'elles utilisent. Les packages sont des archives (Rpm, Debian ou Tarball) qui contiennent les fichiers binaires pour une application. Ces archives sont préparées spécialement pour un type de distribution (Red Hat ou Debian). Les packages standardisent l'installation des applications qui s'intègrent alors parfaitement avec le reste du système. Des gestionnaires graphiques (packet manager) permettent la récupération des archives depuis Internet, et l'automatisation de l'installation et de la désinstallation des applications. Les gestionnaires de paquets gèrent également les dépendances d'une application. Parfois, un programme n'est disponible que sous la forme des sources. La compilation des sources permet d'installer une application quelque soit le type de distribution Linux. Toutefois, l'installation des applications par l'intermédiaire des packages managers est toujours préférables quand c'est possible. L'installation des applications Distribution Archive Gestionnaire Commande Format Red Hat Rpm Red Hat Packet Manager rpm i archive.rpm .rpm Debian Deb Advanced Packet Tool .deb BSD Bsd Port BSD Gnu Linux Tarball Compilation des sources ./configure;make;make install .tar.gz ou .tar.bz2 aptget install archive.deb Les dépendances des applications Les dépendances d'une application sont les binaires et les bibliothèques (libraries) dont se sert l'application pour fonctionner. Les dépendances peuvent être communes à plusieurs applications. La même bibliothèque peut servir à plusieurs applications. Le gestionnaire de paquet d'une distribution vérifie la présence de ces dépendances avant d'installer une application. Les dépendances ne sont généralement pas incluses dans les archives pour une question de place et de temps de téléchargement, mais elles sont indispensables au fonctionnement de l'application. Les applications sont généralement compilées avec des liens dynamiques pour les bibliothèques. Ainsi, les bibliothèques sont séparées du programme, mais sont chargées en mémoire en même temps que le programme. La compilation d'un programme avec des liens statiques pour les bibliothèques La Console !© par Patrick Hautrive !;~) 2010 168 permet d'inclure les bibliothèques à l'intérieur du binaire, cela rend le programme plus autonome, mais aussi plus volumineux. En général, les dépendances doivent être installées avant l'application afin que cellesci puissent être configurées dans la foulée. C'est pourquoi, il est toujours préférable de privilégier l'installation d'une application sous la forme d'archive correspondant au type de distribution (Red Hat ou Debian). Toutefois, l'installation manuelle d'une application est toujours possible sur un système Gnu Linux, mais requière des compétences plus approfondies parce qu'il faut alors gérer soi même les dépendances. La compilation des sources La compilation des sources permet une configuration plus précise de l'application. La compilation des sources d'un Logiciel Libre permet d'installer un programme quelque soit le type de distribution. La compilation des sources d'une application est relativement simple et répétitive. Toutefois, tout programme dépend des choix du programmeur. Les conventions et les règles d'usage ne sont pas toujours suivies, aussi la lecture des fichiers INSTALL, README, HELP ou MAKEFILE qui peuvent accompagner le code source sont parfois salutaires pour résoudre des problèmes de dépendance. Une fois l'archive téléchargée, la procédure de configuration, de compilation et d'installation est standard. L'exemple de compilation ftp archive.tar.gz tar xvfz archive.tar.gz cd archive ./configure –Prefix=/usr/archive make make install La Console !© par Patrick Hautrive !;~) 2010 169 SCRIPTS L'environnement des scripts Les scripts sont écrits dans la syntaxe de l'environnement qui les interprétera. Les environnements shell (Bourne, C) sont différents les uns des autres, et ils se distinguent encore plus des environnements d'autres langages d'interprétation (Php, Python, Perl). Ainsi, un script shell est écrit pour un type de shell. Un script shell de type Bourne (Bash), ne sera pas forcément compatible dans un shell de type C shell (TCSH). Ces deux types de shell possèdent en effet des particularités qui leur sont propres. Toutefois, les scripts shell qui remplissent les conditions de la norme POSIX doivent pouvoir être compatible et portable. A contrario, les scripts rédigés pour d'autres langages d'interprétation, comme les scripts Php, Python ou Perl sont foncièrement différents parce que leur grammaire est particulière. Les commandes à l'intérieur d'un script seront exécutées dans l'environnement qui est indiqué en début de script. Cet environnement est stipulé par le chemin du binaire. Pour un script shell, cet environnement sera indiqué par le chemin vers le shell (#!/bin/bash). Pour un script propre à un autre langage, l'environnement sera indiqué par le chemin vers le langage interprété (#!/usr/bin/perl). Bien sûr, le package du langage d'interprétation doit être installé sur le système. Chaque ligne d'un script constitue une ligne de commande, et chaque ligne sera interprétée, analysée et exécutée par le langage de l'environnement dans l'ordre d'apparition. Tous les scripts sont plus ou moins capables de remplir les mêmes fonctionnalités, mais leur écriture sera plus ou moins facile selon le contexte et le résultat attendu. Les environnements peuvent être adaptés selon les besoins. Les commentaires à l'intérieur d'un script sont très utiles pour le documenter. Les commentaires sont toutes les lignes qui commencent par un dièse et elles ne sont pas interprétées. Le code retour («echo $?») permet de savoir si tout s'est bien déroulé. L'exécution des scripts Les scripts sont des fichiers textes contenants des commandes. Les scripts permettent d'automatiser les tâches répétitives. Ces commandes peuvent être des outils, d'autres scripts, ou des applications. Pour être exécutés, les scripts doivent posséder le droit d'exécution (chmod u+x script.sh). Le lancement d'un script obéit aux mêmes règles que les commandes, c'estàdire que l'environnement qui exécute le script doit connaitre le chemin des exécutables. Le chemin des exécutables est donné, soit par la variable PATH («echo $PATH»), soit par le chemin absolu («/home/$USER/script.sh»), soit par le chemin relatif au répertoire courant («./script.sh»), soit par la valeur d'un lien (link) ou celle d'un alias. Mais, il n'est pas recommandé de placer le répertoire courant («.») dans la variable d'environnement PATH, parce que cela permettrait de pouvoir exécuter La Console !© par Patrick Hautrive !;~) 2010 170 tous les exécutables, simplement en se plaçant dans leur répertoire. L'appel d'un script par le point («./scripteur») exécute le script dans l'environnement courant, avec les droits de l'utilisateur en cours. Le lancement des scripts Un script est généralement lancé depuis un terminal virtuel, dans un sous shell, au moyen d'un appel implicite («./script.sh»), ou d'un appel explicite en spécifiant le shell d'exécution («bash script.sh»). La formulation d'une commande appelant un script obéit aux mêmes règles que pour les commandes, c'estàdire que les scripts peuvent être lancés en backgound («./script.sh &») ou détachés du terminal («nohup sh script.sh»). Les scripts peuvent être lancés régulièrement, dans une table cron, et avec les droits d'un utilisateur spécifique. Les scripts shell utilisent les caractéristiques du shell, comme l'interprétation des expressions régulières (regex), les variables d'environnement («setenv»), les fonctions et les variables internes («echo $0»), les redirections de l'entrée et des sorties du terminal (stdin, sdtout et stderr), la communication inter processus avec l'envoi de signal (kill), mais aussi le langage de programmation de l'interpréteur de commande. C'est tout cela qui en fait un outil souple et puissant. Un script commence toujours par un «ShaBang», expression (#!bin/bash) qui désigne le chemin absolu de l'interpréteur de commande (shell) qui interprètera le script. L'exécution d'un script avec le ShaBang «# !/bin/bash xv» permet de voir l'exécution ligne par ligne par le shell Bash, et de visualiser les valeur des variables lors de leur interprétation. La rédaction des scripts Les scripts shell fonctionnent dans l'environnement d'un shell et peuvent donc utiliser toutes les capacités de leur environnement. Ces capacités (l'héritage de l'environnement, les variables, l'interprétation des caractères spéciaux, les fonctions, les structures de programmation, les redirections, l'envoie de signal, les appels systèmes, les outils gnu, les autres scripts et les applications locales,...) sont tellement riches et complexes, qu'il y a toujours plusieurs façons d'écrire un script. La différenciation d'un script d'un autre, ne s'effectue plus, dès lors, sur l'objectif à atteindre, mais sur l'économie des ressources dont il a besoin, en terme, de nombre de lignes, de nombre de processus ou de nombre de fichiers ouverts. Les scripts utilisent abondamment les outils Gnu, qui permettent de rechercher et de consulter des fichiers et d'en extraire des valeurs. Chaque commande peut agir comme un filtre et rediriger son résultat vers la commande suivante. Il est important de prendre le temps de documenter un script, c'est à dire de placer des commentaires pour expliquer son fonctionnement, afin de faciliter sa compréhension par une tierce personne et sa modification par la suite. Les scripts peuvent être interactifs, c'estàdire qu'ils peuvent attendre les réponses de l'utilisateur avec La Console !© par Patrick Hautrive !;~) 2010 171 les commandes internes au shell (echo, wait et read). Ils peuvent être modulables avec les instructions internes au shell (true, sleep, continue, break). Ils peuvent s'adapter aux circonstances en utilisant les structures de contrôle. Enfin, les scripts reconnaissent les opérateurs logiques (AND, OR, NOT, TRUE, FALSE), les opérateurs arithmétiques pour le calcul d'entiers numériques à l'intérieur de formules et les opérateurs alphanumériques pour la comparaison de chaines de caractères. Les commandes de manipulation des fichiers (filter) find grep diff uniq sort wc patch awk sed tr cut col groff expand unexpand pour rechercher un fichier dans l'arborescence pour sélectionner des lignes contenants une occurrence dans un fichier pour comparer deux fichiers ligne à ligne pour écarter les doublons à l'intérieur d'une liste pour classer des listes de lignes dans un ordre alphanumérique pour compter les lignes, les mots ou les caractères (word count) pour insérer des mises à jour dans un fichier pour manipuler et formater des expressions avec un langage de programmation pour d'extraire ou de remplacer des motifs un flux de texte (stream editor) pour traduire un caractère ou l'effacer (translate) pour sélectionner une colonne dans une ligne en fonction d'un séparateur connu pour renverser l'ordre d'un flux pour formater un flux de sortie pour convertir les tabulations en espace pour convertir les espaces en tabulation Les structures de contrôle Les structures de contrôle des scripts peuvent être des structures décisionnelles ou des structures itératives. Les structures de contrôle sont des mécanismes propres au langage de programmation interprété du shell. Les structures décisionnelles sont aussi appelées des branchements conditionnels ou des tests, et elles permettent d'orienter l'exécution du script selon les circonstances vers tel ou tel bloc d'instruction. Les structures itératives sont aussi appelées des boucles, et elles permettent de répéter un certain nombre de fois le même bloc d'instructions. Les boucles tournent selon la valeur d'un compteur qui est incrémenté à chaque tour selon un pas spécifique (en générale «i++», c'estàdire la valeur précédente plus une unité). En général, un compteur est modifié à l'issue d'un traitement, à la fin d'un bloc d'instruction. La Console !© par Patrick Hautrive !;~) 2010 172 Les structures de contrôle Les structures décisionnelles (branchements et tests) Minimum of Tours La condition «if then else then fi» one Le choix multiple «case in default esac» one Les structures itératives (boucles, compteurs et pas d'incrémentation) Le compteur de tours fixé en début de boucle «for do done» =>fixed Le compteur de tours contrôlé en début de boucle «while do done» =>zero Le compteur de tours contrôlé en fin de boucle «until do done» =>one Les tours de boucles Les boucles peuvent tourner un nombre de fois, fixé à l'avance, ou un certain nombre de fois qui peut être variable mais qui va dépendre du résultat d'un traitement à l'intérieure de la boucle. Le nombre de tours d'une boucle for (pour) peut être variable, mais il est connu et fixé en début de boucle. Le nombre de tours d'une boucle while (tant que) est variable, et le compteur est contrôlé en début de boucle, c'estàdire que la boucle peut ne pas s'exécuter, si la condition d'entrée n'est pas remplie, mais la boucle peut également tourner indéfiniment si la condition de sortie n'est jamais réalisée. C'est le cas des serveurs qui restent à l'écoute d'une demande de connexion, et qui tournent en tâche de fond. Le nombre de tours d'une boucle until (jusqu'à ce que) est également variable, mais le compteur est contrôlé en fin de boucle, c'estàdire que la boucle s'exécute toujours au moins une fois. Les opérateurs arithmétiques Les opérateurs arithmétiques permettent le calcul d'entiers numériques à l'intérieur de formules. Il existe un ordre de prévalence pour le calcul de ses formules. A moins d'expliciter l'ordre à l'aide de parenthèse qui est interprété en priorité, les opérateurs suivent un certain ordre: le regroupement (), l'addition («a+b»), la soustraction («ab»), la multiplication («a*b»), la division («a/b»), l'exponentiel (a**b) et le modulo (a%b) qui renvoi le résultat d'une division mais sans les chiffres après la virgule, c'estàdire sans les décimales. Par exemple, la formule («a+bxc») est équivalente à («(a+b)xc»). L'expansion des variables d'une formule est effectuée avant l'évaluation de l'expression. Les opérateurs de test Les opérateurs de la commande interne test du shell Bash s'appliquent sur les attributs des fichiers ou sur des quantités alphanumériques. Les opérateurs de test des attributs d'un fichier vont effectuer un test ou une comparaison sur la valeur d'un attribut (permission, type, taille). Les opérateurs La Console !© par Patrick Hautrive !;~) 2010 173 alphanumériques permettent de tester ou de comparer des valeurs numériques (numerical test) ou des valeurs alphabétiques, c'estàdire de chaines de caractères. Une valeur numérique représente un nombre entier, et une chaine de caractère représente un ensemble de caractères de la table des caractères (ASCII) placés les uns à la suite des autres. Une chaine de caractère peut former un mot, une phrase, ou représenter le nom d'une variable. Une chaine de caractères peut être nulle. Les tests utilisent la commande interne test du shell qui renvoi la valeur zéro si le test est vérifié et valide, ou renvoi une autre valeur, même négative, souvent égale à l'unité, quand le test n'est pas probant. La commande «echo $?» renvoi zéro quand la dernière commande s'est réalisée avec succès. La commande « test condition » peut être remplacée par des crochets [condition]. L'expression (keyword) est alors évaluée par le shell, et retourne le code retour (return code) égal à zéro (zero) si la condition est remplie. La commande «man bash» explique l'utilisation des commandes internes au shell bash (builtin). La commande «info coreutils 'test invocation'» donne des exemples d'utilisation des tests. La commande «man test» explique l'utilisation des opérateurs conditionnels. http://tldp.org/LDP/abs/html/index.html Les opérateurs arithmétiques Les opérateurs arithmétiques ou opérateurs de test des variables numériques permettent de comparer deux valeurs numériques (integer). Les opérateurs de test des variables arithmétiques (man test) Les opérateurs sur les valeurs arithmétiques (binary) (integer) test A eq B test A ne B test A le B test A ge B test A gt B test A lt B equal (==) not equal (!=) less or equal (<=) greater or equal (>=) greater than (>) less than (<) Teste si l'expression A est égale à B (equal) Teste si l'expression A n'est pas égale à B Teste si l'expression A est inférieure ou égale à B Teste si l'expression A est supérieure ou égale à B Teste si l'expression A est strictement supérieure à B Teste si l'expression A est strictement inférieure à B Les évaluations arithmétiques Les évaluations arithmétiques dans Bash consistent à effectuer des calculs numériques. Les expressions arithmétiques comportent des variables numériques ou des valeurs numériques entières. Les nombres peuvent être des entiers (integer) ou des décimales (decimal) signés (signs), négatifs ou positifs. Le calcul des expressions s'effectue à l'intérieur de parenthèses ou avec la commande « expr », et l'affectation des résultats s'effectue avec l'opérateur égal (equal). Plusieurs valeurs à l'intérieur d'une La Console !© par Patrick Hautrive !;~) 2010 174 liste peuvent être séparées par des virgules (comma). Les évaluations arithmétiques dans Bash (man bash) (let) Les opérations sur les expressions arithmétiques (expr) L'addition La soustraction La multiplication L'exponentiel La division Le modulo (remainder) L'évaluation conditionnelle L'affectation de valeur (assignment) La séparation de valeur (comma) Les signes unitaires + * ** / % expr ? expr : expr = *= /= %= += = <<= >>= &= ^= |= expr1 , expr2 La valeur positive La valeur négative + Les opérateurs de comparaison arithmétique Les opérateurs de comparaison arithmétique permettent de comparer deux valeurs numériques. Les évaluations arithmétiques dans Bash (man bash) Les opérations de comparaison La comparaison strictement supérieure La comparaison strictement inférieure La comparaison supérieure ou égale La comparaison inférieure ou égale L'égalité (equality) L'égalité (equality) La différence (inequality) > < >= <= = == != Les opérateurs logiques Les opérateurs logiques permettent de comparer deux expressions selon la valeur de leur code retour (return code). Une expression est considérée comme vrai (true), si sa valeur est égal à zéro, ou faux (false), si sa valeur est différente de zéro. Les opérateurs logiques utilisent les tables de vérité de l'algèbre de Boole. Les opérations logiques effectuées sur plusieurs expressions permettent à l'intérieur de structures de contrôle d'orienter le déroulement d'un script. La Console !© par Patrick Hautrive !;~) 2010 175 Les évaluations arithmétiques dans Bash (man bash) Les opérations logiques (table de vérité) La négation logique (NOT) La conjonction logique (AND) La disjonction logique inclusive (OR) ! && || Les opérateurs a lp hab é ti qu e s Les opérateurs alphabétiques ou opérateurs de test sur les chaines de caractères permettent de comparer deux chaines alphabétiques ou mots (string). Lors de l'emploi de simple crochet, le caractère spécial supérieur ou inférieur, pour comparer les positions de chaines de caractères dans l'ordre de la table ASCII, doit être précédé d'un échappement (escape) avec le caractère d'échappement anti slash (baskslach). Dans la version 2 de l'interpréteur Bash, les doubles crochets (double brackets) ont été implémentés pour satisfaire aux habitudes des programmeurs des autres langages de programmation. Avec l'utilisation des doubles crochets [[condition]], les caractères supérieurs ou inférieurs n'ont plus besoin d'être échappés (\). Les opérateurs de test des variables alphabétiques (man test) Les opérateurs sur les chaines de caractères ASCII (string) (numbers → letters → capitals) test A = B test A != B test A \< B test A \> B test n A test z A same different before after not empty is empty La chaine A est identique à B La chaine A n'est pas identique à B La chaine A apparaît avant B dans la liste triée ASCII La chaine A apparaît après B dans la liste triée ASCII La chaine A n'est pas vide La chaine A est vide La Console !© par Patrick Hautrive !;~) 2010 176 Les opérateurs d'attribut des fichiers Les opérateurs d'attribut des fichiers ou opérateurs de test sur les types de fichiers permettent de tester l'existence d'un fichier et le positionnement d'un attribut particulier, comme le type de fichier (file, directory, pipe, socket, symlink, block device, caracter device), ses droits (permissions), son appartenance (owner), sa taille (size) ou sa date de dernière modification (mdate), et de comparer deux fichiers selon leur inode (hardlink) ou leurs dates d'écriture (mdate). Les opérateurs de test des fichiers (man test) ([[condition]]) Les opérateurs sur les attributs des fichiers (file) test a file test e file test f file test !e file test d dir test h symlink test L symlink test b block test c block test p pipe test S socket test t file test N file test O file test G file test r file test s file test w file test x file test g file test u file test k file test file1 nt file2 test file1 ot file2 test file1 ef file2 exist exist exist do not exist exist exist exist exist exist exist exist terminal modified EUID EGID read not empty write execute SGID SUID STICKYBIT newer older same hard link Existence du fichier (file exists) Existence du fichier (file exists) Existence d'un fichier normal (regular file) Non existence du fichier (file does not exist) Présence du répertoire (directory) Présence d'un lien symbolique (symlink) Présence d'un lien symbolique (symlink) Présence d'un fichier bloc (block device) Présence d'un fichier caractère (character block device) Présence d'un fichier FIFO (pipe) Présence d'un fichier de connexion réseau (socket) Le fichier est associé à un terminal (file descriptor open) Le fichier a été modifié depuis la dernière lecture (new) Le fichier appartient à l'utilisateur effectif (EUID) Le fichier appartient au groupe effectif (EGID) Le fichier a le droit en lecture pour l'utilisateur (read) Le fichier n'est pas vide (size not empty) Le fichier a le droit d'écriture pour l'utilisateur (write) Le fichier a le droit d'exécution pour l'utilisateur (exe) Le fichier a le droit SGID (sgid flag) Le fichier a le droit SUID (suid flag) Le fichier a le droit « t » (sticky flag) Le fichier est plus récent que le deuxième (mdate) Le fichier est plus vieux que le deuxième (mdate) Les deux fichiers pointent vers la même inode (hardlink) La Console !© par Patrick Hautrive !;~) 2010 177 Les opérations particulières Certaines opérations arithmétiques ne sont pas très utilisées, comme les opérations sur les bits (bitwise) ou les opérations d'incrémentation de variables numériques. Les opérations arithmétiques particulières dans Bash (man bash) Les opérations sur les bits (bitwise) L'inversion du bit (NOT) ~ Le basculement vers la droite des bits >> Le basculement vers la gauche des bits << La conjonction logique de deux bits (AND) & La disjonction logique de deux bits (OR) | L'exclusion logique de deux bits (XOR) ^ Les opérations sur l'incrémentation des variables numériques La post incrémentation La post décrémentation La pré incrémentation La pré décrémentation id++ id ++id id Les opérations hexadécimales Les opérations hexadécimales permettent d'effectuer des calculs sur une base 12 (hexadecimale). Les opérations sur d'autres bases sont également possibles dans Bash avec l'expression « base ». Les opérations sur les hexadécimales http://tldp.org/LDP/abs/html/refcards.html Les exemples de scripts date > file ; who >> file sort < file >> filealphanum sort file | lp ; cat file | sort | lp mail user < file echo "$PATH" ;export PATH=$PATH:. ; echo "$?" vi suppr rm i $* chmod u+x suppr ls l suppr La Console !© par Patrick Hautrive !;~) 2010 178 ./suppr file fool vi .profile #Alias dans le Shell Korn rm() { /bin/rm i $* } vi $HOME/.cshrc #Alias dans C shell alias rm 'rm i $*' vi prompt if [ ! «$PS1» ] ; then PS1= «\h:\w%» ; fi vi answer echo «Please type your answer A, B or C» read ANSWER case $ANSWER in A|a) echo « You typed A or a» ;; B|b) echo « You typed B or b» ;; C|c) echo « You typed C or c» ;; *) echo « Your answer is out of range» ;; esac vi plusdate JOUR=`date +%m%d%y` mv $1 $1.$JOUR for i in *.txt ; do cp $i /tmp/$i ; done for FILE in $(find .type f name «*.html») ; do sed e 's/old/new/g' $FILE ; done vi copytmp for i in $* do cp $i /tmp/$i done sort << END MacosX Linux OpenBsd Windows END . script.sh La Console !© par Patrick Hautrive !;~) 2010 179 EXEMPLES 3 . Good practice L'indentation (indentation) des lignes de codes et le respect de certaines règles (rules) permettent de qualifier un script d'élégant, voire d'intellectuellement esthétique (beauty). Ces bonnes habitudes (good practice) et ces conventions permettent de fournir un code lisible et facile à maintenir pour l'exploitation en production. La fonction d'une variable devrait être bien identifiée, et ne servir qu'un seul dessein (purpose), afin d'éviter les confusions. Le nom qui est attribué à une variable devrait refléter sa fonction (naming). La convention de nommage des variables en majuscule (capital letter) est bien utile pour la relecture des scripts. Le choix de variables et de fonction « généralistes » permet de faire évoluer le code (evolution), et l'écriture de petits scripts simples permet de les utiliser ensembles, avec des redirections ou des appels (call). L'écriture de script devrait toujours privilégier les normes officielles (posix) et prendre en considération la portabilité (portability) d'un script vers un autre interpréteur de commandes ou vers un autre système d'exploitation. 2. Errors Les variables devraient toujours être encadrées d'apostrophe (double quote) afin d'éviter l'ambigüité des interprétations par le shell Bash (particulièrement dans les tests des boucles). La déclaration des variables et des tableaux requière impérativement que le signe égal (equal) soit accolé au nom (name) et à la valeur (value). Les structures conditionnelles (test) et les boucles itératives (loop) requièrent un point virgule (semi colon) après le test d'entrée dans la boucle (entry test). Les crochets (brackets) qui entourent les conditions requièrent un espace de part et d'autre de l'expression conditionnelle. Lorsqu'un script est lancé, les erreurs que le shell Bash renvoi sont généralement indiqueés avec le numéro de la ligne correspond à l'erreur (line number) dans le script, et avec un code d'erreur (error code) qui permet de faire des recherches sur internet pour en trouver la signification et la solution. Quand une apostrophe (quote) manque quelque part, alors l'interprétation du script par le shell Bash est décalée. La coloration syntaxique (syntax colour) des terminaux (terminal) ou des éditeurs (editor) de scripts shell permet de visualiser rapidement les variables, les expressions, les commentaires, les structures et les caractères spéciaux. Le ShaBang «#!/bin/sh xv» montre l'éxécution d'un script ligne par ligne avec à chaque moment la La Console !© par Patrick Hautrive !;~) 2010 180 valeur des variables qui sont interprétées par le shell Bash. 1 . Warnings Attention, la copie ou le déplacement écrase le fichier cible, s'il existe déjà, et la redirection simple vers un fichier écrase sont contenu (à moins que le verrou noclobber ne soit fixé). La copie de texte par sélection en surbrillance et clic avec la molette (middle clic) ou clic droit puis coller (right clic and paste) dans un terminal ne copie pas toujours les mêmes caractères (caracters mapping), spécialement les apostrophes (quotes). Il est important de tester au préalable les scripts sur une machine d'essai (textbox). Avant d'appuyer sur la touche d'enter du clavier, il est toujours judicieux de relire sa commande attentivement, et de visualiser ce qu'elle est censée accomplir (are you sure?)... Les Logiciels Libres (free software) sont des outils très bien conçus, et qui s'améliorent grâce à l'accès au code source, et au travail de la communauté. La licence GNU/GPL protège les utilisateurs des Logiciels Libres, en gardant libres toutes les modifications et/ou améliorations qui peuvent être apportées à un programme (free license). Toutefois, ces logiciels ne sont pas responsables de la façon dont on les emploi, et sont livrés gratuitement sur internet, mais sans aucune garantie d'utilisation ou de fonctionnement (no warranty)... 0. Links http://bashshell.net/category/bashshell/ http://www.linuxtutorialblog.com/category/tutorials http://www.linuxconfig.org/Bash_scripting_Tutorial http://tldp.org/HOWTO/BashProgIntroHOWTO.html#toc7 http://www.linuxselfhelp.com/gnu/bash/html_chapter/bashref_toc.html http://www.linuxdoc.org/HOWTO/BashProgIntroHOWTO.html http://www.livefirelabs.com/sample_course/index.htm http://www.gnu.org/software/bash/manual/html_node/ http://www.linuxtopia.org/online_books/index.html http://www.faqs.org/docs/abs/HTML/index.html http://tldp.org/LDP/abs/html/index.html http://wiki.bashhackers.org/start http://www.faqs.org/docs/artu/ http://www.linuxforums.org/ 1. L'expansion touch script.sh ls lih La Console !© par Patrick Hautrive !;~) 2010 181 script.sh VAR="ls" echo $VAR ls echo "VAR = $VAR" VAR = ls echo "VAR = \$VAR" VAR = VAR echo 'VAR = $VAR' VAR = $VAR echo "VAR = " `$VAR` VAR = script.sh echo $VAR ls 2. L'affectation read p «Please give a value to the variable VAR and press the ENTER key ?» VAR Please give a value to the variable VAR and press the ENTER key ? Variable Local and Temporary echo e «\n The variable VAR is: \t $VAR» The variable VAR is: Variable Local and Temporary 3. L'exportation des variables echo $USER $HOME $SHELL env env | grep OSTYPE OSTYPE=linux export OSTYPE=GNU/Linux echo $OSTYPE GNU/Linux bash echo $OSTYPE GNU/Linux exit CTRL+D echo $OSTYPE linux 4. Les alias La Console !© par Patrick Hautrive !;~) 2010 182 alias ls script.sh ll= «ls l» ll rwrr 1 pat users 0 20110331 14:59 script.sh unalias ll ll commandnotfound cnf nagios ll= «ls l» exit CRTL+D ll commandnotfound 5. Les profiles bash login ls l /etc/profile rwrr 1 root root 9154 20100608 17:58 /etc/profile ls l ~/.bash_profile ls l ~/.bash_login ls l ~/.profile rwrr 1 pat users 1027 20110317 21:38 /home/pat/.profile echo $SHLVL 3 bash i ls l /etc/bash.bashrc rwrr 1 root root 8692 20100608 17:58 /etc/bash.bashrc ls l ~/.bashrc rwrr 1 pat users 1177 20110306 12:57 /home/pat/.bashrc echo $SHLVL 4 exit echo $SHLVL 4 exit 6. L'environnement vi ~/.bashrc EDITOR="/usr/bin/vim" La Console !© par Patrick Hautrive !;~) 2010 183 PATH="/opt/bin/:$PATH" export EDITOR PATH alias ls='ls lih' echo "Chargement de la configuration terminé." echo "Bienvenue "`whoami` bash i Chargement de la configuration terminé. Bienvenue pat echo $EDITOR $PATH /usr/bin/vim echo $PATH /opt/bin/:/home/pat/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin: ls 1705429 rwrr 1 pat users 0 20110331 14:59 script.sh echo $SHLVL 3 exit echo $SHLVL 2 ls script.sh 7 . Hello World man bash vi script.sh #! /bin/bash #script.sh echo «Hello World» VAR=LocalEnvironment echo "The variable VAR is: $VAR" echo $VAR chmod +x script.sh ls l script.sh rwxrxrx 1 pat users 32 20110331 16:03 script.sh ./script.sh Hello World The variable VAR is: LocalEnvironment echo $VAR source script.sh Hello World The variable VAR is: LocalEnvironment La Console !© par Patrick Hautrive !;~) 2010 184 echo $VAR LocalEnvironment export VAR=LocalEnvironmentInitialShell echo $VAR LocalEnvironmentInitialShell echo $SHLVL 2 bash echo $SHLVL 3 vi script.sh #! /bin/bash #script.sh echo «Hello World» VAR=LocalEnvironmentNewShell echo "The variable VAR is: $VAR" ./script.sh Hello World The variable VAR is: LocalEnvironmentNewShell echo $SHLVL 3 echo $VAR LocalEnvironmentInitialShell unset VAR echo $VAR env | grep VAR exit echo $SHLVL 2 echo $VAR LocalEnvironmentInitialShell unset VAR echo $VAR 8. Les paramètres man bash vi script.sh #!/bin/bash #script.sh echo e "\n\t Hello World \n" VAR=LocalEnvironment La Console !© par Patrick Hautrive !;~) 2010 185 echo "The variable VAR is set to: $VAR" #export VAR #Print the script parameters# echo e "\n\t Here are the script parameters \n" echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 echo e "\n\t Here are other shell builtin parameters \n" echo "\$# is set to:" $# echo "\$* is set to:" $* echo "\$@ is set to:" $@ echo "\$? is set to:" $? echo "\$$ is set to:" $$ echo "\$! is set to:" $! echo "\$ is set to:" $ echo "\$_ is set to:" $_ chmod +x script.sh ./script.sh one two three four five six seven eight nine ten Hello World The variable VAR is set to: LocalEnvironment Here are the script parameters ./script.sh one two three four five six seven eight nine Here are other parameter builtin $# is set to: 10 $* is set to: one two three four five six seven eight nine ten $@ is set to: one two three four five six seven eight nine ten $? is set to: 0 $$ is set to: 5819 $! is set to: $ is set to: hB $_ is set to: hB 9. Le debugging kill l stty a man bash man trap vi script.sh La Console !© par Patrick Hautrive !;~) 2010 186 #!/bin/bash #script.sh echo e "\n\t Hello World \n" VAR=LocalEnvironment echo "The variable VAR is set to: $VAR" #export VAR #Infinite Loop and exit with CTRL+C echo e "\n\t Infinite Loop \"while true\" (no exit with CTRL+C) Please use: kill 9 PID" #Trap the SIGNALS 2 & 15 (kill l) trap “echo You have pressed CtrlC before the loop” SIGINT SIGTERM sleep 3 while true ; do echo "The process signal CTRL+C will not stop the Loop (use kill 9 PID)" COUNTER=0 while [ "$COUNTER" lt 10 ]; do echo The counter is $COUNTER let COUNTER=COUNTER+1 trap 'echo "You have pressed CtrlC inside the loop"' SIGINT SIGTERM sleep 2 done sleep3 #trap 'echo "You have pressed CtrlC after the loop"' SIGINT SIGTERM done #trap “The EXIT SIGNAL has been trapped” EXIT #trap “This is to trap for debugging” DEBUG #echo "The exit code is (137 is for SIGINT or CTRL+C): $?" #exit 0 #return 7 xterm e «source script.sh» & [1] 7064 ps aux | grep script.sh pat 7064 18.7 1.2 11976 6548 pts/0 S 16:14 0:08 xterm e source script.sh pat 7068 43.7 0.2 4516 1380 pts/3 Rs+ 6:14 0:19 bash c source script.sh pat 7119 0.0 0.1 3628 788 pts/0 S+ 16:15 0:00 grep script.sh kill 2 7064 [2]+ Exit 2 xterm e "source script.sh" echo "The exit code of the latest foreground process was: $?" xterm & [3] 7023 ps aux | grep script.sh pat 7023 44.7 0.2 4516 1224 pts/3 R+ 16:11 0:18 /bin/bash ./script.sh La Console !© par Patrick Hautrive !;~) 2010 187 pat 7027 0.0 0.1 3628 784 pts/0 S+ kill 2 7023 kill 15 7023 kill 9 7023 echo "The exit code of the latest foreground process was: $?" echo "The exit code of the latest foreground process was: $?" xterm & [4] 8804 ./script.sh > pipescript.txt ^C^C^C ps aux | grep script.sh pat 8804 83.3 0.2 4512 1224 pts/4 R+ pat 8806 0.0 0.1 3628 788 pts/0 S+ kill 9 8804 Processus arrêté cat pipescript.txt | grep "loop" You have pressed CtrlC in the loop You have pressed CtrlC in the loop 16:11 0:00 grep script.sh 18:19 0:10 /bin/bash ./script.sh 18:19 0:00 grep script.sh 10. Les commandes pwd ; id ; who ; users ; groups ; hostname ; uptime ; uname a ; lsb_release a {ls; du h; df h;date} > /tmp/my_log ; less /tmp/my_log ; fdisk l ls / R ; ls la ~/ | wc l ; cat ~/.bashrc ; less /etc/passwd ; cat /etc/group | grep $USER touch newfile.txt ; vi newfile.txt ; echo «Another line at the end of the file» >> newfile.txt ifconfig ; route ; tcdump ; nmap A T5 localhost ; nmap A T3 scanme.org ps aux | grep $USER | grep tty ; stty ; kill l; man bash ; man ascii ; stty ; kill l emacs & ; nohup emacs & emacs & top emacs || echo “Emacs did not start !” emacs && echo “Emacs is starting...” KERNEL1=`uname sr` ; KERNEL2=$(uname –sr) ; echo e «$KERNEL1 \n $KERNEL2» !! ; history ; echo e «The error code ZERO shows the last command was successfull \n\t» ; echo $? 11. Les opérateurs man test test 1 gt 2 && echo yes yes test 1 gt 2 ; echo $? 0 [ 10 eq 7 ]; echo $? 1 La Console !© par Patrick Hautrive !;~) 2010 188 [[ 10 lt 11 && 100 gt 99 ]] ; echo $? 0 12. Les expressions expr $((4+3)) 7 let $[12/3] 4 echo “3+2= $[3+2]” «3+2= 5» 13. La sauvegarde vi backuphome.sh #!/bin/bash #To unzip and extract a tarball, go to the directory of extraction and launch the tar command tar czf $HOME/backup$USER$(date +%d%b%Y).tar.gz $HOME chmod +x backuphome.sh ./backuphome.sh ls lih mkdir $HOME/backup cd $HOME/backup ; pwd tar xzvf $HOME/backuppat04avril2011.tar.gz mv $HOME/backuppat04avril2011.tar.gz backup cd backup gunzip backuppat04avril2011.tar.gz tar xvf backuppat04avril2011.tar ls 14. Les locales vi locale.sh #!/bin/bash #Declaration of global variable VAR="global variable" echo «The variable «VAR» is set GLOBALLY and worth: $VAR» #Creation of a fonction called «localvar» #The Bash function «local» defines the local variable for «localvar» function localvar { local VAR="local variable" echo «The variable «VAR» is set LOCALY and worth: $VAR» } La Console !© par Patrick Hautrive !;~) 2010 189 #The local function «localvar» is launched in the script localvar echo «The variable «VAR» has returned to its GLOBALLY value: $VAR» chmod +x locale.sh ./locale.sh «The variable «VAR» is set GLOBALLY and worth: global variable» «The variable «VAR» is set LOCALY and worth: local variable» «The variable «VAR» has returned to its GLOBALLY value: global variable» 15. Les arguments vi argument.sh #!/bin/bash #argument.sh #To passe arguments to the script. Example: "./argument.sh one two three" echo e "\n The first nine arguments passed to the script line (Bash special parameters)." echo e "\t The first nine arguments are: \n\t $1 $2 $3 $4 $5 $6 $6 $7 $8 $9" echo e "\n The command line (\$0\$*) with all the special pamameters passed as arguments." echo e "\b The command line was: \n\t $0 $*" echo e "\t The command line contained $# parameters (\$#)." #Arguments can be stored in an array args=("$@") echo e "\n The arguments passed to the script command line can be stored in an array:" echo e "\t ${args[0]} \t ${args[1]} \t ${args[2]} \t ${arg[3]} \t ${args[4]} \t ${args[5]}" echo e "\t ${args[6]} \t ${args[7]} \t ${args[8]} \t ${arg[9]} \t ${args[10]} \t ${args[11]}" echo e "\n The values of all the lines of the array are:" echo e "\t 'args=("$@")' \n" chmod +x argument.sh ./argument.sh one two three four five six seven eight nine ten eleven twelve The first nine Arguments passed to the script command line (Bash special parameters). The first nine arguments are: one two three four five six six seven eight nine The command line ($0$*) with all the special pamameters passed as arguments. ./argument.sh one two three four five six seven eight nine ten eleven twelve The command line contained 12 parameters ($#). The arguments passed to the script command line can be stored in an array: one two three five six seven eight nine eleven twelve The values of all the lines of the array are: La Console !© par Patrick Hautrive !;~) 2010 190 'args=(one two three four five six seven eight nine ten eleven twelve)' 16. Le développement vi expand.sh #!/bin/bash #The caracter backticks or backquote ' `cmd `' execute a shell command and give the output echo e "The result of the command 'uname o' is: \t `uname o`" chmod +x expand.sh ./ expand.sh GNU/Linux 17. Les réponses vi response.sh #!/bin/bash #The interactivity with a script when it is launched allow the user to enter input. echo e "Welcome, please enter one word of your choice: " read word echo "Thank you, you have typed the word: $word" echo e "Please, enter now two words, separated by a space: " read first second echo "Thank you, you have typed the words \"$first\" and \"$second\"" #The response can be stored into the default buildin variable $REPLY echo e "Please tell me your first name: " read echo "Thank you $REPLY, I'm glad to meet you... " #The read «a» option ennable you to store the answers of the user into an array echo e "$REPLY, can you tell me in four words, why the licence GNU/GPL is important ? " read a answers echo "Ok, $REPLY, Thank you for your answers. " echo "I understood that for you the GNU/GPL licence stand for: " echo e " \n\t ${answers[0]}, ${answers[1]}, ${answers[2]} and ${answers[3]} :) \n" 18. L a trap pe vi trap.sh #!/bin/bash #trap.sh #The command /usr/bin/clear is used to clear the screen of the terminal clear #The trap builtin Bash command will intercept the process signals send to the script echo «The signal CTRL+C is disabled» La Console !© par Patrick Hautrive !;~) 2010 191 #The trap command will execute the local «trapfunction» when receiving the signal trap trapfunction INT #The trapfunction will print on the terminal screen a message every time the subrutine is called trapfunction() { echo "You have pressed CTRL+C, your signal has been intercepted !" } #The loop will count to ten and exit #The loop uses the «/usr/bin/seq» command to get the sequence of number of cycles echo «You can press CTRL+C, but it will not stop the loop of ten seconds...» for counter in `seq 1 10`; do echo "Counting $counter/10 before Exit..." sleep 1; done echo e "\n\t The 'trapfunction' has worked successfully" chmod +x trap.sh ./trap.sh «The signal CTRL+C is disabled» «You can press CTRL+C, but it will not stop the loop of ten seconds...» Counting 1/10 before Exit... Counting 2/10 before Exit... Counting 3/10 before Exit... ^CYou have pressed CTRL+C, your signal has been intercepted ! Counting 4/10 before Exit... Counting 5/10 before Exit... Counting 6/10 before Exit... Counting 7/10 before Exit... ^CYou have pressed CTRL+C, your signal has been intercepted ! Counting 8/10 before Exit... ^CYou have pressed CTRL+C, your signal has been intercepted ! Counting 9/10 before Exit... Counting 10/10 before Exit... The 'trapfunction' has worked successfully 19. Les tableaux vi array.sh #!/bin/bash #array.sh #Declaration of an array with 7 elements into it ARRAY=('Debian GNU/Linux' 'RedHat CentOS' FreeBSD Ubuntu OpenSuSE Slackware 'Linux From Scratch') La Console !© par Patrick Hautrive !;~) 2010 192 #Declaration of a variable that contents the number of lines into the array ELEMENTS=${#ARRAY[@]} #The loop will extract each element of the array and print it #The counter is "i", the loop increment by 1 and stop with the last element of the array echo e " \n " for (( i=0;i<$ELEMENTS;i++)); do echo e " \t ${ARRAY[${i}]} " done echo e " \n " chmod +x array.sh ./array.sh Debian GNU/Linux RedHat CentOS FreeBSD Ubuntu OpenSuSE Slackware Linux From Scratch 20. L'extraction ./array.sh > list.txt vi extract.sh #!/bin/bash #extract.sh list.txt #The script is launched with an argument: a file that countains the lines to be stored in the array # Declararation of the array with the builtin Bash command «declare» declare a ARRAY #Link the standard input «stdin» (0) with file descriptor 10, and opening file descriptor 10 #The link is made with the builtin Bash command «exec» exec 10<&0 #With the redirection of stdin, all the input will come from the file put in argument of the script #The file will be read line by line, and each line will be stored into the array #The argument of the script is the first internal variable «$1» (list.txt) #This file is set to be the input stdin for the script (extract.sh) exec < $1 #Initialisation of a counter for the loop at ZERO, increment by 1 while there is still a new line #Each cycle of the loop will store one numbered line into the variable LINE and into the array #The array starts at ZERO let counter=0 La Console !© par Patrick Hautrive !;~) 2010 193 while read LINE; do ARRAY[$counter]=$LINE ((counter++)) done echo e "\n\t The Number of elements in the array is: ${#ARRAY[@]}" echo e "\n\t The Elements of the array are: \n\t ${ARRAY[@]} \n" #Restoration of stdin from file descriptor 10 and release of file descriptor 10 (10<&) exec 0<&10 10<& 21. La boucle vi loop.sh #!/bin/bash #loop.sh sleep 1 echo e "\n\t Counting a list of predefine numbers" for i in 10 20 30 40 50 60 70 80 90 100 do echo e "\t Counting by 10s: \t $i" done sleep 2 echo e "\n\t Counting a range of numbers within curly bracketss" for i in {0..100} do echo e "\t Counting by ones: \t $i" done sleep 2 echo e "\n\t Counting a sequence of numbers by increment with the command 'seq'" for i in $(seq 1 2 100) do echo e "\t Counting by sequence of 2: \t $i" done chmod +x loop.sh ./loop.sh 22. Le ban n issement vi bannish.sh #!/bin/bash #bannish.sh #The file with known zombie networks is maintained at http://www.spamhaus.org/xbl/ #The banned file is a list of Ips addresses by example: 41.206.45.202 or 58.0.0.0/8 La Console !© par Patrick Hautrive !;~) 2010 194 #The script will input those Ips adresses into the firewall iptables and drop them #This script requires to be launched with root privileges #The variable IP refers to the file that countains the zombie networks IP=/opt/scripts/banned for i in $(awk '{print}' < "$IP") do echo $i iptables A INPUT p tcp s $i j DROP done exit 0 chmod +x bannish.sh su ./bannish.sh iptables L n Chain INPUT (policy ACCEPT) target prot opt source destination RHFirewall1INPUT all – 0.0.0.0/0 0.0.0.0/0 DROP tcp – 41.206.45.202 0.0.0.0/0 DROP tcp – 58.0.0.0/8 0.0.0.0/0 23. Les exécutables vi executables.sh #!/bin/bash #executables.sh #The script will output the files with executables permissions in the directory it is launched echo e "\n\t Those executable files where found in this directory: `pwd` " for i in * do if [ f "$i" a x "$i" ] then echo "$i" fi done chmod +x executables.sh ./executables.sh Those executable files where found in this directory: /home/pat/script argument.sh array.sh executables.sh expand.sh extract.sh La Console !© par Patrick Hautrive !;~) 2010 195 locale.sh loop.sh response.sh script.sh test.sh trap.sh 24. La condition vi directory.sh #!/bin/bash #test.sh $HOME #The script declare a varaible that contain a directory (first argument of the script) #The script check if this directory exists DIRECTORY="$1" if [ d "$DIRECTORY" ]; then echo "The directory does exist" else echo "The directory does not exists" fi chmod +x directory.sh ./directory.sh The directory does not exists ./directory.sh $HOME The directory does exist 25. L'imbrication vi nest.sh #!/bin/bash #nest.sh #The script present a list of choices in a cascade menu echo e " \n\t Welcome to the Menu " echo e " \n\tPlease choose between [1, 2 or 3] \n " echo e " \t 1. You wish to go out tonigth " echo e " \t 2. You prefer to stay at home " echo e " \t 3. You want to exit the menu " read CHOICEPLACE # bash while loop while [ "$CHOICEPLACE" ne 3 ]; do if [ "$CHOICEPLACE" eq 1 ] ; then La Console !© par Patrick Hautrive !;~) 2010 196 echo "You have chosen to go out" PLAN="You have chosen to go out" echo e " \t 1. Do you want to go dancing ?" echo e " \t 2. Do you want to go to the cinema ?" echo e " \t 3. You want to exit the menu " read CHOICEACTION if [ "$CHOICEACTION" eq 1 ] ; then echo e "\n\t $PLAN" echo e "\t Ok, swell we will go dancing tonight" CHOICEPLACE=3 #exit 0 else if [ "$CHOICEACTION" eq 2 ] ; then echo e "\n\t $PLAN" echo e "\t Ok, great we will go to the cinema tonight" CHOICEPLACE=3 #exit 0 else echo e "\n\t $PLAN" echo e "\t Oh well, you will know later where to go tonight..." CHOICEPLACE=3 #exit 0 fi fi else echo "You have chosen to stay at home" PLAN="You have chosen to stay at home" echo e " \t 1. Do you want to relax ?" echo e " \t 2. Do you want to read ?" echo e " \t 3. You want to exit the menu " read CHOICEACTION if [ "$CHOICEACTION" eq 1 ] ; then echo e "\n\t $PLAN" echo e "\t Ok, cool we will stay zen tonight" CHOICEPLACE=3 #exit 0 else if [ "$CHOICEACTION" eq 2 ] ; then La Console !© par Patrick Hautrive !;~) 2010 197 echo e "\n\t $PLAN" echo e "\t Ok, nice we will read a good book tonight" CHOICEPLACE=3 #exit 0 else echo e "\n\t $PLAN" echo e "\t Oh well, you will find later what to do at home..." CHOICEPLACE=3 #exit 0 fi fi fi done chmod +x nest.sh ./nest.sh 26. La comparaison vi compare.sh #!/bin/bash #compare.sh #Declaration of the integers numbers to be compared one another NUM1=2 NUM2=3 if [ "$NUM1" eq "$NUM2" ]; then echo "The two numbers are equal" elif [ "$NUM1" gt "$NUM2" ]; then echo ""$NUM1" is greater then "$NUM2"" else echo ""$NUM2" is greater then "$NUM1"" fi chmod +x compare.sh ./compare.sh 27. Le clavier vi keybord.sh #!/bin/bash #keybord.sh La Console !© par Patrick Hautrive !;~) 2010 198 echo "Please press one key of the keybord and then press ENTER" read KEY case "$KEY" in [az] ) echo "You have pressed one minuscule letter: "$KEY"";; [AZ] ) echo "You have pressed one majuscule letter: "$KEY"";; [09] ) echo "You have pressed one number: "$KEY"";; * ) echo "You have pressed a key that is not a letter, neither a number: "$KEY"";; esac chmod +x keybord.sh ./keybord.sh 28. L'expiration vi expiration.sh #!/bin/bash #expiration.sh #The script requires two integer as arguments #The first argument must be lower than the second i="$1" j="$2" echo e "\n\t The two arguments of the script are "$1" and "$2"" #The loop will run while the first is less than the second number while [ "$i" lt "$j" ]; do echo e "\t "$i"" i=`expr "$i" + 1` done chmod +x expiration.sh ./expiration.sh 4 12 29. Les chaines vi string.sh #!/bin/bash #string.sh word string #The script requires two strings as arguments #The test check if the one of the two Bash internal variable are empty ("||" is OR condition) if [[ z "$1" || z "$2" ]]; then echo e "\n\t Please give two strings arguments when you launch the script ! \n" exit 5 fi #Declaration of the two variables with the script two string arguments La Console !© par Patrick Hautrive !;~) 2010 199 FIRST="$1" SECOND="$2" #Comparison of the two strings if [ $FIRST = $SECOND ]; then echo "The two strings are the same: "$FIRST" equals "$SECOND" " exit 5 else #With one only bracket the escape superior or inferior sign need to be escape if [ $FIRST \< $SECOND ]; then echo "The two strings are different: "$FIRST" before "$SECOND" " exit 5 else #With two bracket do not need to escape the superior or inferior sign # [[ $FIRST > $SECOND ]]; echo "The two strings are different: "$FIRST" after "$SECOND" " exit 5 fi fi chmod +x string.sh ./string.sh linux debian 30. Le tank vi while.sh #!/bin/bash #while.sh #The while loop tests if the condition is true and runs while the condition remains true COUNTER=1 LIMIT=25 #The while loop must have a semi colon after the condition and before the do on the same line #The while loop: # "while [condition];do" # "cmd" # "done" while [ "$COUNTER" le "$LIMIT" ]; do echo e "\t "$COUNTER"/"$LIMIT" " let "COUNTER +=1" #COUNTER=$(( $COUNTER + 1 )) done chmod +x while.sh ./while.sh La Console !© par Patrick Hautrive !;~) 2010 200 31. La presence vi presence.sh #!/bin/bash #presence.sh file.txt #The script checks the presence of the file that is given as argument FILE=$1 #Checking if the file allready exist if [ e "$FILE" ]; then echo e "\t\n The file \""$FILE"\" allready exist !" echo e "\n\t `ls lih "$FILE"` " fi #The loop to create the file while [ ! e "$FILE" ]; do echo e "\n\t ...The file \""$FILE"\" doesn't exist..." sleep 1 echo e "\t Do you want to create the file \""$FILE"\" in `pwd` ? (yes or no)" read ANSWER echo "ANSWER is: "$ANSWER"" echo "FILE is: "$FILE"" if [[ $ANSWER == "yes" ]]; then /bin/touch "$FILE" echo e "\n\t `ls lih "$FILE"` " echo e "\n\t The file \"`pwd`/"$FILE"\" now exist \n" else echo e "\n\t The file \""$FILE"\" will not be created !" fi done chmod +x presence.sh ./presence.sh file 32. Les inombrables vi listing.sh #!/bin/bash # listing.sh directory #The script list the files into the directory put as argument DIRECTORY=$1 echo e "\n\t The files in the directory \""$DIRECTORY"\" are:\n" La Console !© par Patrick Hautrive !;~) 2010 201 for FILES in $( ls "$DIRECTORY" ); do echo e "\t $FILES" done chmod +x listing.sh ./listing.sh / 33. La minuterie vi countdown.sh #!/bin/bash #countdown.sh #The script will count down from ten second and stop COUNTER=10 echo e "\n\t This script will stop in ten seconds \n" while [[ "$COUNTER" gt 0 ]]; do echo e "\t "$COUNTER"" sleep 1 let COUNTER=COUNTER1 done chmod +x countdown.sh ./countdown.sh 34. La progression vi progressing.sh #!/bin/bash #progressing.sh #The script will count number from zero to ten seconds COUNTER=0 echo e "\n\t The script will count from 0 to 10 \n" until [[ "$COUNTER" gt 10 ]]; do echo e "\t "$COUNTER" " sleep 1 let COUNTER=COUNTER+1 done chmod +x progressing.sh ./progressing.sh 35. La substitution La Console !© par Patrick Hautrive !;~) 2010 202 vi underspace.sh #!/bin/bash #underspace.sh #The script will locate the files with a space in the name and replace the spaces with underscore DIRECTORY="." #The loop condition is controlled with the bash "read" command #The command "find" redirects its STDOUT to the STDIN of the while loop #The command "tr" truncates the files found in the local directory by substituting " " with "_" #The result of the command "tr" is piped into the "rename" command find "$DIRECTORY" type f | while read FILE; do #The POSIX class [:space:] is used to find space in the filename if [[ "$FILE" = *[[:space:]]* ]]; then #Each files are renamed and each " " is substitue with "_" caracter mv "$FILE" `echo $FILE | tr ' ' '_'` #A semi colon is put at the end of "if" structure to get back to the "while" loop fi; done chmod +x underspace.sh touch "file with space" ./underspace.sh ls file_with_space 36. Les fonctions vi function.sh #!/bin/bash #The Bash "function" command is used to declare a local function into the script function fn_echo { echo e "\n\t The function \"fn_echo\" print out that output \n" } function fn_echo_arguments { echo $* } function fn_ls { ls $1 } #The function can be called with parameters fn_echo fn_echo_arguments how many arguments are passed to the function \"fn_echo_arguments\" ? La Console !© par Patrick Hautrive !;~) 2010 203 echo e "\n\t The function \"fn_ls\" lists the files from the directory \"\$HOME\"" fn_ls $HOME fn_echo chmod +x function.sh ./function.sh 37. La sélection vi selection.sh #!/bin/bash #selection.sh #The Bash variable "PS3" is used to change the default prompt with the "select" Bash command PS3='Choose one word: ' #The Bash "select" command uses a list of words to propose in an ordered menu select WORD in "linux" "bash" "scripting" "tutorial" do echo e "\n\t The word you have selected is: $WORD" #The Bash "break" command is used to go out of the endless loop break done exit 0 chmod +x selection.sh ./selection.sh Le menu vi choices.sh #!/bin/bash #choices.sh #The script present a list of choice in a menu echo e "\n\t Welcome to the Menu " echo e "\n\t Please choose between [1, 2, 3, 4 or 5] \n " echo e "\t\t 1. Launch a terminal " echo e "\t\t 2. Get some informations about the Operating System " echo e "\t\t 3. Read the Man Pages " echo e "\t\t 4. See the logs " echo e "\t\t 5. Exit " read CHOICE; case $CHOICE in 1) echo e "\t You have chosen to launch a teminal..." sleep 1 /usr/bin/xterm& ;; La Console !© par Patrick Hautrive !;~) 2010 204 2) 3) 4) 5) echo e "\t You have chosen to get some informations about the OS:" echo e "\t The date is:\t\t `date` " echo e "\t The hostname is:\t `hostname` " echo e "\t The processor is:\t `uname mp` " echo e "\t The memory is:\t\t `cat /proc/meminfo | grep MemTotal` " echo e "\t The system is:\t\t `uname o` " echo e "\t The kernel is:\t\t `uname r`" echo e "\t The `lsb_release a | grep Description` " echo e "\t The system is up since:`uptime` " echo e "\t The disk usage is:\t `du sh $HOME` " echo e "\t You are logged in as:\t `id` " ;; echo e "\t You have chosen to read the Man Pages... " /bin/bash c 'xterm e man man' ;; echo e "\t You have chosen to see the logs" /bin/dmesg | less ;; echo e "\t You have chosen to Exit...bye..." exit ;; esac chmod +x choices.sh ./choices.sh La Console !© par Patrick Hautrive !;~) 2010 205 TOOLS Inventaire « inhexaustif » des principales commandes (man man) Init: init telinit runlevel Info: man info xman help Window: xinit startx X gdm Environnement: env set inetd2xinetd msginit mkinitrd mandb manpath catman xdm kdeinit xev xload unset printenv export reset typeset declare Host: uname uptime hostname updatedb apropos makewhatis xosview whois whatis whereis locate Devices: lsusb lspci hotplug Control: Ctrl+C Ctrl+D dmesg arch hostid slocate MAKEDEV mknod Ctrl+L Ctrl+Z Ctrl+U Times: clock hwclock date Tools: find grep egrep fgrep Partition: sync fsck e2fsck Ctrl+S+Q Ctrl+At+F1 ntpdate times cal tzconfig Ctrl+At+F7 tzfile tzselect tzsetup zdump sort uniq wc diff comp patch mount umount mountpoint awk sed tr cut col expand Ctrl+Backspace zic mkfs mke2fs mkreiserfs Ctrl+Alt+Del Login: login sulogin last lastb unexpand pr troff nroff groff reiserfsck debugreiserfs Shift+Ctrl+Tab Format: hexdump hd od tune2fs debugfs dump2fs lastlog logger getty agetty codepage recode badblocks fdisk cfdisk sfdisk Terminal: tty stty openvt mingetty wall fdformat hdparm rdev df du screen tic setterm tset resize Archives: gzip gunzip tar Shell: sh bash chsh wish dd ddrescue testdisk e2label chvt md5sum chksum gpg ar Users: w who logname id chfn e2image resize2fs sum Console: xterm uxterm kvt cdrecord users finger whoami useradd Memory: free mkswap rxvt gnometerminal Programs: make gcc userdel usermod false nologin swapon swapoff vmstat konsole fgconsole xconsole Groups: groupadd groupdel Network: ifconfig route host Process: ps pstree top jobs bg Keys: locale localegen groupmod chgrp newgrp sg netstat ping iptables tcpdump localedef loadkeys nmblookup nslookup nc netcat fg tee kill killall skill nice Shadowing: shadowconfig nmap tripwire exports losetup renice time pidof pkill pgrep dumpkeys showkey install pwck pwconv pwunconv keymap setkeycodes Remote: ssh scp rsync mail Kernel: strace bootparam grpck grpconv grpunconv getkeycodes setxkbmap ftp wget telnet rlogin rsh rcp ltrace updatepasswd setmetamode xmodmap Journal: klogd syslogd rwho rdist kermit Vmware tip Commands: history alias charmap showrgb dircolors procomm minicom rpcinfo Modules: lsmod depmod unalias script nohup & watch Fonts: xfsinfo Services: chkconfig sysctl modprobe modinfo update Permissions: passwd gpasswd Counting: bc calc number ntsysv service tcpdchk modules ldd vipw vigr chage visudo random morse sc tcpdmatch Packages: rpm urpmi yum sudoedit su sudo aptget aptcache aptadd dpkg Images: eog Root: ls pwd ln lndir unlink Configuration: linuxconf Internet: lynx w3c wget alien apt4rpm rpmdrake readlink type file mc cd mv drakconf yast2 lisa setup Games: xeyes fortune pom redhatconfig controlpanel up2date cp rm mkdir rmdir chroot swat webmin gnomesystem Scripts: echo expr read sleep codebreaker corewars ulimit umask rename monitor exec wait write exit continue Logout: exit logout halt basename dirname pathchk Hardware: kbdrate setleds break clear type toe xargs reboot shutdown reset Files: file stat lsof fuser lsattr sndconfig mouseconfig alsa poweroff Printing: cups lp lpd chattr attr chown chmod crypt sane scsi_info eject hotplug Screensaver: munch Backup: dump restore cryptdir shred filefrag touch discover recover newer Cron: cron crontab batch at mismunch Editing: less more cat zcat tac Loader: lilo grub atq atrm vi pico nano emacs gedit tail Floppy: mkboot mkbootdisk head split strings xpdf gv gs superformat mformat La Console !© par Patrick Hautrive !;~) 2010 206 FILES Inventaire « inhexaustif » des principaux fichiers de configuration Man /etc/man.conf /etc/manpath.config /usr/man/ /usr/local/man/ /usr/share/man/ /usr/share/mandb/chconfig /var/cache/man/index.db Documentation /usr/doc/ /usr/share/doc/ /usr/src/linux/ Log /var/log/message /var/log/sulog /var/log/boot.msg Suze /var/log/boot.log RedHat /var/log/dmesg Debian /var/log/installer/messages /tmp/install.log /root/anaconda.ks.cfg /proc/kmsg /var/log/wtmp (last) /var/log/secure (login) /var/log/lastlog (lastlog) /var/log/sulog (sulog) /var/log/dmesg (dmesg) /var/log/utmp (who) /var/log/btmp (lastb) Locale /etc/environment /etc/locale.alias /etc/locale.gen /etc/gdm/locale.conf /etc/profile.d/lang.sh /etc/localtime /etc/alternatives /etc/magic /etc/timezone Init /etc/inittab /etc/init.d/rc /etc/initlog.conf /etc/rc.d/rc.sysinit /etc/rc.d/rc.local /etc/default/rcS /etc/syslog.conf /etc/sysctl /etc/sysctl.conf /etc/inetd.conf /etc/rc.config /etc/rc.d/rc.inet1 /etc/rc.d/rc.inet2 /etc/rc.d/xinetd.conf /dev/initrd /etc/mkinitrd.conf Pam /etc/pam.d/login /etc/security/pam_env.conf /etc/security/group.conf /etc/security/time.conf /etc/security/access.conf /etc/security/limits.conf Window /etc/X11/xinit /etc/X11/xinit/xinitrc /etc/X11/xdm/xdm.config /usr/lib/X11/xinit/.Xinitrc /usr/X11R6/lib/X11/xinit /etc/X11/xdm/xdm.config Modules /etc/modules.conf Floppy /images/boot.img /images/bootnet.img /images/rescue.img Partition /etc/fstab /etc/mtab Terminal /etc/securetty /etc/usertty /etc/terminfo /etc/termcap /etc/gettydefs /etc/ttytab Device /dev/null /dev/zero /dev/random /dev/console /dev/error Variables PS1 PS2 PS3 BASH_ENV PATH SHELL LOGNAME MANPATH TERM TERMCAP LS_COLOR Network /etc/services /etc/protocols /etc/exports /etc/hosts /etc/host.allow /etc/host.deny /etc/host.equiv /root/.rhosts /etc/ftpusers /etc/dialups /etc/dpasswd /etc/rpc /etc/portmap man hosts_access Boot Howto Boot Prompt /etc/crontab Halt /etc/shutdown.allow /etc/powerstatus La Console !© par Patrick Hautrive !;~) 2010 207 Password /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/netgroup /etc/login.defs /etc/nologin /etc/login.access /etc/porttime /etc/environment /etc/limits /etc/pam.d/login /etc/security/* Login /etc/issue /etc/motd /boot/bootmsg.txt /etc/profile /etc/bash.bashrc Shell /etc/shells /etc/bash_completion /bin/bash /bin/false /bin/nologin User /etc/skel /etc/aliases /etc/sudoers Profile ~/.login ~/.bash_profile ~/.bash_login ~/.bash_history ~/.profile ~/.bashrc ~/.Xsession ~/.Xdefaults ~/.Xinitrc ~/.signature ~/.rhosts ~/.bash_logout CARACTERS Les caractères spéciaux – ASCII AZERTY Fonction Le séparateur interne (IFS) L'indentation Le joker caractère Le joker (multiplication) Les commentaires La séparation de valeurs L'intervalle de valeur La substitution de commande La redirection L'échappement caractère Le séparateur de répertoire Le lancement en sous shell Le lancement en un bloc shell Le regroupement d'expression La protection à l'évaluation La protection à l'expansion La succession de commandes Le lancement en background L'opérateur logique (AND) L'opérateur logique (OR) L'opérateur logique (NOT) Le lien répertoire parent Le lien répertoire courant Le répertoire personnel Le séparateur Le préfixe des jobs La dernière commande La redirection vers la droite La redirection vers la gauche La concaténation Les séquences de contrôle L'expansion de variables L'attribution des droits L'identification d'un compte Octal Char French La barre d'espace La touche de tabulation ? Le point d'interrogation * L'étoile # Le dièse , La virgule Le tiret ` L'apostrophe inversé | La barre verticale \ La barre oblique gauche / La barre oblique droite ( La parenthèse ouvrante ) La parenthèse fermante { L'accolade ouvrante } L'accolade fermante [ Le crochet ouvrant ] Le crochet fermant “” Le guillemet ' L' apostrophe ; Le point virgule & L'esperluette && La double esperluette || La double barre ! Le point d'exclamation .. Deux points successifs . Le point ~ Le tilde : Le double point % Le pourcentage %% Le duble pourcentage > Le signe supérieur < Le signe inférieur >> Le double supérieur ^ La touche contrôle $ Le signe du dollars + Le signe plus @ arrowbase English space bar tabulation question mark star, asterisk diaresis, hash comma hyphen, dash back quote pipe back slash slash opening parenthesis closing parenthesis curly bracket left curly bracket right square bracket left square bracket right double quote simple quote semicolon ampersand double ampersand double pipe exclamation mark double dot, dot dot full stop, period tilde colon percentage double percentage right angle bracket left angle bracket concatenation circumflex dollar plus sign at sign La Console !© par Patrick Hautrive !;~) 2010 208 Clavier Exemple SPACE TAB Altgr+3 Altgr+7 Altgr+6 Altgr+8 ls h?l? cp * . #! /bin/bash ls [a,c]* ls [az]* cmd `cmd` ls | less echo \ rm rf / Altgr+5 Altgr+° alias ll=”ls l” cmd ; cmd cmd & ls && cd ls || cd !cmd cd .. ./configure Altgr+2 Maj+< /etc/passwd fg %NUM kill %% >file cat >> file CTRL+^ echo $HOME chmod u+x Altgr+0 ssh user@host DEFINITIONS MAIL_DIR MAIL_FILE FAIL_DELAY /var/mail .mail 3 #Définition obligatoire de la variable $MAIL #Fichier contenant les mail de l'utilisateur #Nombre de seconde d'attente après échec de la connexion FAILLOG_ENAB yes #Acceptation des échecs et log dans “/var/log/faillog” LOG_UNKFAIL_ENAB no #Acceptation des échec avec login inconnus (unknown) LOG_OK_LOGINS no #Enregistrement dans les journaux des connexions réussies QUOTAS_ENAB yes #Acceptation des quotas (umask, ulimit, nice) (Gecos) SYSLOG_SU_ENAB yes #Log avec syslog de la commande “su” SYSLOG_SG_ENAB yes #Log avec syslog des commandes “newgrp” et “sg” SULOG_FILE TTYTYPE_FILE /var/log/sulog /etc/tty FTMP_FILE /var/log/btmp SU_NAME su HUSHLOGIN_FILE NOLOGIN_STR .hushlogin nologin ENV_TZ /etc/timezone ENV_HZ HZ=100 ENV_SUPATH #Log de la commande “su” #Type de terminal #Log des échecs de connexion “lastb” #Affichage du “su” pour la commande “ps” #Acceptation du hush mode #Refus de connexion #Définition de la variable d'environnement TZ #Définition de la variable HZ PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/X11:/usr/local/sbin:/usr/local/bin ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games TTYGROUP tty #Le groupe propriétaire pour le périphérique terminal TTYPERM 0 #Les permissions attribuées au périphérique terminal ERASECHAR 177 #Caractère d'effacement (backslash) pour system V KILLCHAR 25 #Caractère de suppression de ligne (Ctrl+U) pour system V UMASK 22 #Définition du masque par défaut de création des fichiers ULIMIT 0 #Les limites (file, size, process, user, cpu, memory) PASS_MAX_DAYS 99999 #Nombre maximal de jours valide pour un mot de passe PASS_MIN_DAYS 0 #Nombre minimal de jour entre deux changements PASS_WARN_AGE 7 #Nombre de jour d'alerte avant l'expiration UID_MIN 1000 #Numéro d'ordre minimal pour l'attribution des UID UID_MAX 60000 #Numéro d'ordre maximal pour l'attribution des UID GID_MIN 100 #Numéro d'ordre maximal pour l'attribution des GID GID_MAX 60000 #Numéro d'ordre maximal pour l'attribution des GID LOGIN_RETRIES 5 #Nombre maximal de tentative de connexion LOGIN_TIMEOUT 60 #Nombre maximal de seconde pour se connecter 8 #Nombre de caractères pour le cryptage du mot de passe PASS_MAX_LEN CHFN_AUTH yes #Mot de passe pour les commandes “chfn” et chsh” CHFN_RESTRICT rwh #Champ de “chfn” (full name, room#, work#, home#) LOGIN_STRING DEFAULT_HOME USERDEL_CMD NO_PASSWORD_CONSOLE GETPASS_ASTERISKS USERGROUPS_ENAB FAKE_SHELL CLOSE_SESSIONS %s's password: yes /usr/sbin/userdel_local tty1:tty2:tty3:tty4:tty5:tty6 #Prompt pour la demande de mot de passe #Acceptation des connexions sans cd $HOME #Commande automatique après “userdel” #Login sans mot de passe 1 #Nombre d'astérix affiché à la place des caractères saisies yes #Acceptation de umask UID pour les GID égaux aux UID /bin/fakeshell no #Lancement d'un script avant le lancement du shell #Acceptation de pam_close_session() de pam_unix.so Obsolètes: DIALUPS_CHECK_ENAB ENVIRON_FILE NOLOGINS_FILE LASTLOG_ENAB MOTD_FILE MAIL_CHECK_ENAB OBSCURE_CHECKS_ENAB PASS_MIN_LEN PORTTIME_CHECKS_ENAB PASS_CHANGE_TRIES PASS_ALWAYS_WARN MD5_CRYPT_ENAB ISSUE_FILE SU_WHEEL_ONLY CRACKLIB_DICTPATH CONSOLE_GROUPS La Console !© par Patrick Hautrive !;~) 2010 209 FORMULES La formulation d'une commande : cmd arg option source target Commands cmd cmd ; cmd cmd | cmd cmd `cmd` cmd $(cmd) cmd & cmd && cmd cmd || cmd cmd; \\n cmd nohup cmd type cmd echo “text” echo '$VAR' echo \$HOME echo '`cmd`' echo e “\120” batch (Ctrl+D) at now (Ctrl+D) crontab cmd | tee > cmd !! !num /usr/bin/cmd Fonction Validation (enter) Traitement séquentiel (train) Redirection (pipe) Substitution en sous shell Substitution POSIX Background (jobs) Conditionnement Vrai (AND) Conditionnement Faux (OR) Échappement Eol (Escape) Détachement du terminal (tty) Évaluation de la syntaxe (test) Protection littérale (sauf `,\,$) Annulation de toute expansion Échappement d'un caractère Protection de l'évaluation Évaluation Escape Sequence Execution séquentielle (FIFO) Execution programmée (atd) Execution régulière (crond) Execution et duplication (fork) Execution last command Execution from history Chemin absolu (Absolut Path) Commands Fonvtion (cmd ; cmd) {cmd ; cmd} cmd > file.txt cmd >> file.txt cmd < file.txt cmd 2> error.txt cmd 1&2> ouput.txt !cmd alias cmd=”cmd option” unalias cmd time cmd su root c “cmd” sh c cmd ssh v user@host cmd ln s /bin/bash ~/myshell echo $? batch < script.txt source script.sh . script.sh ./script.sh declare_function bash c cmd Sous shell (fils distincts) Bloc (un seul processus) Écrasement Concaténation Passage de paramètres Déviation STDERR Déviation des sorties Inversion du code retour Définition d'un alias Suppression d'un alias Minutage de l'exécution Lancement en root Lancement en sous shell Lancement à distance Lien symbolique (link) Dernier code retour Execution d'un script Execution shell Bash Execution shell Bash Execution sub shell Bash Execution d'une fonction La Console !© par Patrick Hautrive !;~) 2010 210 Patrick Hautrive 2010 http://hautrive.free.fr La Console !© par Patrick Hautrive !;~) 2010 211