Résumé:

Il s'agit d'un brouillon, je vous serais très reconnaissant de mailto:Bruno.Boettcher@ensps.u-strasbg.fr'envoyer des critiques constructives , avec si possible la partie du texte corrigée inclue, pour faire cela téléchargez ce fichier en mode html et appliquez les corrections.

Cette documentation à été faite en convertie avec l'aide de LaTeX2HTML. Donc si le coeur vous en dit, vous pourrez avoir une copie papier.

Table des matières

Déterminer le type d'un fichier: file

Souvent, après le déchargement d'un fichier p.ex. l'on se retrouve avec un fichier au nom bizarre et aucune indication de ce que ce fichier pourrait contenir comme information. Or la plupart der formats de fichier spécifient un entête spécifique et unique qui permet d'identifier à coup sur ce format.

C'est à cette entête que s'attaque le programme file, en extrait les données pertinentes et essait de nous faire part de ses suggestions.

P.ex.

$file introBash.tex 
 introBash.tex: International language text
$ file engel.fig
 engel.fig: FIG image text, version 3.2
$ file engel.ps 
  engel.ps: PostScript document text conforming at level 3.0
$ file engel.gif 
  engel.gif: GIF image data, version 87a, 556 x 366
$ file wordtrain-0.5.0.tar.gz
 wordtrain-0.5.0.tar.gz: gzip compressed data, deflated, last modified: Wed Mar
  22 23:31:04 2000, os: Unix
$ file tkbabel.tar.bz2
  tkbabel.tar.bz2: bzip2 compressed data, block size = 900k

On notera que ce programme ne fait aucune assumption en utilisant le suffixe du fichier, ce qui peut être dommage (p.ex. dans le cas du fichier latex) mais garantit aussi une certaine précision.

 

La compression

Historiquement l'éspace de stockage de masse était toujours (très) limité, de nos jours ce n'est plus toujours vrai pour les particuliers, mais il y a toujours nombre d'applications ou la compression de fichiers reste improtante, p.ex. pour les transferts par TCP/IP ou grâce à la compression l'on pourra réduire (fortement) la taille des données à transferer, donc la bande passante nécessitée et de fait le temps de déchargement et son coût.

Nombreux mathématiciens et informaticiens se sont penchés sur le problème de la compression de fichiers, de fait il y a à peu près autant d'algorythmes de compression (variantes incluses) que de chercheurs.

L'on sépare les algoryhtmes de compression en deux grandes familles:

 

 

compression exacte

 

zip

Les algorythmes de compression les plus communs sont de la famille Lempel-Ziv, étendus aux algoryhtmes de Huffman et autres améliorations. On les retrouve dans les programmes tels que zip, gzip et bzip2.

Les fichier comprimés avec ces formats peuvent être identifiés soit par leur suffixe (respectivement .zip, .gz et .bz2) soit en utilisant la commande file.

En règle générale les fichiers peuvent être comprimés en utilisant le nom du programme le nom de l'archive et puis les fichiers à comprimer, sauf si les programmes s'appliquent qu'à un seul fichier à la fois (gzip, bzip2), p.ex.:

 

localhost:~$ localhost:~$ ll toto
-rw-rw-r--    1 bboett   bboett        10k Jun  5 21:03 toto
localhost:~$ gzip toto
localhost:~$ ll toto*
-rw-rw-r--    1 bboett   bboett       3.2k Jun  5 21:03 toto.gz

Pour décomprésser, le chemin inverse est utilisé, en règlè générale ces outils ont un alias avec 'un' (français 'de') dans le nom qui indique que l'on decompresse:

 

localhost:~$ gunzip toto
localhost:~$ ll toto*
-rw-rw-r--    1 bboett   bboett        10k Jun  5 21:03 toto

 

compression avec perte

Exemple le format jpeg.

 

Archivage d'arborescences de fichiers

La compression est très utile lorsqu'il s'agit de fichiers isolés, ceci dit souvent on est confronté au fait que l'on doit archiver, donc mettre sur CD, bande, serveur ftp etc. toute une arborescence de fichiers.

Pour faciliter le traitement de ces arborescences on les compacte en un fichier qui peut ensuite être comprimé. C'est l'une des raisons pour lesquelles personnellement, je n'aime pas trop les format zip, jar etc. car ils mélangent la compactation de l'arborescence en un fichier et ensuite la compression de ce fichier.

Il est important de comprendre qu'il s'agit la de deux étappes bien distinctes, qui en plus dans la plupart des cas sont mieux séparées, surtout s'il s'agit d'archives d'arborescences mixtes, contenant des fichiers textes à côté d'images et de sons. Dans ces cas il vaut mieux appliquer à chaque fichier séparément le type de compression le mieux adapté.

textbfImportant: quand on crée des archives, histoire de réduire les accidents côté utilisateur, il est impératif d'emballer une arborescence qui commence par un répertoire, ainsi si l'utilisateur décompacte l'archive sans regarder au préalable de ce qu'il y a à l'intérieur, il ne se retrouvera pas avec un multitude de fichiers inconnus se baladant et éventuellement écrasant des fichiers déjà présents dans le répertoire courant.

 

gnu-tar (.tar, .tgz)

Dans le monde UN*X un type d'archive (ar) est très répandu, c'est tar, (angl. tape archive). Historiquement ce programme servait à piloter directement des lecteurs/enregistreurs de bandes, la version la plus puissante de ce programme est la version gnu-tar, livré avec toutes les variantes de systèmes opératifs libres (p.ex. linux).

Les suffixes sont en général fichier.tar, vu que l'on compacte ces archives la plupart du temps, un autre suffixe indiquant le mode de compression est rajouté, donnant p.ex. archive.tar.bz2. Dans un cas comme le compactage par tar et la compression par gzip, une combination presque standard, un nouveau suffixe, regroupant les deux suffixes est en utilisation. Donc archive.tar.gz devient archive.tgz.

 

Création d'une archive

 

localhost:~$ ls tst
index.wml  index2.shtml  index3.shtml
localhost:~$ tar czf tst.tgz tst

Gnu-tar n'a pas besoin de l'évidentiation des arguments en prépendant un '-'. Les arguments sont comme suit:

 

c
comme create, indique que l'archive sera crée, écrasant par la même une eventuelle autre archive du même nom.

 

z
compression par gzip, entre temps une compression par bzip2 est possible en utilisant à la place du 'z' le 'I'.

 

f
pour indiquer que contrairement à l'opération par défaut la cible de l'archive n'est pas une bande, mais un fichier, l'argument qui suit est donc le nom de fichier dans lequel sera stoquée l'archive.

 

 

Inspection d'une archive

 

localhost:~$ tar tzf tst.tgz 
tst/
tst/index.wml
tst/index2.shtml
tst/index3.shtml

L'argument qui change est donc le 't' qui remplace le 'c'. À noter le fait que l'arborescence commence par un nom de répertoire, ce qui dénote une archive propre.

 

Décompaction d'une archive

 

localhost:~$ tar xzf tst.tgz

L'extraction de l'archive se fait donc grâce à l'option 'x' (angl. eXtract).

Tous les exemples peuvent être agrémentés de l'option supplémentaire 'v', pour verbeux (angl. verbose) qui provoquera une émission de messages supplémentaires. Ceci dit cette option n'est pas forcément utile, surtout en sachant que l'impression sur la ligne de commande ralentit considérablement tout programme.

 

Telnet

La commande telnet est utilisée pour communiquer avec un autre ordinateur gràce au protocole TELNET (au sein de TCP/IP). Ceci permet de s'identifier par rapport à un autre ordinateur, de lancer une session et ètre capable de travailler sur cette machine distante comme si l'on se trouvait devant sa console. Le gros, très gros problème de telnet réside dans le fait que tout le traffic entre votre terminal et le serveur se passe en clair. Il est donc très aisé pour ceux qui sont équipés pour, et qui en ont la volonté de récupérer vos noms de comptes ainsi que vos mots de passe.

La syntaxe est la suivante

telnet [-d] [-a] [-n fichier] [-e escapechar] [[-l utilisateur] machine_distante [port]]

 

-a
, essai de login automatique, c'est a dire les variables d'environnement actuel sont passées, si possible, à l'environnement distant. Le nom d'utilisateur notamment.

 

-l
utilisateur, specifie le nom de l'utilisateur sous lequel on aimerait ouvrir une session sur la machine distante.

 

machine_distante
, ici il faut inserer le nom, l'alias ou le numéro IP de la machine sur laquelle on veut ouvrir une session.

 

port
, indique le numéro de port sur lequel on voudrait se connecter. Avant d'utiliser cette option sachez au moins sur quel service vous allez vous brancher.

 

telnet appelé sans nom de machine distante vous ouvrira l'interpreteur commande de telnet. Ceci vous permettra de contrôler et manipuler votre session telnet. Pour plus d'information lire 'man telnet'

 

Rlogin/ssh

En somme la même chose que telnet, sauf que ces programmes ont été développés pour les utilisateurs ayant un certain souci de sécurité informatique.

rlogin [-8EKLdx] [-e char] [-k realm] [-l username] host ssh [-l login_name] hostname [command]

 

rlogin

La sécurisation se fait ici originairement grâce au système ''Kerberos''. Si ce système n'est pas installé ls système ''rhosts'' de Berkeley est utilisé. Celui ci consiste dans le fait que dans le compte à connecter existe un fichier .rhosts (en lecture/écriture pour l'utilisateur EXCLUSIVEMENT) dans lequel figure la machine à partir de laquelle on veut se connecter ainsi que le nom d'utilisateur que l'on a sur cette machine. Ainsi la transmission du mot de passe en clair n'est plus nécessitée.

A savoir que tout traffic sur réseau est en clair, et que n'importe qui qui arrive à se connecter dessus peut, en analysant le traffic sur le brin connecté, trouver sans difficulté les mots de passe ainsi que les noms de compte des utilisateurs qui se connectent de manière distante.

Pour pouvoir analyser le traffic de son brin de réseau il faut etre ''root'' sur la machine UNIX que l'on utlise (pas aisé d'obtenir frauduleusement) ou disposer d'un PC sous DOS/Windows et des logiciels correspondants. Dans le dernier cas même le pipo pallino de base sans aucune connaissance de réseau n'aura aucune difficulté à pirater votre réseau.

 

Rsh

Cette commande envoit le flux STDIN vers l'application sur la machine distante et récupère le flux STDOUT sur la machine distante pour l'envoyer sur STDOUT local. Sans nom de commande rsh à la même fonctionalité que rlogin.

rsh [-Kdnx] [-k realm] [-l username] host [command]

Son utilité se montre pour le lancement de jobs sur des machines distantes sans la nécessité d'ouvrir une session sur ces machines.

 

ssh

Si on n'aime pas les implications de la fin du dernier paragraphe, je conseille d'utiliser un système de type ''ssh'' (Secure Shell). Vous trouverez des liens concernant ce paquetage sur ma page internet, gardez en mémoire qu'en France comme en Iraq et en Chine le cryptage est un grave delit contre la constitution. Eh oui, la liberté d'expression range dans ces pays loin derrière la raison d'Etat.

Ceci dit, l'utilisation de ssh est pratiquement identique à rlogin, une fois configuré. Si vous voulez utiliser ssh, vant tout, il vous faut un identificateur à vous que vous obtiendrez en executant 'ssh-keygen', en ce qui concerne le mot de passe que ce programme vous demande, moi je ne mets rien (donc $<$entrée$>$), car sinon il faudrait taper ce mot de passe chaque fois que vous voulez utiliser ssh....

Ensuite, le système du .rhosts est un peu différent. ssh-keygen vous aura crée un répertoire  /.ssh, dans ce répertoire vous trouverez les fichiers identity, identity.pub et random_seed. identity est votre clé privée, à cacher de tout le monde (pensez aux droits d'accès!), identity.pub est la clé publique que vous transfèrez (par ftp ou scp) sur la machine ou vous voulez vous logguer sans taper de login, et que vous appendrez au fichier  /.ssh/authorized_keys la bas.

Ainsi vous pourrez vous connecter de manière tout a fait sûre (modulo quelques bugs de sécurité) à toutes les machines sur lesquelles tourne un démon sshd.

A noter qu'entre temps il y a deux grandes versions de ssh qui sont en utilisation (ssh1 et ssh2). ssh2 fonctionne différemment, à des protocoles de communication nettement plus sécurisés que la première version, ainsi qu'un mécanisme de reconnaissance un peu différent (Les clés sont stoquées chacune dans un fichier à part et leur nom ajouté à la liste qui se trouve dans le fichier .ssh2/identification, dans le genre IdKey erm7, en supposant que la clé publique de mon compte sur erm7 se trouve dans le fichier .ssh2/erm7.pub).

 

secure copy: scp

En bonus avec ssh, vient un utilitaire scp qui permet de copier des fichier d'une machine à l'autre sans devoir faire de ftp ou autre procédure de login (comme rcp).

scp [-qprvBC] [-S path-to-ssh] [-o ssh-options] [-P port] [-c cipher] [-i identity] [[user@]host1:]filename1... [[user@]host2:]filename2

P. ex. scp index.html bboett@inforezo: /www (Je transfère index.html de la machine ou je me trouve sur inforezo dans le compte de bboett, assumant qu'en ce moment j'ai une autre userId rendant cette option nécessaire, dans le répertoire /home/bboett/www). La aussi, si ssh est correctement configuré ente ma machine et p.ex. inforezo, je n'aurai pas de mot de passe à taper et la copie se fera encryptée sur le réseau.

 

Mode d'emploi rapide pour l'utilisation d'un serveur cvs

Pour pouvoir assurer la mainteance de projets variés (que ce soit un projet de programmation en langage C, C++, java et autre, ou des structures de fichiers quelquonques comme une arborescence html) par plusieures personnes, de manière fiable et tolérante envers les erreurs le système cvs est devenu une sorte de standard.

Rappelons brièvement les problèmes majeurs de l'administration d'un projet:

 

Tous ces problèmes sont addréssés par un système cvs. Ce système garde (dans le cas idéal sur un serveur central) l'état actuel du projet à disposition des multiples usagers, dans ses différentes déclinaisons (on peut récupérer un projet dans l'état à une certaine date ou à une certaine version).

Dans le cas ou le serveur cvs se trouve sur une machine autre que les machines de développement, l'on aura une sécurité supplémentaire concernat la perennité des données.

Chaque développeur pourra faire avec sa copie locale du projet ce qu'il veut, il n'y a pas de contraintes comme l'imposent d'autres systèmes (ou les développeurs acquièrent un droit exclusif sur les fichiers qu'ils sont en train d'éditer, bloquant de e fait éventuellement les autres développeurs).

Une fois que le développeur sera satisfait de son travail il synchronisera sa version avec celle du serveur en suppléant en plus un message, ceci aura pour effet que les fichiers modifiés changeront de numéro de version, et que les autres développeurs pourront facilement récupérer le message, et ainsi ètre informés des changements encourus quand ils synchroniseront à leur tour leurs versions du projet.

La synchronisation des projets est faite grâce à l'aide entre autres de mécanismes appelés diff ou patch, qui essayeront de maximiser l'introduction des nouvelles parties de manière automatique. Ceci ne fonctionnera pas toujours, et le système rapportera les localisations non-traitables à l'utilisateur.

L'avantage de ce systèmes est qu'en pratique à peu près 90% des modifications sont ainsi insérées automatiquement, de plus les sections à problèmes sont clairement marquées. Les oublis sont impossibles.

La base d'un système cvs sont outre la commande cvs l'existence d'un repositoire cvs, une strucure spéciale présente quelquepart dans le système de fichiers de l'ordinateur (un endroit standard est /usr/local/cvsroot).

La gestion de ce repositoire est grandement facilitée en utilisant des outils comme tkcvs, qui cachera aux utilisateurs les manipulations qui seront décrites plus bas.

Pour faciliter les explications qui suivent nous allons supposer un repositoire cvs (/usr/local/cvsroot) existant sur une machine imaginaire tux.u-strasbg.fr.

Dans ce répositoire nous supposons la présence de différents modules, p.ex. un au nom de www contenant l'arborescence complète du serveur web de tux et un autre appelé projets/jmud contenant un projet de programme en java.

 

Crash-course de cvs:

Il y a plusieurs mécanismes qui permettent de récupérer sur un serveur cvs une arborescence, la première (et c'est celle à préférer) suppose que vous avez droit d'accès à un utilisateur sur le serveur (ce qui signifie pouvoir faire un rsh sur le serveur sans mot de passe) pour cette méthode l'utilisation de ssh(2) est vivement recommandée, la deuxième utilise la méthode login du serveur, qui s'appuie elle aussi sur la présence dans le système d'un utilisateur (par la suite appelé cvs), cette méthode à tous les inconvénients du telnet de base: nom d'utilisateur et mot de passe transitent en clair sur le réseau.

Tout d'abord s'assurer que les variables d'environnement soyent bien reglées: echo $CVSROOT doit retourner tux.u-strasbg.fr:/usr/local/cvsroot si c'est pas le cas:

 

export CVSROOT=tux.u-strasbg.fr:/usr/local/cvsroot

et echo $CVS_RSH doit donner ssh(2), sinon déclarer cette variable comme décrit plus haut. Ou bien pour utiliser un accès externe, régler sur le scripte que vous aurez pris la peine de télécharger et placer dans un endroit accessible par votre chemin par défaut (p.ex.  /bin).

Ensuite: cvs -d cvs@tux.u-strasbg.fr:/usr/local/cvsroot co www pour la première méthode ou

cvs -d :pserver:cvs@tux.u-strasbg.fr:/usr/local/cvsroot login (avec le mot de passe convenu, à n'utiliser qu'en cas d'urgence fatale)

Puis cvs -d :pserver:cvs@tux.u-strasbg.fr:/usr/local/cvsroot co www pour la deuxième méthode (qui je le répète est absolument à éviter.

Préférez à la version pserver, la version sécurisée utilisant ssh:

CVS_RSH= /bin/sshanoncvs cvs -d :ext:cvs@inforezo.u-strasbg.fr:/usr/local/cvsroot checkout jmud

il y a une alternative à cela, il suffit de placer dans votre  /.ssh/config:

 

Host kitenet.net
User = cvs
IdentityFile = ~/.ssh/identity_anoncvs
ForwardAgent = no
ForwardX11 = no
Compression = yes

Et mettez à la place de  /.ssh/identity_anoncvs ce fichier en utilisant pour CVS_RSH comme d'habitude ssh. Cet accès est en lecture uniquement, pour un accès en lecture/écriture en anonyme, le mécanisme est le même, mais les clés changent, et vous les demanderez aux mainteneurs des différents projets.

À savoir que les paramètres du style -d :pserver:cvs@tux.u-strasbg.fr:/usr/local/cvsroot sont stoquès (ex. www/CVS/Root) dans l'arborescence qui vient d'ètre crée, donc tant que l'on évoluera dans cette arborescence ces arguments n'auront plus besoin d'ètre répétes.

Pour rajouter des fichiers au serveur, vous vous positionnez dans le repertoire dans lequel ils se trouvent, puis cvs add votre_fichier (les wildcards sont permis, et chose importante les répertoires aussi doivent ètre déclarés au préalable), pour enlever, reciproquement cvs delete le_fichier (pour que cette dernière commande soit acceptée, il faut que le fichier en question n'existat déjà plus dans ce répertoire). A savoir que cela stoque seulement votre intention de faire une telle action, vous allez la finaliser ainsi que la sauvegarde de vos changements sur le serveur avec cd racine_de_votre_projet , cvs -m"un commentaire" ci (qui est recursif...).

Prière de mettre des commentaires parlants (que l'on peut récupérer par cvs log un_fichier) car pour ceux qui passeront derrière, pour chercher un problème, p.ex. ne seront pas forcément ravis de trouver des coucou et autres messages à la c.. !

Avant de faire un ci (check in) s'assurer que personne n'en a fait avant vous: cvs update >log 2>&1 . Contrôlez le log concernant les erreurs et les lignes commencant avec un C indiquant des conflits qui doivent etre resolus a la main.

 

Quelques utilisations avancées

 

Récupérer une version ancienne d'un projet

Si on ne connait pas la syntaxe requise, cette opération peut devenir un cauchemar, car malheureusement pas très intuitive, car cvs au lieu d'accepter le format des dates dans la facon courrante du pays requierst forcément le formatage des dates au format américain, qui est on ne peut plus inconvenant pour des européens.

Pour récupérer une version ancienne d'un projet l'on se base non sur le numéro de révision, mais sur la date du check-in, ou bien sur des marques qu'on å eu le soin d'apposer sur un projet à une certaine date.

Ainsi cvs -d erm1:/usr/local/cvsroot co -D "04/29/99" jSim sera une ligne valide, on remarquera l'agencement bizzarre de la date, malheureusememnt, c'est le seul format compris.

 

 

Comment filtrer son E-mail automatiquement

 

Bases

Dans le cadres des protocoles TCP/IP il y a le protocole SMTP (Simple message transfer protocol) qui est celui qui permet d'échanger des messages en mode asynchrone entre utilisateurs du réseau. Ce protocole est utilisé pour passer des message entre deux ou plusieurs (listes!) MUA (mail user agent), clients mail, les interfaces vers les utilisateurs à travers un réseau de MTA (mail transfer agent), serveurs de mail.

Des exemples de MUA sont mail, mh, elm, pine, mutt, balsa, netscape-messenger etc..., des exemples de MTA sont sendmail, qmail, zmail, postfix etc..

Le service mail est identifié au moment de la connexion par le fait que celle-ci se fait par le port 25 du serveur.

 

Introduction

Dés que l'on commence serieusement a utiliser l'outil que représente la possiblilté d'envoyer et de recevoir des messages a travers l'internet, on se voit confronté à une quantité souvent impressionnnante de messages.

Si tous ces messages sont envoyes (comme par défaut) dans la même boite d'entrée, l'on passera un certain temps a faire le tri, surtout si l'on n'a pas l'habitude de vider quotidiennement sa boite d'entrée.

Donné le cas que l'on se trouve sous UNIX et que l'on utilise un outil performant tel que l'est pine, il est facile de gérer de multiples boites d'entrée. Ainsi personnellement, je renvois tout messages émanant d'un membre de ma famille dans une boite, ceux de mes connaissances rapprochées dans une autre, chaque liste de discussion à laquelle je suis abbonné à sa propre boite etc...

Ce que j'utilise est d'une part la fonctionalité du MUA pine (voir p. 7.3), d'autre part un programme qui est appelé par défaut par le MTA sendmail appelé deliver (voir sec. 7.5) qui traite tous les messages que vous envoyez a l'aide d'un fichier $HOME/.deliver (s'il existe).

Entre temps j'ai migré vers une solution utilisant comme MUA mutt (voir 7.4) et deliver.

 


Configuration de pine

Vous avez deux possibilités, celle du débutant qui utilise le menu de pine (tapez m s c puis cherchez le point enable-incoming-folders que vous cocherez, ensuite tapez e puis l et ajoutez avec a autant de boites qu'il vous faut.

Les purs et durs utiliseront vi(m) directement sur le fichier de configuration de pine ( $HOME/.pinerc), chercheront la ligne ou se trouve incoming-folders (très près du début, ceci dit '/' fonctionne a merveille...) et la manipuleront de manière à avoir quelquechose qui ressemble à cela:

 

incoming-folders="family" {erm1.u-strasbg.fr}mail/boettcher_in,
        "prive" {erm1.u-strasbg.fr}mail/prive_in,
        "admin" {erm1.u-strasbg.fr}mail/admin_in,
        "www" {erm1.u-strasbg.fr}mail/www_in,
        "security" {erm1.u-strasbg.fr}mail/security_in,
        "kernel" {erm1.u-strasbg.fr}mail/linux_in,
        "java" {erm1.u-strasbg.fr}mail/java_in

Le permier truc en étant le pseudo qui apparaitra comme nom de boite dans pine, la chose entre { et } étant la machine sur laquelle se trouvent vos boites (facultatif, ceci dit je lis mes messages sur une autre machine que celle ou ils arrivent...) et enfin le reste étant le chemin jusqu'à la boite elle même.

À noter aussi que la dernière ligne est dépourvue d'une virgule et que les lignes de commentaire dans la liste font office de termination de liste aussi :(

Le fait de faire cela à la main n'est pas totalement gratuit, car ainsi vous pourrez changer l'ordre d'apparition des boites dans le menu, ce qui n'est pas possible avec le menu (ordre dans lequel les boites auront été crées).

 


Configuration de mutt

Mutt est extrèmement configurable, contactez moi pour avoir mon .muttrc, ou prenez un des exemples tout faits, ici je ne parlerai que des adaptations nécessaires à notre site.

La première chose à changer est le fait que nous utilisons comme MTA qmail, donc que notre mail arrive dans  /Mailbox, ceci est notifié en insérant ou changeant la ligne correspondante dans le muttrc:

set spoolfile=' /Mailbox'

À savoir que mutt est configuré par défaut à travailler avec des MTA de type sendmail, qui déposent les messages dans des boites dans /var/spool/mail/$USER.

Ensuite il faudra spécifier les boites d'entrée, que mutt devra surveiller. Contrairement à pine, mutt est plus puissant et permet déjà ici du scriptage, donc voici la ligne à rajouter ou changer dans le .muttrc:

mailboxes ! `echo $HOME/mail/*in`

Le '!' signifie l'inclusion de la mailbox par défaut dans les boites d'entrée, la deuxième partie devrait ètre claire, du moins pour ceux qui sont habitués aux shell unix: seront prises en compte toutes les boites se terminant en 'in' dans le répertoire mail dans la racine de l'utilisateur.

Autre chose, mutt permet de faire une saisie du recepteur du mail ainsi que le titre du mail, pour ceux que cette façon de faire incommoderait, il y a les options suivantes:

 

set edit_headers
pour que l'entête soit passée à la session d'édition du message

 

set autoedit
pour passer directement à l'édition sans passer par le menu de début.

 

 


Utilisation d'un .deliver

A savoir que moi j'utilise comme MTA (mail transfer agent) qmail qui est beaucoup plus sur et fiable que sendmail, plus petit plus rapide et qui fait tout ce que moi je demande a un MTA. Qmail dépose les messages personnels non point dans un répertoire central comme le fait sendmail, mais directement dans un fichier (Mailbox) dans le compte de l'utilisateur. Donc si vous voudrez reprendre mon scripte ci dessous, vous devrez changer la variable BOX en consequence (normalement /usr/spool/mail/bboett p.ex.).

Ceci dit, il n'est pas sûr, que votre MTA utilise deliver pour filtrer les mails par défaut, il peut très bien s'agir de procmail (voir 7.6) comme c'est le cas sur inforezo. Si vous voulez tout de même utiliser deliver il faudra rajouter dans votre répertoire racine un fichier .forward avec le contenu suivant:

| /usr/bin/deliver votre-user-ID

Le fonctionnement de deliver se limite a définir trois varibales d'environnement: HEADER qui renferme l'entête du message, BODY qui contient le texte du message et SENDER qui contient l'envoyeur du message correspondant a la ligne ''From:'' dans l'entête du message.

Ensuite deliver 'pipe' (voir utilisation de base d'une shell) le message a travers le scripte $HOME/.deliver et s'il reçcoit comme retour un DROP, il sait que le message à été processé et ne s'en occupe plus.

Sauf que moi je fais pas trop confiance à ces mécanisme donc vous les retrouverez redifinis dans le scripte.

 

#!/bin/sh
#echo heres deliver
#echo header is:$HEADER

BOX=Mailbox
DESTDIR=mail
MYPATH=/home/bboett/mail/ #mettez ici l'endroit ou vous stoquerez vos messages

# Ici on s'occupe des liste de distribution, ou dans la ligne From-espace se
# trouve le serveur de liste et dans From: l'auteur du message.

SENDER=`cat $HEADER | grep "From " | cut -d' ' -f 2`
case $SENDER in
        *linux-security*)       BOX=security_in;;
        *linux-alert*)          BOX=security_in;;
        *linux-kernel*)         BOX=linux_in;;
        *ssh*)                  BOX=ssh_in;;
        *asr*)                  BOX=security_in;;
        *java*)                 BOX=java_in;;
        *fvwm*)                 BOX=fvwm_in;;
        *pine*)                 BOX=pine_in;;
esac

#et maintenant on les place pour de bon
if [ $BOX != "Mailbox" ]; then
  cat $HEADER $BODY >>$MYPATH$BOX               
  echo DROP        
  exit 0
fi

#et maintenant la famille les copains etc, dont leur nom figure dans From:
SENDER=`cat $HEADER | grep "From:" | cut -d' ' -f 2-4`

case $SENDER in
        *[Bb]oett*)     BOX=boettcher_in;;
        *casset*)       BOX=prive_in;;
        *sept*)         BOX=prive_in;;
        *root*)         BOX=admin_in;;    
        *www*)          BOX=www_in;;
esac

#et la aussi faut concretiser la manip
if [ $BOX != "Mailbox" ]; then
cat $HEADER $BODY >>$MYPATH$BOX                 
echo DROP        
else #ici la partie qui demontre que je n'ai pas trop confiance dans deliver :)
cat $HEADER $BODY >>$MYPATH../$BOX
echo DROP        
fi

 


Utilisation d'un .procmailrc

Si quelqu'un voulait bien écrire quelquechose pour cette séction, cela m'arrangerait....

Enfin voici un exemple de fichier .procmailrc:

 

:0
* ^To.*vger.rutgers.edu*|^FROM_MAILER.*vger.rutgers.edu*|^FROM_DAEMON.*vger.rutg
ers.edu*
mail/linux_in
:0
* ^To.*axp-list*|^FROM_MAILER.*axp-list*|^FROM_DAEMON.*axp-list*
mail/linuxaxp_in
:0
* ^From.*magali|^From.*tiberi|^From.*MOREL|^From.*GEORGENTHUM|^From.*lanuit|^Fro
m.*sm|^From.*bboett|^From.casset
mail/prive_in

Je ne suis pas très sur de ce que j'avance, mais il semble que le ':0' soit un séparateur, la ligne qui suit donne les expressions régulières pour cette sélection, donc en décortiquant p.ex. la ligne avec vger.rutgers.edu, cela donne en français:

cherche dans l'entête du mail la ligne commencant par 'to:', si la dedans l'on trouve quelquepart la chaine vger.rutgers.edu, ou bien si l'on trouve dans la ligne débutant par FROM_MAILER la même chaine ou si l'on trouve dans la ligne commencant par FROM_DAEMON toujours cette même chaine de caractères, dans ce cas le mail est redirigé dans la boite qui est spécifiée dans la ligne en dessous, donc /home/l-utilisateur/mail/linux_in.

 

Ftp en prennant ''ncftp''

''ncftp'' est un interface (comfortable) utilisateur pour le standard internet FTP (File Transfer Protocole). Ce programme permet de transférer des fichiers entre machines distantes et offre plein de fonctionalitées dont on rève dans le ftp standard.

ncftp [program options] [[open options] host-name[:pathname]]

 

Lire les news en utilisant trn

Trn comme beaucoup d'utilitairs unix, à une apparence prime assez rébarbative, mais une fois que l'on a pris l'habitude de l'utiliser, on ne peut plus s'en passer.

Pour le configurer correctement lancez trn une première fois, pour que les répertoires de configuration soyent crées, ensuite, quittez immédiatement, et reportez vous dans ce nouveau repertoire .trn, dans celui créez un fichier access (avec vim p. ex.) dans lequel vous ferez des entrées selon l'exemple qui suit:

 

[inforezo]
NNTP Server = inforezo.u-strasbg.fr
Overview Dir = none

[mygale]
NNTP Server = news.mygale.org
Overview Dir = none

[ciril]
NNTP Server = news.ciril.fr
Overview Dir = none

[Group 1]
ID = inforezo
Newsrc = ~/.newsrc-inforezo.u-strasbg.fr
Add Groups = yes

[Group 2]
ID = ciril
Newsrc = ~/.newsrc-news.ciril.fr
Add Groups = yes

[Group 3]
ID = mygale
Newsrc = ~/.newsrc-news.mygale.org
Add Groups = yes

Une fois ce fichier crée, vous aurez accès aux serveurs de news sur inforezo, mygale et ciril (les plus importants a mon avis dans ces parages).

En relancant trn vous tomberez sur le premier serveur (inforezo) (il y a une possiblité de configurer trn pour qu'en le lancant l'on accède à un menu des serveurs, mais je ne me rappelle plus comment l'on fait). Pour changer de serveur vous tapez $<$ctrl$>$N (comme next) pour le prochain ou $<$ctrl$>$P (comme previous) pour le serveur précédent.

Une fois que vous avez accédé À un serveur qui vous plait, vous voudrez vous abboner aux groupes qui vous intéressent.

Si vous ne connaissez pas le nom exact du groupe, faites une recherche par mot clé: tapez '
a mot-clé'. Si par contre vous connaissez le nom exact du groupe, tapez '
g nom-du-groupe-exact'.

Vous suivrez les indications, et si vous n'ètes pas surs de vos actions continuez a taper la barre d'espace (ce qui valide les choix par défaut).

L'aide interactive est appelée par 'h'.

Une fois un groupe de discussion sélectionné (en tapant la lettre du groupe suivi par $<$entree$>$) vous accéderez à la liste des articles, laaussi vous sélectionnerez les articles qui vous intéressent en tapant les lettres qui précedent les discussions, si le nombre de discussion excède l capacité de votre écran, vous pourrez avancer dans la liste avec '$>$' ou revenir en arrière avec '$<$'.

Une fois votre sélection faite, le plus simple est de taper $<$shift$>$X, ceci marque tous les articles non-sélectionnés comme lus (donc ils disparaitront de la liste des discussion sélectables) et démmarrera la lecture des articles sélectionnés. Vousnoterez des drôles d'images en haut a droite des la fenêtre de lecture, enfait c'est une représentation ascii de la structure de la discussion, en fait vous pourrez naviguer avec les flèches dans cette discussion, l'arre vous montrant à tout moment quel niveau vous vous trouvez.

Si vous ètes perdus, ou que vous vous rendez compte qu'en fait la discussion actuelle ne vous intéresse pas, revenez au sélecteur en tapant '+'. Au contraire si un article vous intéresse et que vous ne voulez pas qu'il disparaisse du sélecteur tapez 'm', 's' pour sauvegarder, 'r' ou 'R' si vous voulez répondre par mail à l'auteur sans inclure l'article ou en incluant l'article et finalement 'f' ou 'F' si vous voulez que votre réponse soit ajoutée à la discussiondans ce forum sans inclusion de l'article ou avec inclusion.

Si vous voulez poster un article sans sélectionner d'article au préalable tapez ':p' quand vous ètes dans le groupe de discussion (fonctionne aussi quand le groupe est actuellement vide).

L'aide interactive et les pages de man et info vous donneront le complément d'infos dont vous auriez encore besoin après ceci.

 

Archie

Programme permettant la recherche dans les bases de données de serveurs ftp anonymes grace à prospero.

Utilisez plustot xarchie, c'est un interface grafique pour archie, avec lequel on n'a plus besoin de s'embrouiller avec les commandes archie. En plus on peut directement récupérer les fichiers trouvés. Une autre alternative sont les moteurs de recherche par ftp comme FAST FTP Search

 

Le concept des libraires

Un des grands préceptes de la programmation est la re-utilisation de code existant. Nombreuses fonctionnalitées sont nécessitées par de nombreux programmes différents. Une possibilité pour réduire les coûts de développement (c'est à dire le temps de développement et la déprime du fait de reinvneter chaque fois la roue) est l'utilisation de librairies. Sont regroupées les fonctions utiles par thèmes dans des librairies, on différencie les libraires statiques des libraires dynamiques.

Le premier type de libraire à être apparu était la libraire statique, reconnaissable à leur suffixe '.a'. Tout programme ayant besoin de certaines fonctionnalitées inclut les librairies concernées, incluant par la même occasion tout le code de ces libraires. L'avantage étant que ce programme une fois compilé et 'linké' (regroupé avec les libraires) n'aura plus aucune dépendance externe, et pourra donc ètre facilement migré vers d'autres machines, ou servir comme utilitaire de base dans des disquettes de récupération de système.

Le désavantage de ce sytème est la taille des exécutables et le fait que si l'on lance des instances de programmes qui utilisent toutes la même libraire, on aura en mémoire autant de copies de cette libraire, ce qui représente encore aujourd'hui du gâchis (vu que la mémoire est et reste chére).

D'où l'idée de faire le 'linkage' au dernier moment, à l'exécution du programme, en gardant les parties communes chargées exactement une fois. C'est ce qu'on appelle des librairies dynamiques, reconnaisables à leur suffixe '.so'.

 

Le chemin de recherche

L'assemblage au vol des différentes parties est fait par un programme qui est appélé automatiquement par le shell (vu que grâce au format ELF, tout programme est par la force des choses un programme utilisant des libraires dynamiques). Ce programme, ld.so/ld-linux.so, regarde dans les chemins qui lui sont configurés pour trouver les libraires nécessitées par les programmes lancés. Ce chemin est défini de deux manière:

 

les fichiers ld.so.conf/ld.so.cache
qui se trouvent dans /etc. Dans ld.so.cache se trouvent toutes les librairies disponibles ainsi que le chemin ménant à elles. Cette base de données est compilée par le programme ldconfig.

ld.so.conf regroupe tous les répertoires candidats qui contiennent des libraires, c'est dans ce fichier qu'il faudra éventuellement rajouter des répertoires ou ld.so pourra trouver des libraires faites ou installées par l'utilisateur dans des répertoires non-standards.

 

la variable LD_LIBRARY_PATH
Variable à la syntaxe similaire à la variable PATH, une liste de répertoires séparés de ':' contenant des libraires.

 

 

Connaître les dépendances - ldd

Avant de lancer et se laisser planter un programme, ou pour détecter d'éventuels problèmes de version, l'on peut demander à un programme grâce à ldd ses dépendances, p.ex.:

 

localhost:~$ ldd /bin/bash 
      libreadline.so.4 => /lib/libreadline.so.4 (0x40019000)
      libhistory.so.4 => /lib/libhistory.so.4 (0x4003e000)
      libncurses.so.5 => /lib/libncurses.so.5 (0x40044000)
      libdl.so.2 => /lib/libdl.so.2 (0x40082000)
      libc.so.6 => /lib/libc.so.6 (0x40087000)
      /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

 

Recompiler la base des librairies - ldconfig

Ce programme est lancé en tant que super-utilisateur (root). ldconfig prend toutes les informations du fichier ld.so.conf, suit les chemins qui s'y trouvent et compile avec les libraires trouvées en parcourant ces répertoires la base de données qui servira à rapidement trouver les différentes libraires nécessitées par les programmes.

Une fois une libraire, ou un nouveau répertoire rajouté le programme ldconfig doit ètre relancé.

Si malgré la présence d'une bibliotheque dans les chemins, elle n'est pas trouvée, l'on pourra inspecter la base en lançant ldconfig -v. Avec une utilisation judicieuse des tubes et de différent utilitaires comme grep, on trouvera rapidement le problème.

 

Créer ses propres librairies dynamiques

Supposons que nous ayons crée une collection de fonctions C/C++ que nous avons écrites dans le fichier libdyn.C. Que nous voulons compiler un programme dont le source se trouve dans le fichier prog.C, qui est sensé utiliser dynamiquement les fonctions de libdyn.C.

Aucune mesure spécifique n'a besoin d'être faite dans le code, par contre la compilation diffère et peut être suivi dans le makefile qui suit:

 

all:libdyn.a prog.exe
  @echo "finished"

libdyn.a:
  @echo "Compiling dynamic lib"
  g++ -fPIC -I/usr/local/include -c libdyn.C
  g++ -shared -L. -Wl,-soname,libdyn.so.1 -o libdyn.so.1.0 libdyn.o
  -ln -s libdyn.so.1.0 libdyn.so.1
  -ln -s libdyn.so.1 libdyn.so
  -LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH ;
  -export LD_LIBRARY_PATH

prog.exe:
  @echo "Compiling Program"
  g++ -g -I. -I/usr/local/include prog.C -L. -L/usr/lib -o prog.exe -ldyn

Comme l'on peut noter, la libraire est compilée en premier, les sous-fichiers de la libraire sont compilés avec l'option -fPIC, alors que le linkage est effectué en spécifiant qu'il s'agira d'une librairie dyamique (-shared).

PIC est l'acronyme pour position-independent code, donc du code qui ne contient que des pointeurs relatifs, ce qui résulte en code qui peut être placé à n'importe quel endroit de la mémoire.

L'option -Wl,-soname,libdyn.so.1 est une option qui sera passée immédiatement au 'linker' (le 'l' dans Wl) en spécifiant le nom de cette libraire.

 

Utiliser dynamiquement des éléments de librairies dynamiques

En allant plus loin il est possible d'utiliser des fonctions de libraires dynamiques chargées au vol par le programme:

 

       #include <dlfcn.h>
       #include <stdio.h>

       main()
       {
         void *libc;
         void (*printf_call)();

         if(libc=dlopen("/lib/libc.so.5",RTLD_LAZY))
         {
           printf_call=dlsym(libc,"printf");
           (*printf_call)("hello, world\n");
         }/* if(libc=dlopen("/lib/libc.so.5",RTLD_LAZY))*/
       }/* main()*/

On notera que la librairie dynamique ne sera chargée qu'au moment de l'appell dlopen, et qu'il faudra activement extraire une méthode en utilisant son nom avant de pouvooir l'utiliser.

 

Conclusion

Si vous avez des suggestions sur d'autres programmes à prendre dans ce texte ou des modifications de celui-ci n'hésitez pas si vous avez des problèmes ou des suggestions à faire concernant ce texte n'hésitez pas à me le dire.

 

À propos de ce document...

This document was generated using the LaTeX2HTML translator Version 99.2beta6 (1.42)

Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999, Ross Moore, Mathematics Department, Macquarie University, Sydney.

The command line arguments were:
latex2html -dir /home/bboett/www/Utilitaires Utilitaires

The translation was initiated by Bruno Boettcher on 2000-06-21


Bruno Boettcher
2000-06-21