05.03.2014 Views

Chapitre 1 - IPNL - IN2P3

Chapitre 1 - IPNL - IN2P3

Chapitre 1 - IPNL - IN2P3

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Initiation linux<br />

juin 2010<br />

M. Mommey & Y. Giraud Institut de Physique Nucléaire de Lyon<br />

- 1 -


<strong>Chapitre</strong> 1 : Historique, concepts et préliminaires<br />

Historique<br />

UNIX est né en 1969 dans les laboratoires de la BELL, développé par Ken Thompson<br />

pour les besoins internes tant des programmeurs que du service des brevets. Il s’appelle<br />

alors UNICS.<br />

UNIX avait à l'origine un but non commercial et se voulait très généraliste.<br />

En 1973 D. Ritchie réécrit complètement UNIX en langage C, C étant considéré<br />

facilement portable et donc « machine indépendant », rendant ainsi UNIX facilement<br />

portable sur de multiples plateformes.<br />

Cette portabilité a été une des raisons de la diffusion d'UNIX.<br />

Pendant toutes les années 70 les fondateurs d’UNIX améliorent en profondeur leur<br />

système, au sein des laboratoires BELL.<br />

Mais ATT, propriétaire de BELL, ne misait pas alors sur la commercialisation d’UNIX et en<br />

a délivré des licences à des universités.<br />

Celles-ci ont travaillé sur une amélioration du système et de nombreux ajouts ont été<br />

apportés. A la fin des années 70 une version nouvelle émerge portant le nom de<br />

l'université l'ayant conçue : BSD (Berkeley System Development).<br />

D'autre part le département de la défense américain a bâti sur UNIX le protocole réseau<br />

TCP/IP et des constructeurs informatiques ont dès le début des années 80 apporté des<br />

compléments tels que SUN avec NFS et NIS. Ces ajouts sont rapidement devenus des<br />

standards de fait enrichissant UNIX.<br />

Enfin citons au milieu des années 80 l’apparition du système XWINDOW d’interface<br />

graphique pour stations UNIX, développé par le MIT.<br />

Au début de ces années 80 ATT commence à trouver intéressant la commercialisation<br />

d'UNIX, protège son système d'exploitation, et diffuse une version appelée SYSTEM V.<br />

Le nom UNIX étant protégé, chaque UNIX livré par les constructeurs de matériel porte un<br />

nom spécifique : HP-UX, IRIX, ULTRIX, AIX, SUNOS puis SOLARIS...<br />

Les années 80 sont celles de la non unicité d’UNIX, certains systèmes se réclamant de<br />

BSD et d’autres de SYSTEM V, avec des différences importantes. Heureusement cette<br />

situation est révolue et les commandes sont unifiées. Les acteurs du monde UNIX ont<br />

compris que la division favorisait des systèmes concurrents tel WINDOWS et ont multiplié<br />

les consortiums et projets d’unification (OSF, CDE…).<br />

La situation a encore évoluée en 1994-1995, ATT ayant vendu UNIX à NOVELL qui a luimême<br />

cédé au groupe d'utilisateurs X-OPEN le label UNIX, les sources étant propriété de<br />

SCO. Le but du consortium X-OPEN étant la définition et la promotion des systèmes<br />

ouverts, le label UNIX peut maintenant être obtenu par tout système d'exploitation<br />

respectant totalement les standards des systèmes ouverts.<br />

En 1991 Linus Torvalds écrit de A à Z un clone d’UNIX, pour l’architecture X86. Il le<br />

nomme LINUX. LINUX est compatible avec SYSTEM V et BSD, et implémente toutes les<br />

fonctionnalités d’UNIX. LINUX a été immédiatement licencié sous forme licence GPL, ce<br />

- 2 -


qui a permis qu’une communauté de développement se crée rapidement. Il est distribué<br />

gratuitement. Une communauté toujours très active continue à travailler sur LINUX, et de<br />

nombreux projets logiciels sont en cours ou achevés. Le travail fait autour de LINUX<br />

dépasse probablement ce qui a été fait sur UNIX, avec notamment le développement de<br />

logiciels orientés « grand public », ce qui n’existait pas sous UNIX.<br />

Plusieurs distributions de LINUX ont vu le jour mais elles se différencient essentiellement<br />

par les outils d’administration et les paquets supplémentaires.<br />

On peut considérer que pour un utilisateur toutes les distributions de LINUX et toutes les<br />

versions UNIX ont des comportements quasi-similaires en ce qui concerne les<br />

commandes de bases, et nous parlerons indifféremment des 2 dans ce stage.<br />

De ce cheminement chaotique, UNIX/LINUX sort avec l'avantage d’un système d’une très<br />

grande richesse ; UNIX et LINUX sont de véritables boites à outils : des centaines<br />

d'utilitaires (commandes) sont disponibles.<br />

Concepts<br />

Techniquement, UNIX est un système multi-tâches, multi-utilisateurs, avec gestion de<br />

mémoire virtuelle, travaillant sur un système de fichiers hiérarchisé et qui, pour l'utilisateur<br />

débutant, se caractérise par :<br />

• La prépondérance de la notion de fichier, les périphériques étant par exemple vus<br />

par l'utilisateur comme des fichiers.<br />

• De même chaque commande UNIX correspond à un fichier exécutable<br />

indépendant. Ce concept permet une vue totale du système, une personnalisation<br />

facile. L'accès aux ressources de la machine est simplifié avec une gestion aisée des<br />

entrées-sorties.<br />

• L'importance de la notion de processus. Toute action génère en machine la création<br />

d'un processus parfaitement identifiable. UNIX offre un mécanisme de communication<br />

et d'héritage entre tous ces processus.<br />

• La banalisation de l'interpréteur de commande, interface entre l'utilisateur et le<br />

système et qui contrôle le déroulement de la session. Cet interpréteur de commandes,<br />

qui est appelé shell sous UNIX, est un fichier exécutable standard et il en existe de<br />

multiples versions. Ce shell est facilement paramétrable et offre de nombreuses<br />

fonctions. Il occupera une part importante de notre programme.<br />

Le shell<br />

L’interpréteur de commande vous permet de lancer les commandes UNIX. Il vous fournit<br />

l’invite vous permettant de rentrer la syntaxe de votre commande, analyse votre syntaxe<br />

et fait appel à la commande UNIX spécifiée.<br />

Il gère votre session et vous permet notamment :<br />

• la gestion des entrées-sorties<br />

• la définition de variables<br />

• un mécanisme de rappel des commandes précédentes<br />

• la création de synonymes<br />

• la gestion de caractères de substitution<br />

Le shell, outre l'interprétation des commandes système passées, fournit des commandes<br />

internes dites 'built-in commands'.<br />

- 3 -


Ces apports spécifiques liés au shell ont pour objet de simplifier la session UNIX et<br />

également font du shell un langage de commande permettant l'écriture de procédures<br />

complexes.<br />

Ces 'built-in commands' permettent notamment des structures conditionnelles et de<br />

répétition.<br />

Il est possible de créer un fichier contenant une liste d'instructions shell. Une telle<br />

procédure de commande est appelée SCRIPT sous UNIX.<br />

Le shell n'étant qu'un exécutable ordinaire il est aisé d'en rajouter un nouveau à un<br />

système UNIX. Ces shells vont différer par leurs fonctions internes, par exemple le<br />

mécanisme d'historique des commandes ou les fonctions de programmation élaborées.<br />

Il en découle une non unicité du déroulement de votre session UNIX en fonction du choix<br />

de votre interpréteur de commande.<br />

Le shell historique est celui de S. Bourne appelé le Bourne-shell (sh). Se sont rajoutés<br />

deux shells importants le C-shell (csh) offrant un langage de programmation proche du C<br />

et le Korn-shell (ksh) du nom de son créateur, plus de nombreux shell plus ou moins<br />

marginaux et disponibles dans le domaine public. csh et ksh ne sont pas compatibles<br />

entre eux. On classe les shells supplémentaires selon qu'il sont de la famille des C-shell<br />

ou des k-shell. Citons notamment tcsh qui est un csh amélioré et bash dans la lignée de<br />

ksh. bash est le shell utilisé par défaut sous LINUX.<br />

Un shell est lancé automatiquement au login. Chaque utilisateur pourra donc choisir le<br />

shell qu'il souhaite utiliser par défaut dès le début de sa session, sachant qu'à tout<br />

moment il peut appeler un nouveau shell.<br />

Préliminaires<br />

Système d'exploitation<br />

Comme nous l'avons indiqué au chapitre précédent, UNIX et LINUX ne sont pas uniques<br />

mais les différences sont très mineures d’un point de vue d’un utilisateur. Nous utiliserons<br />

pour ce stage des systèmes LINUX en version Scientific Linux 5.<br />

Shell<br />

Pour l'utilisateur UNIX, la différence majeure vient du choix de l'interpréteur de<br />

commandes (shell). Les chapitres sur l'environnement de travail et l'écriture de scripts en<br />

dépendent fortement. Comme nous avons choisi d’utiliser LINUX nous ferons le choix de<br />

bash, qui est le choix par défaut.<br />

Poste de travail<br />

Pour être le plus général possible, nous considèrerons au maximum un poste de travail de<br />

type terminal simple, sans utiliser les fonctionnalités complètes de l'environnement des<br />

postes graphiques utilisés. Nous n’aborderons les interfaces graphiques de LINUX qu’en<br />

fin de stage. Les concepts d'Xwindows seront également abordés.<br />

- 4 -


<strong>Chapitre</strong> 2 : La prise de session<br />

L'utilisateur<br />

UNIX étant multi-utilisateurs chaque utilisateur doit être identifié par un nom bien défini<br />

sous lequel il sera connu sur la machine (nom de login), et auquel est associé un mot de<br />

passe non public assurant que seul cet utilisateur puisse utiliser le compte qui lui est<br />

attribué.<br />

Chaque utilisateur fait donc l'objet d'un enregistrement préalable dans un fichier base de<br />

données utilisateurs (fichier /etc/passwd) maintenu par un responsable du système.<br />

Celui-ci utilise un compte privilégié nommé root, seul login à pouvoir modifier les fichiers<br />

systèmes.<br />

De façon standard les noms d'utilisateurs comporte 8 caractères au maximum et les mots<br />

de passe ont une longueur minimale de 6. Mais ces longueurs peuvent être différentes et<br />

propres à chaque 'UNIX constructeur'.<br />

Sont associés à chaque utilisateur et inscrit dans le fichier /etc/passwd, outre un nom de<br />

login et un mot de passe :<br />

• un numéro UID qui est un identificateur unique de l'utilisateur.<br />

• un numéro GID qui est un identificateur commun à un groupe d'utilisateurs ayant<br />

des intérêts à partager des ressources (fichiers notamment). A ce gid correspondra<br />

(dans un fichier /etc/group) un nom symbolique de groupe au même titre qu'à l'uid<br />

correspond un nom de login.<br />

• le vrai nom de l'utilisateur.<br />

• une zone logique (ou répertoire) du système de fichiers dans lequel seront par<br />

défaut stockés les fichiers qui lui appartiendront.<br />

• l'application qui sera lancée lorsque l'utilisateur se connectera. Celle-ci est de façon<br />

générale un shell et on définit donc ici le shell par défaut que souhaite utiliser la<br />

personne.<br />

• éventuellement si le mécanisme de péremption du mot de passe est actif,<br />

figureront les dates associées à celui-ci<br />

Les uid et gid sont les vrais identificateurs de l'utilisateur et servent au mécanisme de<br />

protection des fichiers.<br />

Signalons qu'un utilisateur peut être connu de façon unique sur un ensemble de machine<br />

en réseau si le mécanisme de NIS (Network Information Service) est mis en oeuvre. Ce<br />

mécanisme exporte à partir d'une machine maître des bases de données du système, et<br />

notamment passwd et group, vers les autres machines (dites esclaves) du réseau.<br />

La connexion<br />

Le mécanisme de connexion est différent dans sa forme selon que l’on se connecte sur<br />

une session graphique ou bien en ligne de command depuis une connexion distante. Mais<br />

dans tous les cas le système envoie à l'utilisateur une bannière spécifiant en général le<br />

système d'exploitation, le nom affecté à la machine, et le terme login invitant à rentrer son<br />

nom d’utilisateur puis passwd pour le mot de passe.<br />

- 5 -


Signalons qu'UNIX est case-sensitive (sensible aux minuscules/majuscules) et<br />

notamment pour le mot de passe. Une vieille compatibilité admet que pour le nom<br />

d'utilisateur, si les majuscules sont utilisées, le terminal ne possède que celles-ci et donc<br />

tout le reste de la session se déroulera en majuscules, ce qui peut être relativement<br />

gênant.<br />

Si la validation du login est correcte, le shell par défaut est lancé et les fichiers<br />

d'initialisation généraux et de l’utilisateur sont interprétés. Le nom de ces fichiers est<br />

dépendant du shell. Les fichiers permettant une personnalisation de sa session sont<br />

situés dans le répertoire de base de l'utilisateur (home directory) et s'appellent par<br />

exemple .bashrc pour bash, .cshrc et .login pour csh.<br />

Le shell vous fournit alors le « prompt » ($ pour bash, % pour csh), vous invitant à taper<br />

vos commandes.<br />

A votre shell interactif est associé un pseudo-terminal (appelé tty sous UNIX). Un nombre<br />

donné de pseudo-terminaux est disponible et chaque shell lancé sur le système est<br />

associé au premier pseudo-terminal libre dans la liste. Quand le shell se termine il libère<br />

son pseudo-terminal.<br />

Sous LINUX ces terminaux sont notés pts/nn ou nn est le numéro du terminal.<br />

Sous UNIX tous les processus tournant en machine sont numérotés de façon unique (pid)<br />

et sont « fils » du processus qui les a généré. Le premier processus lancé au boot de la<br />

machine a pour nom init et porte le pid 1.<br />

Le shell lancé lors de votre connexion sera donc le père de tous les processus<br />

(commandes) exécutés pendant votre session. Les processus fils héritent d’information de<br />

leur processus père. Les processus lancés pendant votre session hériteront notamment<br />

des fichiers ouverts et des variables dites « d’environnement » définies dans le shell<br />

initial. Celui-ci ouvre notamment l'entrée standard (stdin) , la sortie standard (stdout), la<br />

sortie-erreur standard (stderr).<br />

La première est de façon générale le clavier, les 2 sorties sont le pseudo-terminal associé<br />

à votre shell.<br />

Les commandes que vous passerez lors de votre session afficheront donc par défaut sur<br />

ce pseudo-terminal.<br />

Une fois connecté, l'utilisateur peut modifier son mot de passe, et cette action est<br />

recommandée de façon régulière lorsqu'un mécanisme obligatoire ne l'impose pas. La<br />

commande passwd permet ce changement : elle demande le mot de passe en cours pour<br />

validation de la personne et demande 2 fois le nouveau afin d'éviter les erreurs de frappe.<br />

Les mots de passe sont bien sur tapés en aveugle pour éviter des regards indiscrets.<br />

Tous les systèmes récents et notamment LINUX exigent que votre mot de passe est un<br />

minimum d’en général 6 caractères et qu’on n’identifie pas des chaînes de caractères<br />

correspondant à des mots de dictionnaires. Inutile donc d’essayer des prénoms simples<br />

ou des séquences triviales. Pour compliquer, mixez des majuscules, minuscules, chiffres<br />

ou caractères spéciaux.<br />

Enfin si le mécanisme de NIS est mis en œuvre ce n’est pas passwd que vous devez<br />

utiliser mais yppasswd. Le fonctionnement est le même. Mais la modification de votre mot<br />

de passe se propagera sur tout le parc de machines LINUX.<br />

En cours de connexion l’utilisateur peut « devenir » un autre utilisateur par la commande<br />

su :<br />

- 6 -


su<br />

su [user] : basculer en l’utilisateur user ; le mot de passe de user sera bien sur demandé.<br />

Quand on termine la session user, on revient dans sa session initiale. Si user est omis<br />

c’est que l’on souhaite basculer vers l’utilisateur root.<br />

La déconnexion d’une session terminal sera obtenue en tapant CTRL-D ou logout ou exit.<br />

Les 3 mécanismes ne sont pas identiques, exit terminant une session shell, CTRL-D<br />

fermant l’entrée standard ce qui pour un shell en phase d’attente (prompt) provoque sa<br />

fin ; enfin logout est géré par certains shells comme un ordre de déconnexion avec<br />

éventuellement exécution d’un fichier de sortie.<br />

- 7 -


<strong>Chapitre</strong> 3 : Syntaxe générale d'une commande<br />

Format<br />

Une commande UNIX revient à taper le nom d'un exécutable qui est cherché dans un des<br />

répertoires du système de fichiers figurant dans une liste de recherche que le shell<br />

maintient dans une variable d'environnement nommée PATH.<br />

Les commandes admettent des arguments, passés après le nom de commande, et<br />

séparés entre eux par des blancs ou tout caractère qui aurait été défini comme<br />

séparateur.<br />

Une commande admet comme argument des options qui sont des modificateurs (ou<br />

choix) vis-à-vis de l'action que doit exécuter la commande. Et des paramètres qui sont les<br />

objets sur lesquels portent la commande.<br />

Les arguments sont traités comme des options s'ils commencent par - ou comme des<br />

paramètres sinon.<br />

Ne pas oublier qu'UNIX est « case-sensitive ».<br />

Format général : commande [-options [paramètres]] [paramètres]<br />

Une option est en général une lettre, une même lettre ayant un sens souvent différent<br />

pour deux commandes différentes, ou pour une même commande selon qu'elle est<br />

majuscule ou minuscule. C'est ce dernier point qui fait souvent dire aux utilisateurs<br />

qu'UNIX n'est pas convivial.<br />

Plusieurs options peuvent être accolées derrière le -. Si pour une commande une option<br />

au moins est nécessaire le - est optionnel.<br />

Un paramètre peut s'adresser à une option ou à la commande même, sans ambiguïté car<br />

si une option nécessite un paramètre, le paramètre qui suit est celui de l'option.<br />

Il est possible de passer plusieurs commandes sur une même ligne en les séparant par<br />

un « ; ». Si lors du passage d’une commande on veut aller à la ligne suivante pour<br />

continuer la frappe, on termine la première ligne par \ qui inhibe l’action d’exécution de la<br />

touche RETURN.<br />

De façon générale une commande nécessitant un paramètre rentre en mode attente<br />

dans l'entrée standard si le paramètre n'est pas spécifié sur la ligne de commande. C’està-dire<br />

que le prompt va à la ligne suivante et attend que vous entriez les informations<br />

nécessaires ; lorsque vous les avez fournies vous terminez l’entrée par CTRL-D sur une<br />

ligne blanche.<br />

Le résultat des commandes est affiché sur la sortie standard.<br />

S’il n’est pas question dans ce stage de donner un catalogue de commandes, nous en<br />

étudierons quelques unes de base dans ce chapitre. Puis nous verrons dans chaque<br />

chapitre les commandes spécifiques.<br />

Citons tout d’abord 3 commandes qui vont nous permettre de donner des exemples sur la<br />

syntaxe et le fonctionnement des commandes. Nous en détaillerons pour chacune<br />

quelques options, loin de les recouvrir toutes.<br />

- 8 -


ls<br />

ls [-alF] [fichier]<br />

permet d'afficher la liste des fichiers contenu dans un répertoire.<br />

• -a : permet de visualiser également les fichiers cachés<br />

• -l : affiche en format long<br />

• -F : met derrière le nom de fichier un caractère indiquant le type : rien pour un<br />

fichier ordinaire, / pour un répertoire, * pour un exécutable<br />

cat<br />

cat [-n] [fichier]<br />

permet de lister le contenu d'un fichier. Si le paramètre fichier est omis stdin est pris<br />

• -n : permet d’afficher devant chaque ligne le numéro de ligne<br />

grep<br />

grep [-cin] expression [fichier]<br />

permet de rechercher une chaîne de caractères dans des fichiers ou répertoires. Si le<br />

paramètre fichier est omis stdin est pris<br />

• -c : affiche le nombre d'occurrences de l'expression<br />

• -i : ne tient pas compte du case-sensitive<br />

• -n : affiche le numéro des lignes ou apparaît l'occurrence<br />

_______________________________________________________________________<br />

exemple :<br />

$ ls<br />

test test.f titi<br />

$ ls -a<br />

. .. .init test test.f titi<br />

$ ls -l<br />

total 153<br />

-rwxr-xr-x 1 ollivier 147456 Sep 16 10:18 test<br />

-rw-r--r-- 1 ollivier 23 Sep 16 10:18 test.f<br />

-rw-r--r-- 1 ollivier 0 Sep 16 10:19 titi<br />

$ ls -alF<br />

total 157<br />

drwxr-sr-x 2 ollivier 512 Sep 16 10:20 ./<br />

drwxr-sr-x 15 ollivier 2560 Sep 21 16:28 ../<br />

-rw-r--r-- 1 ollivier 0 Sep 16 10:20 .init<br />

-rwxr-xr-x 1 ollivier 147456 Sep 16 10:18 test*<br />

-rw-r--r-- 1 ollivier 23 Sep 16 10:18 test.f<br />

-rw-r--r-- 1 ollivier 0 Sep 16 10:19 titi<br />

$ ls -l titi<br />

-rw-r--r-- 1 ollivier 0 Sep 16 10:19 titi<br />

_______________________________________________________________________<br />

- 9 -


Le shell et les commandes<br />

Le shell, par des commandes internes, offre des mécanismes de simplification pour<br />

passer des commandes. Il permet par exemple :<br />

• de rappeler et modifier une commande antérieure pour re-exécution. Les shells<br />

historiques le permettait à travers des caractères de contrôle ; Ainsi en csh le<br />

mécanisme d'history permettait le rappel de commandes à partir du caractère « ! ». La<br />

commande history liste les commandes précédentes en leur attribuant un numéro<br />

d'ordre. ! suivit d'une chaîne de caractères rappelle la dernière commande<br />

commençant par cette chaîne et ! suivit d'un nombre rappelle la commande ayant ce<br />

numéro dans la liste.<br />

Mais tous les shells récents, et c’est le cas de bash, permettent le rappel de<br />

commande par la flèche haute et la modification par les flèches droites et gauche.<br />

• de créer des synonymes (alias) de commandes, dans un but d’en raccourcir ou<br />

d’en simplifier certaines. Cette possibilité sera traitée dans le chapitre sur<br />

l'environnement de travail.<br />

• de compléter automatiquement des noms de commande en pressant la touche<br />

« TAB ».<br />

• d'utiliser des caractères de substitution dans les paramètres.Les paramètres s'ils<br />

sont des noms de fichiers peuvent être utilisés avec substitution d'une partie du nom<br />

par des métacaractères de remplacement afin de généraliser à un groupe donné de<br />

paramètres l'action de la commande.<br />

Ces métacaractères gérés par le shell sont :<br />

* remplace un groupe de caractères<br />

? remplace un caractère<br />

[...] remplace un caractère par un de ceux de la liste<br />

[.-.] remplace un caractère par un de ceux de l'intervalle<br />

______________________________________________________________________<br />

exemple :<br />

$ ls<br />

erreur liste test.f titi<br />

$ ls t*<br />

test.f titi<br />

$ ls t[a-f]*<br />

test.f<br />

______________________________________________________________________<br />

Redirections d'entrée-sortie<br />

Du fait de la banalisation des entrées-sorties le shell permet de gérer des redirections<br />

de celles-ci. Les notations utilisées sont :<br />

< redirige l’entrée<br />

> redirige la sortie<br />

>& redirige la sortie et l’erreur<br />

>> redirige en mode ajout<br />

- 10 -


Dans les redirections de sortie, si le fichier de redirection n’existe pas il est créé. S’il existe<br />

il est écrasé, sauf mode ajout, à moins qu’une variable (noclobber, voir chapitre<br />

environnement) ne l’interdise.<br />

Le shell permet également que la sortie d'une commande soit l'entrée d'une suivante :<br />

c'est la notion de tube (pipe), noté « | ».<br />

Il suffit simplement de séparer les commandes par le symbole | pour que la sortie de la<br />

première commande soit l’entrée de la seconde. On peut empiler plusieurs « pipe »<br />

successifs (cmd1 | cmd2 | cmd3 | …..). Cette notion permet en une seule ligne d'exécuter<br />

des commandes complexes et puissantes.<br />

exemple :<br />

$ ls<br />

test.f titi<br />

$ ls > liste<br />

$ ls<br />

liste test.f titi<br />

$ cat liste<br />

liste<br />

test.f<br />

titi<br />

$ ls toto<br />

toto not found<br />

$ ls toto >& erreur<br />

$ ls<br />

erreur liste test.f titi<br />

$ cat erreur<br />

toto not found<br />

$ ls tata >>& erreur<br />

$ cat erreur<br />

toto not found<br />

tata not found<br />

$ ls | grep i<br />

liste<br />

titi<br />

$ cat erreur | grep -c toto<br />

1<br />

________________________________________________________________<br />

Le manuel<br />

Comme nous l'avons signalé les commandes UNIX sont très nombreuses et en plus<br />

relativement peut mnémotechniques. Un des attrait d'UNIX est en compensation de<br />

disposer en standard de toute la documentation en ligne.<br />

Par la commande man vous pouvez obtenir à l'écran pour chaque commande le<br />

descriptif complet tel que vous l'auriez sur la documentation papier.<br />

Cette documentation est découpée en section, la section 1 concernant la description<br />

des commandes externes ; il est rarement utile de préciser la section à l'appel de man<br />

mais cela peut arriver dans le cas ou plusieurs items portent le même nom et que l’on<br />

veuille les pages d’un item spécifique.<br />

- 11 -


man fournit, outre une explication et la liste détaillée des options, des exemples, les<br />

fichiers concernés par la commande, des pré requis vis-à-vis de la commande, et surtout<br />

des commandes agissant dans le même domaine ce qui permet de trouver des<br />

commandes non connues initialement.<br />

L’affichage dans man se fait page par page selon le format de la commande more : voir<br />

paragraphe ci-dessous pour les détails.<br />

Quelques autres commandes utiles<br />

more<br />

more [-num] [-ds] [+num] fichier : affiche le fichier passé en argument page par page.<br />

more est une commande interactive qui permet d’avoir le contrôle sur le défilement du<br />

fichier, par une série de caractères de commandes.<br />

• -num : affiche des écrans de num lignes. Par défaut s’adapte à la taille de l’écran.<br />

• -d : permet d’avoir en fin de page le message « Press space to continue, q to<br />

abort »<br />

• -s : concatène en une seule plusieurs lignes blanches consécutives<br />

• +num : démarre l’affichage à la ligne num du fichier<br />

Caractères de commandes dans more :<br />

• space : avance d’une page<br />

• return : avance d’une ligne<br />

• b : revient en arrière d’une page<br />

• h : help de more<br />

• q : termine l’affichage et sort de la commande<br />

• /chaine : se positionne à la première occurrence de la chaine de caractères<br />

spécifiée<br />

• v : lance un éditeur positionné à la ligne d’affichage en cours<br />

• :f : affiche le nom de fichier et le numéro de la ligne en cours<br />

who<br />

who : indique le nom de login, le numéro de terminal, l’heure de connexion et la machine<br />

de provenance, pour tous les utilisateurs connectés sur le système.<br />

users<br />

users : indique le nom de login des utilisateurs connectés sur le système<br />

write<br />

write user [term] : permet d’envoyer un message à l’utilisateur user. Si cet utilisateur est<br />

connecté sur plusieurs sessions, le paramètre term permet de choisir sur quel numéro de<br />

terminal on envoie le message. La commande entre en mode stdin et le message est tapé<br />

ligne à ligne, en terminant par CTRL-D sur une ligne blanche. Un utilisateur peut se<br />

protéger de la réception de message par la commande mesg.<br />

date<br />

date [mmddhhmm] : Renvoie la date du système. En mode superutilisateur permet de<br />

changer la date en passant les informations en paramètre.<br />

- 12 -


exemple :<br />

$ users<br />

belmir belmir caffari caffari combroux delsart distefan dmercier<br />

donini giraud hansen jmeyer lecarpen lecarpen millet muanza muanza<br />

muanza muanza ollivier ollivier pillot rafidiso rmoustab rmoustab<br />

rmoustab rmoustab rmoustab rmoustab rmoustab root royole royole<br />

royole smadja smadja smadja smgascon smgascon smgascon smgascon<br />

smgascon smgascon soubane soubane trocme<br />

$ who | grep ollivier<br />

ollivier pts/26 Apr 22 08:40 (lyopc280.in2p3.fr)<br />

ollivier pts/38 Apr 22 08:46 (lyodhc29.in2p3.fr)<br />

$ write ollivier pts/38<br />

Salut on va boire un café<br />

Je te retrouve en bas<br />

CTRL-D<br />

$ date<br />

Thu Apr 22 08:48:04 CEST 2004<br />

$ date 04220855<br />

date: cannot set date: Operation not permitted<br />

Thu Apr 22 08:50:00 CEST 2004<br />

$<br />

- 13 -


<strong>Chapitre</strong> 4 : Le système de fichiers<br />

On entend par système de fichiers l'ensemble des fichiers disponibles sur un ordinateur,<br />

qu’ils soient locaux ou non.<br />

L'arborescence<br />

Le système de fichiers UNIX dans son ensemble est un système arborescent en arbre<br />

inverse, c'est-à-dire que la racine est considérée être de plus haut niveau. Une<br />

arborescence est une succession de zones logiques, ou répertoires, de niveau d'autant<br />

plus bas qu'ils sont éloignés de la racine.<br />

Chacun de ces répertoires est un 'tiroir' contenant des fichiers ayant une « certaine »<br />

unité. Chaque répertoire peut servir de base à un nouveau répertoire dit sous-répertoire<br />

par rapport à celui-ci. Créer un répertoire revient à définir le chemin par lequel il peut être<br />

accédé depuis la racine.<br />

Le séparateur entre les répertoires est noté « / » ; / tout seul représente le répertoire<br />

de plus haut niveau (racine).<br />

Un nom de répertoire commençant par / décrit l'accès à ce répertoire depuis la racine et<br />

est dit chemin absolu. Un nom de répertoire ne commençant pas par / est dit relatif par<br />

rapport au répertoire dans lequel on travaille.<br />

Il n'y a pas de distinction de notation entre un répertoire et un fichier ordinaire.<br />

Les fichiers sont étiquetés par le système par un numéro (inode) unique. Un répertoire<br />

n’est qu’un fichier qui contient la correspondance entre inode et le nom logique des<br />

fichiers qui lui sont attachés.<br />

Dans une session un utilisateur est toujours « positionné » sur dans un des répertoire de<br />

l'arborescence, qui est alors appelé le répertoire courant.<br />

Toutes les commandes sont relatives aux fichiers contenus dans ce répertoire courant à<br />

moins qu'il ne soit spécifié un chemin absolu pour les noms de fichiers.<br />

Il est crée un répertoire spécifique pour chaque utilisateur (home directory) qui contiendra<br />

ses propres fichiers et dans lequel il sera positionné par défaut après le login.<br />

Des notations spécifiques repèrent certains répertoires :<br />

Le répertoire courant est noté « . »<br />

Le répertoire père du répertoire courant est noté « .. »<br />

Le home directory est noté « ~ »<br />

La figure suivante montre de façon très schématique les principaux répertoires de<br />

l'arborescence LINUX et un exemple de quelques répertoires utilisateurs :<br />

- 14 -


Le partitionnement<br />

Un même disque peut être partitionné (découpé) en zone physique distinctes (un nombre<br />

donné de cylindres) afin de séparer des parties de l'arborescence ayant des usages<br />

Spécifiques ; trois partitions peuvent par exemple être créées : l'une pour /, une autre pour<br />

le répertoire contenant les utilitaires LINUX (/usr et au-dessous), et une troisième pour les<br />

fichiers utilisateurs (/home et au-dessous). La première contiendra donc tout sauf ce qui<br />

est sous /usr et sous /home. Il n'y a ainsi pas recouvrement au niveau capacité entre ces<br />

parties de l'arborescence, la place réservée à chaque branche étant bien définie et figée.<br />

Les répertoires sont attachés sur les zones disques qui leur on été destinées : on parle de<br />

montage. Si l'on dispose de plusieurs disques une même arborescence peut être répartie<br />

sur ceux-ci. On peut également par NFS (Network File System) avoir une arborescence<br />

étendue de façon transparente sur les disques de plusieurs machines en réseau.<br />

La commande df donne une vue de la façon dont est découpée le système de fichier et<br />

pour chaque partition donne le nombre de kilo-octets restant disponibles.<br />

Commandes concernant le système de fichiers<br />

Lorsque ces commandes utilisent des noms de répertoires en paramètre ils peuvent être<br />

spécifiés soit en absolu soit en relatif.<br />

cd<br />

cd [répertoire] : positionne sur le répertoire en paramètre, qui devient le répertoire courant.<br />

S'il est omis, cd positionne sur le home directory<br />

pwd<br />

pwd : affiche le répertoire courant, en absolu<br />

- 15 -


mkdir<br />

mkdir répertoire : crée le répertoire passé en argument<br />

rmdir<br />

rmdir répertoire : efface le répertoire en argument dans la mesure ou celui-ci est vide de<br />

tout fichier<br />

du<br />

du [-as] [répertoire] : donne le nombre de k-octets occupés par les fichiers d'un répertoire,<br />

ainsi que pour chacun de ses sous-répertoires<br />

• -a donne également la place occupée par chaque fichier<br />

• -s ne donne que le total pour l'ensemble de l'arborescence située sous le répertoire<br />

- 16 -


<strong>Chapitre</strong> 5 : Les fichiers<br />

Leur nom<br />

Un nom de fichier peut comporter 256 caractères. Il faut exclure les caractères qui ont un<br />

sens pour le shell et seraient donc interprétés ; exclure donc : $ { } [ ] | / \ < > * ? & !<br />

Les noms de fichiers ne comportent ni extension ni numéro de version.<br />

Les fichiers dont le nom commence par « . » sont dits fichiers cachés ou silencieux. Ils ne<br />

sont pas visibles automatiquement par la commande ls mais en le spécifiant par ls -a.<br />

Ce sont en fait par habitude des fichiers d'initialisation lus par des utilitaires et qui n'ont<br />

pas à être visibles systématiquement.<br />

Il existe un certains nombres d'habitudes voire obligation dans les noms de fichiers, tel<br />

que mettre .f à la fin du nom d'une source fortran. Le compilateur fortran n'accepte pas de<br />

traiter un fichier de nom ne terminant pas par .f.<br />

Le mode des fichiers<br />

Le mode d'un fichier est un champ de 10 caractères décomposé en un premier caractère<br />

appelé type du fichier suivi de 9 caractères correspondant au champ de protection<br />

appliqué au fichier.<br />

Le mode d'un fichier est visible par ls en format long (ls -l).<br />

Le type d'un fichier<br />

UNIX traitant de façon identique fichier, répertoire, périphériques, un caractère indique à<br />

quoi correspond un fichier.<br />

• - indique un fichier ordinaire<br />

• d indique que le fichier est un répertoire<br />

• l indique que le fichier est un lien symbolique<br />

• c indique un fichier de type caractère (tel bande magnétique)<br />

• b indique un fichier de type bloc (tel disque)<br />

Le champ de protection d'un fichier<br />

Nous avons vu que l'identification d'un utilisateur reposait sur un UID personnel et un GID<br />

commun à un groupe. La propriété d'un fichier dépend donc de ces deux notions.<br />

Chaque fichier à un propriétaire et un groupe propriétaire. On définit donc une protection à<br />

trois niveaux, vis-à-vis du propriétaire (noté u), du groupe (noté g) et des autres (noté o).<br />

A noter qu'il n'y a pas de protection vis-à-vis de root qui outrepasse tous les droits.<br />

Pour chacun, trois types de droits sur un fichier sont possibles : des droits en lecture (noté<br />

r), en écriture (noté w) et en exécution (noté x).<br />

Lecture pour un répertoire signifie possibilité d'en lister le contenu.<br />

Ecriture pour un fichier ordinaire donne le droit d'effacer; pour un répertoire cela donne le<br />

droit d'y créer des fichiers.<br />

Exécution pour un répertoire signifie possibilité de s'y positionner.<br />

- 17 -


Le champ de protection est donc un champ de 3x3=9 caractères dans l'ordre suivant : rwx<br />

pour u, rwx pour g, rwx pour o. Si un droit est présent la lettre est visible sinon un - figure.<br />

Ainsi rwxr-xr-- signifie droits de lecture, écriture, exécution pour l'utilisateur propriétaire,<br />

lecture et exécution pour les gens du même groupe, lecture pour tous les autres.<br />

On peut également utiliser une notation octale du champ de protection, en considérant<br />

rwx comme une valeur octale à partir de trois bits de valeurs potentielles 4 pour r, 2 pour<br />

w, 1 pour x. Le champ de protection est donc noté comme 3 valeurs octales : par ex. 754<br />

signifie rwxr-xr--<br />

Signalons trois notions peut utilisées mais à connaitre. Il existe 3 bits supplémentaires<br />

positionnables sur le champ de protection :<br />

• Le bit setuid noté s à la place du x dans la partie u : il permet d'avoir les droits du<br />

propriétaire le temps de l'exécution<br />

• Le bit setgid noté s à la place du x dans la partie g : il permet d'avoir les droits du<br />

groupe le temps de l'exécution<br />

• Le sticky bit noté t à la place du x dans la partie o : seul root et le propriétaire<br />

peuvent effacer le fichier même si les autres ont tous les droits sur le répertoire : cas<br />

du répertoire commun /tmp par exemple.<br />

En notation octale il faut rajouter un quatrième chiffre avec pour poids 4 pour le setuid, 2<br />

pour le setgid et 1 pour le sticky bit.<br />

________________________________________________________________<br />

exemple :<br />

$ ls -l<br />

total 157<br />

-rw-r--r-- 1 ollivier 30 Sep 22 10:23 erreur<br />

lrwxrwxrwx 1 ollivier 10 Sep 23 18:18 hello.c -> ../hello.c<br />

-rw-r--r-- 1 ollivier 18 Sep 22 10:07 liste<br />

drwxr-sr-x 2 ollivier 512 Sep 23 18:17 subdir1<br />

-rwxrwxrwx 1 ollivier147456 Sep 23 18:00 test<br />

-rw-r--r-- 1 ollivier 23 Sep 16 10:18 test.f<br />

-rw-r--r-- 1 ollivier 0 Sep 16 10:19 titi<br />

$ ls -l /dev | more<br />

crw-rw-rw- 1 root 18, 65 Apr 29 1991 rst5<br />

crw-rw-rw- 1 root 18, 66 Apr 29 1991 rst6<br />

crw-rw-rw- 1 root 18, 67 Apr 29 1991 rst7<br />

crw-rw-rw- 1 root 18, 8 Apr 29 1991 rst8<br />

crw-rw-rw- 1 root 18, 9 Apr 29 1991 rst9<br />

crw------- 1 root 3, 32 Apr 29 1991 sbus0<br />

crw------- 1 root 3, 33 Apr 29 1991 sbus1<br />

crw------- 1 root 3, 34 Apr 29 1991 sbus2<br />

crw------- 1 root 3, 35 Apr 29 1991 sbus3<br />

brw-r----- 1 root 7, 0 Apr 29 1991 sd0a<br />

brw-r----- 1 root 7, 1 Apr 29 1991 sd0b<br />

brw-r----- 1 root 7, 2 Apr 29 1991 sd0c<br />

--More—<br />

________________________________________________________________<br />

- 18 -


Modification du champ de protection<br />

Cette modification se fait par la commande chmod :<br />

chmod<br />

chmod mode fichier : affecte le mode indiqué au fichier, avec le mode soit en notation<br />

symbolique : (classe d'utilisateur)(opération)(droits) avec :<br />

• classe d'utilisateur : (u g o a), avec a pour all<br />

• opération : (= + -)<br />

• droits : (r w x)<br />

ou le mode en notation octale.<br />

________________________________________________________________<br />

exemple :<br />

$ ls -l titi<br />

-rw-r--r-- 1 ollivier 0 Sep 16 10:19 titi<br />

$ chmod u+x,g+w,o-r titi<br />

$ ls -l titi<br />

-rwxrw---- 1 ollivier 0 Sep 16 10:19 titi<br />

$ chmod a=rw titi<br />

$ ls -l titi<br />

-rw-rw-rw- 1 ollivier 0 Sep 16 10:19 titi<br />

$ chmod 750 titi<br />

$ ls -l titi<br />

-rwxr-x--- 1 ollivier 0 Sep 16 10:19 titi<br />

________________________________________________________________<br />

Protection par défaut<br />

Chaque utilitaire créant des fichiers leur affecte une protection spécifique, en général peut<br />

restrictive. Ainsi l'éditeur vi affecte rw-rw-rw- et les compilateurs rwxrwxrwx. On peut<br />

appliquer à la création un masque sur le champ de protection. Ce masque enlèvera<br />

systématiquement tel ou tel droit sur le fichier.<br />

La notation est de type octale. Ainsi le masque 022 masquera systématiquement w pour g<br />

et o ; les fichiers exécutables résultats de compilateurs seront donc en rwxr-xr-x si un tel<br />

masque est appliqué.<br />

La commande pour définir ce masque est umask :<br />

umask<br />

umask [mask] : définit le masque qui sera appliqué à tout nouveau fichier crée. Si mask<br />

est omis umask renvoie le masque existant.<br />

Attention umask ne protège en rien les fichiers déjà créés avant la définition du masque.<br />

Pour qu’elle soit permanente cette protection par défaut devra être indiquée dans un<br />

fichier de personnalisation de la session (voir plus loin).<br />

________________________________________________________________<br />

- 19 -


exemple :<br />

$ umask<br />

0<br />

$ f77 -o test1 test.f<br />

test.f:<br />

MAIN:<br />

$ umask 077<br />

$ umask<br />

77<br />

$ f77 -o test2 test.f<br />

test.f:<br />

MAIN:<br />

$ ls -l test?<br />

-rwxrwxrwx 1 ollivier 147456 Sep 23 18:31 test1<br />

-rwx------ 1 ollivier 147456 Sep 23 18:31 test2<br />

________________________________________________________________<br />

Les mouvements de fichiers<br />

Les fichiers affectés par les commandes suivantes sont aussi bien des fichiers ordinaires<br />

que des répertoires. Tous les noms de fichiers peuvent comporter des métas caractères<br />

de remplacement fournis par le shell.<br />

cp<br />

cp [-ir] fichier-source fichier-cible : copier un fichier. Le fichier source est laissé intact<br />

• -i : demande confirmation avant d'écraser un fichier cible s'il existe déjà<br />

• -r : permet de copier récursivement tout un répertoire<br />

mv<br />

mv [-i] fichier-source fichier-cible : déplacer un fichier. Revient donc à renommer le fichier<br />

source.<br />

• -i : demande confirmation avant d'écraser un fichier cible s'il existe déjà<br />

rm<br />

rm [-ir] fichier : effacer un fichier<br />

• -i : demande confirmation avant d'effacer le fichier. Il est souvent créé un synonyme<br />

de rm en rm -i de sorte que la demande soit systématique<br />

• -r : permet d'effacer récursivement dans tout un répertoire ; danger !<br />

________________________________________________________________<br />

exemple :<br />

$ ls -l<br />

total 1<br />

drwxr-sr-x 2 ollivier<br />

-rwxr-x--- 1 ollivier<br />

-rw------- 1 ollivier<br />

$ ls subdir1<br />

tata toto<br />

512 Sep 24 09:20 subdir1<br />

0 Sep 16 10:19 titi<br />

0 Sep 24 09:19 toto<br />

- 20 -


$ cp titi subdir1<br />

$ ls subdir1<br />

tata titi toto<br />

$ cp -r subdir1 subdir2<br />

$ ls -l<br />

total 2<br />

drwxr-sr-x 2 ollivier<br />

drwxr-sr-x 2 ollivier<br />

-rwxr-x--- 1 ollivier<br />

-rw------- 1 ollivier<br />

$ ls subdir2<br />

tata titi toto<br />

$ mv subdir2 subdir3<br />

$ ls -l<br />

total 2<br />

drwxr-sr-x 2 ollivier<br />

drwxr-sr-x 2 ollivier<br />

-rwxr-x--- 1 ollivier<br />

512 Sep 24 09:21 subdir1<br />

512 Sep 24 09:21 subdir2<br />

0 Sep 16 10:19 titi<br />

0 Sep 24 09:19 toto<br />

512 Sep 24 09:21 subdir1<br />

512 Sep 24 09:21 subdir3<br />

0 Sep 16 10:19 titi<br />

-rw------- 1 ollivier 0 Sep 24 09:19 toto<br />

$ cp -i toto subdir3<br />

overwrite subdir3/toto? y<br />

$ rm -i toto<br />

rm: remove toto? y<br />

$ ls<br />

subdir1 subdir3 titi<br />

$ rm -ir subdir3<br />

rm: remove subdir3/toto? y<br />

rm: remove subdir3/tata? y<br />

rm: remove subdir3/titi? y<br />

rm: remove subdir3? y<br />

________________________________________________________________<br />

Quelques autres commandes concernant les fichiers<br />

touch<br />

touch fichier : effectuer une mise à jour de la date d'un fichier. Ne modifie pas le contenu.<br />

Si le fichier n'existe pas, crée un fichier vide.<br />

ln<br />

ln [–s] fichier-existant nom-du-lien : crée un fichier de nom nom-du-lien qui est un<br />

pointage vers un fichier réel ; sert à voir en plusieurs points de l’arborescence un fichier<br />

sans le dupliquer.<br />

• -s : crée un lien symbolique. Si le lien est effacé le fichier réel n’est pas affecté.<br />

C’est le mode le plus utilisé.<br />

Recherche de fichiers<br />

Plusieurs utilitaires permettent de rechercher un fichier dans une arborescence UNIX<br />

relativement complexe.<br />

- 21 -


which<br />

which commande : cherche si la commande est présente dans la liste des répertoires<br />

définie par la variable {\tt path}. Cette variable permet à l'utilisateur de maintenir<br />

l'ensemble des répertoires ou un exécutable doit être cherché lorsqu'il est appelé. which<br />

renvoie le chemin absolu du premier répertoire ou la commande est trouvée.<br />

whereis<br />

whereis nom : recherche dans une liste standard de répertoire système tout ce qui se<br />

rapporte à une source, un exécutable, un manuel, de nom indiqué. Renvoie, en absolu,<br />

les répertoires concernés.<br />

locate<br />

locate motclé : renvoie tous les fichiers dont le nom contient la racine motclé<br />

find<br />

find répertoire critères-de-recherche : recherche récursivement à partir du répertoire<br />

spécifié et avec les critères indiqués.<br />

find est une commande très puissante qui permet non seulement de rechercher mais<br />

d'agir sur les objets trouvés.<br />

critères :<br />

• -name fichier : donne le critère de nom de recherche<br />

• -print : affiche le répertoire ou le fichier est trouvé<br />

• -user utilisateur : donne un critère d'appartenance pour la recherche<br />

• -type type : donne un critère de type de fichier<br />

• -exec action : effectue l'action indiquée sur les fichiers trouvés<br />

________________________________________________________________<br />

exemple :<br />

$ cd<br />

/home/lyosu1/ollivier<br />

$ find . -name titi -print<br />

./stage/subdir1/titi<br />

./stage/titi<br />

$ find . -name titi -exec ls -l {} \;<br />

-rwx------ 1 ollivier 0 Sep 24 09:21 ./stage/subdir1/titi<br />

-rwxr-x--- 1 ollivier 0 Sep 16 10:19 ./stage/titi<br />

$ find . -name titi -exec rm {} \;<br />

$ find . -name titi –print<br />

$<br />

________________________________________________________________<br />

L’impression de fichiers<br />

Il existe deux séries de commandes pour l'impression de fichiers :<br />

Soit l'impression type BSD : lpr pour lancer l'impression, lpq pour interroger, lprm pour<br />

annuler l'impression<br />

Soit l'impression type SYSTEM V: lp, lpstat, cancel<br />

- 22 -


Sous LINUX utilisez l’impression BSD. Cependant nous rappelerons les 2 jeux de<br />

commandes car le second est encore présent sur pas mal de systèmes UNIX.<br />

Signalons que les imprimantes ont un nom défini par l'administrateur système. Vous<br />

devez connaitre ce nom pour lancer une impression.<br />

Pour la partie BSD, les imprimantes sont définies dans un fichier /etc/printcap que vous<br />

pouvez lister. D'autre part l'outil lpc permet de gèrer les imprimantes. lpc est un outil<br />

interactif qui renvoie le prompt lpc> et comporte un help intégré. Certaines taches sont<br />

privilégiées mais tout utilisateur peut notamment voir le nom des imprimantes et l'état des<br />

queues d'impression.<br />

Pour SYS V, la commande lpstat sans arguments vous donne l'état de l'ensemble des<br />

queues d'impression et, de fait, leurs noms.<br />

Commandes BSD :<br />

lpr<br />

lpr [-h -#n -Pimprimante] [fichier] : lance une impression. Si fichier n'est pas spécifié, sdtin<br />

est pris; par exemple derrière un |<br />

• -P imprimante : définit le choix de l'imprimante. Si omis l'imprimante définie dans<br />

une variable PRINTER est utilisée ou en dernier lieu l'imprimante appelée lp<br />

• -#n : imprimante n copies<br />

• -h : suppression de la banière<br />

lpq<br />

lpq [-Pimprimante] [user ou jobnumber] : renvoie l'état de la queue d'impression pour<br />

l'imprimante spécifiée (ou PRINTER ou lp). Permet de voir ou en est une impression et<br />

également de connaitre le numéro unique de job qui a été attribué à l'impression par lpr.<br />

On peut restreindre l'interrogation aux impressions d'un utilisateur ou à une impression<br />

particulière si son jobnumber est déjà connu.<br />

lprm<br />

lprm [-Pimprimante] [user ou jobnumber] : tue un job dans la queue d'impression de<br />

l'imprimante spécifiée (ou PRINTER ou lp). lprm teste que l'impression appartient bien à<br />

l'utilisateur qui passe la commande. Si user est spécifié toutes les impressions de cet<br />

utilisateur sont tuées. Si ni jobnumber ni user ne sont spécifiés, toute la queue<br />

d'impression est vidée.<br />

Commandes SYS V :<br />

lp<br />

lp [-w -ttitre -nnombre -dimprimante] [fichier] : lance une impression. Si fichier n'est pas<br />

spécifié, sdtin est pris.<br />

• -d imprimante : définit le choix de l'imprimante. Si omis l'imprimante définie dans<br />

une variable LPDEST est utilisée ou en dernier lieu l'imprimante dite 'default printer'<br />

• -n nombre : imprime nombre copies<br />

• -t titre : La banière porte le titre précisé<br />

• -w : envoie un message quand l'impression est finie<br />

lpstat<br />

lpstat [-d -s -uutilisateur-pimprimante] } : renvoie l'état de l'ensemble des queues<br />

d'impression ou de l'imprimante spécifiée par -p.<br />

• -d : donne l'imprimante par défaut si elle existe<br />

• -s : donne un résumé d'informations sur les imprimantes<br />

• -u utilisateur : limite l'interrogation aux requetes de l'utilisateur précisé<br />

- 23 -


cancel<br />

cancel [-a] [jobnumber ou imprimante] : tue le job spécifié ou le job dans la<br />

queue d'impression de l'imprimante spécifiée. cancel teste que l'impression appartient<br />

bien à l'utilisateur qui passe la commande.<br />

• -a : toutes les impressions appartenant à l'utilisateur sont tuées.<br />

- 24 -


<strong>Chapitre</strong> 6 : Interaction de l’utilisateur et du système<br />

Une session Unix<br />

Débuter une session<br />

Il existe diverses possibilités pour se connecter à un système Unix. Tout dépend du<br />

matériel dont on dispose et de sa connectivité réseau.<br />

Dans tous les cas, vous passerez par un mécanisme d’identification et d’authentification,<br />

en d’autres termes vous devrez fournir un couple d’informations (nom d’utilisateur, mot<br />

de passe) pour accéder aux ressources logicielles disponibles sur le système.<br />

Le mécanisme d’authentification (qu’il soit local à la machine ou commun à un ensemble<br />

de machines) procède à la validation de votre accès pour le couple (nom d’utilisateur, mot<br />

de passe). Si l’un des 2 éléments du couple n’est pas valide, vous obtiendrez un message<br />

comme :<br />

Login incorrect<br />

Une fois l’authentification validée, le système exécute un ensemble de procédures<br />

appelées profiles. Ces procédures s’exécutent à divers niveaux et dans l’ordre suivant :<br />

o système. Procédure dépendant du système d’exploitation qui est systématiquement<br />

exécutée quelque soit l’environnement applicatif disponible. Elle va, par exemple, définir<br />

le langage national courant;<br />

o<br />

o<br />

fournies par les administrateurs du système;<br />

utilisateur. L’utilisateur peut personnaliser son environnement<br />

Ensuite le système donne la main à l’utilisateur et affiche la première invite. Dès lors,<br />

vous êtes à même d’interagir avec le système Unix cible. Cette invite est représentée par<br />

une chaîne de 1 ou plusieurs caractères précédant le curseur sur la ligne de commande<br />

courante.<br />

Note : Convention d’écriture retenue dans ce document. Pour simplifier l’écriture,<br />

l’invite choisie est l’invite par défaut des shells de la famille « sh » cad. le caractère $ .<br />

Connexion sur un poste distant<br />

Pour ce faire, parmi les protocoles possibles on trouve rsh, telnet ou ssh (qu’on préfèrera<br />

car il offre un niveau de sécurité bien supérieur aux autres). On va pouvoir à partir un<br />

- 25 -


poste local disposant d’une connectivité réseau d’établir une connexion avec une machine<br />

distante. Par exemple :<br />

__________________________________________________________________<br />

$ ssh lyopc61.in2p3.fr<br />

__________________________________________________________________<br />

Les messages d’établissement de la connexion apparaissent suivis d’une mire de login;<br />

on procède ensuite comme précédemment en fournissant son identification et<br />

authentification.<br />

Caractéristiques des terminaux<br />

Selon le type de terminal (ou plutôt d’émulation de terminal) utilisé, certaines applications<br />

peuvent présenter des comportement inhabituels. La plupart du temps positionner la<br />

variable d’environnement TERM comme vt100 (la notion de variable d’environnement<br />

sera développée ultérieurement dans ce chapitre), offre un mode de fonctionnement<br />

confortable.<br />

Cependant suivant le constructeur, il est parfois plus judicieux d’affecter à cette variable,<br />

une valeur de terminal propriétaire (hpterm par exemple pour une machine HP).<br />

D’autre part, en cas de connexion sur un site distant, un protocole comme telnet se<br />

présente avec les attributs du terminal source; or si celui-ci n’est pas reconnu, le système<br />

cible va considérer qu’il s’agit d’un terminal générique (appelé parfois dumb) lequel se<br />

comportera rarement de façon satisfaisante.<br />

- 26 -


Le shell et Unix<br />

Unix : un système en couches<br />

Le système Unix est un système organisé en couches qui communiquent entre elles et qui<br />

ont chacune un rôle spécifique.<br />

X window<br />

Vous<br />

Shell<br />

Applications Commandes<br />

Noyau<br />

Matériel<br />

La couche la plus basse est le noyau qui interagit directement avec le matériel et le gère.<br />

Le support de nouveaux dispositifs matériels imposera généralement une génération du<br />

dit noyau.<br />

Les applications ou les commandes interagissent avec le noyau plutôt qu’avec le matériel.<br />

Mais la mise en exécution de ces commandes résulte d’une action (ligne de commande)<br />

saisie par l’utilisateur après interprétation de sa syntaxe par le shell.<br />

C’est pourquoi, on trouve au dessus des applications et des commandes, l’interpréteur de<br />

commandes (ou shell) en charge de l’interaction entre l’utilisateur et Unix.<br />

Enfin dans le cas d’une station de travail ou d’un terminal X, la couche en charge du<br />

système de fenétrage vient s’intercaler entre vous et le shell ou directement entre vous et<br />

les applications.<br />

Lorsque vous vous connectez à un système Unix via un terminal (login console en mode<br />

non graphique) ou une émulation terminal (telnet), vous vous retrouvez sous le contrôle<br />

d’un programme appelé shell de connexion.<br />

Un shell est à la fois un programme exécutable (et en exécution!) et un interpréteur de<br />

commandes qui lit chaque commande entrée au clavier et les transmet au noyau. Le<br />

résultat des commandes suit le chemin inverse et sera généralement affiché à l’écran.<br />

L’exécution du shell est lancée par un mécanisme complexe du type "fork/exec". Le shell<br />

courant reste le shell de connexion tant qu’on n’exécute pas un autre shell sur la ligne de


commande.<br />

Aujourd’hui, malgré l’existence d’interfaces graphiques de haut niveau, le shell reste la<br />

principale interface entre l’utilisateur et le système Unix. La plupart des systèmes Unix<br />

supportent plusieurs shells. Les shells les plus couramment employés sont:<br />

le ✣✍▲❈❅●● ❏◆ ❃▲❈<br />

le ✢❏◆❒■❅✍▲❈❅●● ❏◆ ▲❈<br />

le ✫❏❒■✍▲❈❅●● ❏◆ ❋▲❈<br />

le ✴✣✍▲❈❅●● ❏◆ ▼❃▲❈<br />

Le ✢❏◆❒■❅✍✡❇❁❉■✍▲❈❅●● ❏◆ ❂❁▲❈<br />

Le sh est disponible sur tous les systèmes et est l’ancêtre du ksh avec lequel il est<br />

compatible arrière. Le tcsh et le bash se différencient du csh et du ksh par leur mécanisme<br />

d’historique. Cependant contrairement au tcsh, le bash utilise des fichiers de configuration<br />

différents du shell dont il est issu (sh) ainsi que quelques extensions de syntaxe.<br />

Le fait que le tcsh et le zsh proviennent du domaine public et qu’ils soient supportés sur de<br />

nombreuses plateformes matérielles, est à l’origine de leur succès.<br />

Chaque shell dispose d’une grammaire et d’une sémantique qui lui est propre faisant de<br />

lui un véritable langage de programmation. Aussi sur la ligne de commande, peut-on<br />

saisir des constructions syntaxiques de ce shell qui seront immédiatement<br />

interprétées dans le contexte du shell courant.<br />

D’autres fonctionnalités existent dans les shells (pas dans tous, et pas mises en<br />

oeuvre de la même manière); il s’agit :<br />

• du mécanisme d’historique qui permet de gérer la liste des commandes<br />

récemment exécutées;<br />

• du mécanisme d’alias qui permet de personnaliser son environnement de<br />

travail;<br />

• et du mécanisme de contrôle des programmes en exécution.<br />

Les caractères<br />

La ligne de commande étant le mode privilégié de communication entre l’utilisateur et<br />

Unix, il convient de préciser l’utilisation des caractères qui la constituent. Parmi la<br />

totalité des caractères disponibles sur votre clavier, un certain nombre sont<br />

interprétés par le shell avant que toute autre action n’ait lieu : ces sont les<br />

caractères spéciaux. On distingue parmi ces caractères, deux catégories :<br />

• les caractères génériques généralement utilisés pour constituer les noms de


fichiers ou de répertoires<br />

• les caractères spéciaux<br />

Les caractères génériques<br />

* remplace n’importe quelle chaîne de caractères de même qu’une chaîne vide<br />

? remplace un caractère unique quelconque<br />

[] les crochets encadrent un jeu de caractères et chacun d’entre eux peut correspondre<br />

à un caractère unique pour la position courante.<br />

[bx] correspond aux caractères b ou x.<br />

- utilisé au sein de [] correspond à une gamme de caractères. [b-x]<br />

correspondant à un caractère compris entre b et x. On notera que gammes de<br />

caractères, caractères individuels peuvent être spécifiés dans un même couple<br />

de crochets. Par exemple [a-z0-9+-] correspond aux caractères + et - associés<br />

aux minuscules et aux caractères numériques.<br />

~ la tilde est interprétée comme le répertoire "home".<br />

A titre d’exemples:<br />

___________________________________________________________________<br />

$ ls fi*<br />

affiche la liste des fichiers dont le nom commence par fi<br />

$ ls ?xy*<br />

affiche tous les fichiers dont le 2ième et 3ième caractères sont xy<br />

$ ls [ab]cd[h-k]<br />

affiche tous les fichiers dont le nom commence par a ou b, suivi de la chaîne de<br />

caractère cd et terminés par un caractère compris entre h et k<br />

$ ls ~/.*.?<br />

affiche tous les fichiers dans votre répertoire "home" dont le nom commence par un<br />

point, disposant d’une extension d’un seul caractère.<br />

______________________________________________________________<br />

Les caractères spéciaux<br />

Parmi les caractères qui sont sujets à une interprétation particulière par le shell, on<br />

trouve:<br />

\ est le caractère spécial qui permet de faire perdre sa signification à un caractère<br />

spécial lorsqu’il le précède. Dans un script shell, il pourra être utilisé en tant que<br />

caractère de continuation de ligne.<br />

les symboles de redirection d’entrée/sortie.


$ précède le nom d’une variable<br />

# ce qui le suit est traité comme un commentaire<br />

’ ’ au sein des simples quotes tous les caractères spéciaux perdent leur signification<br />

excepté ‘ (quote)<br />

" " au sein des doubles quotes tous les caractères spéciaux perdent leur signification<br />

à l’exception de \ $ " ’<br />

() les commandes placées entre parenthèses sont exécutées dans un sous shell<br />

du shell courant<br />

‘ ‘ au sein d’anti-quotes une commande y est substituée par son résultat.<br />

Exemples :<br />

___________________________________________________________________<br />

$ ls monprg.\*<br />

monprg.*<br />

* précédé d’un antislash perd son caractère générique.<br />

$ echo "Mon répertoire home est $PATH"<br />

Mon répertoire home est /home/tartempion<br />

Entre double côtes $ est toujours interprété<br />

$ echo \$PATH est identique à ’$PATH’<br />

$PATH est identique à $PATH<br />

Ici $PATH n’est pas interprété dans le premier cas à cause de l’antislash, dans le<br />

second car il apparaît entre simples côtes.<br />

___________________________________________________________________<br />

Les redirections<br />

Par défaut, Unix suit un certain nombre de conventions concernant l’endroit où un<br />

programme lit ses données, écrit ses résultats et envoie ses erreurs. Ces entités sont<br />

appelées :<br />

• entrée standard ou stdin<br />

• sortie standard ou stdout<br />

• erreur standard ou stderr.<br />

Par défaut, l’entrée standard est connectée au clavier, tandis que la sortie et l’erreur<br />

standard sont associées au terminal. Il est cependant aisé de changer leur valeur; en


terminologie Unix ceci s’appelle la redirection.<br />

Dans le ksh ou bash, on associe les descripteurs de fichiers 0, 1 et 2 à<br />

respectivement stdin, stdout et stderr.<br />

Les redirections vont s’effectuer sur la ligne de commande grâce à des combinaisons<br />

de ces descripteurs et des caractères > , < et &.<br />

Une commande qui requiert une entrée clavier pourra utiliser un fichier en guise<br />

d’entrée standard ceci grâce au caractère < . Par exemple :<br />

___________________________________________________________________<br />

$ mail machin < document<br />

___________________________________________________________________<br />

Le résultat d’une commande qui normalement s’affiche sur le terminal, peut être<br />

redirigé dans un fichier grâce au caractère > ou 1> :<br />

___________________________________________________________________<br />

$ ls >fichier-resultat<br />

ou<br />

$ ls 1>fichier-resultat<br />

___________________________________________________________________<br />

En doublant le caractère >, la sortie sera concaténée au fichier si ce fichier existe<br />

déjà :<br />

___________________________________________________________________<br />

$ df >>fichier-resultat<br />

___________________________________________________________________<br />

Pour rediriger, l’erreur standard on utilise 2><br />

___________________________________________________________________<br />

$ grep sed /etc/* 2>fichier-erreurs<br />

___________________________________________________________________<br />

On pourra également doubler ces chevrons, si l’on souhaite obtenir la concaténation<br />

du résultat à un fichier existant.<br />

L’environnement<br />

L’utilisateur dispose dès son premier accès au système, d’un environnement de<br />

travail. Cet environnement s’appuie sur l’utilisation de variables et d’alias.<br />

On pourra affecter une valeur à ces variables dans les fichiers d’initialisation<br />

dépendant du shell de connexion mais également sur la ligne de commande du shell.<br />

La portée des variables dépend de leur nature (globales ou locales).<br />

Quand aux alias, il s’agit d’un moyen d’abréger des commandes ou de leur définir


des synonymes.<br />

Concept de variable<br />

Les variables du shell ont un nom auquel on associe une valeur. Le nom est<br />

constitué d’une chaine de caractères alpha-numérique. La déclaration se fait comme<br />

suit :<br />

___________________________________________________________________<br />

$ nom_de_var=valeur<br />

___________________________________________________________________<br />

Un variable ainsi créée sera une variable locale, sa valeur n’est accessible que dans<br />

le shell courant.<br />

La suppression d’une variable se fait par :<br />

___________________________________________________________________<br />

$ unset nom_de_var<br />

___________________________________________________________________<br />

Pour accéder à la valeur d’une variable consiste à la faire précéder son nom par le<br />

caractère $ :<br />

___________________________________________________________________<br />

$ aa=10<br />

$ echo $aa<br />

10<br />

_________________________________________________________________________________<br />

Si une variable n’a pas été définie, le shell retournera une ligne blanche en guise de<br />

valeur.<br />

Pour obtenir la liste des variables définies, utiliser la commande set :<br />

_____________________________________________________________________<br />

$ set<br />

LOGNAME=larrieu<br />

MAIL=/usr/spool/mail/larrieu<br />

MAILCHECK=600<br />

MAILMSG=[YOU HAVE NEW MAIL]<br />

MANPATH=/usr/man:/usr/local/man:/home/larrieu/man<br />

__________________________________________________________________________________<br />

Portée des variables<br />

La portée des variables dépend de leur nature. Elles peuvent être :<br />

• Locales à l’application qui les a créées. Une variable est créée par défaut comme<br />

variable locale<br />

• Globales c’est à dire transmises à tout sous processus du processus courant. On<br />

parle alors de variable d’environnement.


Les variables internes<br />

Ces variables sont prédéfinies dans le shell en fonction de critères communs à l’ensemble<br />

des utilisateurs. Comme précédemment pour accéder à la valeur de ces variables, il<br />

faudra les préfixer du caractère $. Nous ne donnerons pas ici la liste complète de ces<br />

variables mais voici quelques unes des plus couramment utilisées.<br />

Les variables mono-caractère<br />

? contient le code de retour de la dernière commande. Exemple :<br />

__________________<br />

$ vo toto<br />

bash: vo: not found.<br />

$ echo $?<br />

1<br />

___________________<br />

# nombre décimal contenant le nombre de paramètres d’un script shell.<br />

Les variables ayant à trait aux répertoires :<br />

PWD<br />

OLDPWD<br />

HOME<br />

Les variables d’édition<br />

COLUMNS<br />

LINE<br />

EDITOR<br />

Les variables de chemin<br />

contient le répertoire courant<br />

l’ancien répertoire courant (avant le dernière commande cd émise)<br />

le répertoire home<br />

nombre de colonnes du terminal utilisé<br />

nombre de lignes<br />

le chemin d’accès à votre éditeur préféré<br />

PATH<br />

MANPATH<br />

le chemin de recherche des commandes<br />

le chemin de recherche des pages de manuel<br />

Et les autres


PS1 définit la chaine de caractères d’invite du shell. (par défaut le caractère $)<br />

PS2<br />

TERM<br />

définit l’invite secondaire. Lorsqu’une commande n’est pas terminée sur une<br />

ligne, le shell affiche un invite secondaire de continuation.<br />

définit le type de terminal (p.e. vt100)


Les variables d’environnement<br />

Ces variables sont appelées ainsi car elles caractérisent des paramètres de<br />

l’environnement sous lequel une commande ou un programme s’exécute. Elles seront<br />

transmise à tout type de sous processus du shell courant.<br />

Pour les rendre accessibles, elles devront être définies comme une variable normale et<br />

exportées. Ceci se fait par la commande export et c’est le seul moyen de transmettre des<br />

variables à un sous shell :<br />

__________________________________________________________________<br />

$ envvar=abcd<br />

$ export envvar<br />

__________________________________________________________________<br />

Ce mécanisme d’exportation est commun aux shells sh, ksh et bash. Cependant la commande<br />

export du ksh et du bash accepte la forme suivante (définition et exportation):<br />

___________________________________________________________________<br />

$ export envvar=abcd<br />

___________________________________________________________________<br />

La commande env permet d’accéder à la définition des variables d’environnement:<br />

___________________________________________________________________<br />

$ env<br />

TERM=aixterm<br />

SHELL=/usr/local/bin/tcsh<br />

HOME=/home/l/larrieu<br />

PATH=/home/g/gnats/bin:/usr/local/bin:/usr/local/etc:/bin:/usr/ucb<br />

:/usr/ bin/X11:/usr/local/oracle/bin:/usr/afs/bin:.<br />

HARDWARE=RS6000/390<br />

USER=larrieu<br />

VENDOR=IBM<br />

___________________________________________________________________<br />

La valeur affectée à une variable d’environnement est aisément modifiable, cependant il<br />

est vivement déconseillé de ne pas modifier certaines variables dites "système" où une<br />

mauvaise affectation risquerait de perturber notablement votre session.<br />

Il convient de s’attarder sur le contenu d’une variable d’environnement qui est la variable<br />

PATH. En effet cette variable conditionne l’exécution des commandes dans votre<br />

environnement. Elle a pour valeur un ensemble de chemins séparés par le caractère : ( 2<br />

points).<br />

___________________________________________________________________<br />

$ echo $PATH<br />

/


opt/ssh/bin:/usr/sbin:/usr/bin/X11:/cern/pro/bin:/usr/local/bin:/h<br />

ome/l/larrieu:.<br />

___________________________________________________________________<br />

Avant d’être mise en exécution, la commande que vous entrez sur la ligne de commande<br />

sera recherchée dans les répertoires spécifiés dans la variable PATH dans l’ordre de<br />

lecture. La première occurrence sera mise en exécution.<br />

Dans l’exemple précédent, la recherche s’effectue à partir de /opt/ssh/bin éventuellement<br />

jusqu’au répertoire courant (noté .)<br />

En cas d’échec dans la recherche d’une commande, vous obtiendrez quelque chose<br />

comme :<br />

___________________________________________________________________<br />

$ tagada<br />

tagada: Command not found.<br />

___________________________________________________________________<br />

Nous vous conseillons donc vivement de ne pas créer d’exécutables portant le<br />

même nom que des procédures système. Si malgré tout, vous le souhaitez, évitez<br />

de les déposer dans des répertoires qui seront accédés, via votre variable PATH,<br />

avant les répertoires système (dans l’exemple précédent, éviter d’en créer dans<br />

/home/l/larrieu ou .).<br />

Les alias<br />

Il s’agit d’un moyen d’abréger des commandes ou de leur définir des synonymes. La<br />

définition d’alias peut être faite dans les fichiers de configuration (.kshrc) ou directement<br />

sur la ligne de commande. La syntaxe est la suivante :<br />

alias nouveau_nom=’definition’<br />

Par exemple :<br />

___________________________________________________________________<br />

$ alias rm=’rm -i’<br />

$ alias qui=’who | sort’<br />

___________________________________________________________________<br />

rm est un alias de la commande rm avec l’option -i. qui est une nouvelle commande qui<br />

affiche la liste triée des utilisateurs connectés.<br />

___________________________________________________________________<br />

$ alias<br />

false=let 0<br />

functions=typeset -f<br />

history=fc -l<br />

integer=typeset -i


ls=/bin/ls<br />

rm=/bin/rm<br />

stop=kill -STOP<br />

rm=/bin/rm -i<br />

qui=who | sort<br />

___________________________________________________________________<br />

Il est toujours possible d’éviter occasionnellement d’utiliser la définition d’un alias. Pour ce<br />

faire, il faut sur la ligne de commande faire précéder la commande par le caractère \<br />

(antislash).<br />

___________________________________________________________________<br />

$ \rm toto<br />

___________________________________________________________________<br />

exécutera la commande rm de base sans la moindre option.<br />

La suppression permanente d’un alias se fait par la commande unalias :<br />

___________________________________________________________________<br />

$ unalias qui<br />

$ qui<br />

bash: qui: not found.<br />

___________________________________________________________________<br />

Les fichiers de configuration<br />

Ces fichiers contiennent un ensemble d’instructions qui respectent la syntaxe propre au<br />

shell de connexion et sont modifiables par l’utilisateur. Tels qu’ils sont livrés initialement,<br />

ces fichiers établissent un environnement de base minimum.<br />

Il est souhaitable de ne pas supprimer les instructions existantes mais plutôt d’y ajouter<br />

votre personnalisation.<br />

Les fichiers de configuration pour le bash , s’appellent :<br />

.bashrc<br />

exécute à chaque démarrage du shell<br />

.bash_profile exécuté une fois lors de votre connexion. L’exécution du .<br />

bash_profile est précédée de celle du .bashrc<br />

.bash_logout<br />

exécuté une fois lors de la fermeture de connexion<br />

En bash, c’est essentiellement dans .bashrc que vous serez amené à effectuer vos<br />

modifications. En cours de session pour que ces modifications s’activent immédiatement,<br />

il vous faudra faire :<br />

_______________________________<br />

$ . ~/.bashrc<br />

___________________________________


Historique et rappel des commandes<br />

L’ historique du shell<br />

Les commandes passées sur la ligne de commande sont stockées dans un fichier<br />

d’historique maintenu par le shell et qui porte par défaut le nom de .sh_history. Ce fichier<br />

réside dans le répertoire home de l’utilisateur et par défaut contient les 128 dernières<br />

commandes passées.<br />

Les variables d’environnement HISTFILE et HISTSIZE permettent de modifier ces défauts<br />

et doivent être définies dans le fichier .profile.<br />

HISTFILE=~/.historique<br />

HISTSIZE=50<br />

Dans cette exemple, le fichier d’historique s’appellera .historique et sera limité à 50 lignes.<br />

Edition de commandes<br />

Le fichier d’historique ne doit pas être manipulé directement par un éditeur Unix, mais<br />

c’est cependant grâce à des sous commandes d’un éditeur que pourront être rappelées et<br />

modifiées les commandes précédemment émises sur la ligne de commandes.<br />

En bash, un mode de rappel de commandes est défini par défaut. Il suffit d’utiliser les<br />

touches flèches de votre clavier pour vous déplacer dans la pile des commandes déjà<br />

passées.<br />

Compléter les noms de fichiers<br />

Le bash offre la possibilité de compléter sur la ligne de commande, le début du nom d’un<br />

fichier. Cette possibilité existe également dans d’autres shells.<br />

Le principe consiste à taper les premiers caractères d’un nom de fichier suivi d’une<br />

combinaison de touches clavier propres à chaque mode. Le shell complètera alors le nom<br />

du fichier s’il n’y a pas d’ambiguité ou une partie du nom s’il y a plusieurs choix<br />

On tape une partie du nom suivi de la touche de tabulation (taper 2 fois consécutives sur<br />

la touche fonctionne également). Supposons qu’il existe des fichiers appelés nomde-fichier,<br />

fichier123 et fichier223 alors :<br />

_______________________________________________________________________<br />

$ ls nom <br />

complètera la ligne de commande à « $ ls nom-de-fichier. »<br />

Si le nom complété est celui d’un répertoire, un caractère / sera ajouté à la fin du nom,<br />

ceci afin de pouvoir éventuellement compléter le nom d’un fichier de ce répertoire. Tandis


que<br />

_______________________________________________________________________<br />

$ ls fi <br />

complètera la ligne à « $ ls fichier » car il y a ambiguïté sur le dernier caractère (1 ou 2)<br />

_______________________________________________________________________<br />

Pour afficher la liste des fichiers candidats au complément faire :<br />

_______________________________________________________________________<br />

$ ls fichier <br />

fichier123<br />

fichier223<br />

_______________________________________________________________________<br />

On complète ensuite à la main ou partiellement pour lever l’ambiguïté suivi d’un nouveau<br />

:<br />

_______________________________________________________________________<br />

$ ls fichier1 sera alors complété à « $ ls fichier123 »


<strong>Chapitre</strong> 7 : Présentation du concept X11<br />

Historique<br />

Le besoin de faire cohabiter sur un même écran physique en plusieurs zones, chaque<br />

zone (ou fenêtre) étant associée à une tâche (ou application) s’est fait sentir au début des<br />

années des années 80. Il fallait trouver un moyen de garantir la cohérence de chaque<br />

zone et ce fut le début de l’aventure X11 :<br />

1983: Projet Athéna (MIT), Kerberos, AFS et X<br />

1985: X10 (1ère version publique), 1987: X11R1<br />

Il en ressortira le système X Window : un système distribué où une application peut<br />

s’exécuter sur une machine et s’afficher sur une autre. X Window est une système de<br />

multi-fenêtrage garantissant transparence réseau, hétérogénéité et portabilité.<br />

C’est un modèle client/serveur où il y a séparation du traitement de l’algorithme<br />

applicatif et de la gestion des interactions utilisateur sur l’écran, clavier, souris.<br />

Fonctionnement de X<br />

Sur chaque machine dotée d’une chaîne graphique (écran bitmap, clavier, souris),<br />

l’environnement X se traduit par l’occurrence d’un processus serveur X (Xserver).<br />

Les applications qui ont des besoins d’affichage (les clients ou Xclients) vont<br />

interagir avec le processus serveur.<br />

Dans un cadre plus général, Xclient et Xserver sont 2 processus indépendants<br />

pouvant tourner sur une même machine ou sur 2 machines différentes.<br />

Une voie de communication est nécessaire entre client et serveur : c’est le<br />

protocole X11 qui permet ce dialogue. Sur un poste autonome, c’est le mécanisme<br />

d’IPC (InterProcessCommunication) qui assure ce rôle. Dans le cas de machines en<br />

réseau, le protocole sous-jacent est TCP/IP.


client<br />

Xlib<br />

Serveur<br />

TCP/IP<br />

Interaction client / serveur<br />

Préalablement à l’établissement de la communication client/serveur, il faut<br />

positionner la variable d’environnement DISPLAY. Cette variable définit sur quelle<br />

chaîne graphique seront affichés les clients X. Par exemple :<br />

$ export DISPLAY=lyofor05 :0<br />

Une fois la communication établie, 4 catégories d’informations transitent entre<br />

client et serveur:<br />

o<br />

o<br />

o<br />

o<br />

Requêtes: client --> serveur. Créer une fenêtre, tracer une trait, etc...<br />

Réponses: serveur --> client. Taille d’écran, couleur, etc...<br />

Evènements: serveur --> client. Entrée clavier, mouvement souris<br />

Erreurs: serveur --> client. Si problème...<br />

Quelques clients X<br />

Voici quelques clients X standards qui sont généralement installés dans le répertoire<br />

/usr/bin/X11 :<br />

mwm, twm<br />

xterm<br />

xclock<br />

xv<br />

xlsclients<br />

xlsfonts<br />

gestionnaires de fenêtres<br />

émulation de terminal passif<br />

une horloge<br />

visualisateur d’images<br />

affiche une liste des clients actif sur le serveur X<br />

liste les polices de caractères connues par le serveur X


Gestionnaires de fenêtres<br />

Les Gestionnaires de fenêtres ou "Window Managers" sont des applications qui<br />

offrent une ergonomie supplémentaire à l’utilisateur (habillage de fenêtre, gestion<br />

de menus déroulants, tableaux de bord, etc…).<br />

Par exemple, /usr/bin/X11/fvwm2, /usr/bin/X11/mwm font partie des plus répandus.<br />

Ce sont des clients X qui habillent avec de nouvelles fenêtres, les fenêtres des autres<br />

clients afin de permettre une manipulation de celles-ci à la souris.<br />

Fenêtre client<br />

Fenêtre "root"<br />

mise en icône<br />

déplacement<br />

changement de taille<br />

Le chapitre 13 traitera plus en détail de ce sujet<br />

Le graphisme sous X<br />

X11 gère un graphisme en 2 dimensions dans le système de coordonnées de la<br />

fenêtre racine (rootWindow)


X<br />

Y<br />

Concernant le gestion des dessins:<br />

<br />

<br />

le serveur ne redessine pas le contenu des fenêtres<br />

c’est au client de le faire s’il le souhaite<br />

X11 contient un mécanisme qui permet d’écrire des applications telles que les<br />

options (couleur, fontes, etc...) puissent être données à l’exécution. On parle alors<br />

de ressource X. Une ressource X est une option re-configurable.<br />

Les ressources<br />

Les applications vont chercher les ressources :<br />

o sur la ligne de commande: xclock -hands red<br />

o dans le fichier .Xdefaults de l’utilisateur<br />

o dans la propriété RESOURCE_MANAGER de la fenêtre root<br />

o dans /usr/lib/X11/app-defaults<br />

o codées dans l’application même<br />

La forme générale d’une ressource est :<br />

app.nom.sous-nom.attribut: valeur<br />

mais on rencontre le plus souvent une écriture du type :


app*nom*attribut: valeur<br />

où valeur est un booléen, un numérique, une chaine de caractères<br />

La difficulté de l’exercice vient du fait qu’il faut connaître la hiérarchie des objets. Par<br />

exemple : xterm.vt100.scrollBar: false .<br />

Alors qu’en utilisant le caractère * , on désigne les attributs d’un objet quelque soit la place<br />

de l’objet dans la hierarchie : xterm*scrollBar: true


<strong>Chapitre</strong> 8 : Commandes réseau<br />

Rappel IP (Internet Protocol)<br />

Les machines (ordinateurs, imprimantes, routeurs …) communiquent entre elles sur<br />

Internet grâce au protocole TCP/IP (Transmission Control Protocol/Internet Protocol).<br />

La communication se fait par l’acheminement de paquets de données.<br />

Lorsqu’un paquet transite sur Internet, les routeurs grâce à des tables de routage,<br />

aiguillent le paquet vers le réseau de destination. Puis la passerelle de ce réseau local<br />

l’envoie vers la machine de destination.<br />

La passerelle est une machine qui sert de point d’accès à l’extérieur du réseau local.<br />

Chaque machine a une adresse IP qui s’écrit sous la forme de 4 nombres xxx.xxx.xxx.xxx<br />

(xxx est un entier pouvant aller de 0 à 255).<br />

ex. : 193.54.12.213<br />

Il ne peut pas avoir 2 machines ayant la même adresse sur le même réseau.<br />

On distingue 2 parties dans l’adresse IP :<br />

Une partie des nombres à gauche désigne le réseau.<br />

Les nombres de droite désignent les ordinateurs de ce réseau.<br />

Plus la partie de nombres pour le réseau est petite, plus celui-ci peut contenir<br />

de machines et inversement. C’est la notion de classe IP à laquelle appartient<br />

la machine.<br />

Les adresses IP xxx.xxx.xxx.xxx sont réparties en classes :<br />

- Classe A : Le premier nombre xxx. représente le réseau (xxx de 1 à 126)<br />

Un réseau de classe A peut contenir 16777214 ordinateurs<br />

- Classe B : Les 2 premiers nombres xxx.xxx. représentent le réseau (xxx.xxx de 128.0 à<br />

191.255)<br />

Une classe B peut contenir 65534 ordinateurs<br />

- Classe C : Les 3 premiers nombres xxx.xxx.xxx. représentent le réseau (xxx.xxx.xxx de<br />

192.0.0 à 223.255.255)<br />

Une classe C peut contenir 254 ordinateurs.<br />

Remarque : dans un réseau, il y a 2 adresses réservées : l’adresse du réseau et celle de<br />

diffusion générale (broadcast).<br />

Remarque : l’adresse 127.0.0.1 est appelée adresse de boucle locale car elle désigne la<br />

machine locale.


Remarque : il peut avoir un serveur DHCP (Dynamic Host Configuration Protocol) qui<br />

alloue de façon dynamique une adresse IP à une machine du réseau local.<br />

Notion de masque : il se présente sous la forme de 4 chiffres comme une adresse IP. Le<br />

masque permet de connaître le réseau associé à une adresse IP et permet la définition de<br />

sous-réseau.<br />

Exemple : un masque pour un réseau de classe C s’écrit : 255.255.255.0<br />

Un nom est en général associé à l’adresse IP de la machine.<br />

Ce nom est composé de plusieurs parties séparées par un « . » :<br />

La 1 ère partie (partie gauche) est le nom de la machine<br />

Les autres parties restantes représentent le domaine auquel appartient la machine<br />

exemple : lyonas2.in2p3.fr<br />

lyonas2 = nom de la machine, in2p3.fr = domaine<br />

Les serveurs DNS (Domain Name Service) permettent la résolution de nom de machines,<br />

c’est à dire obtenir l’adresse IP à partir du nom.<br />

Prise de session à distance<br />

Ces sessions sont basées sur le modèle client-serveur. Le client envoie des ordres et le<br />

serveur attend des requêtes pour effectuer les actions.<br />

Coté serveur, sous linux, ce service est fourni par un démon qui est un processus tournant<br />

en arrière-plan. Ces démons sont en attente et à l’écoute d’une requête.<br />

Par exemple, le démon FTP s’appelle ftpd.<br />

TELNET<br />

Telnet permet une connexion sur une machine distante via la ligne de commande (depuis<br />

un poste client).<br />

Tout ce qui est tapé au clavier est envoyé à travers le réseau à l’interpréteur de<br />

commande (shell) de la machine distante.<br />

Telnet véhicule les données en clair (de manière non chiffrée) sur le réseau,<br />

même ce qui ne se voit pas a l’écran (par exemple, les mots de passe).<br />

syntaxe : telnet nom_machine<br />

________________________________________________________________<br />

exemple :<br />

lyopcs1 17:14:16 0 /root $ telnet lyopcs9.in2p3.fr<br />

Trying 134.158.138.13...<br />

Connected to lyopcs9.in2p3.fr.


Escape character is '^]'.<br />

Red Hat Linux release 7.3 (Valhalla)<br />

Kernel 2.4.20-20.7smp on an i686<br />

login: rafidiso<br />

Password:<br />

Last login: Mon Mar 22 09:36:00 from lyopc213.in2p3.fr<br />

$ hostname<br />

lyopcs9.in2p3.fr<br />

$<br />

$ ls -l<br />

total 43<br />

-rw-r--r-- 1 rafidiso infor 48640 Feb 16 09:50 courrier1.doc<br />

drwxr-xr-x 2 rafidiso infor 4096 Dec 30 1997 bin/<br />

-rwxr-xr-x 1 rafidiso infor 1499 Dec 30 1997 #.cshrc.dist*<br />

-rw------- 1 rafidiso infor 419 Mar 22 10:08 dead.letter<br />

-rw-r--r-- 1 rafidiso infor 8720 Feb 16 12:37 DEV-15332.pdf<br />

-rw-r--r-- 1 rafidiso infor 49434 Feb 17 11:41 Diapositive1.JPG<br />

-rw-r--r-- 1 rafidiso infor 10515 Jan 7 10:49 difop.pdf<br />

-rw-r--r-- 1 rafidiso infor 353136 Dec 9 14:05 tableau2.pdf<br />

-rw-r--r-- 1 rafidiso infor 3534336 Dec 9 12:34 presentation.ppt<br />

$ logout<br />

Connection closed by foreign host.<br />

lyopcs1 17:19:00 1 /root #<br />

________________________________________________________________<br />

SSH<br />

Telnet permet d’exécuter des commandes sur un hôte distant mais la communication n’est<br />

pas sécurisée. Le protocole SSH (Secure Shell) permet d’accéder à une machine à<br />

travers une communication chiffrée.<br />

Il y a 2 versions majeures du protocole SSH, la version 2 n‘étant pas vulnérable<br />

à un trou de sécurité particulier à la première version du protocole.<br />

La version 2 propose aussi un moyen de transfert de fichier sécurisé.<br />

L’établissement d’une connexion SSH se réalise en plusieurs étapes :<br />

Le client et le serveur négocient tout d’abord l’algorithme de chiffrement.<br />

Le serveur transmet sa clé publique au client. Le client génère ensuite une clé de session<br />

qui est chiffrée grâce à la clé publique du serveur. La communication est cryptée en<br />

utilisant cette clé de session.<br />

A la première connexion ssh entre 2 machines, on a un message qui s’affiche sur le client<br />

demandant d’accepter ou non la connexion.<br />

Le message indique bien que l’authenticité de la machine ne peut être établie.<br />

________________________________________________________________<br />

exemple :<br />

lyopcs1 17:31:30 0 /root $<br />

lyopcs1 17:31:30 0 /root $ ssh rafidiso@lyopcs326.in2p3.fr<br />

The authenticity of host 'lyopc326 (134.158.138.176)' can't be<br />

established.<br />

RSA key fingerprint is<br />

a1:22:f4:9e:4f:cc:fa:10:a2:8d:9f:9a:17:ba:44:2f.<br />

Are you sure you want to continue connecting (yes/no)? yes


Warning: Permanently added 'lyopc326,134.158.138.176' (RSA) to the<br />

list of known hosts.<br />

rafidiso@lyopcs326.in2p3.fr's password:<br />

Last login: Mon Mar 22 17:14:29 2004 from lyopcs1<br />

$<br />

________________________________________________________________<br />

Pour véritablement contrôler l’identification de la machine distante, il faudrait demander<br />

auprès de l’administrateur de cette machine de valider la clé publique présentée.<br />

Une fois la première connexion établie, le client enregistre la clé d’hôte du serveur. La<br />

machine distante a également une liste de machines qui lui permettra de vérifier que le<br />

client est bien celui qu’il prétend être.<br />

exemple de syntaxe : ssh nom_machine<br />

ssh ne demande pas un identifiant utilisateur (login) comme telnet. Il prend par défaut<br />

l’identifiant utilisateur de la machine locale.<br />

On peut préciser un login au niveau de la commande :<br />

ssh login@nom_machine<br />

________________________________________________________________<br />

exemple 1: connexion simple<br />

lyopcs1 17:30:52 0 /root $ ssh lyopcs9.in2p3.fr<br />

root@lyopcs9.in2p3.fr's password:<br />

Last login: Mon Mar 22 17:30:35 2004 from lyopcs1.in2p3.fr<br />

[root@lyopcs9 root]#<br />

[root@lyopcs9 root]$ hostname<br />

lyopcs9.in2p3.fr<br />

[root@lyopcs9 root]$<br />

[root@lyopcs9 root]$ id<br />

uid=0(root) gid=0(root)<br />

groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)<br />

[root@lyopcs9 root]$<br />

[root@lyopcs9 root]$ logout<br />

Connection to lyopcs9.in2p3.fr closed.<br />

exemple 2: connexion avec un login différent<br />

lyopcs1 17:31:30 0 /root $<br />

lyopcs1 17:31:30 0 /root $ ssh rafidiso@lyopcs9.in2p3.fr<br />

rafidiso@lyopcs9.in2p3.fr's password:<br />

Last login: Mon Mar 22 17:14:29 2004 from lyopcs1<br />

$ hostname<br />

lyopcs9.in2p3.fr<br />

$<br />

$ id<br />

uid=1900(rafidiso) gid=110(infor) groups=110(infor)<br />

$<br />

$logout


Connection to lyopcs9.in2p3.fr closed.<br />

lyopcs1 17:35:17 0 /root $<br />

________________________________________________________________<br />

D’autres fonctionnalités avec ssh<br />

- ssh permet d’exécuter une ou plusieurs commandes sur une machine distante. Le<br />

résultat de la commande s’affiche en local.<br />

exemple de syntaxe : ssh login@nom_machine commande<br />

________________________________________________________________<br />

exemple : passage de 2 commandes sur une machine distante<br />

[ipn@lyopc325 ipn]$<br />

[ipn@lyopc325 ipn]$ ssh lyopc326 ’’who;hostname’’<br />

ipn@lyopc326's password:<br />

dupont :0 Apr 20 14:08<br />

durand pts/0 Apr 20 14:08<br />

lyopc326<br />

[ipn@lyopc325 ipn]$<br />

________________________________________________________________<br />

- ssh permet la redirection X11<br />

Les programmes graphiques utilisent X Window pour s’afficher à l’écran. Avec un serveur<br />

X, on peut exécuter un programme sur une machine distante et avoir son affichage en<br />

local. Normalement, cette communication n’est pas cryptée.<br />

Avec ssh, on peut chiffrer également la communication X Window.<br />

exemple de syntaxe : ssh –X –f nom_machine commande<br />

option ‘-X’ permet la redirection X11<br />

option ‘-f’ met en ssh en arrière-plan après l’exécution de la commande.<br />

- scp (secure copy) permet de copier des fichiers à travers le réseau et la communication<br />

est chiffrée.<br />

voir le paragraphe sur le transfert de fichiers.<br />

Exemples de logiciels client ssh et telnet sur quelques plateformes :<br />

Linux :<br />

Windows :<br />

MacOS 8 et 9 :<br />

ssh et telnet en ligne de commande<br />

putty, SSH secure shell, telnet en ligne de commande<br />

Nifty telnet


MacOS X :<br />

ssh et telnet en ligne de commande<br />

Transfert de fichiers<br />

FTP (File Transfert Protocol)<br />

Le protocole ftp sert au transfert de fichiers.<br />

Il faut s’authentifier pour accéder à un serveur.<br />

Certains serveurs dit publiques acceptent des connexions anonymes. Il suffit alors de<br />

rentrer comme identifiant « anonymous » et comme mot de passe son adresse<br />

électronique (il n’y a pas de vérification).<br />

Un compte sur un serveur ftp définit des privilèges d’accès (écriture/lecture).<br />

Quelques commandes :<br />

help : aide sur les commandes<br />

ftp : connexion à un serveur ftp en ligne de commande<br />

open : se connecte à un serveur ftp<br />

get : récupération d’un fichier<br />

mget : récupération de plusieurs fichiers<br />

put : envoie d’un fichier<br />

mput : envoie de plusieurs fichiers<br />

hash : affichage d’un # pour une unité transférée<br />

ascii/bin : mode de transfert texte ou binaire<br />

prompt : session interactive ou pas<br />

dir : liste le répertoire courant<br />

cd : change de répertoire<br />

pwd : affiche le répertoire courant sur la machine distante<br />

lcd : change de répertoire en locale<br />

close : termine la session ftp<br />

bye, exit : termine la session ftp et quitte le mode interactif ftp.<br />

Remarque : si le nom d’un fichier contient des espaces, il faut saisir le nom avec des<br />

guillemets.<br />

Exemple de logiciels client ftp :<br />

Linux :<br />

ftp, ncftp (en ligne de commande), gftp (graphique)<br />

Windows : ftp (en ligne de commande), smartftp, cuteftp<br />

MacOS : fetch<br />

________________________________________________________________<br />

exemple :<br />

[ipn@lyopc325 ipn]$<br />

[ipn@lyopc325 ipn]$ ftp lyonas1.in2p3.fr<br />

Connected to lyonas1.in2p3.fr (134.158.138.111).<br />

220 LYONAS1 Microsoft FTP Service (Version 5.0).


Name (lyonas1.in2p3.fr:ipn): rafidiso<br />

331 Password required for rafidiso.<br />

Password:<br />

230 User rafidiso logged in.<br />

Remote system type is Windows_NT.<br />

ftp><br />

ftp> dir<br />

227 Entering Passive Mode (134,158,138,111,16,210).<br />

125 Data connection already open; Transfer starting.<br />

03-17-04 12:44PM 2662400 etc.tar<br />

06-25-02 10:00PM 5908 LICENSE<br />

09-24-03 06:16AM 1049600 paris-24-01-b.jpg<br />

06-25-02 10:00PM 13012 README<br />

06-25-02 10:00PM 13012 README2<br />

03-17-04 12:44PM 1587200 root.tar<br />

03-17-04 01:18PM 2738647040 scratch.tar<br />

03-17-04 12:44PM 105482240 tmp.tar<br />

03-17-04 12:43PM 14653440 var.tar<br />

226 Transfer complete.<br />

ftp><br />

ftp> hash<br />

Hash mark printing on (1024 bytes/hash mark).<br />

ftp> prompt<br />

Interactive mode off.<br />

ftp> put commandes.doc<br />

local: commandes.doc remote: commandes.doc<br />

227 Entering Passive Mode (134,158,138,111,16,211).<br />

125 Data connection already open; Transfer starting.<br />

##########################################<br />

226 Transfer complete.<br />

44069 bytes sent in 0.0287 secs (1.5e+03 Kbytes/sec)<br />

ftp><br />

ftp> bin<br />

200 Type set to I.<br />

ftp> lcd<br />

Local directory now /home/ipn<br />

ftp> mget READ*<br />

local: README remote: README<br />

227 Entering Passive Mode (134,158,138,111,16,213).<br />

125 Data connection already open; Transfer starting.<br />

############<br />

226 Transfer complete.<br />

13012 bytes received in 0.00439 secs (2.9e+03 Kbytes/sec)<br />

local: README2 remote: README2<br />

227 Entering Passive Mode (134,158,138,111,16,214).<br />

125 Data connection already open; Transfer starting.<br />

############<br />

226 Transfer complete.<br />

13012 bytes received in 0.00234 secs (5.4e+03 Kbytes/sec)<br />

ftp><br />

ftp><br />

ftp> mkdir reptemp<br />

257 "reptemp" directory created.<br />

ftp> cd reptemp<br />

250 CWD command successful.<br />

ftp>


ftp> dir<br />

227 Entering Passive Mode (134,158,138,111,16,216).<br />

125 Data connection already open; Transfer starting.<br />

226 Transfer complete.<br />

ftp> put commandes.doc<br />

local: commandes.doc remote: commandes.doc<br />

227 Entering Passive Mode (134,158,138,111,16,217).<br />

125 Data connection already open; Transfer starting.<br />

###########################################<br />

226 Transfer complete.<br />

44032 bytes sent in 0.0154 secs (2.8e+03 Kbytes/sec)<br />

ftp> pwd<br />

257 "/reptemp" is current directory.<br />

ftp> cd ..<br />

250 CWD command successful.<br />

ftp> pwd<br />

257 "/" is current directory.<br />

ftp> bye<br />

221<br />

________________________________________________________________<br />

SCP (secure copy )<br />

scp permet de copier des fichiers à travers le réseau et la communication est chiffrée.<br />

Exemple de syntaxe pour l’envoie d ‘un fichier :<br />

scp fichier1 nom_machine:/repertoire_destination/<br />

Exemple de syntaxe pour le rapatriement d’un fichier :<br />

scp nom_machine:/repertoire/fichier2 /repertoire_local/<br />

________________________________________________________________<br />

exemple : rapatriement d’un fichier et on le place dans le<br />

répertoire locale /tmp/<br />

[ipn@lyopc325 ipn]$<br />

[ipn@lyopc325 ipn]$ scp root@lyopc326:/root/addnisuser /tmp/<br />

root@lyopc326's password:<br />

addnisuser 100% |<br />

******************************************************************<br />

***| 6367 00:00<br />

[ipn@lyopc325 ipn]$<br />

________________________________________________________________<br />

Exemple de clients scp :<br />

Linux :<br />

scp, gftp (application graphique)<br />

Windows : winscp<br />

MacOS 8 et 9: Nifty telnet<br />

WGET


wget est un logiciel qui permet de télécharger des fichiers de façon non interactive en http,<br />

https, et ftp. Cette commande peut être utile dans des scripts.<br />

________________________________________________________________<br />

exemple 1: téléchargement d’un fichier sur un serveur ftp<br />

[ipn@lyopc325 ipn]$<br />

[ipn@lyopc325 ipn]$ wget ftp://rpmfind.net/redhat/9/i386/RPMS/lynx-2.8.5-11.i386.rpm<br />

--17:39:08-- ftp://rpmfind.net/redhat/9/i386/RedHat/lynx-2.8.5-11.i386.rpm<br />

=> `lynx-2.8.5-11.i386.rpm'<br />

Resolution de rpmfind.net... complete.<br />

Connexion vers rpmfind.net[195.220.108.108]:21...connecte.<br />

Session debutant sous anonymous...Session etablie!<br />

==> SYST ... complete. ==> PWD ... complete.<br />

==> TYPE I ... complete. ==> CWD //redhat/9/i386/RPMS ... complete.<br />

==> PORT ... complete. ==> RETR lynx-2.8.5-11.i386.rpm ... complete.<br />

Longueur: 1,522,835 (non autorisee)<br />

100%[============================================================================>]<br />

1,522,835 4.00M/s ETA 00:00<br />

17:39:08 (4.00 MB/s) - « lynx-2.8.5-11.i386.rpm » sauvegardee [1522835]<br />

[ipn@lyopc325 ipn]$<br />

exemple 2: téléchargement d’un fichier sur un serveur http<br />

[ipn@lyopc325 ipn]$<br />

[ipn@lyopc325 ipn]$ wget<br />

http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe<br />

--17:47:06-- http://the.earth.li/%7Esgtatham/putty/latest/x86/putty.exe<br />

=> `putty.exe'<br />

Resolution de the.earth.li... complete.<br />

Connexion vers the.earth.li[193.201.200.66]:80...connecte.<br />

requete HTTP transmise, en attente de la reponse...302 Found<br />

Location: http://the.earth.li/~sgtatham/putty/0.54/x86/putty.exe [suivant]<br />

--17:47:11-- http://the.earth.li/%7Esgtatham/putty/0.54/x86/putty.exe<br />

=> `putty.exe'<br />

Connexion vers the.earth.li[193.201.200.66]:80...connecte<br />

requete HTTP transmise, en attente de la reponse...200 OK<br />

Longueur: 372,736 [application/x-msdos-program]<br />

100%<br />

[============================================================================>]<br />

372,736 1.70M/s ETA 00:00<br />

17:47:12 (1.70 MB/s) - « putty.exe » sauvegarde [372736/372736]<br />

[ipn@lyopc325 ipn]$<br />

[ipn@lyopc325 ipn]$<br />

[ipn@lyopc325 ipn]$ ll<br />

total 1916<br />

-rwxr-xr-x 1 ipn ipn 8710 nov 9 2001 acroread<br />

-rw-r--r-- 1 ipn ipn 44032 avr 16 20:49 commandes.doc<br />

-rw-rw-r-- 1 ipn ipn 1522835 avr 20 17:39 lynx-2.8.5-11.i386.rpm<br />

-rw-rw-r-- 1 ipn ipn 372736 fev 12 20:21 putty.exe<br />

[ipn@lyopc325 ipn]$<br />

________________________________________________________________<br />

Points à retenir


* Prise de session distante, utiliser de préference ssh au lieu de telnet<br />

La communication par ssh est chiffrée<br />

exemple de commande : ssh login@nom_machine<br />

* Transfert de fichier : commandes ftp, scp, wget<br />

Un client ftp graphique est plus pratique<br />

wget est pratique si l’on travaille qu’en ligne de commande.


<strong>Chapitre</strong> 9 : Les processus<br />

Principes<br />

Un algorithme d’ordonnancement des tâches permet de servir plusieurs utilisateurs en<br />

leur allouant à chacun une "tranche de temps".<br />

Tout programme ou commande s’exécutant sous Unix entraîne la création d’un<br />

processus. Un processus est l’instance en exécution d’un programme. Un processus a la<br />

possibilité, à son tour, de générer d’autres processus; on parle alors de "fork" : le<br />

processus courant ou processus père crée un processus fils. Le processus père reste en<br />

attente de la fin d’exécution de son fils.<br />

Etant donné un processus, sa filiation (tout processus est fils d’un autre mais peut<br />

également être père) est garantie grâce à des identificateurs numériques associés à<br />

chaque processus que sont le :<br />

• PID : qui identifie le processus courant<br />

• PPID : qui identifie son père<br />

Echappe à cette règle le processus initial (init) dont le PID est égal à 1 et qui est crée en<br />

fin d’initialisation du système Unix. Ce processus est père d’un certain nombre de<br />

processus de base tels que les processus de gestion de login, de gestion des fichiers,<br />

etc...<br />

Vous aurez accès à l’état de vos processus grâce à la commande ps. L’exemple suivant<br />

est un retour de la commande ps utilisée sans option :<br />

_______________________________________________________________________<br />

$ ps<br />

PID TTY TIME CMD<br />

31156 pts/2 0:00 xcalc<br />

38143 pts/2 0:00 ps<br />

39071 pts/2 0:00 -tcsh<br />

_______________________________________________________________________<br />

Ici 3 processus sont actifs pendant l’exécution de ps. Il s’agit de tcsh (puisque vous êtes<br />

en permanence sous le contrôle d’un shell de connexion), de la commande ps et d’une<br />

autre application xcalc. La première colonne affiche le PID de chaque processus.<br />

On obtiendra des informations plus détaillées (heure de démarrage et durée de vie du


processus, processus des autres utilisateurs, etc...) avec les options e et f de ps :<br />

_______________________________________________________________________<br />

$ ps -ef<br />

USER PID PPID C STIME TTY TIME CMD<br />

root 10078 1319 0 Oct 02 - 0:00 /usr/etc/rpc.lockd<br />

root 10342 1319 0 Oct 02 - 0:00 /etc/writesrv<br />

larrieu 11536 1 0 Oct 09 hft/1 1:33 netscape<br />

larrieu 11917 15492 0 Oct 08 hft/1 0:00 xss<br />

larrieu 13004 19602 4 13:20:46 pts/0 0:00 grep larrieu<br />

larrieu 15492 14718 0 Oct 08 hft/1 2:15 mwm<br />

____________________________________________________________________________________<br />

Mode d’exécution<br />

Deux modes d’exécution sont possibles pour un processus :<br />

• Le premier plan (ou foreground). On tape le nom d’une commande suivi de<br />

. Il faudra attendre la terminaison de ce processus pour lancer un nouveau<br />

processus à partir de la ligne de commande.<br />

• L’arrière plan (ou background). On tape la commande suivie de & puis .<br />

On libére alors immédiatement l’entrée standard, permettant ainsi la saisie d’une<br />

nouvelle commande.<br />

Le shell maintient en permanence une table de tâches actives. Supposons que vous<br />

lanciez une calculette en arrière plan par :<br />

___________________________________________________________________<br />

$ xcalc &<br />

[1] 31156<br />

___________________________________________________________________<br />

Cette réponse vous indique qu’il s’agit de la tâche numéro 1 ayant pour PID 31156. Le<br />

numéro de tâche est utilisé pour contrôler le mode d’exécution d’un processus :<br />

___________________________________________________________________<br />

$ fg %1<br />

___________________________________________________________________<br />

ramènera au premier plan, le processus initialement en arrière plan.<br />

Si vous avez lancé un processus au premier plan, vous pourrez toujours le dérouter vers<br />

l’arrière plan, sans l’interrompre par un signal "terminant", mais en suspendant son activité<br />

par la séquence de touches ; vous obtiendrez alors une réponse du type :<br />

___________________________________________________________________<br />

$


^Z[2] + 31040 Stopped xclock<br />

$ bg %2<br />

___________________________________________________________________<br />

La commande jobs permet de récupérer les numéros de tâches actives en arrière plan à<br />

un instant donné.<br />

___________________________________________________________________<br />

$ jobs<br />

[2] + Running xclock<br />

[1] - Running xcalc<br />

___________________________________________________________________<br />

Indique que 1 et 2 sont les numéros de tâches associés respectivement aux processus<br />

test et xcalc<br />

Interruption des processus<br />

Les processus communiquent entre eux à l’aide de signaux. C’est grâce à ces mêmes<br />

signaux, que l’utilisateur interagira avec les processus dont il est propriétaire. Ainsi un<br />

processus lancé sur la ligne de commande au premier plan est interruptible par un<br />

ce qui correspond à l’émission d’un signal INTR.<br />

Dans le cas général, c’est la commande kill qui permet de contrôler l’utilisation des<br />

signaux.<br />

Pour afficher la liste des signaux disponibles faites :<br />

___________________________________________________________________<br />

$ kill -list<br />

HUP INT QUIT ILL TRAP IOT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP<br />

TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ MSG WINCH PWR USR1 USR2 PROF DANGER<br />

VTALRM MIGRATE PRE GRANT RETRACT SOUND SAK<br />

___________________________________________________________________<br />

Pour envoyer une signal à un processus, on peut utiliser diverses formes de la commande<br />

kill :<br />

____________________________________________________________________<br />

$ kill -SIG-NAME PID<br />

ou<br />

$ kill -SIG-INDEX PID<br />

____________________________________________________________________<br />

où SIG-NAME est le nom du signal (par exemple INT ou KILL)<br />

SIG-INDEX est le numéro d’index du signal dans la liste des signaux (2 pour INT et 9


pour KILL par exemple)<br />

ou bien encore<br />

_____________________________________________________________________<br />

$ kill -SIG-NAME %job<br />

$ kill -SIG-INDEX %job<br />

_____________________________________________________________________<br />

on utilise ici le numéro de job plutôt que le PID.<br />

Exemple : pour envoyer le signal TERM au processus de PID 1234, tapez :<br />

_____________________________________________________________________<br />

$ kill -TERM 1234<br />

ou<br />

$ kill -15 1234<br />

_____________________________________________________________________<br />

On peut également utiliser la commande stop pour suspendre un processus en le<br />

désignant par son PID:<br />

_____________________________________________________________________<br />

$ stop 1234<br />

_____________________________________________________________________<br />

La commande cron<br />

S’utilise pour effectuer une même tâche périodiquement. La commande /etc/cron<br />

peut être activée au démarrage du système (dans un /etc/rc*). Sa configuration<br />

s’appuie sur 3 fichiers :<br />

/var/spool/cron/. Répertoire où sont stockés les tables cron. Un fichier par utilisateur<br />

autorisé portant le même nom.<br />

cron.allow (généralement dans /var/adm/cron). Fichier consignant les utilisateurs<br />

autorisés à utiliser cron.<br />

cron.deny (généralement dans /var/adm/cron). Fichier des interdits.<br />

Liste les utilisateurs non-autorisés à utiliser cron. Ou interdiction temporaire pour ceux<br />

listés dans cron.allow<br />

Une table cron ou crontab<br />

C’est un fichier que l’on construit dans son propre repertoire. Sur chaque ligne, on associe<br />

une périodicité à une commande. Sa structure est<br />

:___________________________________________________________________


Minutes ( 0 à 59)<br />

Heures (0 à 23)<br />

Jours (1 à 31)<br />

Mois (1 à 12)<br />

Jour de la semaine (0 à 6)<br />

Commande<br />

___________________________________________________________________<br />

Autres paramètres<br />

- signifie "de .... à"<br />

10-20 = toutes les minutes de 10 à 20<br />

, est un séparateur de plusieurs valeurs<br />

0,2 = dimanche et mardi<br />

* toutes les valeurs possibles d’un champ<br />

% remplace l’entrée standard<br />

Exemple d’utilisation de cron<br />

On crée un fichier contenant :<br />

______________________________________________________________<br />

30 7 * * 1,3,5 /home/toto/rm_core<br />

15 9,14 * 1-6,9-12 1-5 /etc/wall%News a lire%<br />

______________________________________________________________<br />

• Ligne 1<br />

execute rm_core à 7h30, lundi, mercredi et vendredi<br />

• Ligne 2<br />

Envoie à tous le message News à lire à 9h15 et 14h15


du lundi au vendredi, chaque mois sauf juillet et août<br />

Transférer le fichier que l’on a par exemple nommé crt, dans le répertoire de cron cad vers<br />

/varr/spool/cron/<br />

$ crontab crt<br />

Vérifier ce qui sera exécuté par cron :<br />

$ crontab –l<br />

Edition des crontabs (attention! n’altère pas le fichier crt)<br />

$ crontab –e<br />

La commande at<br />

Permet de démarrer une tâche à une date précise<br />

Sa configuration s’appuie sur 3 fichiers :<br />

/var/spool/at/ Répertoire où sont stockés les fichiers at.<br />

at.allow Fichier consignant les utilisateurs autorisés à utiliser at.<br />

at.deny Liste les utilisateurs non-autorisés à utiliser at.<br />

at.allow n’existe pas<br />

at.allow existe<br />

at.deny n’existe pas Seul root peut faire at seuls ceux qui apparaissent<br />

sont autorisés<br />

at.deny existe Ceux qui ne sont pas interdits sont<br />

autorisés<br />

At.allow consulté en premier<br />

Exemple d’utilisation de at<br />

Effacer tous les fichiers core ce soir à 21h<br />

___________________________________________________________________<br />

$ at 2100 today<br />

find / -name core -exec rm {} ’;’<br />


Job 4 at 1998-02-10 22:0<br />

Lister les tâches en queue<br />

___________________________________________________________________<br />

$ at -l<br />

3 at 1998-02-10 22:00<br />

4 at 1998-02-10 22:00 a<br />

___________________________________________________________________<br />

Affiche le contenu d’une tâche<br />

______________________________________________________________<br />

$ at -c 4<br />

ici des variables d’environnement sont transmises.<br />

....<br />

find / -name core -exec rm {} ’;’<br />

_______________________________________________________________<br />

Supprimer une tâche<br />

______________________________________________________________<br />

$ at -r 4<br />

______________________________________________________________


<strong>Chapitre</strong> 10 : Eléments de programmation Shell<br />

Comme nous l’avons déjà évoqué, les shells sous Unix sont en général à la fois des outils<br />

d’interaction entre l’utilisateur et le noyau du système mais également peuvent être<br />

utilisés en tant que langage de programmation interprété.<br />

Les commandes<br />

Sur une ligne de commande vont apparaître une ou plusieurs commandes (commandes<br />

Unix ou commandes intrinsèques au shell) ainsi qu’éventuellement des séparateurs et<br />

des terminateurs.<br />

Les caractères séparateurs et terminateurs<br />

; permet de séparer plusieurs commandes sur une même ligne. Exemple :<br />

&<br />

&&<br />

______________<br />

$ date ; ls<br />

______________<br />

La commande date sera exécutée suivie par la commande ls<br />

va créer un processus d’arrière plan de la commande qui le précède donc cela<br />

détachera le processus du terminal.<br />

Lorsque le caractère & est doublé ceci indique au shell de n’exécuter ce qui suit &&<br />

qu’à condition que l’exécution de ce qui le précède ait réussie. Exemple :<br />

____________________________________<br />

$ grep bash toto && echo Bravo<br />

#!/bin/bash<br />

Bravo<br />

____________________________________<br />

Ayant trouvé la chaîne bash dans le fichier toto, on affiche Bravo<br />

| le symbole pipe utilisé seul dans le cadre des redirections.<br />

|| Lorsque ce caractère est doublé ceci indique au shell de n’exécuter ce qui suit || qu’à<br />

condition que l’exécution de ce qui le précède ait échouée. Exemple:


__________________________________________<br />

$ touch /etc/new || echo On doit être root pour ca<br />

touch: 0652-046 Cannot create /etc/new.<br />

__________________________________________<br />

On doit être root pour ça. La création du fichier /etc/new a échoué alors on envoie<br />

un message.<br />

Exécution de commandes et substitution<br />

Le Korn shell offre la possibilité des substituer le résultat d’une commande sur la ligne de<br />

commande ou d’affecter ce résultat à une variable du shell.. La syntaxe pour aboutir à<br />

cette substitution est $( commande ) . Par exemple :<br />

_______________________________________________________________________<br />

$ ls<br />

bb cc param<br />

$ echo "Liste des fichiers :" $(ls)<br />

liste des fichiers : bb cc param<br />

______________________________________________________________________________________<br />

Va substituer la liste des fichiers sur la ligne des commande puis lui appliquer la<br />

commande echo.<br />

L’affectation d’une variable se fait de la même façon :<br />

_______________________________________________________________________<br />

$ var=$(id)<br />

$ echo "je suis" $var<br />

uid=311(larrieu) gid=102(ccnrs)<br />

______________________________________________________________________________________<br />

L’autre notation que l’on rencontre souvent pour la substitution des commandes consiste à<br />

placer la commande entre anti-cotes :<br />

var=‘id‘ est identique à var=$(id) , cette dernière étant la notation standardisée pour la<br />

substitution de commandes.<br />

La substitution de la tilde<br />

Le shell utilise la tilde (~) pour représenter les répertoires "home" des utilisateurs. Il faut<br />

noter cependant que la substitution ne pourra avoir lieu que si la tilde est le premier<br />

caractère d’une chaine ( par exemple ab~c ne subira aucune substitution)<br />

Utilisée seule ou suivie du caractère / , elle se réfère à votre propre répertoire "home". Le


shell lui substitue la valeur du chemin absolu du répertoire "home". L’utilisation de ~ et la<br />

variable d’environnement $HOME sont équivalentes. Par exemple<br />

_______________________________________________________________________<br />

$ echo ~<br />

/home/pierre<br />

$ echo $HOME<br />

/home/pierre<br />

______________________________________________________________________________________<br />

Concaténée avec un nom valide d’utilisateur, le shell lui substitue le chemin absolu du<br />

répertoire home de cet utilisateur<br />

_______________________________________________________________________<br />

$ echo ~toto<br />

/home/toto<br />

_______________________________________________________________________<br />

Si le nom d’utilisateur n’est pas valide (par exemple ubidon), aucune substitution n’aura<br />

lieu.<br />

_______________________________________________________________________<br />

$ echo ~ubidon<br />

~ubidon<br />

______________________________________________________________________________________<br />

Gestion des scripts shell<br />

C’est grâce à son éditeur favori que l’utilisateur pourra créer le plus simple des scripts<br />

shell qui contiendra une ou plusieurs commandes Unix. Outre les commandes système,<br />

des constructions propre au shell (boucles, sélections, comparaisons, etc...) permettront<br />

d’écrire des procédures plus complexes.<br />

Un shell script est un ensemble de commandes et de commentaire non exécutables. Tout<br />

ce qui suit sur une même ligne, le caractère # constitue un commentaire. Ce caractère<br />

peut se trouver aussi bien en début de ligne qu’après une instruction.<br />

Conventionnellement et pour être sûr que le script shell soit interprété à coup sur par le<br />

"bon interpréteur" (ici en l’occurrence le bash), il faudra que la première ligne du fichier<br />

commence par :<br />

#!/bin/bash<br />

L’ exécution de shell-scripts


Il existe plusieurs façons de mettre un script shell (que nous appellerons fichier) en<br />

exécution.<br />

La méthode "point" . On tape un point, un espace, le nom du fichier avec ses éventuels<br />

arguments :<br />

_______________________________________________________________________<br />

$ . fichier<br />

_______________________________________________________________________<br />

Dans ce cas les commandes contenu dans le fichier seront exécutées par le shell courant<br />

et sont traitées comme des commandes internes au shell. Il n’y a pas création d’un sous<br />

shell.<br />

Pour que cette méthode fonctionne, la variable PATH doit contenir le répertoire courant où<br />

est localisé fichier ou bien fichier est un chemin absolu. Dans le cas contraire, on<br />

obtiendra quelque chose comme :<br />

bash: fichier: not found.<br />

La méthode directe. On tape le nom du fichier suivi des ses arguments. Le nom pouvant<br />

être simplement le nom du fichier ou un chemin absolu d’accès au fichier. Dans ce cas, le<br />

script shell devra avoir les "mode bits" de lecture et d’exécution positionnés pour pouvoir<br />

s’exécuter :<br />

_______________________________________________________________________<br />

$ fichier [ arg1 arg2 ..... argn ]<br />

_______________________________________________________________________<br />

Il y a la création d’un sous shell , fils du shell courant.<br />

La création d’un shell fils du shell courant au sein duquel s’exécuteront les commandes du<br />

fichier script shell :<br />

_______________________________________________________________________<br />

$ bash fichier [ arg1 arg2 ...... argn ]<br />

L’exécution en arrière plan.<br />

_______________________________________________________________________<br />

$ fichier &<br />

_______________________________________________________________________<br />

Dans ce cas il y a également création d’un sous shell mais avec libération du terminal<br />

attaché au shell courant.


Eléments syntaxiques<br />

P aramètres positionnels<br />

Une procédure peut recevoir des arguments. Ces paramètres sont positionnels sur la<br />

ligne de commande. La façon de les référencer peut être décrite par la procédure suivante<br />

que nous nommerons proc :<br />

____________________________________________________________________<br />

#!/bin/bash<br />

echo $0 # Nom de la commande<br />

echo $1 # Premier parametre<br />

echo $2 # Second parametre<br />

____________________________________________________________________<br />

Appelons cette procédure comme suit :<br />

___________________________________________________________________<br />

$ proc aa bbb<br />

proc<br />

aa<br />

bbb<br />

___________________________________________________________________<br />

La commande eval<br />

Le shell dispose d’une commande unique : eval qui permet une double interprétation<br />

d’une expression. Le shell interprète une fois la ligne de commande et passe ses<br />

arguments à la commande eval qui effectue une seconde interprétation.<br />

Cette commande permet de construire dynamiquement des variables ou encore permet<br />

l’exécution de commandes préalablement construites qui n’auraient pu l’être sans son<br />

utilisation. Exemple :<br />

___________________________________________________________________<br />

$ eval file=~$user/.rhosts<br />

$ echo $file<br />

/home/toto/.rhosts<br />

_________________________________________________________________________________<br />

Ici au premier passage $user est évalué et au deuxième passage l’expansion de la tilde a


lieu. Sans l’utilisation de la commande eval, file se serait vu affecter la chaîne<br />

~toto/.rhosts et lors de l’utilisation de la variable file plus aucune autre substitution n’aurait<br />

eu lieu.<br />

Les tests<br />

La plupart des langages de programmation disposent de constructions permettant<br />

d’effectuer des test, il en va de même du Korn shell. La formulation d’expressions<br />

conditionnelles qui entreront en jeu au sein de structures de contrôle est réalisée à l’aide<br />

d’opérateurs de test ou de mots clé s’appliquant à des objets.<br />

Pour évaluer une expression conditionnelle et retourner 1 ou 0, on utilise la syntaxe :<br />

[[ instruction-conditionnelle ]]<br />

L’instruction à évaluer sera donc soit :<br />

Un test sur les fichiers ou les répertoires<br />

-a fichier retourne 1 si fichier existe<br />

-d fichier fichier est un répertoire<br />

-x fichier fichier existe et est exécutable par le processus courant<br />

Un test des dates de création<br />

fic1 -nt fic2 retourne 1 si fic1 est plus récent que fic2<br />

fic1 -ot fic2 retourne 1 si fic1 est plus vieux que fic2<br />

Une comparaisons de chaines<br />

str1 = str2 Vrai si str1 est identique à str2<br />

str1 != str2 Vrai si str1 est différent de str2<br />

-z str1 retourne 1 si str1 est de longueur nulle<br />

Une comparaison de valeurs entières<br />

val1 -eq val2 Vrai si val1 est identique à val2<br />

val1 -ne val2 Vrai si val1 est différent de val2<br />

val1 -lt val2 Vrai si val1 est plus petit que val2<br />

Structures de contrôle<br />

Les instructions " if/then/else"<br />

Sa syntaxe est la suivante :


if condition de test<br />

then expressions<br />

[else instructions ]<br />

fi<br />

ce qui apparaît entre crochets est facultatif. Une application courante est le test des codes<br />

de retour de commandes :<br />

_______________________________________________________________________<br />

# Exemple : test du code de retour de la commande "macmd"<br />

#<br />

macmd<br />

if [[ $? -eq 0 ]]<br />

then<br />

echo Tout va bien<br />

else<br />

echo Il y a eu un problème<br />

exit 3<br />

fi<br />

_______________________________________________________________________<br />

Les boucles<br />

On distinguera deux types de boucles :<br />

la boucle for<br />

for variable in liste-de-valeurs<br />

do<br />

liste-de-commandes<br />

done<br />

les boucles while et until.<br />

while condition-satisfaite<br />

do<br />

liste-de-commandes<br />

done<br />

La boucle until a la même syntaxe que while mais à la différence de until, ce type de boucle<br />

s’exécute jusqu’à ce que la condition exprimée soit satisfaite.<br />

Exemples :<br />

_______________________________________________________________________<br />

# On supprime tous les fichiers dont le nom débute par "file"<br />

# suivi d’un numérique compris entre 1 et 4


for ndx in 1 2 3 4<br />

do<br />

rm file.$ndx<br />

done<br />

_______________________________________________________________________<br />

# Calcul d’une factorielle<br />

#<br />

n=$1<br />

fact=1<br />

while [ $n != 1 ]<br />

do<br />

let fact=fact*n<br />

let n=n-1<br />

done<br />

echo factorielle $1 = $fact<br />

_______________________________________________________________________<br />

Les instructions d’entrée/sortie<br />

Le Korn shell permet de lire des lignes à partir de l’entrée standard et de les éclater dans<br />

des variables apparaissant sur la commande de lecture read. La syntaxe de base est :<br />

read var1 var2 ...<br />

Exemple :<br />

_______________________________________________________________________<br />

$ echo I/O error | read aa bb<br />

$ echo $aa; echo $bb<br />

I/O<br />

error<br />

_______________________________________________________________________<br />

Outre la commande echo pour afficher sur la sortie standard, le shell offre la commande<br />

print qui lui est similaire. print possède cependant quelques options additionnelles comme<br />

_______________________________________________________________________<br />

$ print -n "Entrer une valeur: " ; read val<br />

Entrer une valeur :<br />

______________________________________________________________________________________


n’émettra pas de retour chariot après l’affichage, c’est équivalent à utiliser le caractère \c<br />

dans la ligne d’argument de la commande echo :<br />

_______________________________________________________________________<br />

$ echo "Entrer une valeur: \c"<br />

_______________________________________________________________________


<strong>Chapitre</strong> 11 : Création d’applications<br />

Les compilateurs<br />

De façon générale sur UNIX le compilateur fortran s'appelle f77, le C cc, le C++ CC. Pour<br />

LINUX les compilateurs sont g77, gcc et g++. Les options des compilateurs sont quasiidentiques<br />

si bien que nous les citerons globalement.<br />

Par défaut l'appel à un compilateur génère la compilation et l'édition de liens (ld), le fichier<br />

intermédiaire objet (.o) étant automatiquement effacé.<br />

Par défaut il n'y a pas de phase d'optimisation.<br />

Si l'on ne précise pas de nom pour l'exécutable à créer, celui-ci s'appelle a.out.<br />

L'appel étant unique pour le compilateur et l'editeur de liens, les options sont passées<br />

simultanément, certaines s'adressant au compilateur d'autres à l'editeur de liens.<br />

Options concernant le compilateur :<br />

• -c : n'appelle pas ld et conserve le .o<br />

• -On : appel de l'optimiseur niveau n<br />

• -g : prépare pour le débogueur<br />

• -temp=répertoire : définit un nouveau répertoire pour les fichiers temporaires<br />

lorsque la place dans /tmp est insuffisante<br />

Options concernant ld :<br />

• -o nom : nom de l'exécutable de sortie<br />

• -lnom : appel de la librairie nom<br />

• -Lrépertoire : répertoire de recherche des librairies appelées si elles sont situées<br />

ailleurs que dans /lib, /usr/lib, /usr/local/lib<br />

Les librairies<br />

Une librairie est un fichier archive qui contient une série de fichiers, en l’occurrence des<br />

objets compilés (.o) qui correspondent à des fonctions programmées spécifiques et<br />

auxquelles vous ferez appel dans vos programmes. Les librairies servent donc à éviter de<br />

re-inclure dans vos sources des fonctions écrites une fois pour toutes. La fonction en<br />

librairie utilisée sera incluse lors de la phase de création de l’exécutable (édition de liens).<br />

Par défaut les librairies sont situées dans /lib ou /usr/lib mais vous pouvez bien sur créer<br />

vos propres librairies chez vous. Il faudra alors signaler à l'éditeur de liens le chemin<br />

d'accès à ces librairies (par l'option –L lors de la compilation), ou maintenir la liste des<br />

chemins dans une variable d'environnement (différente selon le système UNIX).<br />

L'option -l d'appel à une librairie est utilisée sous la forme –lnom et fait appel à une<br />

librairie de nom libnom.a.<br />

Ainsi on créera donc libmalib.a pour appeler -lmalib<br />

L'outil de construction et maintenance de librairies s'appelle ar<br />

ar [rxdtv] librairie [fichier]<br />

• r : remplace ou ajoute un fichier dans la librairie; crée la librairie si elle n'existe pas


• x : extrait un fichier de la librairie<br />

• d : efface un fichier dans la librairie<br />

• t : liste le contenu de la librairie<br />

• v : mode parlant<br />

L’utilitaire make<br />

Cet outil permet de construire un exécutable à partir de l'ensemble de ces dépendances. Il<br />

n'est intéressant à mettre en oeuvre que si l'exécutable dépend de nombreuses sources.<br />

La construction se fait par la commande make à partir des instructions indiquées dans un<br />

fichier d'utilisation de make, appelé par défaut « Makefile » ou « makefile ».<br />

Toute la difficulté réside pour le concepteur dans l’écriture du makefile qui doit décrire<br />

astucieusement toutes les étapes de constructions de l’exécutable.<br />

Les construction et reconstruction de l’exécutable final sont particulièrement facilitées<br />

pour l’utilisateur, make travaillant par comparaison de date entre l'exécutable et ses<br />

dépendances. make ne re-exécute que les actions dépendant de modules dont la date de<br />

création est postérieure à la précédente date de construction de l'exécutable, et recrée cet<br />

exécutable automatiquement.<br />

make est très utilisé notamment pour diffuser des applications sous forme de sources, afin<br />

que l’utilisateur n’ait pas à se poser de questions quand aux compilations mais ait juste à<br />

taper make.<br />

Un fichier makefile peut contenir plusieurs objectifs à construire, appelés cibles.<br />

make<br />

make [-f fichier] [cible] : construit la cible précisée ou la première décrite si cible est omis.<br />

On décrira donc en général la cible totale en premier dans le makefile.<br />

• -f fichier : précise un fichier d'utilisation si le nom est différent de Makefile ou<br />

makefile<br />

Ecriture du fichier makefile :<br />

cible1:dépendances [cible2 cible3...]<br />

action<br />

cible2:dépendances<br />

action<br />

...<br />

On peut définir des variables dans le fichier makefile, et mettre des commentaires<br />

commençant par #.<br />

(Dans l'exemple suivant le touch des fichiers sert uniquement à modifier leur date de mise<br />

à jour et donc à simuler une édition avec modification de la source qui, aurait le même<br />

effet sur la date de dernière modification.)<br />

______________________________________________________________________<br />

exemple :<br />

$ cat makefile<br />

# construit s1 a partir de s1.f s2.f s3.f


#<br />

LIB=-L. -lmalib<br />

#<br />

s1:s1.o s2.o libmalib.a<br />

g77 -o s1 s1.o s2.o \$(LIB)<br />

s1.o:s1.f<br />

g77 -c s1.f<br />

s2.o:s2.f<br />

g77 -c s2.f<br />

libmalib.a:s3.o<br />

ar r libmalib.a s3.o<br />

s3.o:s3.f<br />

g77 -c s3.f<br />

$ make<br />

g77 -c s1.f<br />

s1.f:<br />

MAIN:<br />

g77 -c s2.f<br />

s2.f:<br />

sub1:<br />

g77 -c s3.f<br />

s3.f:<br />

sub2:<br />

ar r libmalib.a s3.o<br />

g77 -o s1 s1.o s2.o -L. -lmalib<br />

$ make<br />

`s1' is up to date.<br />

$ touch s1.f<br />

$ make<br />

g77 -c s1.f<br />

s1.f:<br />

MAIN:<br />

g77 -o s1 s1.o s2.o -L. -lmalib<br />

$ touch s3.f<br />

$ make<br />

g77 -c s3.f<br />

s3.f:<br />

sub2:<br />

ar r libmalib.a s3.o<br />

g77 -o s1 s1.o s2.o -L. -lmalib<br />

______________________________________________________________________<br />

Analyse en temps


2 commandes permettent une analyse en temps d’exécution de vos applications. La<br />

première très simple mais grossière, la seconde plus lourde mais fournissant une analyse<br />

fine, fonction par fonction.<br />

time<br />

time exécutable : exécute le programme et donne à la fin les 3 temps : écoulé total, cpu<br />

pur, passé en tache système.<br />

prof<br />

prof [exécutable] : effectue une analyse fine, module par module, du temps consommé.<br />

Nécessite que la source ait été compilée avec l'option -p<br />

Le lancement de l'exécutable crée un rapport dans un fichier mon.out<br />

prof exécutable analyse le rapport qui a été crée par le lancement de l'exécutable et<br />

affiche à l'écran les résultats.<br />

Utilise un exécutable a.out si aucun nom n'est spécifié en paramètre.<br />

Des options permettent de n'avoir qu'un résumé des résultats.<br />

Le debugger<br />

Chaque système UNIX dispose en standard d’un debugger. Celui-ci est un outil interactif<br />

qui va permettre de faire tourner votre programme pas à pas, en indiquant des points<br />

d’arret, le suivi de variables, etc….<br />

Le debugger standard UNIX s’appelle dbx mais sous LINUX c’est gdb.<br />

Le principe est le suivant : on compile le programme avec l’option –g puis on lance ce<br />

programme sous le contrôle du debugger : gdb monprogramme<br />

Si le nom de programme n’est pas fourni, a.out est pris par défaut.<br />

Lorsqu’une application UNIX « plante » pendant l’exécution, un fichier core est créé,<br />

correspondant à l’image mémoire de l’application au moment de l’arret. Le debugger<br />

permet également d’analyser ces « core » (gdb core) afin d’essayer de comprendre le<br />

problème.<br />

Une fois lancé, le debugger fournit alors un invite avec une aide intégrée. Nous n’irons<br />

pas plus loin sur l’utilisation, qui est un domaine assez spécialisé, l’essentiel étant que<br />

vous connaissiez l’existence de l’outil.


<strong>Chapitre</strong> 12 : Quelques outils sous linux<br />

L’archivage et la compression de fichiers<br />

Beaucoup de fichiers téléchargeables sur Internet sont compressés. Cela permet de<br />

transférer un volume de données moins important tout en ayant la possibilité de restaurer<br />

(décompresser) les fichiers tels qu’ils étaient au départ.<br />

Une archive est un fichier qui peut contenir des répertoires et des fichiers.<br />

- Le format .tar.gz<br />

Un fichier ayant l’extension .tar.gz (ou .tgz) est un format très répandu. Cette extension<br />

indique que le fichier est une archive tar qui a été compressée avec gzip.<br />

La commande ‘tar’ permet notamment de créer et de restaurer une archive.<br />

Exemples :<br />

* pour créer et compresser une archive :<br />

tar cfvz nom_archive.tar.gz /repertoire1<br />

option ‘c’ : indique qu’on crée une nouvelle archive<br />

option ‘v’ : visualise les fichiers traités par la commande tar<br />

option ‘f’ : indique l’élément à archiver<br />

option ‘z’ : compresse l’archive<br />

* pour extraire et décompresser une archive :<br />

tar xzvf nom_archive.tar.gz<br />

option ‘x’ : extrait l’archive<br />

option ‘z’ : ici, décompresse l’archive<br />

* pour lister le contenu d’une archive :<br />

tar –tvf nom_archive.tar<br />

remarque : la commande ‘gunzip’ permet de décompresser les fichiers gzip.<br />

- Le format bz2<br />

Ce format de compression est plus performant que gzip.<br />

Pour décompresser un fichier .tar.bz2, on peut utiliser la commande :<br />

bzip2 –d nom_fichier.tar.bz2<br />

ensuite, il faut extraire l’archive obtenue avec la commande :<br />

tar xvf nom_fichier.tar


On peut également décompresser et extraire l’archive avec tar :<br />

tar xjvf nom_fichier.tar.bz2<br />

Installation d’un programme contenu dans une archive tar<br />

Une grande partie des programmes à installer sont des archives tar compressées avec<br />

gzip (extension .tar.gz ou .tgz) ou bzip2 (extension .tar.bz2)<br />

Pour décompresser l’archive compressée avec gzip et extraire les fichiers, on utilise la<br />

commande :<br />

tar xzvf nom_fichier.tar.gz<br />

option ‘x’ : extrait les fichiers de l’archive<br />

option ‘z’ : décompresse l’archive (compressée avec gzip)<br />

option ‘v’: visualise les fichiers en cours de traitement par la commande<br />

option ‘f’ : indique le fichier traité par la commande<br />

Pour décompresser l’archive compressée avec bzip2 et extraire les fichiers, on utilise la<br />

commande :<br />

tar xjvf nom_fichier.tar.bz2<br />

option ‘j’ : décompresse l’archive (compressée avec bzip2)<br />

Les fichiers obtenus sont soit un binaire directement exécutable,<br />

soit il faut compiler le programme pour qu’il puisse fonctionner.<br />

Pour compiler le programme, il faut se placer dans le répertoire qui a été extrait de<br />

l’archive, puis passer les commandes :<br />

./configure : construit le fichier ‘makefile’ qui servira pour la compilation et éventuellement<br />

crée d’autres fichiers.<br />

On peut passer des options à cette commande. Il faut lire le fichier texte relatif à<br />

l’installation du programme (ce fichier s’appelle généralement INSTALL).<br />

make : compile le programme<br />

make install : installe le programme compilé.<br />

Les paquetages RPM (Red Hat Package Manager)<br />

RPM est un outil développé par RedHat pour gérer les paquetages.


Cet outil fonctionne sur les distributions Redhat mais également sur d’autres linux comme<br />

Mandrake ou Suse.<br />

Cet outil permet à l’utilisateur d’installer, de supprimer ou de mettre à jour facilement des<br />

logiciels et cela avec de simples commandes.<br />

Il existe des logiciels comme gnorpm et kpackage qui permettent de gérer les RPMs via<br />

une interface graphique.<br />

RPM maintient une base de données des paquetages installés et de leurs fichiers. Cela<br />

permet de connaître simplement l’état du système sur les logiciels, leurs versions et les<br />

fichiers installés.<br />

Pour un paquetage, RPM vérifie les dépendances par rapport à d’autres paquetages.<br />

Cela signifie par exemple que pour une installation d’un paquetage, RPM signale les<br />

paquetages manquants pour que l’installation et le logiciel fonctionnent correctement.<br />

Les noms des paquetages RPMS sont de la forme :<br />

..>..rpm<br />

: nom du logiciel<br />

: version du logiciel<br />

: version du paquetage<br />

: identifie la plateforme pour lequel le paquetage est prévu (i386, alpha, …)<br />

exemples :<br />

- nedit-5.0.2-4.sparc.rpm : 4 ème version du paquetage ‘nedit’ version 5.0.2 pour une<br />

plateforme Sun.<br />

- nedit-5.3-1.i386.rpm : 1ère version du paquetage ‘nedit’ version 5.3 pour une plateforme<br />

Intel.<br />

Des liens pour chercher des paquetages rpms :<br />

http://rpmfind.net<br />

http://rpm.pbone.net/<br />

Exemples de commandes :<br />

* installation d’un paquetage rpm –i paquetage.rpm<br />

remarque : on peut indiquer un lien d’un serveur web ou ftp sur lequel se trouve le<br />

paquetage rpm<br />

exemple :rpm -i ftp://rpmfind.net/linux/redhat/7.3/en/os/i386/RedHat/RPMS/nedit-5.2-2.i386.rpm<br />

* suppression d’un paquetage rpm –e paquetage


emarque : pour la suppression, il ne faut pas indiquer les parties<br />

..rpm du nom du paquetage<br />

* mise à jour d’un paquetage rpm –Uvh paquetage.rpm<br />

remarque : l’option ‘v’ et ’h’ permet d’avoir un mode verbose et de voir une progression de<br />

l’installation<br />

remarque : il existe une option ‘–nodeps‘ qui indique à RPM de ne pas tenir compte des<br />

dépendances.<br />

remarque : il existe l’option ‘—force’ qui force RPM à réaliser son action (installation,<br />

désinstallation ..) …à utiliser avec prudence.<br />

* affiche tous les paquetages installés rpm –qa<br />

* recherche d’un paquetage rpm –qa | grep string<br />

où on remplace « string » par le nom ou une partie du nom du paquetage recherché.<br />

* liste les fichiers du paquetage installé rpm –ql paquetage<br />

* affiche les informations sur un paquetage rpm –qi paquetage<br />

* retrouve l’appartenance d’un fichier<br />

à un paquetage<br />

rpm –qf /chemin/fichier<br />

* affiche le contenu d’un fichier rpm rpm –qpl paquetage.rpm<br />

* affiche les informations d’un fichier rpm rpm –qpi paquetage.rpm<br />

Il existe d’autres systèmes de gestion de paquetages comme APT.<br />

Points à retenir<br />

* une seule archive .tar.gz (ou bz2) peut servir à installer un programme quelque soit la<br />

plateforme et le système linux de destination grâce à la création du makefile et la<br />

compilation.<br />

* gestion simplifiée des logiciels grâce aux paquetages RPM mais il faut récupérer le<br />

paquetage spécifique à la plateforme et la version du système linux.


<strong>Chapitre</strong> 13 : Interfaces graphiques<br />

Le système X Window<br />

Ce système permet l’affichage d’objets graphiques sous linux.<br />

Il fonctionne sur le principe client-serveur :<br />

Le client est un programme qui demande au serveur d’afficher des objets graphiques.<br />

Le serveur est le système X window (appelé aussi serveur X) qui réalise l’affichage.<br />

Un client peut faire une requête d’affichage sur un serveur X d’une machine distante.<br />

Il est donc possible d’exécuter un programme sur une machine distante et d’avoir un<br />

affichage en local.<br />

Xfree86 est une implémentation pour linux du système X Window.<br />

Il existe des logiciels serveur X sous windows : cygwin, exceed, Xming, x-win 32…<br />

Fig. : un serveur X sous Windows XP qui affiche le bureau d’une station Unix


Les Windows Managers (environnement de bureau)<br />

Un Window Manager se charge de l’habillage des fenêtres sous X Window, gère la barre<br />

de titre et les boutons des fenêtres. Il offre aussi les moyens à l’utilisateur d’interagir avec<br />

l’interface graphique (menus, icones).<br />

Ces environnements de bureau ont permis de rendre linux moins « austère » à utiliser par<br />

rapport à la ligne de commande.<br />

Exemples de Window manager :<br />

FVmw : un des premiers environnements graphiques sous linux<br />

Fig. : FVMW – Window Manager<br />

Window maker : Son interface graphique vise à ressembler à celle de NeXTStep.


XFCE : C’est un window manager léger et rapide<br />

Fig. : XFCE – Window manager<br />

Les projets KDE et Gnome apportent un environnement de bureau complet :<br />

- Une interface graphique dont l’utilisation est proche de celle de Windows (menu pour<br />

lancer les applications, bureaux virtuels, barre des tâches, barre lanceurs d’application …)<br />

- De multiples outils pour configurer le système, des outils de bureautique, internet et pour<br />

le développement.<br />

Site officiel de KDE : http://www.kde.org<br />

Site officiel de Gnome : http://www.gnome.org/


Fig. : exemple d’un environnement KDE<br />

Exemples d’applications KDE :<br />

Konqueror : un navigateur internet<br />

koffice : une suite bureautique avec un traitement de texte, un tableur …<br />

KghostView : ce logiciel permet de visualiser des fichiers postscript et pdf<br />

Konsole : un client terminal<br />

Kinternet : pour configurer les connexions internet


Fig. : exemple d’un environnement Gnome<br />

Exemples d’applications Gnome :<br />

Evolution : un client courrier électronique, un carnet d’adresses et un agenda<br />

Gnome system tools : gestion des utilisateurs et des groupes, gestion de la date et heure,<br />

gestion de la configuration réseau, …<br />

Nautilus : gestionnaire de fichiers<br />

Gnome-terminal : un client terminal<br />

Quelques logiciels du domaine publique utiles (en environnement interface<br />

graphique)<br />

* Gimp : C’est un logiciel de retouche d’images (l’équivalent de Photoshop). Il est porté<br />

sur plusieurs plateformes (linux , windows, macintosh)<br />

Site officiel : http://www.gimp.org<br />

* Openoffice : C’est une suite bureautique qui inclue entre autre un traitement de texte,<br />

un tableur, un logiciel de présentation. Il existe également sur plusieurs plateformes.


Site officiel : http://www.openoffice.org<br />

Site francophone : http://fr.openoffice.org/<br />

* Ekiga (ex Gnomemeeting) : c’est un logiciel de vidéo et audio conférence point à point.<br />

Il permet de réaliser des appels audio et vidéo avec des utilisateurs distants utilisant un<br />

client H.323 (comme Microsoft Netmeeting)<br />

Site officiel : http://www.gnomemeeting.org/<br />

* Rdesktop : C’est un client pour accéder à un environnement windows distant d’un<br />

serveur Windows Terminal Server<br />

Site officiel : http://www.rdesktop.org/

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!