Partie pratique
Partie théorique
Unix Power Tools, publié chez O'Reilly
Shell Scripting Primer, guide du développeur Apple
…
Two of the most famous products of Berkeley are LSD and Unix. I don't think that this is a coincidence.
- Anonyme
Guerre Unix/Windows - et autres considérations stupides
Quel est le meilleur système? Linux ou Windows? Mac OS X?
Quel est le système le plus sûr?
Quelle est la plus belle voiture…etc
Vous constatez des décalages entre le sujet de TP et l'environnement de votre système:
Les raisons :
Mais comment s'en sortir?
Trop de logins?
Se connecter :
Connexion réussie :
pwd
cd CHEMIN
où CHEMIN
est un chemin absolu ou relatifEt les fichiers?
file
Le shell
Les combinaisons de touche
Gestion des processus
jobs
).Une commande
Qu'est-ce qui alimente l'entrée standard?
Où arrivent les informations en provenance de stdout et stderr?
Le shell dispose de divers opérateurs de redirection
com1 | com2
1> fichier1 1>> fichier1
2> fichier2 2>> fichier2
2>&1 1>&2
< fichier
<< TRUC
<<< TRUC
Linux dispose de quelques fichiers bizarres parmi lesquels
/dev/null
/dev/random
/dev/urandom
Les commandes vues ici procèdent à des recherches sur des fichiers. Quelques remarques s'imposent :
195.220.111.226
, le système de fichiers (HFS+) est insensible à la casse, mais la préserve (not case-sensitive but case-preserving): les noms T et t ne peuvent désigner des fichiers différents dans le même répertoire!10
en décimal (0a
en hexadécimal) et appelé Line Feed (saut de ligne) définit eol;13
en décimal (0d
en hexadécimal) et appelé Carriage Return (retour chariot) marque une fin de ligne; 13 10
en notation décimale (0d 0a
en hexa) définit la fin de ligne. Elle est souvent dénotée CRLF.man ascii
maim!
suivie d'une fin de ligne (à la Unix)?
> echo 'maim!' | hexdump 0000000 6d 61 69 6d 21 0a 0000006 > echo 'maim!' | od -t xC 0000000 6d 61 69 6d 21 0a 0000006 > echo 'maim!' | od -t dC 0000000 109 97 105 109 33 10 0000006
printf
> printf 'ô\n' ô > printf '\xc3\xb4\n' ô > printf '\xef\xa3\xbf\n' > printf '\xc3\xb8\n' øOn peut ainsi écrire en utilisant l'encodage utf-8. Pour que ces caractères soient correctement affichés par le programme les exploitant, il faut d'une part qu'il sache quel est l'encodage utilisé et d'autre part qu'il dispose des polices des caractères correspondantes! Ces slides sont écrits en utf-8, et il est souvent nécessaire de le rappeler au navigateur!
> printf 'maim!\n' | hexdump 0000000 6d 61 69 6d 21 0a 0000006 > printf -- '-_ô\n' | hexdump 0000000 2d 5f c3 b4 0a 0000005 > printf 'é' | hexdump 0000000 c3 a9 0000002Tiens, tiens…les deux dernières commandes révèlent que les caractères accentués sont codés sur deux octets.
195.220.111.226
. L'encodage de taille variable a des effets innatendus : > touch 'é'; echo ? ? > echo ?? é > printf '\x65\xcc\x81\n' é > figlet Wow..! __ __ _ \ \ / /____ __ | | \ \ /\ / / _ \ \ /\ / / | | \ V V / (_) \ V V / _|_| \_/\_/ \___/ \_/\_(_|_|_)utf-8 est plein de surprises.
Moralité : se restreindre aux caractères ascii pour nommer les fichiers permet d'éviter des surprises (au moins dans un premier temps).
Certaines commandes (man, info) sont dédiées à la consultation de fichiers d'aide organisés dans des systèmes d'aide différents. Ces commandes reposent sur l'usage d'un programme permettant de visualiser ces fichiers, i.e. de voir ce qu'ils contiennent.
Visualiseurs classiques:
more
less
En pratique, comment les utilise-t-on?
SYNOPSIS man [-acdfFhkKtwW] [--path] [-m systeme] [-p chaine] [-C fichier_config] [-M chemin] [-P visualiseur] [-B navigateur] [-H visualiseur_html] [-S liste_sections] [section] nom ...
man [2] read
mais man 2 read
).-h --help
grep -r -m 1 'ifconfig'
équivaut à grep -r --max-count=1 'ifconfig'
grep -Eci ':0$'
équivaut à grep -E -c -i ':0$'
grep -Eci ':0$'
, grep -cEi ':0$'
, grep -Ec ':0$' -i
sont équivalentsgrep -e ':0$' -mi 1
ne fonctionne pas contrairement à grep -e ':0$' -im 1
grep -m 1 -m 2 ':0$'
est ambigüe et n'équivaut pas à grep -m 2 -m 1 ':0$'
SYNOPSIS tar <operation> [options] Operations: [-]A --catenate --concatenate [-]c --create [-]d --diff --compare [-]r --append [-]t --list [-]u --update [-]x --extract --get --delete Common Options: -C, --directory DIR -f, --file F -j, --bzip2 -p, --preserve-permissions -v, --verbose -z, --gzip All Options: [ --atime-preserve ] [ -b, --blocking-factor N ] [ -B, --read-full-records ] [ --backup BACKUP-TYPE ] [ --block-compress ] [ -C, --directory DIR ] [ --checkpoint ] [ -f, --file [HOSTNAME:]F ] [ -F, --info-script F, --new-volume-script F ] [ --force-local ] [ --format FORMAT ] [ -g, --listed-incremental F ] [ -G, --incremental ] [ --group GROUP ] [ -h, --dereference ] [ --help ] [ -i, --ignore-zeros ] [ --ignore-case ] [ --ignore-failed-read ] [ --index-file FILE ] [ -j, --bzip2 ] [ -k, --keep-old-files ] [ -K, --starting-file FILE ] [ --keep-newer-files ] [ -l, --check-links ] [ -L, --tape-length N ] [ -m, --touch, --modification-time ] [ -M, --multi-volume ] [ --mode PERMISSIONS ] [ -N, --after- date DATE, --newer DATE ] [ --newer-mtime DATE ] [ --no-anchored ] [ --no-ignore-case ] [ --no-recursion ] [ --no-same-permissions ] [ --no- wildcards ] [ --no-wildcards-match-slash ] [ --null ] [ --numeric-owner ] [ -o, --old-archive, --portability, --no-same-owner ] [ -O, --to- stdout ] [ --occurrence NUM ] [ --one-file-system ] [ --overwrite ] [ --overwrite-dir ] [ --owner USER ] [ -p, --same-permissions, --preserve- permissions ] [ -P, --absolute-names ] [ --pax-option KEYWORD-LIST ] [ --posix ] [ --preserve ] [ -R, --block-number ] [ --record-size SIZE ] [ --recursion ] [ --recursive-unlink ] [ --remove-files ] [ --rmt-command CMD ] [ --rsh-command CMD ] [ -s, --same-order, --preserve-order ] [ -S, --sparse ] [ --same-owner ] [ --show-defaults ] [ --show-omitted-dirs ] [ --strip-components NUMBER, --strip-path NUMBER (1) ] [ --suffix SUFFIX ] [ -T, --files-from FILE ] [ --totals ] [ -U, --unlink-first ] [ --use-compress-program PROG ] [ --utc ] [ -v, --verbose ] [ -V, --label NAME ] [ --version ] [ --volno-file FILE ] [ -w, --interactive, --confirmation ] [ -W, --verify ] [ --wildcards ] [ --wildcards- match-slash ] [ --exclude PATTERN ] [ -X, --exclude-from FILE ] [ -z, --gzip, --gunzip, --ungzip ] [ -Z, --compress, --uncompress ] [ -[0-7][lmh] ]
Symbole | Signification - !! tableau imprécis !! | Exemple |
---|---|---|
. | correspond à n'importe quel caractère | |
* | indique que ce qui précéde peut être répété 0, 1 ou plusieurs fois | ^[a-z][a-z]*$ ^\([a-z][a-z]\)*$
|
^ | indique le debut de ligne - sert à contraindre dès le début de ligne | |
$ | indique la fin de ligne | |
\ | permet de faire perdre le sens spécial du caractère suivant | \. |
[…] | correspond à un caractère dont la description est donnée entre les crochets | [:space:] [[:space:]] [[:space:][:alpha:]3-9] |
\(…\) | la chaîne correspondant au contenu de la i-ème telle paire est mémorisé | |
\n | correspond à ce qui a été mis en correspondance avec la i-ème paire du type précédent | \([^[:space:]]+\)[[:space:]]+\1 |
[:blank:]
correspond aux caractères espace et tabulation horizontale.[:space:]
correspond aux caractères espace, tabulations horizontale et verticale, retour chariot, newline et formfeed.isspace
et dont la page man indique clairement les caractères formant la classe.Symbole | Signification | Exemple |
---|---|---|
{…} | permet de définir les répétitions de ce qui précéde | ^[a-z]{3}[^a-z] , ^[a-z]{3,}[^a-z] , ^[a-z]{3,7}[^a-z] |
\{…\} | même sens pour d'autres commandes | |
\<…\> | délimite un mot | |
+ | une ou plusieurs fois ce qui précède | |
? | zéro ou une fois ce qui précède | |
| | ou | |
(…) | analogue de \(…\) dans les expressions régulières étendues - permet de grouper également! | ([a-z])x\1 |
Expression régulière étendue?
(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
- adresse IP??
- ligne de ls -l /tmp
correspondant aux fichiers exécutables par tous et dont je suis propriétaire
ls -l /tmp | grep -E '^.{9}x[[:space:]]+[0-9]+[[:space:]]+moi'
ls -l /tmp | grep -E '^.{9}x[[:space:]]+[0-9]+[[:space:]]+'$(whoami)
??
- ligne comportant une occurence de PAF, mais pas plus!
… | grep -v 'PAF.*PAF' | grep 'PAF'
Avertissement
Les expressions régulières permettent de chercher des motifs d'information. Mais sous quelle forme l'information dans un fichier particulier est-elle stockée?
compress
, gzip
, bzip2
, …Z
pour compress
, gz
pour gzip
, bz2
pour bzip2
file
uncompress
, gunzip
, bunzip2
zless
, zcat
, zgrep
, zegrep
…bzless
, bzcat
, bzgrep
, bzegrep
(faire par exemple man -k bz | grep '^bz'
…)zip
, tar
, rar
…mouahahahaha....... Mais à quel niveau d'information vous placez-vous? A celui de l'information initiale, au niveau d'un format particulier (peut-être celui de la compression…)
Entrainez-vous
Si vous avez un doute sur la possibilité de faire intervenir les expressions régulières dans vos différents projets informatiques, consultez http://www.regular-expressions.info/tools.html
Pensez à toujours protéger vos expressions régulières du shell!
Placez-les entre simples quotes ('
…'
) sauf si vous savez ce que vous faites.
grep
? Remember : get
RegExpr print
Permet de chercher un motif (ou patron ou expression régulière) et de produire divers résultats en fonction de l'information trouvée. Ci-dessous, une liste de quelques options intéressantes:
-E
pour travailler avec les expressions régulières étendues (mieux vaut travailler directement avec egrep
);-i
pour ne plus faire de différence entre caractères majuscules et minuscules;-r
pour faire une recherche récursive à partir d'un répertoire qui est indiqué en argument;-l
pour obtenir le nom des fichiers contenant le motif cherché;…
sed
? Remember : String Editor
Permet d'appliquer des commandes d'édition aux lignes lues. Pour indiquer directement les opérations sur la ligne de commande, la syntaxe est la suivante : sed [option] [-e ¿command¿] [file(s)]
où la partie command
est de la forme : [address[,address]][!]command [arguments]
. Les différents élements sont décrits ci-après :
commande [arguments]
correspond à la description de la commande réalisée. Selon la nature de la commande, un argument est présent ou non :
d
(delete) supprime la lignep
(print) imprime la ligne sur la sortie standards/M1/M2/
(substitute) substitue la portion mise en correspondance avec le motif M1
par la construction indiquée par M2
. Il est possible d'indiquer que toutes les portions (ou que la i-ème occurence) soient substituées.q
(quit) met fin aux traitements appliqués par sed
[address[,address]][!]
est optionnelle. Si elle n'est pas indiquée, la commande est appliquée à toutes les lignes. Elle peut prendre différentes formes :
/RegExp/
pour désigner les lignes correspondant à l'expression régulière RegExp
4
pour désigner la quatrième ligne$
pour désigner la dernière ligne4,8
pour désigner les lignes 4 à 8 incluses/RegExp1/,/RegExp2/
pour désigner les blocs dont la première ligne est mise en correspondance avec RegExp1
et la dernière ligne avec RegExp2
- ces deux lignes étant distinctes! Si une ligne est trouvée pour RegExp1
mais pas RegExp2
, alors la ligne trouvée et toutes celles qui la suivent sont incluses dans la plage retenue./RegExp/,8
si une ligne comportant RegExp
est trouvée avant la ligne 8, alors tout le paquet est retenu. Si une ligne comportant RegExp
est trouvée après la ligne 8, alors seule la ligne trouvée est traitée.1,6!
pour désigner toutes les lignes sauf les lignes 1 à 6. !
s'applique à toutes les formes d'adressage précédentes.sed
applique des opérations d'édition aux lignes lues. Plus précisément, chaque ligne lue est placée en mémoire (dans le pattern space), et les commandes qui la concernent sont appliquées. La fin de ligne n'est pas incluse dans le pattern space. sed
? sed
dispose d'une seconde zone mémoire (le hold space). Certaines commandes permettent de réaliser des échanges entre ces deux espaces: x
permet d'intervertir les deux zones;h
remplace le holp sp. par le pattern sp.H
ajoute à la fin du hold sp. une fin de ligne suivie du pattern sp.…
;o)
> echo salut patate | sed -Ee 's/(.)(.)/\2\1/g' asul tapatet > printf '1\n2\n3\n' 1 2 3 > printf '1\n2\n3\n' | sed -ne '1h;1!H;${x;l;s/\n//g;p}' 1\n2\n3$ 123 > printf '1\n2\n3\n' | sed -ne '1h;1!H;${x;s/\n//g;p}' 123 > echo 'tea time' | sed -Ee 's/(.)/\1\n/g' t e a t i m e > echo 'tea time' | sed -Ee 's/(.)/\1\n/g' | sed -nEe '1h;1!H;${x;l;s/([^ ])\n/\1/g;p}' t\ne\na\n \nt\ni\nm\ne\n$ tea time > echo 'tea time' | sed -Ee 's/(.)/\1\n/g;s/\n$//' | sed -nEe '/^[^ ]/,/ /{H;/ /{x;s/^ //;s/\n//g;p;d;x;d}}' -e '${x;s/^ //;s/\n//g;p}' tea time cd /usr/share/doc/rfc gzcat rfc*.txt.gz | gsed -ne '/^Reques.*[1-9]/p;/^Obsol/,/^$/p' | gsed -re '/^(Reques|Obsol|[1-9])/!d;s/([0-9],?) +[^1-9].*$/\1/;/^Req/s/^/\n/' | gsed -ne '/^Req/,/^$/{/^Req/h;/^Req/!H;/^$/{x;s/\n/ /g;p;}}' | lessLes deux dernières commandes illustrent l'utilisation de la zone tampon, mais aussi le regroupement de commandes. En particulier, la dernière commande illustre le fait que l'on peut imbriquer les sélections.
sed
dispose de nombreuses autres commandes documentées dans le manuel. Seules celles présentées dans le support d'application sont à connaître.-e
précéde chaque commande, comme indiqué plus haut.-r
(resp. -E
) permet, pour la version linux (resp. Mac), d'utiliser les expressions régulières étendues - implicitement, les expressions simples sont utilisées.-n
permet de ne pas imprimer le « pattern space », i.e. de repéter les lignes lues sur la sortie standard. La répétition est le comportement par défaut, donc jouer avec cette option implique de savoir ce qu'on fait… Quelques remarques :
sed
comme suit…| sed -e 'com1' | sed -e 'com2' | sed -e 'com3' …Faire les choses de façon plus fine nécessite une meilleure connaissance de
sed
, que les plus curieux pourront travailler.
sed
est un outil puissant en raison de la simplicité de son mécanisme : une ligne lue est immédiatement traitée. En général, sed
peut traiter des fichiers arbitrairement grands! Seule une accumulation excessive dans le hold space présente des risques de saturation.> printf '\xc3\xa9\n' é > printf '\xc3\xa9\n' | sed -Ee 's/./o/' o > printf '\x65\xcc\x81\n' é > printf '\x65\xcc\x81\n' | sed -Ee 's/./o/' ó > figlet 'K-Pow!' _ __ ____ _ | |/ / | _ \ _____ _| | | ' /_____| |_) / _ \ \ /\ / / | | . \_____| __/ (_) \ V V /|_| |_|\_\ |_| \___/ \_/\_/ (_)
sed
mis à profit pour fabriquer des commandes…
On ne retrouve pas partout les commandes que l'on affectionne.
> seq 3 6 3 4 5 6
> seq 3 6 -bash: seq command not found # damned :o( > echo -e "\n"{3..6} 3 4 5 6 > echo -e "\n"{3..6} | sed 1d 3 4 5 6 > MonSeq() { eval echo -e '\\n'{$1..$2} | sed 1d;} > MonSeq 2 3 2 3
> seq 1 3 1 2 3 > seq 1 3 | tac 3 2 1
> MonSeq 1 3 | tac -bash: tac: command not found # vraiment pas de bol :oO -bash: MonSeq: write error: Broken pipe > MonSeq 1 3 | sed -ne '1h;1!{G;x;};${x;p;}' 3 2 1 > MonTac() { sed -ne '1h;1!{G;x;};${x;p;}';} > MonSeq 1 3 | MonTac 3 2 1
awk
? Remember : heu…
sed
permet d'appliquer des opérations d'édition aux lignes lues. awk
permet d'appliquer des traitements à partir des lignes lues, la nature des traitements n'étant plus limitée à grand chose! awk
découpe ce qu'il lit en enregistrement et chaque enregistrement est découpé en champs. Implicitement, les enregistrements sont délimité par une fin de ligne et les champs par des espaces, mais ce découpage est paramétrable. L'enregistrement en cours est placé dans la variable $0
et les champs sont stockés dans $1
, $2
, jusqu'à $NF
, où NF
est la variable contenant le nombre de champ lus.sed
, awk
limite sa lecture à l'enregistrement à traiter (sauf demande explicite de lire plus), ce qui lui permet d'être applicable à des fichiers arbitrairement grands.awk
sont présentés dans le support d'application, mais…quelques rudiments de awk
permettent bien souvent de faire rapidement des choses longues et pénibles à écrire avec sed
.find
? Remember : Trouver
find
permet de déterminer les fichiers pour lesquels l'évaluation d'une expression combinant divers tests donne un résultat positif. -maxdepth N
bride la récursivité et permet de limiter la recherche aux N premiers niveaux de l'arborescence partant des répertoires parcourus. -maxdepth 1
permet de limiter la recherche aux fichiers des répertoires parcourus-o
), des NON (-not
) et des parenthèses (\(…\)
).grep -m 1 -E '^[[:space:]]+$' && echo trouve || echo pas trouveSi le code retour (Gasp!..) d'une commande est 0, ce code est assimilé à un test réussi, sinon à un test échoué.
grep -m 1 -E ifconfig /etc/conf.d/net -s;
if (( $? == 0 )); then echo trouve; else echo pas trouve;fi
find
peut être utilisé pour appliquer une commande aux fichiers satisfaisant un ensemble de critère, mais ce n'est pas la manière la plus naturelle de faire cela!-regex
et -iregex
permettent de rechercher des noms de fichiers pouvant être mis en correspondance avec une expression régulière. Implicitement, c'est un sur-ensemble des expressions régulières simples qui est utilisé. L'option -regextype
permet d'ajuster ce paramétrage.tar
? Remember : Tape Archiver
tar
est une commande permettant de manipuler des archives…respectant un des formats tar.tar
est incomplet (ou pas très explicite pour l'usage de certaines actions)! -c
)-t
)-x
)-r
)-f FILE
où FILE peut être un chemin vers un fichier ou - pour indiquer l'entrée ou la sortie standard (en fonction de l'action!-O
pour extraire les fichiers vers la sortie standard-j
pour filtrer l'archive à l'aide de bzip2
-z
pour filtrer l'archive à l'aide de gzip
ou gunzip
en fonction de l'action-v
pour afficher un maximum d'information lors du traitementtar
peut facilement conduire à des catastrophes! Gare aux incohérences.
tar -czf arch.tgz Rep1 Fich1 Fich2 tar -rzf arch.tgz Fich2 tar: Ne peut mettre à jour des archives compressées. Pour en savoir davantage, faites: « tar --help » ou « tar --usage ». gunzip arch.tgz -v arch.tgz: 98.5% -- replaced with arch.tar tar -rf arch.tar Fich2 tar -tf arch.tar Rep/ Rep/Famille.jpg Fich1 Fich2 Fich2 …
Principe de base : tout est fichier!
Qu'est ce qu'un fichier?
D'un point de vue abstrait, un fichier est l'entité qui associe un contenu et des attributs.
Différents types de fichier :
Attributs :
Et le nom? Ce n'est pas un attribut! Voir la description d'un répertoire.
D'un point de vue physique, le concept de fichier est projetté sur une structure d'«i-nœud» (i-node).
Un support physique de stockage doit être structuré pour permettre l'écriture et la restitution des données. L'organisation est basée sur un système de fichiers qui définit les structures qui seront utilisées à cette fin. Il existe de nombreux systèmes de fichiers :
Dans le contexte des Unices, l'i-node est la structure qui soustend l'organisation des fichiers. Elle rassemble les attributs et des pointeurs vers les blocs contenant le contenu. Chaque i-node est numéroté et le système sait lire les informations d'un i-node de numéro donné.
Qu'est-ce qu'un répertoire?
C'est un fichier établissant une correspondance entre des noms et des numéros d'i-nœud.
Ajouter un fichier dans un répertoire, c'est ajouter une telle correspondance. Dans l'i-node pointé, le nombre de liens est incrémenté.
Supprimer un fichier revient à retirer la correspondance associée. Le nombre de lien pointé est décrémenté et s'il tombe à zero, les blocs de données sont libérés ainsi que la structure d'i-node.
Le nombre de lien peut-il être supérieur à 1?
Oui. Il est possible de créer un lien vers un fichier existant (et donc vers l'i-node correspondant). Il y a ainsi plusieurs noms qui pointent vers le même i-node.
A sa création, chaque répertoire contient un lien vers lui-même et un lien vers son répertoire parent. Le premier de ces deux liens implique un compteur de liens au moins égal à 2 pour tout répertoire, nombre auquel s'ajoute le nombre de sous-répertoires (et d'enventuels autres liens).
Lorsqu'un fichier est retiré d'un répertoire, il n'est pas forcément effacé!
Qu'est-ce qu'un lien?
On distingue les liens physiques des liens symboliques :
rm
et unlink
) ouvre le lien, le système ouvre en réalité la ressource pointée.rm
et unlink
suppriment le lien, elles affectent le lien lui-même et non la ressource pointée.Les liens se font à l'aide de la commande ln
:
ln /REP1/REP2/FICHIER
ln REP2/FICHIER REP3/FICHIER
ln FICHIER1 FICHIER2
ln -s /SUR/LA/LUNE/LA-BAS lune
ln -s ../.. 2up
Les permissions standards
La lecture, l'écriture et l'exécution sont les permissions standards. Selon le type de fichier, la sémantique des opérations est adaptée :
Rien n'est dit sur la modification des attributs de fichiers! Seul le propriétaire (et root) peut les ajuster. Cette opération n'est pas sujette à une permission particulière, mais conditionnée par la possibilité d'accéder au fichier visé.
Ces permissions sont déclinées à trois entités :
Comment ces permissions sont-elles appliquées?
Pour que votre commande puisse réaliser une opération sur un fichier, il est important de comprendre que le processus est associé à votre login et votre groupe. Ces informations sont utilisées comme suit :
Les permissions additionnelles
Trois permissions supplémentaires existent dont le sémantique est déclinée selon la nature du fichier :
SUID et SGID ne sont pas exploitables directement par les scripts!
Ci-dessus, il est indiqué …il est possible de prendre les droits du…. Pour effectivement prendre ces droits, il faut utiliser des outils permettant de d'ajuster les identifiants utilisés par un processus. Les mises en œuvre ne seront pas considérés (c'est plus l'objet de programmation système). Les curieux pourront consulter ça, qui présente une solution basée sur l'utilisation d'un programme écrit en C!
Les permissions exceptionnelles : ACL
Les permissions standards et additionnelles sont les permissions POSIX. Certains systèmes permettent d'utiliser en parallèle des ACLs (Access Control List) permettant de définir d'une façon plus ponctuelle des permissions. Pour l'instant, ce mécanisme ne sera pas considéré. Toutefois, sa présence, notamment sur 195.220.111.226, se manifeste dans les sorties de certaines commandes. Plus de détails plus loin, un jour :o(
Observation des permissions
La commande ls
permet d'observer les permissions d'un fichier ou d'un répertoire :
ls -l .ssh/known_hosts -rw-r--r-- 1 denis users 2052 jun 25 14:59 .ssh/known_hosts
ls -l .ssh/ total 24 -rw-r--r-- 1 denis users 398 mar 3 2008 authorized_keys -rw------- 1 denis users 672 mai 13 2007 id_dsa -rw-r--r-- 1 denis users 617 mai 13 2007 id_dsa.pub
ls -ld .ssh/ drwx------ 2 denis users 4096 jun 25 14:59 .ssh/
L'option -l
permet d'afficher les principaux attributs associés au fichier :
-
pour un fichier régulier, d
pour un répertoire, l
pour un lien symbolique…-
ou r
), le second à l'écriture (-
ou w
) et le dernier est décrit dans la table suivante :
Bloc 1, 2 ou 3 | caractère | permissions |
---|---|---|
tous | - | rien |
tous | x | exécution |
1 | s | exécution et SUID |
1 | S | SUID |
2 | s | exécution et SGID |
2 | S | SGIG |
3 | t | exécution et sticky bit |
3 | T | sticky bit |
L'option -i
permet d'afficher le numéro d'i-node.
ls .ssh/ -ila total 40 2452883 drwx------ 2 denis users 4096 jun 25 14:59 . 3891777 drwxr-xr-x 133 denis users 12288 oct 23 16:16 .. 2453089 -rw-r--r-- 1 denis users 398 mar 3 2008 authorized_keys 2453581 -rw------- 1 denis users 672 mai 13 2007 id_dsa
ls .ssh/ -ild 2452883 drwx------ 2 denis users 4096 jun 25 14:59 .ssh/
Le propriétaire d'un fichier peut toujours(*) redéfinir les permissions sur son fichier, dans la mesure où il dispose d'un chemin pour accéder à son fichier.
Ajustement des permissions
La commande chmod
permet d'ajuster les permissions d'un fichier :
r
, w
, x
), l'entité indiquée (u
pour le propriétaire, g
pour le groupe, o
pour les autres et a
pour tous) est suivie d'un + ou d'un - et des caractères dénotant les permissions e.g. g+wr
pour ajouter les permissions de lecture et ecriture au groupeu
(resp. g
) est suivie d'un + ou d'un - et de s
.t
) est précédé d'un + ou d'un -.chmod g+rx FILE chmod go+rx FILE chmod u+rwx,go-w,g+s FILE chmod -R +t DIR
permission | r | w | x |
---|---|---|---|
valeur | 4 | 2 | 1 |
permission | SUID | SGID | stiky bit |
---|---|---|---|
valeur | 4 | 2 | 1 |
chmod 600 FILE chmod 1777 DIR
ln
, rm
et unlink
affectent directement un lien symbolique. Toutes les autres commandes qui tentent d'accéder à un lien symbolique sont détournées vers la ressource pointée par le lien (Cf. ici). C'est donc le cas de la commande chmod
. Les permissions d'un lien symbolique sont toujours positionnées à rwxrwxrwx!
Permissions implicites - Quelles permissions sont données lors de la création d'un fichier (resp. répertoire)?
La commande umask
permet d'ajuster les permissions positionnées lors de la création d'un fichier ou d'un répertoire.
umask
donne le masque de création en cours. Ce masque correspond aux permissions retirées lors de la création d'un fichier ou d'un répertoire.umask
est une sous-commande du shell, documentée dans le manuel de bash
.Ajustement des dates
La commande touch
permet d'ajuster les différentes dates associées à un fichier.
Changement de propriétaire/groupe
root
associé au groupe root
a une place particulière : c'est le login pour lequel il n'existe (quasiment) pas de restrictions d'où une certaine obsession largement répandue et un défi constant dans certains esprits : devenir root.Il est possible de changer le propriétaire (et le groupe) attaché à un fichier à l'aide de la commande chown
, mais cette commande nécessite des privilèges particuliers. Il est possible de changer seulement le groupe avec la commande chgrp
.
Pourquoi je peux pas chown
er?
Considérez le scénario suivant :
root
.Ouf, ce n'est pas possible!
Commandes usuelles de manipulation de fichiers
nom de commande | opération réalisée | fichier | répertoire |
---|---|---|---|
mkdir (make directory) | créer un répertoire vide | - | ok |
rmdir (remove directory) | effacer un répertoire vide | - | ok |
cp (copy) | copier | ok | ok |
mv (move) | déplacer/renommer | ok | ok |
touch | créer un fichier/ajuster une date | ok | ok |
rm (remove) | supprimer | ok | ok |
Dans la table ci-dessus, la colonne intitulée «opération réalisée» décrit naïvement l'opération. Il est nécessaire de consulter le manuel pour connaître avec précision l'opération lorsqu'elle est appliquée à un fichier ou à un répertoire. L'implication d'un répertoire sous-entend souvent la prise en charge d'une arborescence complète.
> mkdir rep1;mkdir rep1/rep2; > cd rep1;touch F1 F2 rep2/F3; > cd ..; > ls -R rep1 rep1/: F1 F2 rep2 rep1/rep2: F3 > cp rep1 rep3 cp: omission du répertoire `rep1/' > cp -R rep1 rep3 > ls -R rep3 rep3/: F1 F2 rep2 rep3/rep2: F3 > cp -R rep1 rep3 > ls -R rep3 rep3/: F1 F2 rep1 rep2 rep3/rep1: F1 F2 rep2 rep3/rep1/rep2: F3 rep3/rep2: F3 > rmdir rep3 rmdir: rep3: Le répertoire n'est pas vide. > rm -rf rep3 > ls rep3 ls: ne peut accéder rep3: Aucun fichier ou répertoire de ce type
> mkdir -p rep1/rep2; > cd rep1;touch F1 F2 rep2/F3; > cd ..; > tree rep1 rep1/ |-- F1 |-- F2 `-- rep2 `-- F3 1 directory, 3 files > cp -R rep1 rep3 > cp -R rep1 rep3 > tree rep3 rep3 |-- F1 |-- F2 |-- rep1 | |-- F1 | |-- F2 | `-- rep2 | `-- F3 `-- rep2 `-- F3 3 directories, 6 files > rm -rf rep3
Attention!!
> rm FichierImportant; > unrm FichierImportant -bash: unrm: command not found > undelete FichierImportant -bash: undelete: command not found (x_X).... > tree . |-- Fichier `-- FichierSuperMegaImportant 0 directories, 2 files > cat Fichier > mv Fichier FichierSuperMegaImportant (x_X)....
Un fichier effacé est effacé. Pas de seconde chance!
Et les permissions dans tout ça?
Lors d'une manipulation portant sur un fichier existant, qu'advient-il des permissions? Plus précisément :
cp
ne préserve pas les attributs. Il est toutefois possible d'essayer de le faire : concernant le propriétaire, cela revient à faire un chown
et ceci ne fonctionne que si le login utilisé pour faire le cp
peut faire le chown
.root
, mais pas pour un autre utilisateur.cp
, l'association d'un fichier à un login pourra être maintenue si et seulement si le login utilisé pour la commande tar
peut réaliser un chown
.Par le biais d'astuces reposant sur des redirections :
echo Texte > Fichier echo plus long >> Fichier
echo -e "Texte\nplus long" > Fichier
cat > Fichier Texte plus long que le precedent <Ctrl+D>
Toutefois, cette solution ne permet pas les modifications facilement! Comment modifier l'une des lignes sans lourdeur?
Par le biais d'un éditeur de texte non graphique :
nano
;emacs
;vi
ou vim
!
vi
est très efficace et puissant :
vi
n'est pas convivial, vi
est complexe.Par le biais d'un éditeur de texte graphique : débrouillez-vous.
Vos fichiers
…dans le titre précédent, un amalgame courant est commis : un login et la personne qui l'utilise. Un login est plutot à associer à un rôle ou un niveau de permissions - il n'est pas rare de jongler avec plusieurs logins! Les groupes aident à éviter la multiplication des logins, mais en fonction des besoins en sécurité, il est préférable d'utiliser différents logins.
Les fichiers associés à un login
Dans le fichier /etc/passwd
, chaque login est associé à un répertoire (sixième champ), son «home directory» ou «home». Ce répertoire appartient au login et est voué à abriter de façon pérenne les fichiers associés au login. Il est courant d'utiliser le répertoire /tmp
pour placer de façon provisoire des fichiers. Dans ce répertoire au nom évocateur (tmp pour temporaire), il n'est pas assuré de retrouver les fichiers placés la veille par exemple.
Certains raccourcis existent pour faciliter les déplacements/copies vers/depuis le home :
> whoami denis > cd /usr/share/doc/rfc > pwd /usr/share/doc/rfc > cd > pwd /home/denis > cat /etc/passwd | awk -F ":" '/denis/{print $6}' /home/denis > echo ~ ~denis ~root /home/denis /home/denis /root > cd ~root bash: line 1: cd: /root: Permission non accordée > cp -r /usr/share/doc/rfc/ ~/rfc -v `/usr/share/doc/rfc/rfc1809.txt.gz' -> `/home/denis/rfc/rfc1809.txt.gz' `/usr/share/doc/rfc/rfc2479.txt.gz' -> `/home/denis/rfc/rfc2479.txt.gz' `/usr/share/doc/rfc/rfc855.txt.gz' -> `/home/denis/rfc/rfc855.txt.gz' …
TP recherche d'informations
Le sujet comporte des imprécisions, la correction présente des erreurs : comment caractérise-t-on les fichiers que vous avez le droit d'exécuter? Que veut dire «les fichiers exécutables»? Pour les deux questions, des réponses naïves et fausses peuvent être données!
/tmp
exécutables par le login denis
?
denis@195.220.111.226 ~> groups denis denis audio wheel fabien denis@195.220.111.226 ~> find /tmp \( -user denis -perm -u+x \) -o \( -not -user denis -perm -g+x \( -group denis -o -group audio -o -group wheel -o group fabien \) \) -o \( -not -user denis -perm -o+x -not \( -group denis -o -group audio -o -group wheel -o group fabien \) \) …
~maimm1
peut obtenir un usager quelconque du système
denis@195.220.111.226 ~> echo ~maimm1 /mnt/old/home/2008/maimm1 denis@195.220.111.226 ~> ls -ld ~maimm1 drwxr-xr-x 4 maimm1 maimm1 4096 nov 5 10:54 /mnt/old/home/2008/maimm1Ici, on peut penser que le répertoire est accessible et listable pour tout le monde. Ceci ne pourra être vérifier que si chaque répertoire qu'il faut traverser pour atteindre la destination finale est traversable. Ce n'est pas parce que la commande ici n'a pas provoqué d'erreur que c'est vrai. L'absence d'erreur ici montre que le login
denis
peut atteindre ce répertoire et lire ses attributs. Il faut donc tester chaque répertoire pour pouvoir répondre.
denis@195.220.111.226 ~> ls -ld / drwxr-xr-x 20 root root 4096 nov 3 21:59 / denis@195.220.111.226 ~> ls -ld /mnt drwxr-xr-x 11 root root 4096 nov 11 21:05 /mnt/ denis@195.220.111.226 ~> ls -ld /mnt/old drwxr-xr-x 19 root root 4096 nov 3 22:13 /mnt/old/ denis@195.220.111.226 ~> ls -ld /mnt/old/home drwxr-xr-x 54 root root 4096 sep 17 07:47 /mnt/old/home/ denis@195.220.111.226 ~> ls -ld /mnt/old/home/2008 drwxr-xr-x 48 root root 4096 oct 22 07:36 /mnt/old/home/2008/D'après les permissions observées, ce répertoire est accessible par tous : que ce soit pour le propriétaire, le groupe ou les autres, il y a toujours le droit de traverser.
denis@195.220.111.226 ~> umask 0022 denis@195.220.111.226 ~> touch File;ls -l File -rw-r--r-- 1 denis denis 0 nov 12 15:52 File denis@195.220.111.226 ~> mkdir Rep;;ls -ld Rep drwxr-xr-x 2 denis denis 4096 nov 12 15:52 RepLe mode numérique du fichier (resp. du répertoire) est 0644 (resp. 755). La somme de 0022 et 0644 donne 0666 pour le fichier. On voit que les droits d'exécution ont été perdus (Cf. Permissions implicites décrites plus haut). La somme de 0022 et 0755 donne 0777. On retrouve toutes les permissions : celles données et celles retirées.
denis@195.220.111.226 ~> umask 37 denis@195.220.111.226 ~> umask 0037 denis@195.220.111.226 ~> touch File2;ls -l File2 -rw-r----- 1 denis denis 0 nov 12 16:00 File2 denis@195.220.111.226 ~> mkdir Rep2;ls -ld Rep2 drwxr----- 2 denis denis 4096 nov 12 16:00 Rep2Le mode numérique du fichier (resp. du répertoire) est 0640 (resp. 0740). La somme de 0037 et 0640 donne 0677 pour le fichier. On voit que seul le droit d'exécution pour le propriétaire est perdu (normal puisque les autres sont explicitement retirés par le masque). La somme de 0037 et 0740 donne 0777. On retrouve toutes les permissions : celles données et celles retirées.
/tmp
.
denis@195.220.111.226 ~> mkdir ~denis/Shared -m 777 denis@195.220.111.226 ~> ls -ld ~denis/Shared drwxrwxrwx 2 denis denis 4096 nov 12 16:11 /home/denis/Shared/ … maimm1@195.220.111.226 ~> touch ~denis/Shared/File maimm1@195.220.111.226 ~> ls -li ~denis/Shared/File 5014384 -rw-r----- 1 maimm1 maimm1 0 nov 12 16:55 /home/denis/Shared/File … denis@195.220.111.226 ~> cd ~/Shared denis@195.220.111.226 ~/Shared> mv File toto denis@195.220.111.226 ~Shared> ls -il toto 5014384 -rw-r----- 1 maimm1 maimm1 0 nov 12 16:55 toto denis@195.220.111.226 ~/Shared> mv toto ../ denis@195.220.111.226 ~/Shared> cd .. denis@195.220.111.226 ~> ls -il toto 5014384 -rw-r----- 1 maimm1 maimm1 0 nov 12 16:55 toto denis@195.220.111.226 ~> mv toto /tmp denis@195.220.111.226 ~> ls -il /tmp/toto 5014384 -rw-r----- 1 maimm1 maimm1 0 nov 12 16:55 /tmp/toto
maimm1@195.220.111.226 ~> mkdir ~maimm1/Shared -m 777; maimm1@195.220.111.226 ~> ls -ld ~/Shared drwxrwxrwx 2 maimm1 maimm1 4096 nov 12 17:17 /mnt/old/home/2008/maimm1/Shared/ … denis@195.220.111.226 ~> touch ~maimm1/Shared/File denis@195.220.111.226 ~> chmod a+r ~maimm1/Shared/File denis@195.220.111.226 ~> ls -li ~maimm1/Shared/File 3079510 -rw-r--r-- 1 denis denis 0 nov 12 17:20 /mnt/old/home/2008/maimm1/Shared/File … maimm1@195.220.111.226 ~> cd ~/Shared maimm1@195.220.111.226 ~/Shared> mv File toto maimm1@195.220.111.226 ~/Shared> ls -il toto 3079510 -rw-r--r-- 1 denis denis 0 nov 12 17:20 toto maimm1@195.220.111.226 ~/Shared> mv toto ../ maimm1@195.220.111.226 ~/Shared> cd .. maimm1@195.220.111.226 ~> ls -il toto 3079510 -rw-r--r-- 1 denis denis 0 nov 12 17:20 toto maimm1@195.220.111.226 ~> mv toto /tmp maimm1@195.220.111.226 ~> ls -il /tmp/toto 475545 -rw-r--r-- 1 maimm1 maimm1 0 nov 12 17:20 /tmp/toto maimm1@195.220.111.226 ~> figlet Mouahaha __ __ _ _ | \/ | ___ _ _ __ _| |__ __ _| |__ __ _ | |\/| |/ _ \| | | |/ _` | '_ \ / _` | '_ \ / _` | | | | | (_) | |_| | (_| | | | | (_| | | | | (_| | |_| |_|\___/ \__,_|\__,_|_| |_|\__,_|_| |_|\__,_| maimm1@195.220.111.226 ~> mount | sort /dev/hda3 on / type ext3 (rw,noatime) /dev/hda4 on /mnt/old type ext2 (rw,noatime) devpts on /dev/pts type devpts …
maimm1
, il y a un changement de systèmes de fichier : le home pour ce login est situé sur la partition /dev/hda4
et le répertoire /tmp
est situé sur la partition /dev/hda2
! Pour réaliser ce déplacement, il faut être capable de lire le fichier pour le copier vers l'autre partition. Par ailleur, la création d'un nouveau fichier sur l'autre partition implique un changement de numéro d'i-node et un changement de propriétaire : le propriétaire n'est pas le propriétaire initial, mais celui qui crée le fichier et le numéro d'i-node du nouveau fichier est indépendant de l'ancien. Par ailleurs, il faut également pouvoir supprimer le fichier de son emplacement original.
denis@195.220.111.226 ~> mkdir ~/Welcome -m 777;ls -ld ~/Welcome drwxrwxrwx 2 denis denis 4096 nov 12 16:11 /home/denis/Welcome/ … maimm1@195.220.111.226 ~> umask 077 maimm1@195.220.111.226 ~> touch ~denis/Welcome/File; mkdir -p ~/denis/Welcome/Rep/SSRep maimm1@195.220.111.226 ~> ls -l ~denis/Welcome/File; ls -ld ~/denis/Welcome/Rep{/,/SSRep} -rw-r----- 1 maimm1 maimm1 0 nov 12 16:16 /home/denis/Welcome/File drwxr----- 3 maimm1 maimm1 4096 nov 12 16:16 /mnt/old/home/2008/maimm1/denis/Welcome/Rep/ drwxr----- 2 maimm1 maimm1 4096 nov 12 16:16 /mnt/old/home/2008/maimm1/denis/Welcome/Rep/SSRep … denis@195.220.111.226 ~> ls -lR ~/Welcome /home/denis/Welcome/: total 4 -rw------- 1 maimm1 maimm1 0 nov 12 16:22 File drwx------ 3 maimm1 maimm1 4096 nov 12 16:22 Rep ls: ne peut ouvrir le répertoire /home/denis/Welcome/Rep: Permission non accordée denis@195.220.111.226 ~> cp -r Rep/ /tmp cp: ne peut accéder `Rep/': Permission non accordée denis@195.220.111.226 ~> rm Rep/ -rf rm: ne peut enlever `Rep/': Permission non accordée denis@195.220.111.226 ~> ...Pour supprimer le répertoire
Rep
, il faut qu'il soit vide. Pour le vider, il faut pouvoir acceder à son contenu, ce qui n'est pas possible dans le cas présent!
Divers outils existent pour enregistrer et rejouer une partie d'une interaction avec le systéme. Certains outils permettent d'enregistrer une interaction avec le terminal, d'autres permettent de capturer une interaction graphique portant sur une fenêtre ou la totalité de l'environnement graphique.
Vous pouvez enregistrer une session de console avec script
(commande existante sur 195.220.111.226).
> script -t DemoScript 2> DemoScriptTime Le script a débuté, le fichier est DemoScript not in a login shell reading ~.bashrc > echo salut salut > umask 0022 > <Ctrl+D> exit Script complélé, le fichier est DemoScript > script -a -t DemoScript 2>> DemoScriptTime Le script a débuté, le fichier est DemoScript not in a login shell reading ~.bashrc > whoami …
Vous pouvez rejouer une session avec la commande scriptreplay
si vous disposez du fichier contenant l'output de la console ET le fichier contenant le timing de cet output.
> scriptreplay DemoScriptTime DemoScript > echo salut salut > umask…
Vous pouvez même la rejouer en modifiant la vitesse de lecture!
> scriptreplay DemoScriptTime DemoScript 4
Quelques sessions ont été enregistrées et placées sur le site dans le but de donner des exemples concrets d'usage des commandes vues en cours
Exécution de programme
Il existe différentes façons de lancer un programme :
Chaque lancement de programme engendre un processus qui est une instance du programme. Un programme peut être exécuté plusieurs fois en parallèle, ce qui conduit à différents processus.
Organisation des processus
Comme les fichiers, les processus sont organisés en arborescence :
init
devient le nouveau père des processus fils. init
est le processus de PID 1. Il est créé au cours du processus de démarrage du système et son père n'est pas un processus à proprement parler (Cf génération de processus plus loin).mai12345@195.220.111.226:~> pstree -p init(1)-+-NetworkManager(5149)-+-dhclient(5377) | `-{NetworkManager}(5378) ...... |-acpid(4515) |-atd(5264) |-avahi-daemon(4724)---avahi-daemon(4725) |-evolution-data-(6178)-+-{evolution-data-}(6183) | `-{evolution-data-}(6190) |-firefox(11881)-+-{firefox}(11883) | |-{firefox}(11893) | `-{firefox}(11899) |-klogd(4679) |-master(4881)-+-pickup(11331) | `-qmgr(5466) |-mixer_applet2(6226)---{mixer_applet2}(6256) |-pulseaudio(6044)-+-gconf-helper(6047) | |-{pulseaudio}(6045) | `-{pulseaudio}(6046) |-syslogd(4625) |-system-tools-ba(5229) |-trashapplet(6212) |-udevd(2284) |-wpa_supplicant(5153) `-xterm(8745)---bash(8746)
Structure d'un processus
Un processus est un objet géré en mémoire. L'espace mémoire qu'il occupe est structuré pour contenir :
On appelle «contexte d'un processus» l'ensemble des informations qui permettront au système d'arrêter le processus à un instant et le redemarrer plus tard sans qu'il soit perturbé par cet arrêt :
Création d'un nouveau processus : fork
et exec
Un processus peut créer un nouveau processus, ce qui implique les étapes suivantes :
fork
(ou un appel de la même famille) - fork
renvoie 0 dans le nouveau processus et le PID du nouveau processus dans son père;stdin
, stdout
et stderr
);exec
(ou un appel de la même famille).ZZZzzz (-_-)
Ces détails sont utiles à une meilleure compréhension des mécanismes du shell tels que la communication entre processus et les redirections.
Shells
Un shell est un interpréteur de commande - une interface entre l'utilisateur et le système!
Deux familles de shells
Le premier shell, le Thompson shell (sh), très rudimentaire, a donné deux variantes majeures par les caractéristiques qu'elles ont apportées :
sh
) - variables, contrôle des entrées/sorties, gestion des signaux, gestion de l'environnement… csh
), fortement imprégné par la syntaxe du langage C - contrôle des processus, mécanisme d'historique, alias, tableau…. Ces deux shells ont donné lieu à diverses évolutions rassemblées en deux familles
sh
(Bourne shell), bash
(Bourne again shell), ksh
(Korn shell), pdksh
(Public Domain ksh), ash
(Almquist shell) , zsh
… csh
, tcsh
(Tenex csh)… Mécanisme fondamental
Tout shell procède selon le même schéma pour traiter les commandes :
Toutefois, chaque shell peut présenter des spécificités pour ces étapes. Nous nous intéresserons au Bourne shell et plus particulièrement au bash
.
Ce qui suit est un résumé (et probablement une déformation) des informations données par le manuel de la commande bash
!
Lecture et analyse lexicale
Dans le cas général, l'objectif de la phase de lecture et d'analyse lexicale est de découper la ou les lignes lues pour d'identifier le type de commande et lire tous les éléments la constituant. Dans le cas particulier des «dot script», tout le script est lu, mais dans le cas général, le minimum est lu pour identifier la première commande. Une fois cette épape réalisée, le shell passe à la phase d'interprétation.
Le découpage et l'analyse prennent sens autour des éléments suivants :
|
&
;
( )
< >
space
tab
permettant de séparer des mots lorsqu'ils aparaissent hors des quotes;||
&
&&
;
;;
( )
|
<newline>
Il existe différents types de commande :
cmd arg1 arg2…
éventuellement suivie d'un opérateur de contrôle;|
où chaque commande est exécutée dans un sous-shell;;
&
&&
ou ||
et dont la fin est éventuellement marquée par ;
&
ou <newline>
;(liste)
où la liste est exécutée dans un sous-shell;{ liste; }
où la liste est exécutée dans le shell courant; ((expression))
où il s'agit d'une expression arithmétique[[ expression ]]
où il s'agit d'une expression conditionnellefor name [ in word ] ; do list ; done
for (( expr1 ; expr2 ; expr3 )) ; do list ; done
select name [ in word ] ; do list ; done
case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
if list; then list; [ elif list; then list; ] ... [ else list; ] fi
while list; do list; done
until list; do list; done
~> TmpFile() { FILE=/tmp/tmpfile_${RANDOM}; until [[ ! -a ${FILE} ]];do FILE=/tmp/tmpfile_$RANDOM;done; echo ${FILE};} ~> TmpFile /tmp/tmpfile_29780
~> ki () { w | awk '{print $1}' | grep ^mai | sort -u | while read u; do id -P $u; done | awk -F: '{printf "%-12s %s\n",$1,$8}' | sort -k1.13; } ~> ki mai1120338 PLATHEY Loïc mai119599 ANTHOINE Loriane mai1125219 CHICHE Guillaume mai1030182 KOUNA Vanessa
A quoi ressemble une expression?
[[ -f "Mon fichier" ]]
[[ ! -d ~/bin ]]
ou test ! -d ~/bin
ou [ ! -d ~/bin ]
sont équivalents [[ $FILE1 -nt $FILE2 ]]
équivaut à test "$FILE1" -nt "$FILE2"
[[ -d ~/bin || -d ~/cbin ]]
équivaut à test -d ~/bin || test -d ~/cbin
ou [ -d ~/bin ] || [ -d ~/cbin ]
[[ ]]
ou [ ]
ou après test
. Ces deux derniers, qui sont équivalents, permettent de réaliser le test lorsque toutes les étapes de l'interprétation (voir plus loin) ont été réalisées alors que l'expression placée entre [[ ]]
n'est pas l'objet de découpage en champ ni de développement des noms de fichier, comme si elle était évaluée lors de l'étape de développement des expressions arithmétiques.
$(( ))
ou (( ))
. La première forme est substituée par le résultat de l'évaluation alors que la seconde permet d'utiliser le résultat comme booléen : une valeur nulle équivaut à un false et toute autre valeur à true. L'ensemble des opérateurs pouvant servir à construire une expression est présenté dans le manuel. Ci-dessous, quelques exemples d'expressions :
X=$(( 2**10 )); N=$(( 2 << 9 ));echo $N $X
echo $(( 2 | 4 )) $(( 6 | 2 ))
M=6;N=5;echo $(( M>N?M:N ))
if test $(( M > N )) -ne 0; then echo $M;else echo $N;fi
, ce qui équivaut à test $(( M > N )) -ne 0 && echo $M || echo $N
if (( M > N )) ; then echo $M;else echo $N;fi
, ce qui équivaut à (( M > N )) && echo $M || echo $N
(( 0 )) && echo ok
(( ! 0 )) && echo ok
Ceci est incomplet…! Se reporter au manuel ou à la documentation complète du shell concerné pour plus de détails.
Interprétation
La phase d'interprétation (expansion dans le manuel original) est faite d'une suite ordonnée d'opérations :
~
) (tilde expansion)Chacune de ces étapes est décrite dans le support relatif au shell.
Un mot sur les redirections - mises en place avant l'exécution des commandes…
La commande eval
précédant une commande permet de provoquer un nouveau cycle d'interprétation avant exécution.
Quelques eclaircissements
~> find ~ -type l # caractere ~
~> ls *.pdf # dev de nom de fichier
~> for f in *pdf;do ...;done # boucles
~> cd - # pour revenir dans le répertoire
~> alias A=2 ~> echo $A ~> A -bash: 2: command not found
~> ${MaVar:=2} -bash: 2: command not found ~> echo $MaVar 2 ~> ${MaVar:=3} -bash: 2: command not found ~> echo $MaVar 2
~> MonMail=Gpas2memoire@coldmail.org; > mail -s 'historique - '$(date) $MonMail < ~/.bash_history _ _ _ __ ___ ___ _ __ _ __ ___ _ __ | |__ _ _| |_ | '_ \ / _ \ / _ \ '__| '__/ _ \| '__| | '_ \| | | | __| | | | | (_) | | __/ | | | | (_) | | | |_) | |_| | |_ _ _ _ |_| |_|\___/ \___|_| |_| \___/|_| |_.__/ \__,_|\__(_) (_) (_) I'm sorry to have to inform you that your message could not be delivered to one or more recipients. It's attached below. For further assistance, please send mail to postmaster. If you do so, please include this problem report. You can delete your own text from the attached returned message. The mail system <CET@wiport2ucb896.univ-lyon1.fr> (expanded from <CET>): unknown user: "cet" <2011@wiport2ucb896.univ-lyon1.fr> (expanded from <2011>): unknown user: "2011" <7@wiport2ucb896.univ-lyon1.fr> (expanded from <7>): unknown user: "7" <Dec@wiport2ucb896.univ-lyon1.fr> (expanded from <Dec>): unknown user: "dec" <"09:21:35"@wiport2ucb896.univ-lyon1.fr> (expanded from <"09:21:35">): unknown user: "09:21:35" ... > mail -s 'historique - '"$(date)" $MonMail < ~/.bash_history > mail Mail version 8.1 6/6/93. Type ? for help. "/var/mail/denis": 5 messages 1 new 5 unread U 1 mai102575@wiport2ucb Tue Dec 6 13:30 15/625 "Reponses de Margarit Olivier" U 2 denis@wiport2ucb896. Wed Dec 7 09:21 17/705 "Wed" U 3 MAILER-DAEMON@wiport Wed Dec 7 09:21 103/3550 "Undelivered Mail Returned to Send" U 4 denis@wiport2ucb896. Wed Dec 7 09:21 17/712 "historyWed" >N 5 denis@wiport2ucb896. Wed Dec 7 09:45 513/10712 "historique - Wed Dec 7 09:45:08 " _ _ _ _ _ _ _ __ _(_) |_ ___ | | | | | |_ __ __ _| (_) __ _ ___ \ \ / / | __/ _ \ | | | | | | '_ \ / _` | | |/ _` / __| \ V /| | || __/ |_| | |_| | | | | | (_| | | | (_| \__ \ \_/ |_|\__\___| (_) \___/|_| |_| \__,_|_|_|\__,_|___/ > alias sendhist="mail -s 'historique - '"$(date)" $MonMail < ~/.bash_history" > alias ... alias sendhist='mail -s '\''historique - '\''Lun 12 déc 2011 12:59:44 CET denis < ~/.bash_history' ____ | __ ) _ _ __ _ | _ \| | | |/ _` | | |_) | |_| | (_| | |____/ \__,_|\__, | |___/ > alias sendhist="mail -s 'historique - '"'"$(date)" $MonMail < ~/.bash_history' > alias ... alias sendhist='mail -s '\''historique - '\''"$(date)" $MonMail < ~/.bash_history' ___ _ / _ \| | __ | | | | |/ / | |_| | < \___/|_|\_\
Exécution
Lorsque le processus d'interprétation prend fin, si la commande construite est une commande simple, alors l'exécution dépend du premier mot de cette ligne :
/
, alors il s'agit d'un chemin (relatif ou absolu…valide ou non) vers le fichier correspondant au programme à exécuter. cd
, echo
, kill
, jobs
sont des commandes intégrées au bash
(i.e. des fonctions du bash
), mais pas à sh
!PATH
, en parcourant les répertoires de gauche à droite (ou du premier au dernier)Si la recherche aboutit, le reste des mots est passé comme ensemble d'arguments à la commande et le programme est exécuté après que l'interpréteur est «forqué» (sauf s'il s'agit d'une fonction!). Si l'exécution échoue parce que le programme n'est pas dans un format exécutable connu par le système et s'il ne s'agit pas d'un répertoire, il est traité comme un script shell : un sous-shell est exécuté pour le traiter. Si la première ligne est de la forme #!/CHEMIN/VERS/UN/PROGRAMME
, ce programme est utilisé comme interpréteur des commandes qui sont données dans la suite du fichier, sinon, le sous-shell les exécute directement.
Je trouve pas le manuel pour la commande alias
!
Les commandes que vous manipulez peuvent être des commandes intégrées du shell ou des fonctions définies dans cet environnement. Comment repérer que la commande que vous manipulez est interne ou externe au shell? La commande intégrée declare
sans argument fournit la liste des fonctions (et leurs définitions). La commande intégrée enable -p
fournit la liste des fonctions intégrées du bash. La commande which
permet de connaître le chemin absolu vers un programme externe au shell que la variable PATH
permet d'atteindre.
Les fonctions intégrées du shell sont documentées dans le manuel du shell! C'est le cas des commandes alias
, echo
, cd
etc.
~> enable | grep alias enable alias enable unalias ~> which alias ~> declare | grep alias _alias () COMPREPLY=($( compgen -A alias -S '=' -- $cur )) COMPREPLY=("$( alias ${cur%=} 2>/dev/null | sed -e 's|^alias '$cur'\(.*\)$|\1|' )") COMPREPLY=($( command ls $datadir/*.@(multi|alias) )); COMPREPLY=(${COMPREPLY[@]%.@(multi|alias)}); COMPREPLY=($( compgen -W 'alias arrayvar binding ........ ~> which kill /bin/kill ~> enable | grep kill enable kill ~> declare | grep kill _kill () _killall () alarm exec fork getpgrp getppid getpriority kill pipe qx \
Exemples de commandes
Ci-dessous, quelques exemples de pièges
VAR=1;while (( VAR<=4)); do VAR=$(( VAR+1 ));echo $VAR; done; echo $VAR 2 3 4 5 5
VAR=1;seq 2 5 | while read VAR;do echo $VAR; done; echo $VAR 2 3 4 5 1
for f in *.pdf;do md5sum "$f";done 9b2d7dd7e892ee94f7acb20edf95a1c4 Liste Etudiants.pdf ab6ac8451f9a3ccfe22becb0bb19fc98 Projet.pdf 3f49f71264a86028309163839918477e Sujet.pdf
for f in $(ls *.pdf);do md5sum "$f";done md5sum: Liste: Aucun fichier ou dossier de ce type md5sum: Etudiants.pdf: Aucun fichier ou dossier de ce type ab6ac8451f9a3ccfe22becb0bb19fc98 Projet.pdf 3f49f71264a86028309163839918477e Sujet.pdf
for f in $(find -iname \*pdf );do ls -l "$f";done ls: ne peut accéder ./Liste: Aucun fichier ou dossier de ce type ls: ne peut accéder Etudiants.pdf: Aucun fichier ou dossier de ce type -rw-r--r-- 1 denis denis 6 2008-11-29 22:58 ./Sujet.pdf -rw-r--r-- 1 denis denis 5 2008-11-29 22:58 ./Projet.pdf
find -iname \*pdf | while read f;do ls -l "$f";done -rw-r--r-- 1 denis denis 6 2008-11-29 22:58 ./Liste Etudiants.pdf -rw-r--r-- 1 denis denis 6 2008-11-29 22:58 ./Sujet.pdf -rw-r--r-- 1 denis denis 5 2008-11-29 22:58 ./Projet.pdf
alias wt="echo nous sommes le $(date +%d:%b:%Y), il est $(date +%H:%M:%S)"; alias wt alias wt='echo nous sommes le 30:nov:2008, il est 00:42:40'
alias wt="echo nous sommes le \$(date +%d:%b:%Y), il est \$(date +%H:%M:%S)"; alias wt alias wt='echo nous sommes le $(date +%d:%b:%Y), il est $(date +%H:%M:%S)'
grep
, sed
et awk
…
ls | awk '{ print $0}' Liste Etudiants.pdf NOM Projet.pdf Sujet.pdf
ls | awk "{ print $0}"
whoami denis cat /etc/passwd | awk -F":" '$1 ~ '$(whoami)' {print $0}' … avahi:x:110:121:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false haldaemon:x:111:122:Hardware abstraction layer,,,:/var/run/hald:/bin/false denis:x:1000:1000:denis,,,:/home/denis:/bin/bash …
whoami denis cat /etc/passwd | awk -F":" '$1 ~ "'$(whoami)'" {print $0}' denis:x:1000:1000:denis,,,:/home/denis:/bin/bash
eval
permet une nouvelle passe à travers toutes les étapes de l'interprétation.
[[ -f ~/.bash*y ]] && echo ~/.bash*y existe
eval [[ -f ~/.bash*y ]] && echo ~/.bash*y existe /home/denis/.bash_history existe test -f ~/.bash*y && echo ~/.bash*y existe /home/denis/.bash_history existe
Pour finir, un exemple de commande permettant de lancer un traitement sans l'obligation de rester connecter jusqu'à la fin de ce traitement!
nohup R CMD BATCH par_2.R Batch_2.out &
Scripts
Un ensemble de commandes peut être enregistré dans un fichier afin de pouvoir être ré-exécuté plus tard. Un tel fichier est un script. Il existe deux façons d'utiliser un script :
source
(ou .
) suivi du chemin vers le script, d'où le terme de «dot script». Les commandes sont lues puis exécutées dans le shell courant. Dans le second cas, il est préférable que la première ligne soit de la forme #!/CHEMIN/VERS/INTERPRETEUR
afin d'indiquer clairement l'interpréteur des commandes à utiliser pour exécuter les lignes suivantes. Sinon, c'est le shell en cours qui sera utilisé d'office comme interpréteur.
Certains paramètres du shell prennent un intérêt particulier dans le contexte des scripts, notamment pour la mise au point de script pouvant gérer différentes options :
?
contient le code de retour du pipeline ayant pris fin le plus récemment$
contient le PID du processus 0
contient le premier argument ayant servi à lancer le processus en cours i.e. lz nom de la commande la plupart du temps (sauf…)1
(resp. 2
, 3
…) contient initialement le premier (resp. second, troisième…) argument passé au programme en cours. La commande shift
permet de décaler les arguments (n
devient 1
, n+1
devient 2
…) en laissant 0
inchangé.#
contient le nombre d'arguments passés au programme en cours.*
contient les arguments, et "$*"
équivaut à "$1 $2 $3..."
alors que@
contient les arguments, mais "$@"
équivaut à "$1" "$2" "$3"...
Ces paramètres existent en permanence dans l'environnement du shell.
D'autres paramètres existent et peuvent trouver une utilité dans un contexte particulier…
Scripts - Exemples
#!/bin/bash #set -x if ! [[ -d ~/SymantecUpdate ]] ;then mkdir ~/SymantecUpdate;fi cd ~/SymantecUpdate HREF=$(curl http://securityresponse.symantec.com/avcenter/download/pages/FR-N95.html 2>/dev/null | grep href | grep exe | sed -e 's/^.*href="\([^"]*\)"\(.*\)$/\1\n\2/g' -e 's/>.*$//') echo $HREF for f in ${HREF}; do echo "test de ${f##*/}" if ! [[ -f ${f##*/} ]]; then echo "${f} a télécharger"; curl "${f}" -o "${f##*/}" else echo "${f} deja telechargé" fi done at -f $0 $(date +"%k:%M")+6hours
#!/bin/bash set -x ################################################################################ # Limitation : # - pas de recherche tres robuste des urls # - pas de telechargenement robuste... # - ... ################################################################################ DIR=~/SymantecUpdate URL="http://securityresponse.symantec.com/avcenter/download/pages/FR-N95.html" while getopts d:u: OPT do case ${OPT} in d) INPUT=${OPTARG}; if [ -e ${INPUT} ] # Si le fichier existe then if [ ! -d ${INPUT} ] # mais qu'il ne s'agit pas d'un repertoire then echo >&2 "${INPUT} n'est pas un repertoire. Utilisation de $DIR..." else if ( cd ${INPUT} && TMP=$RANDOM$RANDOM && touch $TMP && rm $TMP) # si then DIR=${INPUT} else echo >&2 "${INPUT} n'est pas accessible en ecriture. Utilisation de $DIR..." fi fi else ( mkdir -p ${INPUT} ) && DIR=${INPUT} || echo >&2 "ne peut creer ${INPUT}. Utilisation de $DIR..." fi;; u) URL=${OPTARG};; \?) echo "Usage : $0 [-d DIR] [-u URL]" >&2; exit;; esac done shift $(( ${OPTIND} - 1 )) cd ${DIR} HREF=$(curl ${URL} 2>/dev/null | grep href | grep exe | sed -e 's/^.*href="\([^"]*\)"\(.*\)$/\1\n\2/g' -e 's/>.*$//') echo $HREF exit for f in ${HREF}; do echo "test de ${f##*/}" if ! [[ -f ${f##*/} ]]; then echo "${f} a télécharger"; curl "${f}" -o "${f##*/}" else echo "${f} deja telechargé" fi done if /etc/inid.d/atd status | grep running then at -f $0 $(date +"%k:%M")+6hours else echo "Le demon atd ne semble pas demarre" fi
#!/bin/bash set -x USERS=$(echo ~amraoui ~andridom ~ausseldavid ~badis ~balayaugustin ~benkhali ~cuinan ~degrangejulie ~devesgaetan ~dianaisabelle ~elarif ~fifian_ribane ~fred ~fredericcordier ~garavagnocindy ~gaspardlucie ~geminium ~genoviniemilie ~gigabob ~hellalimalek ~jacquemondflorence ~konstaleta ~kupiecaurelie ~leslietrombone ~like ~lueilin ~ndatanathalie ~poncetmael ~raismehdi ~umulisasonia ~valletmanu ~yakoubenlynda ~zhang_jing ~zhangsiqi) LOG=Watch_public_html.log while true do for f in ${USERS} do if ! find ${f} -maxdepth 1 -name public_html -perm +go+x; then continue;fi # execution dependant des droits en cours... if (( $(ls ${f}/public_html 2>/dev/null | wc -l ) == 0 )); then continue;fi if ! grep -q ${f} ${LOG}; then { echo "********************";echo " LISTING DE $f";ls -l ${f}/public_html 2>/dev/null;echo;echo "********************";} >> $LOG continue fi MD5SUM=$( { ls -l ${f}/public_html 2>/dev/null;echo;} | md5sum ) F=$(echo $f | sed -e 's/\//\\\//g') LAST_MD5SUM=$(tac ${LOG} | sed -e '/'${F}'/,$d' | tac | sed -e '/^\*\*/,$d' | md5sum ) if [[ "${LAST_MD5SUM}" != "${MD5SUM}" ]]; then { echo "********************";echo " LISTING DE $f";ls -l ${f}/public_html 2>/dev/null;echo;echo "********************";} >> $LOG fi done sleep 10 done
#!/bin/bash export MonPORT=$(( RANDOM +1024 )) Stunnel_PID="/tmp/stunnel.$(whoami).pid" bold() { echo "$1" | sed -Ee 's/(.)/\1\\b\1/g';} uline() { echo "$1" | sed -Ee 's/(.)/_\\b\1/g';} export -f bold export -f uline while ( netstat -np tcp | sed 1,2d | awk '{sub(/^.*\./,"",$4);sub(/^.*\./,"",$5);print $4;print $5}' | grep ${MonPORT}) ;do MonPORT=$(( RANDOM +1024 )) done printf "\n\nVotre tunnel vers $(uline gmail) est cree\nPour vous connecter vers gmail,\nutilisez la commande:\n\n\t $(bold 'telnet 127.0.0.1 '$(printf "%d" ${MonPORT})) \n\n\n" | more touch "${Stunnel_PID}" /opt/local/bin/stunnel -fd 0 << FIN_CONF sslVersion = SSLv3 foreground = yes socket = l:TCP_NODELAY=1 socket = r:TCP_NODELAY=1 debug = 7 client = yes pid=${Stunnel_PID} service=pop3s [pop3s] connect = pop.gmail.com:995 accept = 127.0.0.1:${MonPORT} FIN_CONF
Pour une commande simple
Dans le cas d'une commande simple exécutée par le shell sans redirection : echo toto
Dans le cas d'une commande simple exécutée par le shell avec redirection : echo toto > /tmp/toto
Pour une commande composée
Dans le cas d'un pipeline de commandes : echo toto | wc -c
Initialisation d'une session locale
La connexion d'un utilisateur passe par un processus d'initialisation. Cette initialisation varie en fonction du contexte de la connexion (graphique ou console). Il est important de noter qu'un shell est initialisé différemment dans ces deux contextes.
bash
, trois cas sont distingués - trois contextes différents existent pour l'invocation d'un shell
/etc/profile
, s'il existe (et qu'il est lisible), puis exécute les commandes du premier fichier trouvé parmi ~/.bash_profile
, ~/.bash_login
et ~/.profile
, la recherche se faisant dans cet ordre.~/.bash_logout
sont exécutées./etc/bash.bashrc
et ~/.bashrc
BASH_ENV
existe et qu'elle indique un fichier, les commandes qu'il contient sont exécutées.~/.profile
comporte la ligne, d'où une éventuelle confusion…
[ -f ~/.bashrc ] && . ~/.bashrcLes connexions distantes seront revues plus loin.
echo "Reading ${BASH_SOURCE}" 1>&2
en début de fichier. Ceci permet de s'assurer que le fichier nommé NOM_DU_FICHIER
est lu!~/.bash_logout
sont exécutées à la fermeture d'un shell de login.Initialisation d'une session locale
gnome-terminal
ou konsole
ou xterm
, vous exécutez un terminal virtuel.~/.bashrc
est lu.Services de connexions à distance
telnet
pour l'exécution de commandes à distanceftp
pour le transfert de fichiersssh
:
ssh
pour l'exécution de commandes à distancesftp
pour le transfert de fichiertelnet
ou ftp
?
Architecture client/serveur
Outils de connexions à distance
Putty
(ssh), WinSCP
(sftp) - telnet
et ftp
sont des commandes disponibles dans l'interpréteur de commande.ssh
, sftp
- rdesktop
pour se connecter à une machine windows permettant une connexion terminal serverEnvironnement client | |||
---|---|---|---|
Linux | Microsoft | ||
Environnement Serveur | Linux |
|
|
putty
permet également de faire du tunneling et de la redirection de port, mais dans ces cas précis, l'application joue le rôle de serveur.Modèles en couches
Principe du modèle en couches
Exemple
Modèle OSI
Fonctions isolées dans le modèle OSI, en partant du niveau matériel et en remontant vers les niveaux d'abstraction plus hauts
TCP-IP
Le modèle TCP-IP visait différents objectifs :
Le modèle TCP-IP définit quatre couches
TCP-IP - Concepts fondateurs
Octet 1 | Octet 2 | Octet 3 | Octet 4 | |||||||||||||||||||||||||||||
classe A | 0 | netid | hostid | |||||||||||||||||||||||||||||
classe B | 1 | 0 | netid | hostid | ||||||||||||||||||||||||||||
classe C | 1 | 1 | 0 | netid | hostid |
classe | adresse réseau |
---|---|
A | 10.0.0.0 |
B | 172.16.0.0 à 172.31.0.0 |
C | 192.168.0.0 à 192.168.255.0 |
TCP-IP - Concepts fondateurs
numéro | service |
---|---|
21 | ftp |
22 | ssh |
25 | smtp |
80 | http |
443 | https |
root
. TCP-IP - Mécanismes
/etc/hosts
TCP-IP - Mécanismes
TCP-IP - Mécanismes
TCP-IP - Exemple de communication simple
Pour mettre en évidence les informations utiles aux différentes protocoles et les resituer dans les couches de la pile TCP IP, des couleurs sont utilisées ci-desous: couche application, couche transport, couche réseau, couche liaison.
GET / HTTP/1.1 Host: www.google.frCette requête doit maintenant être transmise au serveur, et ceci implique une traversée du reste des couches sur le client.
HTTP/1.1 200 OK Date: Tue, 17 Jan 2012 22:59:23 GMT Accept-Ranges: bytes Content-Length: 5810 Content-Type: text/html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Google</title> .....
La réalité est légèrement plus complexe à déchiffrer car les détails sont plus nombreux, mais la pratique de l'observation des échanges permet de comprendre rapidement l'imbrication et les successions des échanges. Il est important de comprendre, pour bien débuter, que chaque couche a besoin de certaines informations: adresse IP et numéro de port pour le client et pour le serveur, ainsi que des adresses matérielles pour la transmission des paquets.
Ici, seuls les échanges au niveau applicatifs sont illustrés, mais on pourrait s'intéresser à plus de détails.
TCP-IP - Exemple de communication classique - l'envoi de mail
L'envoi de mail repose dans une majorité de cas sur le protocole SMTP (Simple Mail Transfert Protocol). Il reste très simple, au point qu'il peut être réalisé « à la main» comme la session ci-dessous le montre:
telnet smtp.univ-lyon1.fr 25
Trying 134.214.100.11... Connected to smtprocad.univ-lyon1.fr. Escape character is '^]'. 220 cisrsmtp4.univ-lyon1.fr ESMTP Postfix (Debian/GNU)
HELO TestTelnet
250 cisrsmtp4.univ-lyon1.fr
MAIL FROM: <denis@is2ifa-01.univ-lyon1.fr>
250 2.1.0 Ok
Tiens, tiens, je n'ai pas à justifier de l'utilisation de cette adresse…
RCPT TO: denis.clot@gmail.com
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: evidemment test J'ecris des choses tout a fait passionnantes .
250 2.0.0 Ok: queued as C8EABE0072
QUIT
221 2.0.0 Bye Connection closed by foreign host.
SMTP présente une limitation importante: comme le protocole TELNET, il a été écrit pour permettre des échanges entre des terminaux utilisant le NVT ASCII comme encodage, une variante de l'US ASCII utilisant les 7 bits de poids faible pour le codage d'un caractère (le bit de poids fort de l'octet étant mis à 0). En d'autres termes, seuls les caractères ci-dessous peuvent être transmis sans perte (lorsqu'un octet est transmis, le bit de poids fort est positionné à zéro).
| 0 nul| 1 soh| 2 stx| 3 etx| 4 eot| 5 enq| 6 ack| 7 bel| | 8 bs | 9 ht | 10 nl | 11 vt | 12 np | 13 cr | 14 so | 15 si | | 16 dle| 17 dc1| 18 dc2| 19 dc3| 20 dc4| 21 nak| 22 syn| 23 etb| | 24 can| 25 em | 26 sub| 27 esc| 28 fs | 29 gs | 30 rs | 31 us | | 32 sp | 33 ! | 34 " | 35 # | 36 $ | 37 % | 38 & | 39 ' | | 40 ( | 41 ) | 42 * | 43 + | 44 , | 45 - | 46 . | 47 / | | 48 0 | 49 1 | 50 2 | 51 3 | 52 4 | 53 5 | 54 6 | 55 7 | | 56 8 | 57 9 | 58 : | 59 ; | 60 < | 61 = | 62 > | 63 ? | | 64 @ | 65 A | 66 B | 67 C | 68 D | 69 E | 70 F | 71 G | | 72 H | 73 I | 74 J | 75 K | 76 L | 77 M | 78 N | 79 O | | 80 P | 81 Q | 82 R | 83 S | 84 T | 85 U | 86 V | 87 W | | 88 X | 89 Y | 90 Z | 91 [ | 92 \ | 93 ] | 94 ^ | 95 _ | | 96 ` | 97 a | 98 b | 99 c |100 d |101 e |102 f |103 g | |104 h |105 i |106 j |107 k |108 l |109 m |110 n |111 o | |112 p |113 q |114 r |115 s |116 t |117 u |118 v |119 w | |120 x |121 y |122 z |123 { |124 | |125 } |126 ~ |127 del|
Pour permettre l'utilisation de caractères ne figurant pas dans ce jeu (e.g. des caractères accentués) ou l'envoi de fichiers binaires (i.e. pouvant comporter n'importe quel type de caractères), le standard MIME (Multipurpose Internet Mail Extensions), conçu en réponse à cette limitation, prévoit plusieurs représentations possibles pour des données binaires et respectant la contrainte de n'utiliser que les 128 caractères ASCII, parmi lesquelles:
$ echo 'Linux et Sécurité, ça n'\''en finira jamais cette année? =:o(' | qprint -e Linux et S=C3=A9curit=C3=A9, =C3=A7a n'en finira jamais cette ann=C3= =A9e? =3D:o(
$ << FIN cat | qprint -d >Votre bo=EEte aux lettres est presque pleine. > >522 Mo Taille actuelle >550 Mo Taille maximale >R=E9duisez sa taille. Supprimez de votre bo=EEte aux lettres les =E9l=E9men= >ts superflus et videz votre dossier =C9l=E9ments supprim=E9s. >FIN Votre boîte aux lettres est presque pleine. 522 Mo Taille actuelle 550 Mo Taille maximale Réduisez sa taille. Supprimez de votre boîte aux lettres les éléments superflus et videz votre dossier Éléments supprimés.Dans le premier exemple, les caractères sont encodés en utf8. Dans le second, il s'agit d'iso-8858-1. L'information sur l'encodage des caractères doit être présente dans le mail!
Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v 14 O 31 f 48 w (pad) = 15 P 32 g 49 x 16 Q 33 h 50 yAinsi, à trois octets (24 bits) correspondent 4 caractères (4x6 bits). Par exemple:
Le standard MIME prévoit comment indiquer dans un mail si ces représentations sont utilisées de façon à permettre la restitution du contenu original.
TCP-IP - Exemple de communication via msn
wireshark
, un logiciel de capture et analyse, et en particulier grâce à sa fonction «Follow TCP stream». Cependant, avant d'utiliser cette fonction, il est nécessaire de savoir cibler la petite partie des échanges qui est intéressante dans un grand flux d'information…
MSG ginette.robert@.univ-lyon1.fr bob 107 MIME-Version: 1.0 Content-Type: text/x-msmsgscontrol TypingUser: ginette.robert@.univ-lyon1.fr MSG ginette.robert@.univ-lyon1.fr bob 129 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-MMS-IM-Format: FN=Arial%20Narrow; EF=; CO=800080; CS=0; PF=22 ok MSG ginette.robert@.univ-lyon1.fr bob 107 MIME-Version: 1.0 Content-Type: text/x-msmsgscontrol TypingUser: ginette.robert@.univ-lyon1.fr MSG ginette.robert@.univ-lyon1.fr bob 145 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-MMS-IM-Format: FN=Arial%20Narrow; EF=; CO=800080; CS=0; PF=22 alors ..a marche ?
MSG 22 U 93 MIME-Version: 1.0 Content-Type: text/x-msmsgscontrol TypingUser: denis.clot@gmail.com MSG 23 A 136 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-MMS-IM-Format: FN=Lucida%20Grande; EF=; CO=000000; CS=0; PF=2 en partie
ACK 23
MSG 24 U 93 MIME-Version: 1.0 Content-Type: text/x-msmsgscontrol TypingUser: denis.clot@gmail.com MSG 25 A 156 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-MMS-IM-Format: FN=Lucida%20Grande; EF=; CO=000000; CS=0; PF=2 sinon, on a finit avec alexis
ACK 25
Content-Type
: les messages de contrôle (text/x-msmsgscontrol
) et les messages contenant le texte échangé (text/plain; charset=UTF-8
).
Cette capture donne un petit aperçu sur le protocole MSN dans une version actuelle et laisse songeur sur les efforts consentis à la protection des données échangées par les utilisateurs. De la même manière, les émoticônes sont interceptables. Il est plus difficile de reconstruire les flux audio et video, mais nul doute qu'avec un peu de persevérance leur décodage serait également réalisable.
A titre d'exemple, il est facile de vérifier les hypothèses suivantes au sujet du protocole:
TCP-IP - Exemple de communication avec Facebook
On suppose que l'utilisateur veut se connecter à Facebook pour partager le meilleur de sa vie avec ses 357 amis qui s'impatientent d'un quart d'heure de silence…Nous considérons divers contextes dans lequels l'information échangée est exposée à des degrés divers:
TCP-IP - Exemple de communication avec DropBox, EverNote
On suppose que l'utilisateur utilise des applications reposant sur un stockage des données dans le «nuage» (Cloud :o). Cela implique-t-il une protection quelconque des données stockées?
Savoir mettre en forme ses réponses
Pourquoi faire cet effort?
Savoir répondre aux questions
Réclamation et gestion des âneries
Principe #1 : pas d'utilisation d'outils de communication active permettant d'échanger avec des tiers
Principe #2 : placement aléatoire
Principe #3 : imitation du caméléon interdite