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/