• Aucun résultat trouvé

D´ecomposition du mode OCTAL de chmod

A.11 FUTURE REVISIONS OF THIS LICENSE

3.4 D´ecomposition du mode OCTAL de chmod

La valeur des chiffres est obtenue en composant les valeurs des bits `a l’aide de l’addition. Soit pour positionner les bits “r” et “w”, on ajoute 4 2 ce qui donne 6.

L’´equivalent des commandes symboliques est (dans le second cas, on suppose que l’on souhaite accorder les droits en lecture, mais pas en ´ecriture) :

$ chmod 660 *

$ chmod 4755 prog Modification r´ecursive

On constate qu’il est plus facile de g´erer le format symbolique, car il n’est pas n´ecessaire de sp´ecifier les valeurs de tous les bits. Ceci est particuli`erement pratique lorsque l’on modifie des permissions de fac¸on r´ecursive en utilisant l’option “-R”.

$ chmod -R u+rw,g+r,g-w,o-rwx /home/patrick/*

$

Il est aussi possible d’utiliser la commandefind(1)pour faire des modifications r´ecursives. Notamment, si l’on ne souhaite effectuer les modifications que sur les fi-chiers ou les r´epertoires, ou, si l’on souhaite n’effectuer les modifications qu’`a partir d’un r´epertoire particulier.

La premi`ere commande ne modifie que les fichiers, la seconde ne modifie que les r´epertoires, et la troisi`eme ne modifie que les fichiers et r´epertoires contenus dans le r´epertoire nomm´e cible, et la quatri`eme r´ealise la mˆeme chose que la troisi`eme, mais

`a l’aide de la commandexargs(1).

$ find . -type f

./1/cible

La commande find permet de parcourir une arborescence de r´epertoires, elle prend pour premier param`etre un r´epertoire (ici “.”, c’est-`a-dire le r´epertoire courant).

Elle applique ensuite une s´election sur les fichiers et r´epertoires parcourus (ici, soit une s´election sur le type (“f” pour fichier, ou “d” pour r´epertoire).

La fonction ex´ecut´ee par d´efaut est l’affichage des noms des fichiers et r´epertoires parcourus (l’option “-print” est l’option par d´efaut). Elle peut ˆetre remplac´ee par l’action “-exec”.

La syntaxe de l’action “-exec” est singuli`ere. Tout ce qui suit cette option, jusqu’au

“;” est consid´er´e comme la commande `a ex´ecuter et ses param`etres. Le “;” doit ˆetre

´echapp´e, car c’est le s´eparateur de commandes du shell, et il ne serait pas vu par find si le “ ”. ´etait omis. La s´equence “✁✄✂ ” est remplac´ee par le nom du fichier ou r´epertoire.

La commandexargs rec¸oit en param`etre le nom d’une commande `a ex´ecuter. Elle lit dans son entr´ee standard une liste de param`etres s´epar´es par des espaces, tabulations ou retour chariot. Elle transmet chacun de ces param`etres `a cette commande.

3.7.3 Choisir les permissions par d´efaut

Lorsqu’un fichier est cr´e´e, ses permissions sont attribu´ees en fonction d’un masque que chaque utilisateur peut modifier selon ses pr´ef´erences `a l’aide de la commande interneumask(bash(1)).

Elle peut ˆetre soit utilis´ee avec les permissions symboliques, dans ce cas, on indique quelles sont les permissions que l’on autorise pour chacun des propri´etaire, groupe et autres. Mais aussi avec les permissions num´eriques en octal, et dans ce cas, la valeur indique les bits que l’on souhaite supprimer.

Ainsi, si je souhaite que mon groupe puisse lire, et ex´ecuter, mais pas ´ecrire, et que les autres n’auront aucun droit, je peux utiliser l’une des deux commandes suivantes :

$ umask u=rwx,g=rx,o=

$ umask 027

3.7.4 Modifier le propri´etaire et/ou le groupe d’un fichier

Un utilisateur peut modifier le groupe d’un fichier qui lui appartient, `a condition qu’il fasse lui-mˆeme partie du nouveau groupe, mais il ne peut modifier le propri´etaire du fichier. Le changement de propri´etaire se fait automatiquement si le destinataire copie le fichier.

Le super utilisateur peut, bien ´evidemment, modifier tant le groupe que le pro-pri´etaire, sans aucune restriction.

Pour modifier le groupe d’un fichier, on utilise la commandechgrp(1). La syntaxe est chgrp groupe fichiers, o`u groupe est un groupe existant, et fichiers est une liste de fichiers et/ou de r´epertoires. une option -R permet de parcourir les r´epertoires r´ecursivement.

Pour modifier le propri´etaire d’un fichier, on utilise la commandechown(1). La syntaxe est sensiblement la mˆeme que pourchgrp(1)(chown proprio fichiers ), mais proprio repr´esente le propri´etaire, ´eventuellement suivi d’un nom de groupe s´epar´e par le symbole “ :” ou le symbole “.”.

# chgrp patrick *.tex *.dvi

# chown -R tuxbihan:devel *.c* *.h*

3.8 D´eterminer le type de fichier

Les extensions de fichiers, c’est-`a-dire, les caract`eres situ´es derri`ere le dernier point, sont en g´en´eral une bonne fac¸on de d´eterminer le type de fichier auquel on a affaire. Par exemple, un fichier termin´e par l’extension .tex est probablement un fichier LATEX. Mais il n’existe aucune obligation d’utiliser une telle extension significa-tive, et de nombreux fichiers n’ont pas d’extensions, notamment les commandes Unix. Pour savoir `a quel type de fichier on a affaire, on se base donc sur les permissions, pour savoir si le fichier est ex´ecutable ou non, et on peut utiliser la commandefile(1) pour s’assurer du contenu exact d’un fichier. Elle analyse le contenu du fichier pour donner un diagnostic.

Si vous souhaitez creuser un peu plus le fonctionnement de cette commande, regar-dez le fichier /usr/share/misc/magic et sa description (magic(5)).

3.9 Copie de fichiers

Lorsque l’on copie un fichier, les permissions du fichier, ainsi que le propri´etaire sont modifi´es. Si je suis l’utilisateur patrick et que je copie le fichier .emacs.el qui appartient `a l’utilisateur tuxbihan , ce que je peux faire si j’ai le droit de lire ce fichier, la copie de ce fichier m’appartient, et ses permissions sont r´e´evalu´ees en fonction de la valeur deumask(bash(1)).

Ce comportement est satisfaisant dans la quasi totalit´e des cas, mais il pose probl`eme lorsque que l’on souhaite faire une copie conforme des fichiers. C’est le cas, par exemple, quand root souhaite copier des fichiers qui ne lui appartiennent pas pour les d´eplacer d’une partition vers une autre, ou d’un r´epertoire vers un autre. Si cette copie est faite sans pr´ecautions, `a la fin de la copie, tous les fichiers appartiennent `a root, et leur ancien propri´etaire ne peut plus les utiliser.

Plusieurs options de la commandecp(1)sont utiles dans ce cas (-p pour pr´eserver les attributs des fichiers, -d pour ne pas suivre les liens symboliques, -R pour par-courir r´ecursivement les r´epertoires), l’une d’elles combine les autres ( -a qui est

´equivalente `a -dpR).

De plus, pour copier des partitions enti`eres, il faut utiliser l’option -x qui interdit

`a la commandecp(1)de changer de syst`eme de fichiers au cours de la copie.

Chapitre 4

Gestion des utilisateurs

Dans le chapitre pr´ec´edent, nous avons abord´e la notion d’utilisateurs et de groupes, mais si l’installation de votre distribution a cr´e´e au moins deux utilisateurs automa-tiquement ( root et un utilisateur normal), la cr´eation de nouveaux utilisateurs est laiss´ee `a votre discr´etion. La tˆache de gestion des utilisateurs et groupes incombe au super utilisateur (root).

4.1 Les fichiers d’utilisateurs et de groupes

Les utilisateurs sont stock´es dans le fichier /etc/passwd , dont le format est d´ecrit dans la page de manuelpasswd(5). Les mots de passe, qui peuvent ˆetre mo-difi´es `a l’aide de la commandepasswd(1) peuvent ˆetre stock´es, soit dans le fichier /etc/passwd, soit dans le fichier /etc/shadow.

Les groupes sont stock´es dans le fichier /etc/group, dont le format est d´ecrit dans la page de manuelgroup(5).

Seul root est habilit´e `a faire ces manipulations. Il faut donc soit se connecter comme root dans une console virtuelle, soit utiliser la commandesu(1)(voir section 1.5) pour changer d’identit´e.

4.2 Cr´eer et supprimer des utilisateurs

Pour cr´eer un nouvel utilisateur, plusieurs commandes sont disponibles.adduser(8) pr´esente l’avantage de poser des questions pour obtenir les param`etres dont elle a be-soin1.

Pour supprimer un utilisateur, utiliser la commandedeluser(8).

# adduser newuser Adding user newuser...

Adding new group newuser (1004).

Adding new user newuser (1004) with group newuser.

Creating home directory /home/newuser.

Copying files from /etc/skel

1Attention, les utilisateurs de Mandrake seront tr`es d´ec¸us de s’apercevoir que cette commande n’est qu’un lien vers la commandeuseradd(1)

31

Enter new UNIX password:

Retype new UNIX password:

passwd: password updated successfully Changing the user information for newuser

Enter the new value, or press return for the default Full Name []:

Room Number []:

Work Phone []:

Home Phone []:

Other []:

Is the information correct? [y/n] y

# grep newuser /etc/passwd

4.3 Cr´eer et supprimer des groupes

Les commandesaddgroup(8)etdelgroup(8)sont les pendants des fonctions de gestion des utilisateurs.

4.4 Ajouter un utilisateur dans un groupe

La commandegroups(1)permet de v´erifier `a quels groupes un utilisateur appar-tient. La syntaxe est groups utilisateur, o`u utilisateur est une liste d’utilisa-teurs, qui est optionnelle si l’on souhaite v´erifier `a quels groupes l’utilisateur courant appartient.

# groups patrick tuxbihan

patrick : patrick dialout cdrom floppy audio dip www-data src devel tuxbihan : tuxbihan audio

Les groupes auxquels appartient un utilisateur d´eterminent ses droits d’utilisation de certains p´eriph´eriques, ainsi que ses droits en lecture/´ecriture de certains fichiers.

Au-dessus, on voit que l’utilisateur tuxbihan appartient au groupe audio, ce qui lui donne le droit d’acc´eder aux p´eriph´eriques appartenant au groupe audio.

Les deux commandes ci-dessous permettent de voir quels sont ces p´eriph´eriques.

$ find /dev -group audio

$ ls /dev | grep audio

L’utilisateur patrick appartient aussi aux groupes cdrom, ce qui permet no-tamment d’utilisercdparanioa(1)2, au groupe floppy, ce qui permet d’utiliser la commandedd(1)sur le lecteur de disquettes.

Pour information,dd(1)permet de cr´eer une image disque, ou de copier une image disque sur un support, par exemple :

$ dd if=/dev/fd0 of=/tmp/img

$ dd of=/dev/fd0 if=/tmp/img

Pour visualiser les p´eriph´eriques concern´es, on peut utiliser la commandefind(1), avec une recherche sur le groupe et l’op´erateur OU --o :

$ find /dev -group cdrom -o -group floppy -o group audio -o group dialout

$

Pour ajouter un utilisateur `a un groupe, on peut utiliser la commandeadduser(8).

Bien sˆur, seul root peut faire cela.

# adduser tuxbihan floppy

Adding user tuxbihan to group floppy...

Done.

# groups tuxbihan

tuxbihan: tuxbihan floppy audio

#

Pour que l’appartenance au nouveau groupe prenne effet, il faut que l’utilisateur tuxbihan se reconnecte.

2Sur un syst`eme utilisant des p´eriph´eriques SCSI ou IDE-SCSI, il faudra aussi changer le groupe des p´eriph´eriques /dev/sg*

Chapitre 5

Contrˆole des processus

Nous allons dans ce chapitre ´etudier les fonctions qui permettent de manipuler les processus, c’est-`a-dire, leur envoyer des signaux, les stopper, les tuer, les mettre en arri`ere-plan, et les ramener en avant-plan.

5.1 Visualiser les processus en cours

Les processus en cours d’ex´ecution sont list´es par la commandeps(1). La premi`ere ligne de ps indique la signification des diff´erentes colonnes.

$ ps

PID TTY TIME CMD

1058 pts/4 00:00:00 bash 1225 pts/4 00:00:00 ps

$

D’autres options permettent d’afficher plus d’informations. Les options “a” et “x”

permettent de voir l’ensemble des processus (R´ef´erez-vous `a la documentation de ps(1)pour une description compl`ete des tr`es nombreuses options de cette commande).

Voici un petit extrait d’une sortie de g´en´er´ee par ps ax --forest.

$ ps ax --forest

PID TTY STAT TIME COMMAND [...]

995 ? S 0:12 /usr/bin/emacs -g 110x67 997 pts/3 S 0:00 \_ /bin/bash

1058 pts/4 S 0:00 \_ /bin/bash -i [...]

$

L’option --forest indique les liens de parent´e entre les processus. Au-dessus, le processus emacs a lanc´e deux processus fils bash, l’un d’eux est un shell emacs et l’autre est utilis´e pour compiler les fichiers LATEX.

34

5.2 Lancer un processus en arri`ere-plan

La fonctionnalit´e la plus fr´equemment utilis´ee, avec l’envoi de signaux, est l’ex´ecution en arri`ere-plan d’une commande. L’ex´ecution en arri`ere-plan est utile quand une com-mande risque de durer longtemps, et que l’on ne souhaite pas attendre la fin de son ex´ecution.

Par exemple, la commande updatedb (voir sous-section 1.3.3), qu’il vaut mieux lancer sous le compte de root, car il peut acc´eder `a tous les r´epertoires, met beaucoup de temps `a s’ex´ecuter.

Pour lancer un processus en arri`ere-plan, il faut terminer la ligne de commande par un “&”.

# updatedb &

[1] 1234

Le nombre entre crochets est le num´ero de job (voirjobs(bash(1))). Le nombre qui suit est le PID, c’est-`a-dire l’identifiant du processus.

Ce n’est pas forc´ement une bonne id´ee de lancer en arri`ere-plan un processus qui g´en`ere beaucoup de sorties sur l’´ecran, car ces sorties vont perturber votre travail en s’ins´erant au milieu des sorties des programmes que vous allez ex´ecuter par la suite.

Vous pouvez utiliser les redirections (voir la section 3.3) pour envoyer ces sorties vers un fichier.

5.3 Interrompre un processus

Il est parfois n´ecessaire de mettre fin au processus actif, (parce que l’on a fait une erreur en le lanc¸ant, par exemple).

Il suffit de presser la combinaison de touches “Ctl C”.

Si le processus n’est pas actif sur le mˆeme terminal, on peut l’interrompre en utili-sant la commande mal nomm´eekill(1). La commande kill permet en fait d’en-voyer un signal `a un processus. Ce signal peut ˆetre un signal d’interruption, mais pas n´ecessairement, bien que le signal envoy´e par d´efaut (SIGHUP) mette fin au processus.

Pour visualiser les effets de ces commandes, nous allons utiliser deux programmes C que nous pourrons lancer et interrompre `a volont´e.

Le premier (voir figure 5.1) affiche un caract`ere “x” sur le terminal toutes les se-condes. Ses sorties vont donc se m´elanger avec celles des processus courants.

Le second (voir figure 5.2) n’affiche rien, il utilise les ressources processeur autant qu’il le peut, en ex´ecutant du code en permanence.

Nous allons compiler ces fichiers avec les lignes de commande suivantes :

$ cc -o longcmd longcmd.c

$ cc -o long-and-silent long-and-silent.c

$ ./longcmd &

[1] 1594

$ kill 1594

Pour d´etruire le processus, nous aurions pu utiliser ´egalement le num´ero de job avec la commande kill %1 , ou encore kill ‘pidof longcmd‘ . La commande

pidof(8)1retourne le (ou les) PID du (ou des) processus dont le nom est pass´e en param`etre. Attention `a ne pas d´etruire d’autres processus que celui que vous souhaitez d´etruire !

5.4 Stopper un processus et le r´eactiver

Lorsqu’un processus n’a pas ´et´e lanc´e en arri`eplan, et que l’on souhaite re-prendre la main, il n’est pas n´ecessaire d’interrompre le processus. On peut le sus-pendre `a l’aide de la s´equence de touchesC-Z(bash(1)). On retourne au processus stopp´e avec la commande internefg(bash(1)).

$ ./longcmd xxxxˆZ

[1]+ Stopped ./longcmd

$ ps x

PID TTY STAT TIME COMMAND [...]

1233 pts/4 T 0:00 ./longcmd 1234 pts/4 R 0:00 ps x

$ fg ./longcmd xxxxxˆC

1Il a ´et´e constat´e sur des distributions Mandrake que cette commande ne fonctionnait pas.

#include <stdio.h>

int main() {

while(1) { printf("x");

fflush(stdout);

sleep(1);

} }

FIG. 5.1 – Code source de longcmd.c

#include <stdio.h>

int main() {

for(;;);

}

FIG. 5.2 – Code source de long-and-silent.c

$

La lettre “T” dans la colonne STAT indique que le processus est stopp´e. On peut constater que les caract`eres “x” que le processus affichait ne sont plus g´en´er´es.

On peut ´egalement, apr`es avoir stopp´e le processus, le remettre en fonctionnement, mais en le maintenant en arri`ere-plan, `a l’aide de la commandebg(bash(1)).

$ ./longcmd xxxxˆZ

[1]+ Stopped ./longcmd

$ bg %1

[1]+ ./longcmd &

$ xxxxps x

PID TTY STAT TIME COMMAND [...]

1242 pts/4 S 0:00 ./longcmd 1246 pts/4 R 0:00 ps x

$ xxxxkill %1

[1]+ Terminated ./longcmd

On voit qu’apr`es avoir mis le processus en arri`ere-plan, les caract`eres “x” qu’il affiche se m´elangent `a l’affichage. Pour mettre fin au processus, on utilise la commande kill %1, qui a pour effet de d´etruire le job n 1.

5.5 Envoyer un signal `a tous les processus de mˆeme nom

La commandekillall(1) envoie un signal `a tous les processus qui portent le mˆeme nom. Faire attention aux ´eventuelles cons´equences !

5.6 Envoyer le signal HUP `a un daemon

Un moyen courant de forcer un daemon `a relire ses fichiers de configuration est de lui envoyer le signal HUP. Par exemple, apr`es avoir modifi´e la configuration du daemon inetd :

# emacs /etc/inetd.conf

# kill -HUP ‘pidof inetd‘

5.7 Lancer une commande avec nohup(1)

Les essais r´ealis´es avec une Debian 3.0 (kernel 2.4.18) n’ont pas permis de mettre en ´evidence l’int´erˆet de la commande nohup, puisqu’une commande lanc´ee simple-ment en arri`ere-plan se comporte comme si elle avait ´et´e lanc´ee avec nohup. Pour m´emoire, cette commande est sens´ee maintenir active une commande (en redirigeant ses sorties vers le fichier nohup.out ) apr`es que l’utilisateur qui l’a lanc´ee se soit d´econnect´e.

5.8 Ex´ecuter une commande avec nice(1)

La commande nice lance une commande en arri`ere-plan avec un param`etre qui indique sa priorit´e d’ex´ecution.

Pour mettre en ´evidence l’effet de la commande, nous utiliserons la commande top(1). Cette derni`ere affiche les temps CPU utilis´es par chaque processus.

$ nice -n 20 ./long-and-silent &

[9] 1033

$ ./long-and-silent &

[10] 1034

$ top

93 processes: 89 sleeping, 4 running, 0 zombie, 0 stopped

CPU states: 71.4% user, 21.4% system, 7.1% nice, 0.0% idle

Mem: 384824K total, 200868K used, 183956K free, 5172K buffers Swap: 128484K total, 0K used, 128484K free, 100960K cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND

1034 patrick 16 0 252 252 208 R 57.2 0.0 0:32 long-and-silent 1035 patrick 12 0 940 940 716 R 14.3 0.2 0:04 top

595 root 5 -10 66964 17M 3400 S < 7.1 4.6 1:02 XF86_SVGA 656 patrick 9 0 4544 4544 3492 R 7.1 1.1 0:03 gnome-terminal 682 patrick 9 0 4664 4664 3616 S 7.1 1.2 0:05 deskguide_apple 1033 patrick 19 19 252 252 208 R N 7.1 0.0 0:04 long-and-silent [...]

$

On voit bien ici que le processus lanc´e avecnice, dont le PID est 1033 a consomm´e moins de temps CPU (7,1 %) que le processus lanc´e sans nice dont le PID est 1034 et qui a consomm´e 57,2 % de CPU.

Chapitre 6

Programmation du shell

Nous allons ´ecrire des programmes pourbash(1). Comme chaque programme devra contenir le chemin de bash , il est n´ecessaire de le localiser. Nous utiliserons pour cela la commandewhich(1).

$ which bash /bin/bash

$

Toutes les commandes que nous avons utilis´ees jusqu’ici peuvent ˆetre enregistr´ees dans un fichier, dont la premi`ere ligne serait :

#!/bin/bash

Un tel fichier constituerait d´ej`a un programme shell, mais nous allons ´etudier ici quelques structures qui permettent r´eellement de contrˆoler le d´eroulement du pro-gramme, comme le permet tout langage de programmation.

6.1 Les param`etres d’un programme shell

Les param`etres pass´es `a un programme shell sont d´er´ef´erenc´es en utilisant la nota-tion “$x”, o`u “x” est un num´ero de “1” `a “9”. Ce qui limite le nombre de param`etres uti-lisables simultan´ement `a 9. Heureusement, la commande interneshift(bash(1)) permet d’atteindre les param`etres suivants, mais le param`etre “$1” devient alors inac-cessible.

Essayons notre premier programme (voir figure 6.1) :

FIG. 6.1 – Premier programme shell : prg-hello

# !/bin/bash echo Bonjour $1

Nous pouvons l’ex´ecuter comme ceci, en passant ce fichier comme param`etre `a la commandebash(1):

39

$ bash prg-hello Bonjour

$

ou comme ceci, en rendant le fichier ex´ecutable :

$ chmod +x prg-hello

$ ./prg-hello Bonjour

$ ./prg-hello Patrick Bonjour Patrick

$

6.2 La commande read(bash(1))

Modifions-le ainsi en utilisant la commande interneread(bash(1))(voir figure 6.2) :

FIG. 6.2 – Second programme shell : prg-hello2

# !/bin/bash read name

echo Bonjour $name

La commande interneread(bash(1))lit au clavier un texte termin´e par un re-tour chariot, et le stocke dans la variable pass´ee en param`etre. Comme pour le pa-ram`etre “$1”, le d´er´ef´erencement se fait en pr´ec´edant la variable par le symbole “$”.

6.3 if(bash(1))

Si l’utilisateur rentre une ligne vide, on indique un message d’erreur (voir figure 6.3) :

Le “ ” avant le “’”, car, rappelez-vous, c’est le caract`ere qui permet d’´eviter l’in-terpolation de variables.

Le test aurait pu ˆetre invers´e en utilisant le caract`ere “!” devant les crochets. “!”

signifie non. Faites l’essai.

Toutes les expressions conditionnelles qui peuvent ˆetre ´evalu´ees sont list´ees dans la rubriqueCONDITIONAL EXPRESSIONSdu manuel debash(1).

Le testif(bash(1))peut ˆetre plus complexe, avec des tests dans la clause else, ce qui donne : if ... then ... elif ... then ... else ... fi.

6.4 La boucle until(bash(1))

Voici comment parcourir la liste des param`etres de la ligne de commande `a l’aide de

Voici comment parcourir la liste des param`etres de la ligne de commande `a l’aide de

Documents relatifs