Mon Journal à l'École Ouverte Francophone (ÉOF)

LEGER Richard

Mon journal retrace mon experience de certification CP2LL organisé par l'École Ouverte Francophone (ÉOF)

Cette documentation est soumise aux termes de la Licence de Documentation Libre GNU (GNU Free Documentation License).

Les programmes sont soumis aux termes de la Licence Générale Publique GNU (GNU General Public Licence).


Table des matières
1. Licence
2. Introduction...
2.1. Logiciels Libre et Open Source (à code ouvert) - FLOSS
2.1.1. Qu'est-ce qu'un code source?
2.1.2. FLOSS ? Quesaqo ?
2.1.3. Le logiciel libre
2.1.4. Le logiciel open source
2.1.5. Les quatre libertés essentielles de l'utilisateur d'un programme
2.1.6. Le logiciel libre : comment ça marche ?
2.1.7. Promouvoir le libre dans les entreprises et les administrations ?
2.1.8. Comment augmenter/améliorer l'utilisation des logiciels libres en générale et des distributions GNU/Linux en particulier ?
2.2. Facteurs de qualité d'un logiciel (B.Meyer et G.Booch)
2.2.1. Constat :
2.2.2. Liste minimale de critères de qualité du logiciel (d’après B.Meyer, G.Booch)
2.2.3. Characteristics of Great Software (by Apple)
2.2.4. Unix : Philosophie et Historique
2.2.5. Linux : Developpement Agile (The Cathedral and the Bazaar)
2.2.6. Quelques conseils à retenir pour développer un programme ou script
2.2.7. Choisir un language de programmation...
2.2.8. Qu'est-ce une communauté du logiciel libre ?
2.2.9. FLOSS et brevets logiciels
3. École Ouverte Francophone (ÉOF)
4. Formations Libres
4.1. Formation CP2L (8 mois) à l'École Ouverte Francophone (ÉOF)
4.1.1. Introduction
4.1.2. Module et planing
4.1.3. Déroulement de la formation
4.1.4. La notation au sein de la Certification Professionnelle en Logiciel Libre
4.1.5. Promo 2009-2010 - Etudiant et Coordinateurs
4.1.6. Les journaux des apprenants
4.2. KeepIn (SARL)
4.2.1. A propos
4.2.2. Enquête sur la formation à distance
4.2.3. Formations Libres (cursus courts 3 semaines)
4.2.4. Service Liste de discussion (Garder le contact avec ses proches !)
4.2.5. Cours en Ligne du MIT
5. Outils de commnication (Courriel + Liste de distribution + Jabber + IRC + Journal)
5.1. Méthode de Communication
5.1.1. L'Internet
5.1.2. Courriel (E-mail)
5.1.3. Liste de distribution
5.1.4. Chat (Jabber/XMPP ou IRC)
5.1.5. Les journaux de bord
5.2. Méthode de Travail
5.2.1. Bref résumé !
5.2.2. Identifier le problème
5.2.3. Chercher la solution par soi-même avant de demander de l'aide
5.2.4. Les ressources des sites (upstream)
5.2.5. Faire une recherche sur Internet
5.2.6. Poster une question
5.2.7. Problème résolu
5.3. Droit Individuel à la Formation (DIF)
6. UI003 Environnement de travail - Installation d'une distribution
6.1. Distributions Linux: Laquelle choisir ?
6.1.1. Qu'est-ce qu'une distribution, Combien en existe-t-il ?
6.1.2. Distribution et liberté : Combien de logiciel non-libre caché dans votre distribution GNU/Linux ?
6.1.3. vrms (Virtual Richard M. Stallman) : Recherche de paquets non-free
6.1.4. Comment configurer Ubuntu Linux pour moins de 200$ ?
6.2. Dual Boot Mac OS X 10.6 / Ubuntu 9.10 Karmic on MacBook Pro 5,5
6.2.1. Indentifier Modèle (Matériel) et Versions (Système d'Exploitation) du matériel Apple
6.2.2. Installation de Base
6.2.3. Installation du pilote de carte réseau sans-fil (pour BCM4322 802.11a/b/g/n Wireless LAN Controller)
6.3. lshw - Information Matériel de votre ordinateur GNU/Linux !
6.4. Virtual Box
6.4.1. Installation de Base
6.4.2. Installation d'une Machine Virtuelle (Debian)
6.4.3. Virtual LAN : 1 Hôte (Ubuntu) + 2 Machines Virtuelles (Debian)
6.4.4. Installation VM Windows XP Pro (VirtualBox) sur hôte Ubuntu 9.10 64bits, portable Apple MacBook Pro 5,5
6.4.5. Sauvegarde/Restauration (.vdi)
6.4.6. VirtualBox Configuration Linux Avancé (TAP address)
6.4.7. Comment accéder via ssh a une machine virtuelle (Virtualbox)
6.4.8. Résoudre VM Windows XP Pro Freeze
6.4.9. Re-dimensionner un disque de machine virutelle (VirtualBox)
6.4.10. Utilitaires pratique (Sysprep, NewSID, BGInfo, HVRemote) pour la gestion des VMs Windows
6.5. Autres Logiciels
6.5.1. xournal, claws-mail, firefox, emacs, skype
6.5.2. Installer Google Chrome (Chromium) sous Ubuntu
6.5.3. X-lite installation for Ubuntu 9.10 _amd64
6.5.4. Qutecom installation (en remplacement de X-Lite)
6.5.5. Twinkle installation (en remplacement de QuteCom) - SIP Softphone
6.5.6. NetBeans (IDE) installation
6.5.7. xmlcopyeditor installation
6.6. Désactiver l'IPv6 sur Ubuntu 9.10
6.6.1. Méthode 1: Éditer /etc/modprobe.d/blacklist
6.6.2. Méthode 2: via GRUB
6.6.3. Comment s'assurer que IPv6 est désactivé ?
6.7. Debian Live sur une clef USB
7. SR001 Commandes GNU/Linux (Shell)
7.1. SYS01: Système de fichier HFS
7.2. SYS01: Base
7.2.1. Processus
7.2.2. Commande de base sous Linux
7.2.3. Redirection des entrées/sortie (flux)
7.3. SYS01: Sauvegarde et archivage (Backup)
7.3.1. Introduction
7.3.2. Le système RAID (sauvegarder un poste)
7.3.3. La synchronisation (sauvegarder un poste)
7.3.4. rsync - synchronisation/snapshot par copie (lien matériel - hard link)
7.3.5. rsync - Interface Web, Frontend, Outil GUI
7.3.6. rsync - sauvegarde chiffré (backup with encryption / over Samba)
7.3.7. rsnapshot - Sauvegarde incrémentale par instantanné (snapshot)
7.3.8. rdiff-backup - synchronisation/snapshot par diff (delta compressé)
7.3.9. rdiff-backup versus rsync/rsnapshot
7.3.10. Le robot de sauvegarde (sauvegarder un parc de machines)
7.3.11. Multi-archivage sous linux (TAR, SPLIT et CAT)
7.3.12. Autres solutions : SBackup, Back In Time, fwbackups, Time Drive
7.4. Restauration de donnees (data recovery) / Récupération de données après un crash disque !
7.4.1. Ressources Utiles (Info, Outils, etc...) à bien lire avant de commencer !
7.4.2. Suite à un accident inopiné : Quoi faire ! Quoi ne pas faire...!
7.4.3. Restauration de données - Étape par étape...
7.5. SYS02: Avancé
7.5.1. SYS02-01: Environnement et variables
7.5.2. SYS02-02: Commandes avancées sous Linux
7.5.3. Applications
7.5.4. grep et les expressions rationnelles (ou regulières, regexp, ...)
7.5.5. Editeur en mode texte : VI(m), Emacs, Nano, mcedit, etc...
7.5.6. Editeur en mode graphique : Gedit, Kate, Quanta+, Bluefish, Notepad++, etc...
7.5.7. Editeur XML (XML Copy Editor)
7.5.8. Environnement de développement intégré (IDE) : Eclipse, Netbeans, Aptana, etc...
7.5.9. Programmation en Langage SHELL (Bash) sous Linux
7.5.10. Programmation en Langage SHELL (Bash) dans une console - Exercices
7.5.11. Evaluation - Exercice 3
7.6. Aller plus loin !
7.6.1. D'autres commandes
7.7. Examples de commandes utiles
7.8. Noyau GNU/Linux
8. UI004 Réaliser des documents avec LaTeX [EMPTY]
9. UI005 Publier des documents techniques avec DocBook [EMPTY]
10. SR009 Interfacer Apache avec un langage de script et un serveur de base de données
10.1. SR009 Base
10.1.1. Presentation Séquence
10.1.2. Architecture logicielle de l’environnement de développement (Server HTTP + BD + script PHP)
10.1.3. Serveur Web - Apache - Installation et configuration
10.1.4. Base de données - MYSQL - Installation et configuration
10.1.5. Vulnérabilités du moteur PHP
10.1.6. Language de script - PHP - Installation et configuration
10.1.7. phpMyAdmin - Installation et configuration
10.1.8. Atelier - Installation d’une application (Promethée) téléchargée à partir d’un zip ou d’un tar.gz
10.1.9. Développement d’une application et mise à disposition sous la forme d’un tgz
11. SR004 Interconnecter un réseau TCP/IP
11.1. Outils de test - Laboratoire: Netkit & Clownix
11.1.1. Netkit
11.2. NET01 Base
11.2.1. En Bref
11.2.2. Cours IP (Protocole Internet) - Concept à retenir :)
11.2.3. Adresse IP publique et privée
11.2.4. Outil pour les calculs IP (masque, etc...) : gip, sipcalc
11.2.5. DMZ - Zone démilitarisée
11.2.6. Les fichiers importants
11.2.7. Les commandes réseaux importantes : ip, ifconfig, ifup/ifdown, arp, route, netstat, traceroute, dig, host, hostname, whois, ping, mtr, bing, telnet, curl, nc(netcat), iftop
11.2.8. Utilisation de commandes réseau
11.2.9. Init : initialisation du système sous Linux
11.2.10. Modifier l’étape de boot
11.2.11. Exercice - Évaluation
11.2.12. Autres questions
11.2.13. Atelier - Fichier Hosts
11.2.14. Approche des services Telnet et FTP
11.2.15. Telnet et FTP mise en œuvre
11.2.16. Premiers pas dans la sécurité
11.2.17. L’analyse de trame (tcpdump, tshark, wireshark)
11.2.18. Dépannage réseau
11.2.19. netperf/ethtool : Mesure de performance réseau
11.2.20. Le protocole ssh (ssh, rssh, sftp, etc...)
11.2.21. Exercice - Évaluation
11.2.22. VoIP : Le protocole sip
11.2.23. VoIP : Le protocole XMPP (anciennement nommé Jabber)
11.3. IPv6
11.3.1. Introduction
11.3.2. Tester votre connexion IPv6, faite danser la tortue :)
12. SR005 - Administrer un serveur DNS
12.1. L'espace de noms - Arborescence DNS
12.2. DNS : Domain Name Server (Server de noms)
12.2.1. Protocole DNS (port 53, UDP/TCP)
12.2.2. Résolution de Nom - Mécanisme de délégation
12.2.3. Terminologie
12.2.4. Messages DNS (Enveloppe)
12.2.5. Liste des serveurs DNS existant
12.2.6. Installation & Maintenance
12.2.7. Documentation
12.2.8. Configuration
12.2.9. Configuration d'un serveur DNS sur le net
12.2.10. Piège à éviter
12.2.11. Outils de diagnostique et de vérification de la configuration
12.2.12. Commandes utiles
12.2.13. Verification du bon fonctionnement du serveur
12.2.14. Slow DNS lookup issues with bind9
12.2.15. Architecture de Service DNS
12.3. DNS : Travaux pratiques 1
12.3.1. dig : Mise en application
12.3.2. dig : Resolution DNS Simple
12.3.3. dig : Resolution inverse
12.3.4. Manipulation des flags
12.3.5. Section additionnelle
12.4. DNS : Travaux pratiques 2
12.4.1. Plan de délégation du réseau
12.4.2. Procédure et déroulement pour arriver au résultat
12.4.3. Fichiers de configuration (named, options, db, etc) et log de tests
12.4.4. Server Secondaire
12.5. Sécuriser un serveur DNS
12.5.1. Tout interdire par défaut ?
12.5.2. Access Control Lists (ACL)
12.5.3. Transfert sécurisé - Architecture utilisant les signatures de transfert de zones (TSIG)
12.5.4. Signature de requête et réponses DNS avec dig
12.5.5. Diffuser une zone signée avec DNSSEC (2010)
12.6. Évaluation pour le module sr005
12.6.1. Questions de cours
12.6.2. Architecture d’une agence
12.6.3. Configuration Bind
13. SR006 - Administrer un serveur de messagerie (SMTP)
13.1. La messagerie électronique
13.1.1. Présentation & Terminologie
13.1.2. Serveur de messagerie (Exim4, Postfix, etc...)
13.1.3. Choisir un serveur de messagerie, fonctionalités nécessaires
13.1.4. Exim4 Documentation
13.1.5. Exim4 configuration
13.2. Travaux pratiques 1
13.2.1. Général
13.2.2. Expansion de variables
13.2.3. Configurations possibles (Local, Smarthost, Satellite...)
13.3. Évaluation pour le module sr006
14. SR007 Administrer un serveur Web (HTTP)
14.1. Serveur Web Apache
14.1.1. Introduction
14.1.2. Travaux pratiques 1: Base et Protocole
14.1.3. Travaux pratiques 2: SSL, Php et Virtual Host
14.1.4. Contrôle
15. SR010 Les enjeux de la sécurité
15.1. Les enjeux (Password, Sauvegardes, etc...)
15.1.1. Introduction
15.1.2. Choisir son mot de passe... mais un bon mot de passe, c'est quoi ?
15.1.3. Périodicité (3 mois ou moins)
15.1.4. Résumé (Règle/Politique de sécurité)
15.1.5. Technique pour générer son mot de passe (Example simple)
15.1.6. Tester son mot de passe
15.1.7. Clef publique/privée
15.1.8. Les sauvegardes
15.1.9. Le Chiffrement (GnuPG)
15.1.10. Un espace hermétique
15.2. Le Chiffrement : Signature Numérique & Encryption (GnuPG)
15.2.1. Chiffrement symétrique (une clef) / asymétrique (paire de clefs)
15.2.2. Installation et configuration de GnuPG
15.2.3. Lister les clefs de son trousseau
15.2.4. Générer un nouvelle paire de clefs
15.2.5. Générer un certificat de révocation
15.2.6. Export de clefs
15.2.7. Import de clefs
15.2.8. Emprunte et signature de clef publique
15.2.9. Chiffrer/Déchiffrer un document
15.2.10. Signature Numérique (ou Electronique) d'un document
15.2.11. Vérifier la signature d'un document
15.2.12. Gestion du trousseau de clefs (publique/privée, sous-clés, etc...)
15.2.13. Distribution de clés (Serveur de clés)
15.2.14. Chiffrement de messages courriels
15.2.15. PGP/inline, PGP/MIME, S/MIME (PKI)
15.2.16. Gestionaires Graphique de clefs (publique/privée)
15.3. Un espace hermétique
15.3.1. DMZ (Zone démilitarisée)
15.3.2. Protéger son réseau - Contrôler les accès
15.3.3. Définir les usages: Qui (Client/Serveur), Quoi (Service), Pourquoi, Comment (Interface, Ports)
15.3.4. Définir les flux client/serveur autorisés
15.3.5. IDS - Système de détection d'intrusion
15.3.6. Séparer/Re-grouper les services Réseau/Sécurité
15.3.7. Pare-feu
15.3.8. Serveur Proxy (Serveur Mandataire)
15.4. Principes généraux pour sécuriser un système
15.4.1. Quelques règles simple à garder en mémoire
15.4.2. Principe du privilège minimum
15.4.3. BIOS - Protéger par mot de passe
15.4.4. Chargeur de démarrage (Grub, Lilo) - Protéger par mot de passe
15.4.5. Comptes utilisateurs
15.4.6. Système de gestion des fichiers - SGF (ou FHS en anglais)
15.4.7. Droits d'accès UNIX
15.4.8. Chiffrement du système de fichiers
15.4.9. Les services (Fermer l'inutile / Sécuriser l'utile)
15.4.10. Pare-feu
15.4.11. Le serveur graphique
15.5. HOWTO: Securiser Débian
15.6. Sécuriser les processus et surveiller le système
15.6.1. Grsecurity (GrSec) [patche pour sécuriser le noyau]
15.6.2. chroot
15.7. Différents types d’attaques
15.7.1. Attaques Locales
15.7.2. Attaques Distantes
15.7.3. Sensibilisation
15.7.4. La charte de l’utilisation du SI
15.7.5. Historique d'utilisation : Centraliser & protéger
15.8. Configurer le système de journalisation
15.8.1. Rappel
15.8.2. Tester sa configuration
15.8.3. Configurer les rotations (logrotate)
15.8.4. Surveiller les logs (swatch, syslog-ng)
15.9. Outils d’audit de sécurité
15.9.1. Construire un forteresse
15.9.2. nmap
15.9.3. nikto
15.9.4. nessus
15.10. Examen
15.11. Sécurité avancée
16. SR011 Déployer un routeur, un pare-feu et un serveur mandataire
16.1. Pare-feu (Firewall) - Filtre à paquets
16.1.1. Introduction
16.1.2. Conseils à retenir
16.1.3. Configuration Minimum
16.1.4. netfilter & iptables
16.1.5. fwbuilder (GUI)
16.1.6. Pour aller plus loin sur la gestion d'un pare-feu
16.1.7. TP : routage et filtrage
16.1.8. Port(s) Internet à ouvrir/fermer
16.1.9. Port Knocking
16.2. Serveur Proxy (Serveur Mandataire)
16.2.1. Introduction
16.2.2. SQUID
16.2.3. TP : Proxy HTTP
16.2.4. Autre Proxy
17. SAMBA & OpenLDAP
17.1. Planning SAMBA & LDAP
17.2. SAMBA : Présentation
17.3. SAMBA : Premier Pas
17.3.1. Documentation
17.3.2. Fonctionalité
17.3.3. Terminologie & Protocole
17.3.4. Installation
17.3.5. Version, Status
17.3.6. Les binaires "Serveur"
17.3.7. Les binaires "Client"
17.3.8. Fichier de configuration smb.conf
17.3.9. Les fichiers de statut "tdb"
17.3.10. Les fichiers de log
17.3.11. Premiers Tests
17.3.12. Comment diagnostiquer un problème ?
17.4. SAMBA en tant que serveur autonome
17.4.1. Configuration Etendue
17.4.2. Création d'un partage (tmp) accessible à tous (compte invité)
17.4.3. Partage avec authentification
17.4.4. Gestion des comptes (Liste, Création, Suppression)
17.4.5. Vérification des logs
17.4.6. Gestion des droits (lié au partage, lié au système de fichier)
17.4.7. Options de configuration pour gestion des droits
17.4.8. ACLs (pour gestion de droits plus complexe)
17.4.9. L’impression et le partage d’imprimantes
17.4.10. net commande
17.5. LDAP : Présentation
17.6. LDAP : Concepts
17.6.1. Liste des principaux annuaires LDAP existant sur le marché
17.6.2. Caractéristiques communes aux annuaires
17.6.3. Protocole LDAP et versions
17.6.4. Organisation des données (modèle de nommage)
17.6.5. Données contenues dans l’annuaire (modèle d’information)
17.6.6. Accéder à l’annuaire (modèle fonctionnel)
17.6.7. La sécurité (modèle de sécurité)
17.6.8. Concepts avancés (Réplication, distribution, etc...)
17.7. SAMBA en tant que contrôleur de domaine
17.7.1. Les étapes en bref :)
17.7.2. A propos des SIDs
17.7.3. Configuration de Samba en tant que PDC
17.7.4. Les partages spécifiques (homes, netlogon, profiles)
17.7.5. Gestion des comptes utilisateurs
17.7.6. Le mapping de groupes et le rôle des RIDs
17.7.7. Les paramètres avancés de chaque compte Samba ([home][profiles][netlogon])
17.7.8. Création du compte POSIX de manière autonome
17.7.9. Le superutilisateur Samba
17.7.10. Jonction au domaine et test de notre contrôleur
17.7.11. Obtenir des information sur le domaine
17.7.12. Samba en tant que BDC
17.7.13. Visualiser les connexions...
17.7.14. Relire la configuration sans redémarrer Samba...
17.7.15. En cas de problème : étude des logs !
17.7.16. Administration graphique ? Swat...
17.8. OpenLDAP
17.8.1. Installation OpenLDAP
17.8.2. Les outils fournis par OpenLDAP
17.8.3. Configuration du serveur
17.8.4. Documentation
17.8.5. Tester la configuration & redémarrer le serveur OpenLDAP
17.8.6. L’inclusion des schémas
17.8.7. Niveau de logs
17.8.8. Les backends
17.8.9. Performance & Optimisation - Backend (hdb/bdb) configuration (DB_Config)
17.8.10. Les databases
17.8.11. Mot de passe root (rootpw)
17.8.12. Administrer un serveur OpenLDAP
17.8.13. Utilisation des outils clients (Ajouter entrée, initialiser, re-initialiser)
17.8.14. Afficher l'arborescence d'un annuaire ldap
17.8.15. Rechercher une entrée : ldapsearch
17.8.16. Supprimer une entrée : ldapdelete
17.8.17. Modifier une entrée : ldapmodify
17.8.18. Renommer une entrée : ldapmodrdn
17.8.19. Configuration des outils clients
17.8.20. Outils graphiques d’administration
17.9. Connexion de Samba à notre annuaire
17.9.1. Rappel
17.9.2. Préparation de l’annuaire
17.9.3. Comptes POSIX - Nsswitch
17.9.4. Ajout de compte (ldapscripts)
17.9.5. Test de la reconnaissance d'un compte
17.9.6. Connexion sur le système Unix avec le compte LDAP
17.9.7. Connexion de Samba à l’annuaire
17.9.8. Diagnostiquer un problème
18. SR015 - Administrer un serveur CVS
18.1. Système de gestion de version (Version Control Systems - VCS/SCM Source Control Management)
18.1.1. Gestion de versions centralisée (CVS, Subversion)
18.1.2. Gestion de versions décentralisée (Git, Mercurial, Bazaar,...)
18.1.3. Comparaison
18.1.4. Quels VCS/SCM choisir ?
18.2. CVS/Subversion
18.3. Git (Language C)
18.3.1. Présentation, Référence et Documentation
18.3.2. Notion : répertoire Git (.git), répertoire de travail et index Git
18.3.3. Installation/Configuration
18.3.4. Création projet (nouveau ou depuis existant)
18.3.5. Historique du projet (Consulter les logs)
18.3.6. Appliquer des mise à jour et changement au projet
18.3.7. Les branches
18.3.8. Ajouter des fichier à l'index : Quelle différence entre "git add -A", "git add -u" et "git add ." ? Enlever du repertoire de travail les fichiers supprimés
18.3.9. Enlever des fichier à l'index, avant de committer
18.3.10. A ne pas faire !
18.3.11. Git - Configurer un dépôt distant (Remote)
18.3.12. Git - Configurer un dépôt public HTTP ("static") - Travailler en collaboration
18.4. Mercurial (Python)
18.5. Bazaar (Python)
18.6. darcs
19. SR016 Déployer un extranet sécurisé (VPN - Réseaux privés virtuels)
19.1. Les réseaux privés virtuels (VPN)
19.1.1. Introduction
19.1.2. Mise en place d’un VPN sur SSH
19.1.3. Mise en place d’un VPN sur SSL
19.1.4. VPN sur IPSEC
20. Le langage Perl appliqué à l’administration système
20.1. Introduction à la programmation en Perl
20.1.1. Documentation de Perl
20.1.2. Langages dotés de ramasse-miettes
20.2. ÉOF Séance 1 : Scalaires, listes, tableaux et fonctions
20.2.1. Premiers pas
20.2.2. Les scalaires
20.2.3. Structures de contrôle
20.2.4. Listes et tableaux
20.2.5. Écrire une fonction
20.2.6. print, printf, fprintf, sprintf
20.2.7. Autres fonctions sur les listes
20.2.8. Exercices Séance 1
20.3. ÉOF Séance 2 : Fichiers, Tables de hachage et Expressions Régulières
20.3.1. Tables de hachage
20.3.2. Manipulation des fichiers
20.3.3. Expressions régulières
20.3.4. Exercices Séance 2
20.4. ÉOF Séance 3 : Références et Application à l'administration système
20.4.1. Références
20.4.2. Exercices Séance 3
21. Méthodologie de conception des sites Web et interfaces
21.1. De l’idée à la mise en production
21.1.1. En bref
21.1.2. Méthode et plan d'action
21.2. TP : Réalisation d'une analyse des besoins
21.2.1. Sujet
21.2.2. Exercices
21.3. Les cas d’utilisation (UML use case diagram)
21.3.1. Introduction
21.3.2. Umbrello (réaliser des diagrammes UML)
21.3.3. Exo2 : Cas d'utilisation Kart website
21.4. Proposition graphique d'interface : Ergonomie & Accessibilité
21.4.1. Définition (s)
21.4.2. Méthode
21.4.3. Organisation visuelle
21.4.4. Taille de la page
21.4.5. Conception multiplateforme
21.4.6. Vitesse de chargement du site & Accessibilité
21.4.7. Navigation / Interface Homme-Machine
21.4.8. Conception du contenu
21.4.9. A ne pas faire !
21.4.10. Pour résumer en bref...!
21.4.11. Travaux Pratique SI001
21.5. Conclusion
21.6. GIMP
21.6.1. Cours
21.6.2. Maquette
21.6.3. Rendu XHTML
21.7. Hébergement de site Web sur Internet
21.7.1. toile-libre.org
22. HTML, XHTML, CSS
22.1. Présentation de la séquence
22.2. Importance des standards sur Internet
22.2.1. Origine
22.2.2. 1er Principes : au service de tous !
22.2.3. 2ème principe : Intéropérabilité & Accessibilité
22.2.4. 3ème Principe : Séparer forme et fond
22.2.5. 4ème Principe : La sémantique (validation)
22.2.6. 5ème Principe : La qualité
22.2.7. L'importance des jeux de caractères
22.3. (x)HTML
22.3.1. DOCTYPE Déclaration
22.3.2. Tags/Entities/Attributes/Events
22.3.3. Atelier XHTML: Essais et Validation
22.3.4. Questions/Réponses
22.4. CSS (Feuilles de Style en Cascade)
22.4.1. Présentation
22.4.2. Avantages (Beaucoup)
22.4.3. Inconvénients (Peu)
22.4.4. Syntaxe CSS
22.4.5. Intégration des CSS avec les documents XHTML / Type de média
22.4.6. La priorité des sélecteurs
22.4.7. Atelier CSS: Essais et Validation
22.5. Projets Web
22.5.1. CV Taos
22.5.2. Attention: Adresse courriel en direct sur les pages !!!
22.5.3. Site multi-navigateur: Comment gérer la compatibilité !
22.5.4. CSS - Lien Interne/Externe
22.5.5. (x)HTML - Video Embarquée pour tous
22.5.6. Exemples de site (Ombrage, Effets 3D, ...)
22.6. (x)HTML5 & CSS3
22.6.1. xHTML5
22.6.2. CSS3
22.6.3. Respect des standards - Suite de test(s) pour vérifier la conformité des navigateurs Web
23. SI010 - Interfaces Web enrichies
23.1. RIA
23.1.1. Conception d’applications Internet riches
23.1.2. Utilisation de scénarios/schémas (Pattern) connues et identifiés
23.1.3. Framework(s) Javascript
23.1.4. Utiliser AJAX (Asynchronous JavaScript + XML)
23.1.5. Document Objetc Model (DOM)
23.1.6. JSON (JavaScript Object Notation) et JSONP !
23.1.7. Améliorer les performances : "minify" javascript, concatenate CSS in one, optimiser les images...
23.1.8. TP ­- AJAX
23.1.9. Débugger Javascript/AJAX - Conseil et retour d'expérience
23.1.10. Projet Ajax : Logiciel de Chat
24. Initiation au langage de script (PHP, Python, Perl)
24.1. Présentation
24.2. Dévelopement Modulaire (OO, Framework, MVC, etc...)
24.3. PHP
24.3.1. Premier Pas...
24.3.2. Installation d'Apache, PHP et MySQL sous Linux (LAMP)
24.3.3. VirtualHost dédié :)
24.3.4. TP « Hello World »
24.3.5. Calculatrice PHP
24.3.6. Exponentielle d'un entier
24.3.7. Tester le type d'arguments
24.3.8. Le language PHP - Manuel de Référence
24.3.9. Désactiver les guillemets magiques dans php.ini
24.3.10. TP Formulaire
24.3.11. TP Base de données
24.3.12. Sécurisation des développements PHP
24.3.13. Open ID / SSO (Single Sign On)
24.3.14. TP Authentification
24.3.15. Gestion d'erreurs - Logs - Filtrage de données
24.3.16. Librairies / Framework PHP
24.3.17. Projet PHP : Kring
24.4. Python
24.4.1. Version 2.x ou 3.x ?
24.4.2. Installation
24.4.3. Executer un programme Python
24.4.4. Obtenir des informations sur le système
24.4.5. IDE pour coder sous Python
24.4.6. Encodage des fichiers sources (et codecs)
24.4.7. Premier Pas... avec le language
24.4.8. Résumé du language (Cheatsheet)
24.4.9. Coder en Python avec du Style !
24.4.10. Documentation du code
24.4.11. Performance (Conseils, Concatenation, etc...)
24.4.12. Persistance des données : Les fichiers
24.4.13. Persistance des données : Base de données
24.4.14. Utilisation pour le Web (Script CGI)
24.4.15. Interface Graphique (GUI avec Tkinter)
24.5. Lua
25. SI020 - Utilisation avancée d’un gestionnaire de contenu
25.1. SPIP
25.1.1. Cours
25.1.2. TP Installation
25.1.3. TP Prise en main
25.1.4. TP Installation de Squelettes
25.1.5. Réalisation d'un squelette SPIP
25.1.6. TP : introduction à la création de squelettes SPIP
25.1.7. TP : création avancé de squelettes SPIP
25.1.8. Projet SPIP - Réalisation d'un site complet
26. SI022 - Définir et utiliser son propre langage de balises avec XML et ses feuilles de styles XSL
26.1. XML/XSL
26.1.1. Présentation XML
26.1.2. TD - XML
26.1.3. TD - XSL
26.1.4. Projet XML/XSL Livres : Application d'échange (XML)
26.1.5. Transfert de paramètres XSL via PHP
27. ANNEXES
27.1. Liste de commandes
27.2. Ressources Bibliographique
27.2.1. Les coulisses de l’Internet par Olivier Ricou (Geopolitique) [présent]
27.2.2. The Cathedral and the Bazaar
27.2.3. Linux aux petits oignons
27.2.4. « Richard Stallman et la révolution du logiciel libre » Une biographie autorisée
27.2.5. Richard Stallman : « L’avenir du logiciel libre dépend de vous tous »
27.2.6. Mise en place d’une solution de ressources réparties et sécurisées composées de logiciels libres au sein d’une info-structure par Jean-Philippe Gaulier [2007]
27.2.7. Révolution, l’informatique devient votre sixième sens
27.2.8. Analyse des algorithmes finalistes concourant pour le futur standard AES par Jean-Philippe Gaulier
27.3. Linux HOWTO
27.4. Modèles Economique du Libre
Liste des tableaux
12-1. Fichiers de configuration et résultat de tests
21-1. Section publique
21-2. Section partenaires / Espace Client
21-3. Section privée
21-4. Commun à l'ensemble des Sections ci-avant
24-1. Language de script
Liste des illustrations
2-1. Le logiciel libre : comment ça marche ? 1/2
2-2. Le logiciel libre : comment ça marche ? 2/2
10-1. Script PHP avec Apache
10-2. Script PHPinfo() avec Apache
10-3. phpMyAdmin Install Prompt
10-4. phpMyAdmin - Page d'accueil
10-5. phpMyAdmin - Connection Root
10-6. phpMyAdmin - Connection Utilisateur
10-7. phpMyAdmin - Connection Michel
10-8. phpMyAdmin - Table DVD (Resultant du Didacticiel)
10-9. Promethée - Installation 1/7
10-10. Promethée - Installation 2/7
10-11. Promethée - Installation 3/7
10-12. Promethée - Installation 4/7
10-13. Promethée - Installation 5/7
10-14. Promethée - Installation 6/7
10-15. Promethée - Installation 7/7
10-16. Promethée - Ecran de connexion
10-17. Promethée - Ecran d'Accueil
11-1. Datagramme IP
11-2. Applications TCP/IP : Modèle client/serveur
11-3. Découpage des blocs d'adresses IPv4
11-4. Diagramme - Etude de cas
11-5. Diagramme - Traceroute
11-6. Wireshark : Ouvrir fichier .pcap (format libpcap)
11-7. Wireshark : Capture simple par défaut (ARP, IP, DNS, etc...)
12-1. DNS: Arborescence du Domain Name System
12-2. DNS-TP2: Architecture de l'entreprise
13-1. Exim4 : Chemin emprunté par un message SMTP reçu
15-1. Architecture DMZ avec deux pare-feu
15-2. Architecture DMZ avec un seul pare-feu
15-3. Rcconf : Gestion des services
15-4. Tripwire : Installation 1/9
15-5. Tripwire : Installation 2/9
15-6. Tripwire : Installation 3/9
15-7. Tripwire : Installation 4/9
15-8. Tripwire : Installation 5/9
15-9. Tripwire : Installation 6/9
15-10. Tripwire : Installation 7/9
15-11. Tripwire : Installation 8/9
15-12. Tripwire : Installation 9/9
15-13. SR010 Surveillance : Attaque XSS (PHP)
15-14. SR010 Surveillance : Protection contre attaque XSS (PHP)
16-1. iptables: Chemin simple parcouru par un paquet
16-2. iptables: Chemin détaillé parcouru par un paquet
16-3. TP Pare-Feu : Architecture réseau
17-1. Samba : Résultat d'impression distant
17-2. Samba : Partage TMP accessible à tous depuis Windows
17-3. CUPS : Configuration d'imprimante partagé depuis Windows
17-4. Samba : Imprimante partagé depuis Windows accessibe depuis machine Unix
17-5. Samba : Résultat d'impression distant
17-6. LDAP : Arborescence d'informations hiérarchique (DIT)
17-7. Samba : Workstation jointe au domaine avec succès
17-8. Samba : Connexion utilisateur au domaine
17-9. Samba : Disque réseau U: mappée vers votre répertoire home
17-10. Samba : Disque réseau J: mappée vers le partage [donnees]
17-11. OpenLDAP : Schéma représentant une arborescence d'initialisation
17-12. phpLDAPAdmin
20-1. Schéma de Référence Simple en Perl ($refv pointe vers $v)
20-2. Schéma de Référence Diverse en Perl
20-3. Schéma la structure de référence en mémoire
20-4. Schéma de structure de données pour stockage de passwd
21-1. SI001 : UML Cas d'utilisation
21-2. SI001 : Ergonomie/Maquette (QT4-Designer) 1/7
21-3. SI001 : Ergonomie/Maquette (QT4-Designer) 2/7
21-4. SI001 : Ergonomie/Maquette (QT4-Designer) 3/7
21-5. SI001 : Ergonomie/Maquette (QT4-Designer) 4/7
21-6. SI001 : Ergonomie/Maquette (QT4-Designer) 5/7
21-7. SI001 : Ergonomie/Maquette (QT4-Designer) 6/7
21-8. SI001 : Ergonomie/Maquette (QT4-Designer) 7/7
21-9. SI001 : Ergonomie/Maquette (Pencil) 1/2
21-10. SI001 : Ergonomie/Maquette (Pencil) 2/2
21-11. SI001 : Ergonomie/Maquette (GIMP) 1/1
22-1. SI002: (x)HTML Cheat Sheet
22-2. SI002: CSS(v2) Syntaxe de Règle
22-3. SI002: CSS(v2) Modèle de boîte standard du W3C
22-4. SI002: CSS(v2) Cheat Sheet
24-1. SI016 PHP : Hello world!
24-2. SI016 PHP : Hello world! [CGI]
24-3. SI016 PHP : Linéarisation
24-4. SI016 PHP Travaux Pratique 1/3
24-5. SI016 PHP Travaux Pratique 2/3
24-6. SI016 PHP Travaux Pratique 3/3
24-7. SI016 PHP Authentification 1/6
24-8. SI016 PHP Authentification 2/6
24-9. SI016 PHP Authentification 3/6
24-10. SI016 PHP Authentification 4/6
24-11. SI016 PHP Authentification 5/6
24-12. SI016 PHP Authentification 6/6
24-13. SI016 PHP Projet Kring 1/?
24-14. SI016 Python Cheatsheet 1/2
24-15. SI016 Python Cheatsheet 1/2
24-16. SI016 Python CGI 1/16
24-17. SI016 Python CGI 2/16
24-18. SI016 Python CGI 3/16
24-19. SI016 Python CGI 4/16
24-20. SI016 Python CGI 5/16
24-21. SI016 Python CGI (Erreur) 6/16
24-22. SI016 Python CGI (Info) 7/16
24-23. SI016 Python CGI (Info) 13/16
24-24. SI016 Python CGI (Info) 14/16
24-25. SI016 Python CGI (Télécharger Fichier) 8/16
24-26. SI016 Python CGI (Télécharger Fichier) 9/16
24-27. SI016 Python CGI (Télécharger Fichier) 10/16
24-28. SI016 Python CGI (Télécharger Fichier) 11/16
24-29. SI016 Python CGI (PIL) 15/16
24-30. SI016 Python CGI (PIL) 16/16
24-31. SI016 Python Tkinter 1/
24-32. SI016 Python Tkinter 2/
24-33. SI016 Python Tkinter 3/
24-34. SI016 Python Tkinter 4/
24-35. SI016 Python Tkinter 5/
24-36. SI016 Python Tkinter 6/
24-37. SI016 Python Tkinter 7/
24-38. SI016 Python Tkinter 8/
24-39. SI016 Python Tkinter 9/
24-40. SI016 Python Tkinter 10/
24-41. SI016 Python Tkinter 11/
24-42. SI016 Python Tkinter 12/
24-43. SI016 Python Tkinter 13/
24-44. SI016 Python Tkinter 14/
24-45. SI016 Python Tkinter 15/
24-46. SI016 Python Tkinter 16/
24-47. SI016 Python Tkinter 17/
24-48. SI016 Python Tkinter 18/
24-49. SI016 Python Tkinter 19/
24-50. SI016 Python Tkinter 20/
24-51. SI016 Python Tkinter 21/
24-52. SI016 Python Tkinter 22/
24-53. SI016 Python Tkinter 23/
24-54. SI016 Python Tkinter 24/
24-55. SI016 Python Tkinter 25/
24-56. SI016 Python Tkinter 26/
24-57. SI016 Python Tkinter 27/
24-58. SI016 Python Tkinter 28/
24-59. SI016 Python Tkinter 29/
24-60. SI016 Python Tkinter 30/
24-61. SI016 Python Tkinter 31/
24-62. SI016 Python Tkinter 32/
24-63. SI016 Python Tkinter 33/
24-64. SI016 Python Tkinter 34/
24-65. SI016 Python Tkinter 35/
24-66. SI016 Python Tkinter 36/
24-67. SI016 Python Tkinter 37/
24-68. SI016 Python Tkinter 38/
25-1. SI020 SPIP Test .php3
25-2. SI020 SPIP Installation 1/7
25-3. SI020 SPIP Installation 1/7
25-4. SI020 SPIP Installation 3/7
25-5. SI020 SPIP Installation 4/7
25-6. SI020 SPIP Installation 5/7
25-7. SI020 SPIP Installation 6/7
25-8. SI020 SPIP Installation 7/7
25-9. SI020 SPIP Espace Privé
25-10. SI020 SPIP Public (par défaut)
25-11. SI020 SPIP Public 1ère Rubrique
25-12. SI020 SPIP Public 1er Article
25-13. SI020 SPIP Public (mise à jour)
25-14. SI020 SPIP Sauvegarde 1/2
25-15. SI020 SPIP Sauvegarde 2/2
25-16. SI020 SPIP Installation Automatique
25-17. SI020 SPIP Installation Automatique 2
25-18. SI020 SPIP Filezilla 1
25-19. SI020 SPIP Filezilla 2
25-20. SI020 SPIP Monsite Erreur
25-21. SI020 SPIP Monsite Prive
25-22. SI020 SPIP Monsite Public
25-23. SI020 SPIP Ajouter des plugins 1/6
25-24. SI020 SPIP Ajouter des plugins 2/6
25-25. SI020 SPIP Ajouter des plugins 3/6
25-26. SI020 SPIP Ajouter des plugins 4/6
25-27. SI020 SPIP Ajouter des plugins 5/6
25-28. SI020 SPIP Ajouter des plugins 6/6
26-1. SI022 TP XML 1/14
26-2. SI022 TP XML 2/14
26-3. SI022 TP XML 3/14
26-4. SI022 TP XML 4/14
26-5. SI022 TP XML 5/14
26-6. SI022 TP XML 6/14
26-7. SI022 TP XML 7/14
26-8. SI022 TP XML 8/14
26-9. SI022 TP XML 9/14 [XSD]
26-10. SI022 TP XML 10/14 [XSD]
26-11. SI022 TP XML 11/14 [XSD]
26-12. SI022 TP XML 12/14 [XSD]
26-13. SI022 TP XML 13/14 [DTD Formation]
26-14. SI022 TP XML 14/14 [XSD Formation]
26-15. SI022 TP XSL 1/11
26-16. SI022 TP XSL 2/11
26-17. SI022 TP XSL 3/11
26-18. SI022 TP XSL 3-bis/11
26-19. SI022 TP XSL 4/
26-20. SI022 TP XSL 5/11
26-21. SI022 TP XSL 6/
26-22. SI022 TP XSL 7/11
26-23. SI022 TP XSL 8/11
26-24. SI022 TP XSL 9/11
26-25. SI022 TP XSL 10/11
26-26. SI022 TP XSL 11/11
26-27. SI022 TP XSL 11-bis/11
26-28. SI022 Projet XML/XSL 1/
26-29. SI022 Projet XML/XSL 2/
26-30. SI022 Projet XML/XSL 3/
26-31. SI022 Projet XML/XSL 4/

Chapitre 1. Licence

Permission est accordée de copier, distribuer et/ou modifier ce document selon les termes de la Licence de Documentation Libre GNU (GNU Free Documentation License), version 1.1 ou toute version ultérieure publiée par la Free Software Foundation sans section invariante, sans texte de première de couverture, ni texte de quatrième de couverture. Une copie de la licence est fournie dans la section intitulée "GNU Free Documentation License".


Chapitre 2. Introduction...

2.1. Logiciels Libre et Open Source (à code ouvert) - FLOSS

Source(s):


2.1.1. Qu'est-ce qu'un code source?

Le code source est l'ADN d'un programme. Il est écrit en un langage compréhensible par l’homme et plus spécifiquement les développeurs.


2.1.2. FLOSS ? Quesaqo ?

FLOSS signifie "Free Libre et Open Source Software" (Logiciel). FLOSS est un terme générique qui qualifie à la fois les logiciels libres et les logiciels open source.

Un logiciel FLOSS est un logiciel libre ou open source diffusé selon les termes d’une licence libre ou open source et dont le code source est mis à disposition d’un utilisateur pour être exécuté, copié, étudié, modifié, redistribué.


2.1.3. Le logiciel libre

La Free Software Foundation (« FSF ») a conçu ce concept et des licences libres (GPL, etc...). Il faut entendre « libre » au sens de liberté et non de gratuité (Free as Freedom).

Les licences libres sont constuites autour de 4 libertés fondamentales :


* utiliser le programme,
* l'étudier,
* le modifier,
* le distribuer (gratuitement ou non).
    

Le copyleft (« gauche d’auteur par opposition au « copyright ») se pose comme un garant de libertés car il permet d’imposer le redistribution du code source sous la même licence libre.

Tout code propriétaire associé à du code libre (logiciel libre) rend la totatlité du code libre par effet de bord (volontaire) de la licence (GPL est un bonne example)

Example concret d'actualité : Orange - Logiciels Libres et à Sources Ouverts de la Livebox - Livebox Free/Libre & Open Source Software - http://www.livebox-floss.com.


2.1.4. Le logiciel open source

L’Open Source Initiative « OSI » (site web disponible en anglais) a défini 10 critères que doit satisfaire une licence pour être qualifiée de licence open source :


* libre redistribution du logiciel,
* fournir le code source,
* permettre la création d’œuvres dérivées,
* respecter de l'intégrité du code source de l'auteur,
* pas de discrimination quant aux personnes ou aux groupes,
* pas de discrimination quant aux domaines (recherche, industrie, etc.),
* distribuer la licence,
* licence non spécifique à un produit,
* pas de restriction imposée à d’autres logiciels,
* licence neutre technologiquement.
   

Ainsi, toute licence répondant à ces critères peut recevoir la « certification » Open Source mise en place par l’OSI.

Tout code propriétaire associé à du code Open Source ne rend pas la totalité du code forcément Open Source. Dans ce cas une "tolérance" est accepté par effet de bord (volontaire) de la licence (BSD est un bonne example). Ce qui est propriétaire peut le rester (délivrance de code binaire non interpretable par l'homme) et ce qui est Open Source doit le rester (code lisible par l'homme distribuable sous la même license Open Source).


2.1.5. Les quatre libertés essentielles de l'utilisateur d'un programme

  • Liberté 0 : la liberté d'exécuter le programme comme tu veux.

  • Liberté 1 : la liberté d'étudier le code source et de le changer pour que le programme fasse ce que tu veux.

  • Liberté 2 : la liberté d'aider les autres, c'est-à-dire la liberté de redistribuer des copies exactes du programme, quand tu veux.

  • Liberté 3 : la liberté de contribuer à ta communauté, c'est-à-dire la liberté de distribuer des copies de tes versions modifiées du programme, quand tu veux.


2.1.6. Le logiciel libre : comment ça marche ?

 

... Pour aider à sensibiliser de nouveaux publics aux enjeux du logiciel libre, le groupe de travail Sensibilisation de l'April a créé le dépliant « Le logiciel libre : comment ça marche ? ». Ce document de vulgarisation clair introduit le logiciel libre et donne quelques clés pour approfondir sa compréhension. Le document est sous licence libre et sa diffusion au plus grand nombre est fortement encouragée ! ...

 
-- Par Malicia sur Linux.fr  

Cette campagne souligne différentes facettes du logiciel libre dont la démarche est découpée en six étapes principales :


1. Les prémisses d'un logiciel : 
comment les caractéristiques principales d'un logiciel libre sont établies ;
2. Les premières contributions :
grâce à la disponibilité du code source, d'autres développeurs peuvent se joindre au projet ;
3. Les premiers essais de fonctionnement : 
après de nombreux tests de fonctionnement, le logiciel est diffusé aux utilisateurs ; 
ces derniers peuvent remonter des dysfonctionnements et ainsi aider les concepteurs du logiciel à l'améliorer ;
4. Les modifications à apporter :
l'enrichissement en termes de fonctionnalités continue ;
5. L'utilisation à plus grande échelle :
la diffusion du logiciel continue auprès du plus grand nombre d'utilisateurs ; 
un manuel est rédigé et des traductions sont ajoutées ;
6. L'évolution rapide des fonctionnalités : 
à chaque modification, une nouvelle version est diffusée ; 
le cycle d'amélioration est ainsi continu et implique des contributeurs très divers.

    

Figure 2-1. Le logiciel libre : comment ça marche ? 1/2

Figure 2-2. Le logiciel libre : comment ça marche ? 2/2


2.1.7. Promouvoir le libre dans les entreprises et les administrations ?

Source(s):

 

...l'objectif est de diminuer les coûts..., de fournir des logiciels de qualité...

...Il existe aujourd'hui une offre pléthorique de logiciels libres mais beaucoup restent encore peu aboutis...

...Sans compter qu'ils ne sont pas forcément plus rentables. Et au final, c'est bien sur ces deux points que les collectivités risquent de se décider...

...Pour Matthieu Piaumier, l'avantage compétitif du logiciel libre n'est pourtant ni technique ni économique : libre ne veut pas dire gratuit. Selon lui, l'atout décisif des logiciels libres se résume ainsi : « Ils garantissent une indépendance totale vis-à-vis des éditeurs. »...

...Un point loin d'être anodin pour une administration publique et qui explique pourquoi, pour l'Adullact, le logiciel libre, plus qu'un choix technique, devrait être avant tout un choix politique...

 
-- http://www.rue89.com / Adullact  

2.1.8. Comment augmenter/améliorer l'utilisation des logiciels libres en générale et des distributions GNU/Linux en particulier ?

Source(s):

"Breaking out the old metaphors... creating more compelling user experience...", "...more realistic and interactive UI... no menu bar, no floppy disk save icon..."

Privilégié Qualité&Performance au lieu de Quantité...

Aider les utilisateurs à devenir plus efficients...

Anticiper les utilisateurs...ce sont les petits détails qui ont de l'importance... (extrait de cette vidéo). Anticiper ce que les utilisateurs essayent d'obtenir/de faire... pas uniquement ce qu'ils disent qu'ils veulent faire...

Partager l'objectif des utilisateurs :


- Les utilisateurs sont interresser à compléter une tâche rapidement et efficacement...
- Les developpeurs sont interresser à remplir une base de donnée (par exemple)
   
Ces deux objectifs doivent être en synchronisation/symbiose...
   

Assurer un fonctionnement irréprochable des fonctionalités clefs avant d'en ajouter de nouvelles... (palier par un moyen simple de les combiner...)

 

...the quickest way to alienate new users is to make it hard for them to do what they want to do. Or worse, promise something but not do it. Users are more likely to stick with something that works well than something that mostly works but has lots of potential...

 
-- http://mybroadband.co.za/news/columns/12975-New-priorities-for-Ubuntu.html  

À tort ou à raison, les logiciels libres et GNU/Linux en particulier reste souvent considéré comme des systèmes austères et compliqués.

Depuis plusieurs années, des efforts considérables ont été fournis par les adeptes du libre, notamment en matière d'interface graphique pour s'éloigner d'une vision rétrograde et guère flatteuse que l'univers du logiciel libre qui jusque là était intimement lié à des interfaces pas vraiment attractives, où la moindre action impliquait de rentrer une ligne de code dans l'invite de commande.

Note

Au passage, quoique la l'invite de commande demande un plus grand effort de connaissance, d'experimentation et d'accessibilité, cela reste un des moyens les plus efficaces et efficiants de gérer toute machine informatique pour peu que l'on veuille bien s'atteler à la tâche d'apprendre à s'en servir correctement.

De facon similaire l'utilisation d'un éditeur de texte tel que TEX (basé sur LaTex) est bien plus efficace/efficient que de travailler avec une suite bureautique WYSWYG "traditionnelle" tel que Open Office ou Microdoft Word, pour peu qu'on s'y atèle et qu'on dépasse les premières barrières de l'apprentissage des bases nécessaire.

Pourtant, si ces avancées sont à saluer, il reste à convaincre les utilisateurs eux-mêmes afin que les logiciels libres continuent de prendre des parts de marché.

Pour Jim Zemlin, directeur exécutif de la Fondation Linux, il n'y a qu'une seule façon pour y parvenir. Il faut directement concurrencer les leaders dans le domaine de l'expérience utilisateur, à commencer par le leader en la matière, Apple.

Pour Mark Shuttleworth, fondateur de la distribution Ubuntu,


* Taking the great work done by the development community and 
  getting it out there where people can use it.

* Getting top quality software

* "Cadence" - the regularity and frequency of releases : 
  - drawn attention to project
  - generate enthusiasm among users
  - keep community engaged in project and stimulate their work

* Coordinated cadence across multiple projects. 
  - help projects focus their work
  - help distributors to minimize duplicated effort 
  - get the best of what the development community has to offer. 

* Quality (je rajouterais performance aussi)
  - the community shall start thinking differently about the quality of its code
  - stronger focus on everyday quality in development projects
  - starting with broader use of automated test suites
  - use test suites after each commit
  - A good set of regression tests

* Automatic crash reporting 
  - gather all of the relevant information and ship it off to the people 
    who are best equipped to interpret it and, hopefully, fix the problem.
  - a highly useful tool for distributors and developers.  

* Code review was also favorably mentioned

* Pay more attention to design in free software
  - Proper design makes the software more appealing to "ordinary users," 
  - Thus will increase their number and pride among developers.
  - Doing design right is a challenging task 
  - It's not something that can always be done by developers.

* Famous chasm diagram by Geoffrey Moore
  - a bell-shaped curve showing product adoption over time
  - showing a gap between the "early adopters" and the majority of users.
    Getting across that gap ("chasm") can require changes in how a project is developed and marketed.

* Pre-installation 
  - users need to get devices which have Linux already installed on them. 
  - "obvious things should just work" out of the box :)
  - without stopping caring about freedom in the process.  

* Make Linux work better on ARM-based systems
  - Linaro initiative
   

Je verrais aussi...


- Utiliser(considérer) les logiciels libres (et format ouverts) pour toutes tâches informatiques
  Si on ne peut pas toujours utiliser des logiciels libre, 
  ils devraient toujours être considérés en premier lieu
- Contribuer par un moyen ou un autre :
   - reporter les problèmes rencontrés
   - apporter des pistes de solution
   - résoudre les problèmes (le sien ou ceux des autres)
   - participer à des projets 
     (support, developpement, organisation, évènements, documentation, 
      traduction, conception/design, artwork, donation financière ou matériel, financement, légalité)  
   

- garder le coté "hackable device"
- garder et promouvoir les libertés
- communiquer d'avantage sur les logiciels libres et leur avantages
- continuer de promouvoir les formats ouverts et l'intéropérabilité des systèmes
- stimuler la curiosité des utilisateurs
- continuer de provouvoir des environements où les utilisateurs peuvent experimenter en toute confiance
- promouvoir et accentuer les possibilités de formation et auto-formation
   

Et aussi...
- développer le service autour des logiciels libres
- développer et promouvoir la simplicité d'utilisation
- développer l'offre d'application métier de qualité
- augmenter l'accès aux logiciels libres pré-installés
- comparer ce qui est comparable :)
   

Selon JP, un autre point important, c'est de montrer que pour une utilisation quotidienne (web/bureautique) le logiciel libre est simple (plus que d'utiliser Seven par exemple) contrairement à une idée recu que GNU/Linux c'est difficile !

Pour ma part, après avoir récemment touché brièvement du Seven, on peut dire que c'est un peu lourd...comparé à GNU/Linux....d'un point de vu utilisation... au premier abord en tout cas...

Personellement, je me demande aussi si ce n'est ce pas plus flexible/interopérable aussi... en terme de personalisation par exemple, avec le système de paquets chacun peut construire sont système qui repond exactement à ses besoins...

Un point toutefois qui peut chagriner avec le libre parfois... (ou peut être Ubuntu en particulier mais pas sur que ce soit lié a Ubuntu...), c'est que certains problèmes recontrés sont moins excusable/acceptables d'un point de vu utilisateur lambda que sur Windows/MacOSX... (gestion de la connexion wifi) mais ca tiens certainement aussi à la plateforme et au matériel... à la maturité et au fait que Ubuntu est gratuit et s'améliore tous les 6 mois :)

Mais ça dépend aussi car sous Windows un écran bleu est-ce excusable ?

En effet pour certains problèmes que je rencontre avec Ubuntu, je l'avoue, je dois pas mal me battre et mettre les mains dans le camboui, être patient, persévérant et comprendre comment ca fonctionne... par forcément ce qu'attends un utilisateur lambda... mais c'est gratuit, configurable et libre :) ... et peut être aussi que je fais des choses que l'utilisateur lambda ne ferait pas... tel qu'installer Ubuntu sur un MacBook Pro 5,5 d'Apple... Il faudrait que j'essaye avec Windows 7 pour comparer... après installer MacOS X sur un PC lambda n'en parlons pas !!!

Essayer plusieurs distributions telle que Arch GNU/Linux peut être plus stable... mais plus complexe... sinon Debian fonctionne bien mais quelques glitch ici et là aussi...

GNU/Linux est aussi addapté pour le professionnel dans le monde du cinema, de la radio ou de la musique... même si peut etre pas aussi simple à mettre en place qu'une solution propriétaire... (question de connaissance et de support ?)

Deux difficultés pour le monde professionnel :


- il n'y a pas beaucoup d'application métier
- payer cher rassure les décideurs
    

Ce deuxième argument est étonant mais déjà entendu dans des enquêtes sur les habitudes des acheteurs... nature humaine ? habitude ? nature humaine et habitude...

Cela donne peut être un sentiment de guarantie par rapport à ce qui est payé pour... le côté contractuel et donc obligations des parties contractantes... mais ça non plus ce n'est pas tangible y a qu'à voir les outils propriétaires, certains sont buggés à mort et sont inadmissibles :)))

N'est ce pas aussi la raison pour laquelle, certaines companies propriétaires offrent du support payant :) ... si elles corrigeraient tous les bugs cela ne serait plus assez rentable...

Du côté du libre, on imagine que c'est un peu pareil quand même... malgré la visibilité du code rien ne guarantie qu'il soit parfait... mais ce qui est certains, c'est que l'on ne paye pas pour cela, donc cela reste plus compréhensible...

C'est peut être aussi un pb de responsabilité... avec le libre elle est partagée...

D'où l'idée de vendre du service, un autre point surlequel le libre n'est pas en reste mais pour lequel il reste encore grandement à faire...


2.2. Facteurs de qualité d'un logiciel (B.Meyer et G.Booch)

2.2.1. Constat :

Un utilisateur, lorsqu’il achète un produit comme un appareil électro- ménager ou une voiture, attend de son acquisition qu’elle possède un certain nombre de qualités (fiabilité, durabilité,efficacité,...). Il en est de même avec un logiciel.


2.2.2. Liste minimale de critères de qualité du logiciel (d’après B.Meyer, G.Booch)

Source(s):


Correction            Robustesse        Extensibilité
Réutilisabilité       Compatibilité     Efficacité
Portabilité           Vérificabilité    Intégrité
Facilité utilisation  Modularité        Lisibilité
Abstraction
   

Reprenons les définitions communément admises par ces deux auteurs sur ces facteurs de qualité :

  • La correction : est la qualité qu'un logiciel a de respecter les spécifications qui ont été posées.

  • La robustesse : est la qualité qu'un logiciel a de fonctionner en se protégeant des conditions de dysfonctionnement.

  • L'extensibilité : est la qualité qu'un logiciel a d’accepter des modifications dans les spécifications et des adjonctions nouvelles.

  • La réutilisabilité : est la qualité qu'un logiciel a de pouvoir être intégré totalement ou partiellement sans réécriture dans un nouveau code.

  • La compatibilité : est la qualité qu'un logiciel a de pouvoir être utilisé avec d'autres logiciels sans autre effort de conversion des données par exemple.

  • L'efficacité : est la qualité qu'un logiciel a de bien utiliser les ressources.

  • La portabilité : est la qualité qu'un logiciel a d'être facilement transféré sur de nombreux matériels, et insérable dans des environnements logiciels différents.

  • La vérificabilité : est la qualité qu'un logiciel a de se plier à la détection des fautes, au traçage pendant les phases de validation et de test.

  • L'intégrité : est la qualité qu'un logiciel a de protéger son code et ses données contre des accès non prévus.

  • La facilité d'utilisation : est la qualité qu'un logiciel a de pouvoir être appris, utilisé, interfacé, de voir ses résultats rapidement compris, de pouvoir récupérer des erreurs courantes.

  • La lisibilité : est la qualité qu'un logiciel a d'être lu par un être humain.

  • La modularité : est la qualité qu'un logiciel a d'être décomposable en éléments indépendants les uns des autres et répondants à un certain nombre de critères et de principes.

  • L'abstraction : est la qualité qu'un logiciel a de s’attacher à décrire les opérations sur les données et à ne manipuler ces données qu’à travers ces opérations.

La production de logiciels de qualité n’est pas une spécificité des professionnels de la programmation ; c’est un état d’esprit induit par les méthodes du génie logiciel. Le débutant peut, et nous le verrons par la suite, construire des logiciels ayant des " qualités " sans avoir à fournir d’efforts supplémentaires. Bien au contraire la réalité a montré que les étudiants " bricoleurs " passaient finalement plus de temps à " bidouiller " un programme que lorsqu’ils décidaient d’user de méthode de travail. Une amélioration de la qualité générale du logiciel en est toujours le résultat.


2.2.3. Characteristics of Great Software (by Apple)

Source(s):

    
    * High Performance
    * Ease of Use
    * Attractive Appearance
    * Reliability
    * Adaptability
    * Interoperability
    * Mobility
    

2.2.6. Quelques conseils à retenir pour développer un programme ou script

Source(s):


Philosophie d'Unix : « Ne faire qu'une seule chose, et la faire bien. »
- Écrivez des programmes qui effectuent une seule chose et qui le font bien.
- Écrivez des programmes qui collaborent.
- Écrivez des programmes pour gérer des flux de texte, car c'est une interface universelle.

- Tout est fichier
- Les données sont du texte (txt, xml, etc...)
  (scripts, fichiers de configuration, formats de données, 
   protocoles réseau, sortie d'informations)

  Dans la philosophie unix, toutes les données doivent être stockées 
  et transmises sous forme de texte. Cela peut coûter légèrement 
  plus de place qu'un format binaire. Mais on y gagne beaucoup.

  Un fichier texte peut être lu par les autres outils unix, et donc 
  respecte de principe faire une chose et le faire bien
  Un fichier texte peut être lu par un être humain et 
  donc respecte le principe kiss
  Un fichier texte permet une interopérabilité avec d'autres 
  systèmes (pas de problèmes d'indiens en iso par exemple)
  Un fichier texte facilite le débugage

- Les données sont binaires dans les cas où l'espace ou le temps de parsing sont primordiaux
  par exemple dans les formats d'image ou de son

- Simplicité : "Keep it simple, stupid !" (KISS principle)
  Plus c'est simple mieux c'est. 
  Qui dit simple, dit facile à manipuler, faciles à réutiliser.
  Un code est bien écrit, bien architecturé, simple, est aussi 
  simple à lire, à maintenir et à débuger, 
  pas besoin de milliers de lignes de commentaires.

- Pour faire une chose et le faire bien Unix a inventé le pipe '|', 
une méthode simpliste pour faire communiquer 2 programmes entre eux. 
Cette communication est unidirectionnelle et non formatée, seules des 
données brutes y passent (le plus souvent au format texte). 

  Note: La socket a été inventée après le pipe pour une communication 
        dans les 2 sens, ainsi que bien d'autres moyens de communiquer 
        d'un processus a l'autre.
 
- Un logiciel doit savoir communiquer avec d'autres logiciels (unix ou autre) 
pour garantir une large (re-)utilisation.

- S'appyer sur des outils simple déjà existant.

Developpement agile:
- Release early. Release often. And listen to your customers
  L'utilisation d'un système de gestion de version est fortement recommendé

- Éviter les bugs autant que faire se peut. 
- Development dead-ends 
- Try finding the minimum-effort path from point A to point B 
- Simplifying design approach
- Be conservative (API stable)
- Tester & Debugger (Suite de test, test unitaire)

- Indiquer clairement dans le code :
   - la licence : Choisir un licence libre pour distribuer le logiciel et 
                  l'indiquer dès le départ dans le(s) fichier(s) source
   - l'auteur, 
   - la date, 
   - la version
   - l'url site web correspondant (optionel)
   - la description du script, qu'est ce qu'il est sencé faire

- Créer un aide (--help) définissant:
   - l'objectif du script (ou programme)
   - l'usage 
   - les options d'utilisation
   - les options de configuration 
   - des examples d'utilisation simple

Developpement Modulaire:
- Créer un système modulaire : "When you design a system, or a language, then 
if the features can be broken into relatively loosely bound groups of relatively 
closely bound features, then that division is a good thing to be made a part of 
the design. This is just good engineering. It means that when you want to change 
the system, you can with luck in the future change only one part, which will only 
require you to understand (and test) that part. This will allow other people to 
independently change other parts at the same time. This is just classic good software 
design."

Being part of a Modular Design
[This is often much more difficult than modularity.]
- Its is not only necessary to make sure your own system is designed to be made of 
  modular parts. It is also necessary to realize that your own system, no matter 
  how big and wonderful it seems now, should always be designed to be a part of 
  another larger system.

Tolerance:
- "Be liberal in what you require but conservative in what you do"
   This is the expression of a principle which applies pretty well in life,
   and is commonly employed in design across the Internet.
   Ex: Write HTML 4.0-strict. Accept HTML-4.0-Transitional (a superset of strict).

Decentralization:
- This is a principle of the design of distributed systems, including societies. 
  It points out that any single common point which is involved in any operation 
  trends to limit the way the system scales, and produce a single point of complete failure.

Test of Independent Invention
- "If someone else had already invented your system, would theirs work with yours?"
  Does this system have to be the only one of its kind? This simple thought test is 
  described in more detail in "Evolution" in these Design Issues. It is connectted to 
  modularity inside-out: designing a system not to be modular in itself, but to be a part 
  of an as-yet unspecified larger system. A critical property here is that the system tries
  to do one thing well, and leaves other things to other modules. It also has to avoid 
  conceptual or other centralization, as no two modules can claim the need to be the unique 
  center of a larger system.

- Indiquer au utilisateurs où trouver de l'aide (website, FAQ, email, irc, etc...)
- Indiquer comment remonter des commentaires, des bugs, des paths

- Initialiser les variables, fonctions et scripts
- S'assurer que toutes les dépendances 
  dont le script dépend et les conditions (fichiers/paramètres)
  requis sont en place avant d'executer le script
- Externaliser la configuration dans un (ou plusieurs) fichiers externes
  (mettre en dehors des scripts) qui serait charger lors de l'execution
- Créer un configuration par défaut (example)
- Laisser les options possibles au choix de l'utilisateur

- Ecrire des scripts flexible, évolutif et réutisable.

- Lorsqu'on effectue une comparaison il faut comparer les données plustôt 
  que les fichiers/repertoire cad dire leur contenu et pas leur description...
  (ex diff arbre1 arbre2)
- Lors de la manipulation de données pouvant 
  être importante utiliser des fichiers plûtot que des variables notament 
  lors de traitement temporaire (les fichiers peuvent être réutilisé)

- Créer des options (ou API pour les programmes complexe) sur le modèle des commande Unix (-a, -c, etc...) 
  simple et facilement compréhensible

- Lorsque ça dépasse une boucle for, passer en script :)
  Dès que le nombre de commande s'allonge même qu'un peu pour 
  effectuer une tâche... la création de script semble être la meilleure méthode...

- Gérer les erreurs
- Loguer les erreurs (syslog, fichier log, etc...) ou autres message eventuel...
  logerror{}
- Affchier des messages aux utilisateurs (info,progression,erreurs...) 
  logmesssage{}
(Sur un modèle identique aux sorties standards stdout/stderr)
- Laisser à l'utilisateur la possibilité de rediriger les flux (data/messages)

- Ne pas partier des functionalités du script doit avoir techniquement c'est à dire les actions que le script doit entreprendre pour atteindre l'objectif... mais  plutôt partir d'un niveau plus haut, quelles sont les actions que l'utilisateur doit executer pour arriver à ses fins (actions et tests "proof of concept"...)

- Mode de penser orienté totalement utilisateur/partage...et donc libre... 
  et ne pas restreindre uniquement au technique (script->resultat, flexibilité et réutilisation)

Principle of Least Power:
- ...The choice of language is a common design choice. The low power end of the scale 
is typically simpler to design, implement and use, but the high power end of the scale has all 
the attraction of being an open-ended hook into which anything can be placed: a door to uses bounded 
only by the imagination of the programmer...
...the less powerful the language, the more you can do with the data stored in that language... XHTML 
is not to be a programming language because we wanted different programs to do different things with it: 
present it differently, extract tables of contents, index it, and so on...
    

2.2.8. Qu'est-ce une communauté du logiciel libre ?

Source(s):

Quelques idées en vrac pour un thème à explorer plus en détail plus tard...


• Comment puis-je "appartenir" ?
• Qu'est ce qui fait une communauté "forte" ?
• "Communauté d'Utilisateur" vs. "Communauté de Developper"?
• Comment les moyens de communication influe sur une communauté ?
   – IRC
   – Email
   – IM
   – Conferences (e.g., PyCon, ApacheCon)
   – Location (Silicon Valley, MIT, etc.)
• Comment une communauté maintient ses ressources ?
   – hebergement web, wikis, liste de distribution, hôte SVN, etc...
• Pourquoi certains projet ont une communauté large et d'autres très petite ?Voice and power

Qui prends les decisions ?
•    Les developpeurs principaux (Linus et son cercle restreint)
•    "Dur consensus and code de travail" (IETF)
•    Système de votation (e.g., Apache Software Foundation)
•    Pouvoir relatif d'individus vs. Entreprises (Zenoss, Zend, Zmanda)

Qui prends les risques legaux ?
Qui realise les representations contractuels ?
Ai-je une obligation vis à vis des Utilisateurs ?
"Si vous voulez cette fonctionalité, les patches sont bienvenues !"
• Est-ce une invitation ou une technique d'exclusion ?
• OK pour la documentation? Mais pour le code ?

Acces et Exclusion
• Connaissance 
   – Quel est la qualite de la documentation ?
   – Où les nouveaux arrivant trouve-t-il la connaissance institutionnel ?
   – Dois-je parler le "language"?
• Barrières explicites
   – Droits de commit
        • Tigris.org requiere une recommendation d'un autre commiter 
   – Copyright (e.g., FSF)
   – Tests et quizzes (Gentoo ebuild quiz)
• Attitude des developpers envers les nouveaux arrivants...
   – Est-ce que les developpeurs vont accepter mon patch ?
   – Est-ce que je vais trouver de l'aide si besoin ?
• Niveau de difficulté en entrée
   – Existe-t-il des tâches "facile" pour démontrer sa compétance ?

Construire une communauté de developpement :
Idées:
• Réduire les barrières du mieux possible
    – language plus accessible (Perl)
    – Documentation Developpeur (commentaires et article wiki)
    – Liste suggérés de tâches "faciles" (wiki)
• Attitude de bienvenue
    – Suggerer des opportunités pour que les utilisateurs contribut 
      (déplacement d'une communauté d'utilisateur à une communauté de développeur)
    – Fournir de l'aide à toute personne qui en aurait besoin pour développer un patch
• Se présenter lors de LUGs, BUGs, conferences, etc.
   

2.2.9. FLOSS et brevets logiciels

http://fosspatents.blogspot.com/2010/05/will-defensive-patent-license-be-able.html http://fosspatents.blogspot.com/2010/05/dpl-and-fair-troll-business-model-make.html


Chapitre 3. École Ouverte Francophone (ÉOF)

Source(s):

L’École Ouverte Francophone est un projet porté par une association à but non lucratif. L’Éof propose des programmes de formation sur les logiciels libres animés à distance.

Les formations s’adressent :

- à toute personne souhaitant mettre en oeuvre un projet de développement, ou de migration, basé sur les logiciels libres, et souhaitant pour cela, acquérir les compétences nécessaires.

- aux étudiants en informatique de niveau Bac + 2 à Bac + 4 souhaitant compléter leur formation initiale par une formation pratique.

- à toute personne intégrant un cursus de formation continue, ou en période de reconversion professionnelle.

Les acteurs:


Arnauld Mascret
Consultant en informatique sur les logiciels libres

Ganaël Laplanche
Ingénieur en informatique

Jean Philippe Gaulier
Ingénieur sécurité et réseau

Julien Fredon
Chef de projet et développeur

Ludovic Grossard
Maître de conférence

Nicolas Bareil
Administrateur réseaux

Sylvain Floury
Ingénieur informaticien

Sylvain Lhullier
Architecte logiciels libres


Chapitre 4. Formations Libres

4.1. Formation CP2L (8 mois) à l'École Ouverte Francophone (ÉOF)

4.1.1. Introduction

La formation CPLL (ou CP2L) est conçue pour répondre aux besoins des professionnels. Ce référentiel de 300 heures, est élaboré en collaboration avec des SSII et des entreprises.

Il est composé de trois grand modules :


- UI, Usage de l’Internet :
  (pré-requis pour accéder aux deux autres modules) 
  Aborder les notions de système et de techniques d’édition.

- SR, Système/Réseau :
  Aborder les concepts et les architectures de services.

- SI, Système d’Information
  Aborder les techniques de développement et d’intégration d’applications.
     

La formation s’adresse à des techniciens, ingénieurs ayant déjà des connaissances en informatique.

Le cursus peut être suivi dans sa totalité (UI/SR/SI) ou partiellement (UI uniquement ou UI/SR - UI/SI).


4.1.2. Module et planing

J'ai choisi de suivre l'ensemble des modules suivant sur 8 mois... de Novembre 2009 à Juin 2010 :


Module Usage de l’Internet (UI)

Ce module est un pré-requis pour les deux autres modules.

 UI003 - Environnement de travail. Installer et configurer 
         son premier environnement et se familiariser avec les outils de communication. 
 UI004 - Réaliser des documents avec LaTeX. Structurer, composer et 
         mettre en forme des documents scientifiques sous LaTeX 
 UI005 - Publier des documents techniques avec DocBook. Concevoir 
         et publier des documents en xml avec la DTD 
         (Document Type Definition) DocBook 
 SR002 - Utiliser les commandes de bases de GNU/Linux. Comprendre 
         la philosophie GNU, installer GNU/Linux, connaître et utiliser 
         les différentes commandes de base de GNU/Linux dans un shell. 
 SR003 - Administrer GNU/Linux. Comprendre le rôle de l’administrateur 
         système et être capable de gérer les utilisateurs, de surveiller 
         et paramétrer le système. 
 SR009 - Interfacer Apache avec un langage de script et un serveur de base 
         de données. Mettre en oeuvre une solution de type LAMP (GNU/Linux + 
         Apache + MySQL + PHP) ou LAPP avec PostgreSQL.
    

Module Système et Réseau (SR)

 SR004 - Interconnecter un réseau TCP/IP.Maîtriser les aspects 
         fondamentaux de l’administration de systèmes GNU/Linux dans 
         un environnement TCP/IP. 
 SR005 - Administrer un serveur DNS. Comprendre la structure et le 
         fonctionnement du service de nommage, installer et configurer 
         un serveur DNS primaire et secondaire. 
 SR006 - Administrer un serveur de messagerie. Installer et administrer 
         un service de courrier électronique. 
 SR007 - Administrer un serveur HTTP. Installer et administrer le serveur 
         Web Apache. 
 SR010 - Sécuriser son système. Lister les principales règles de sécurité 
         que doit appliquer un administrateur et les enseigner aux utilisateurs. 
 SR011 - Déployer un routeur, un pare-feu et un serveur mandataire. Installer 
         et administrer une passerelle, un firewall et un proxy. 
 SR012 - Déployer un serveur de partage SAMBA.Utiliser GNU/Linux en tant que 
         serveur de fichiers et d’imprimantes. 
 SR013 - Déployer un annuaire LDAP. Comprendre les concepts et enjeux des annuaires,
         installer et administrer un serveur d’annuaire LDAP. 
 SR015 - Administrer un serveur CVS. Installer et administrer un environnement 
         de développement collaboratif. 
 SR016 - Déployer un extranet sécurisé. Installer et administrer des réseaux 
         privés virtuels (VPN). 
 SR018 - Le langage Perl appliqué à l’administration système. Obtenir une approche 
         du langage et apprendre à le manipuler pour la création de scripts 
         simples de traitement de données.
    

Module Système d’Information (SI)

 SI001 - Méthodologie de conception des sites Web et interfaces. 
         Recueillir les informations relatives à un projet, suivre une 
         démarche méthodologique et définir une interface. 
 SI002 - Initiation au langage HTML, XHTML et CSS. Principe de balisage, 
         structure d’un document et utilisation des balises courantes. 
 SI010 - Interfaces Web enrichies.Intégrer des comportements interactifs 
         dans une page WEB. 
 SI016 - Initiation au langage de script. Utiliser un langage de script 
         (php, python, perl). 
 SI017 - Systèmes de gestion de bases de données. Installer, configurer, 
         administrer et utiliser un serveur de bases de données. 
 SI019 - Utiliser et modifier un site collaboratif comme SPIP. Concevoir 
         un site collaboratif en s’appuyant sur les squelettes par défaut. 
 SI020 - Utilisation avancée d’un gestionnaire de contenu comme SPIP. Développer
         les modèles de page d’un site collaboratif. 
 SI022 - Définir et utiliser son propre langage de balises avec XML et ses 
         feuilles de styles XSL. Étendre le langage HTML avec son propre 
         langage de description. 
 SI023 - Initiation au langage Python. Utiliser le langage Python et installer 
         un serveur d’application Zope. 
 SI024 - Serveur d’application sous Zope. Installer, configurer et administrer 
         Zope. Développer et installer un module.
    

4.1.3. Déroulement de la formation

Source(s):

  • La formation se déroule complètement à distance.

  • Une fois votre inscription validée et confirmée, les premiers éléments vous permettant d’installer votre environnement de travail et votre première connexion sur la plateforme de formation vous sont communiqués.

  • Le parcours de chaque module sur lequel vous êtes inscrit est ensuite réalisé sous forme d’activités organisées en séquences.

  • Les activités sont conçues de façon à allier étude, travail pratique et permettre une validation de votre progression.

  • Pour chaque séquence et pour chaque activité, vous aurez sur votre planning, les objectifs pédagogiques, les conseils méthodologiques adaptés, les ressources à exploiter pour la réalisation des travaux, les modes et critères d’évaluation.

  • Des outils vous seront fournis pour établir la relation avec vos enseignants et tuteurs, ainsi que pour la réalisation de certains travaux.

  • Vous aurez en alternance des travaux à réaliser en autonomie, d’autres à réaliser en groupe.

  • Le volume de travail moyen est évalué entre 10h et 14h par semaine. Mis à part quelques cas particuliers, vous aurez la possibilité de vous organiser un peu comme vous le souhaitez.

  • Ce temps est une base moyenne sur laquelle se sont basés les enseignants pour construire leur progression.

  • Il est possible que dans certains cas vous passiez moins de temps si vous avez déjà des notions sur le domaine traité, ou plus de temps si vous rencontrez des difficultés.

  • L’objectif final est que vous obteniez les bases, sur les techniques abordées lors des séquences, sur les outils que vous utiliserez au cours de la formation et sur les facultés à développer un projet à plusieurs avec des ressources réparties.

  • L’ensemble du parcours peut sembler ambitieux, mais moyennant une présence et un travail régulier, il vous sera possible d’obtenir les éléments de références pour poursuivre dans de bonnes conditions, le projet que vous avez de vous approprier les technologies et l’esprit du libre.


4.1.4. La notation au sein de la Certification Professionnelle en Logiciel Libre

http://blog.eof.eu.org/index.php/2007/10/12/5-la-notation-au-sein-de-la-certification-professionnelle-en-logiciel-libre


La notation au sein de la Certification Professionnelle en Logiciel Libre
Par Jean-Philippe Gaulier, vendredi 12 octobre 2007 à 00:19 - General - #5 - rss

On nous demande souvent quels sont les critères de notation, comment est effectué le suivi des élèves.
Bref, les gens veulent pouvoir comparer nos critères avec des choses connues, 
comme ce que l'on peut connaître dans l'éducation nationale. Voici un petit compte rendu 
rapide de notre vision de la chose :

Vérification de l'assiduité

La formation CPLL se déroule entièrement à distance. 
L'assiduité est vérifiée à travers différents supports :

    * la plate-forme Amarante, qui archive les dates de connexion des utilisateurset 
      leurs différentes visites,
    * la tenue d'un journal de bord tout au long du cursus, avec l'explication du cours, 
      les exercices et leurs réponses, les réflexions de l'apprenant,
    * la présence sur la liste de discussion et les réponses aux mails
    * des réunions régulières sur IRC permettant de faire des tables rondes

Modalité de suivi

Le contrôle est effectué au travers du rendu régulier des exercices et de la tenue du journal.
La plate-forme de formation Amarante assure également le suivi au quotidien de l'avancée 
des étudiants de manière globale ainsi que de manière personnelle.

Modalité d'assistance et d'encadrement

Tout au long de leur cursus, les apprenants sont accompagnés par deux tuteurs qui assurent 
le suivi personnalisé des étudiants, la liaison avec les différents cours et professeurs et 
apportent une assistance sur les questions d'organisation, de recherche et durant les TP. 
Chaque professeur prend également connaissance des élèves et apporte une attention particulière.
La classe ne comportant pas plus de quinze élèves, cette attention peut être réelle et efficace.

Évaluation et validation de la formation

Il est demandé tout au long de la formation de tenir un journal relatant les activités de 
l'élève au sein de l'école. Ce journal porte sur les cours, les ateliers, les tp, les td ainsi 
que sur les contrôles. Il n'y a pas de notation de 0 à 20, mais des appréciations 
selon différents critères :

    * Le parcours du stagiaire d'un point de vu technique

* Effort considérable sur la réalisation du cours
* Effort moyen sur la réalisation du cours
* Aucun effort sur la réalisation du cours

    * Le comportement du stagiaire

* Le stagiaire est présent
* Le stagiaire répond quand on l'interpelle
* Le stagiaire est absent

    * Les questions formulées par les stagiaires sont-elles (plusieurs choix possibles)

* Bien formulées
* Pertinentes
* Précises

    * Le stagiaire fait remonter les problèmes qu'il rencontre

* Oui
* Maladroitement
* Non

    * Au niveau du libre, dans sa relation avec le groupe (partage, entraide,inventif, présent, réactif, ...),
      le stagiaire est :

* Dans les bonnes grâces de RMS
* En cours de libération de code
* Point Godwin

Ce tableau est rempli pour chaque cours par chaque professeur, pour chaque élève. Il est également
rempli par les accompagnateurs généraux. C'est la moyenne globale qui définit au final si l'élève 
reçoit ou non sa certification.

Ainsi, les critères d'évaluation ne sont pas uniquement technique, mais aussi relationnel, comportemental 
et évaluent l'aptitude au travail à distance.
  

4.2. KeepIn (SARL)

4.2.1. A propos

La SARL Keepin est l'entreprise des fondateurs (JP et Alix) de l'École Ouverte Francophone.

Elle fournit divers services liées aux logiciels libres.


4.2.3. Formations Libres (cursus courts 3 semaines)

Source(s):

Formation Libre : "En trois semaine je suis formé à ce qui m'interresse !"

Formation libre est une nouvelle activité de la SARL Keepin. Cette activité répond au besoin de pouvoir suivre des formations professionelles sur les logiciels libres. Ces formations sont conçues pour se dérouler complètement à distance afin d'éviter les déplacements, limiter les coûts et désorganiser le moins possible l'activité professionnelle.

Le développement de cette activité fait suite à plusieurs années d'expériences dans les domaines de la formation à distance et de celui des logiciels libres de la part des fondateurs de l'École Ouverte Francophone, notamment au travers de leur projet de certification professionnelle sur les logiciels libres.

Le cursus de l'Éof dure 8 mois. En élaborant des cursus courts (3 semaines), la SARL Keepin entend proposer des schémas de formations ciblés et adaptés à des problématiques précises rencontrées dans les entreprises.


4.2.4. Service Liste de discussion (Garder le contact avec ses proches !)

Service de liste de diffusion : Des personnes sont abonnées à une liste. Par exemple les membres de votre famille. Pour échanger des courriels vous n'avez plus qu'une seule adresse à retenir, celle de la liste. Chaque abonné (chaque membre de votre famille) peut envoyer un courriel sur la liste et chacun des membres recevra une copie du message.


4.2.5. Cours en Ligne du MIT

Le MIT met à disposition gratuitement ses cours en ligne dans plusieurs domaines (avec des vidéos) et notamment en informatique.

Il y a même tout un cours consacré au language de programmation Python.


Chapitre 5. Outils de commnication (Courriel + Liste de distribution + Jabber + IRC + Journal)

5.1. Méthode de Communication

Un petit point sur la manière de communiquer : les coordinateurs travaillent, ce qui limite leur disponibilités. Il faut donc privilégier le mail car il permet une discussion asynchrone.

Tout le monde fait de son mieux pour être le plus réactif possible; une réponse est souvent reçu avant la fin de la journée dans la plupart des cas ou le lendemain...

Tous les élèves sont invités à écrire à la liste de distribution correspondant à la partie du cours étudié plutôt qu' au coordinateur directement par courriel. Ceci afin que chacun puisse profiter des questions et des réponses...


5.1.2. Courriel (E-mail)

Source(s):


----------------
Email clients
- Claws Mail 3.7.3
- Thunderbird
- KMail/1.9.10
- YahooMailClassic
- Zimbra 5.0
- IMP
- Gmail
- SquirrelMail

Règle simple: http://docs.soolbox.net/wiki/Mail

Eviter le "top posting":
http://jargonf.org/wiki/top_posting

préférer le "bottom posting":
http://jargonf.org/wiki/bottom_posting

Avertissement

Il peut nous arriver d'envoyer un message trop vite, ou pas fini d'écrire ou contenant des informations en clair qu'on aurait du chiffrer !!!

Outlook offre la possibilité de "récupérer" mon message dans la mesure ou il n'avait pas été encore ouvert par le destinataire (et ça m'a évité souvent bien des problèmes !) mais c'est une spécificité liée au serveur exchange où tout est géré par le serveur central (les envois, les arrivées, le stockage). C'est uniquement cela qui te permet de jouer avec la messagerie de son voisin (tiens, à chercher, il y aurait sûrement des choses drôles à faire ;)). Ça peut sembler être une fonctionnalité, mais elle n'est pas disponible sous d'autre client de courriel.

En effet, il peut arriver de faire des bêtises quand on envoi un courriel, mais il faut bien assimiler le courrier électronique au courrier papier. Une fois que tu l'as mis dans la boîte aux lettres de la poste, alea jacta est.

Tu fais des bêtises ? Prend plus de temps pour écrire ou relire avant d'envoyer ;)


5.1.3. Liste de distribution

... en cours de construction ...


5.1.4. Chat (Jabber/XMPP ou IRC)


http://jp.gaulier.info/blog/index.php?post/2005/04/14/78
http://bouh.soolbox.com/index.php?post/2006/04/26/606-utilisez-jabber

Client Jabber:
Donc, à vos clients Jabber pour ajouter tous ces contacts, si ce n'est déjà fait.
Pour les autres, la création d'un compte GMail prend 2 secondes :-)

Sinon, si vous êtes sous Pidgin, voici le paramétrage (merci jb) :

protocole : XMPP
utilisateur : ton compte gmail
Domaine : gmail.com

Avancé
SSL/TLS : à cocher
Port de connexion 5222
serveur : talk.google.com
proxy : proxy.eu.jabber.org

A bientôt sous Jabber

Creer un salon jabber persistant avec mot de passe... enfin je crois :|
server: eofsalon@chat.jabberfr.org
mdp: utfg! 

http://chat.jabberfr.org #Liste les salons disponibles sur ce server...

Salon temporaire mis en place par Jimmy
Serveur : 	jabber.athaliasoft.fr
Canal : 	eof2009

---------------------------------------------
IRC communication
Source info: http://fr.wikipedia.org/wiki/Aide:IRC

Serveur :   irc.enix.org [193.19.210.1]
Port : 6667
Channel : #eof

Il y a 3 commandes à connaître pour démarrer et faire ce qu'on veut :
/server server_name_or_IP   pour rejoindre un serveur
/join #eof   pour rejoindre le canal eof
/nick   newalias pour changer votre pseudo
/quit   pour retrouner au bistrot.

Côté client :
- xchat, mais vous êtes libres, c'était juste pour donner
- irssi (terminal ui)
- emacs, ça doit passer aussi :-)
- pidgin 

Tuto pour se connecter en IRC : 
http://www.memepasmal.ch/index.php/2008/09/08/utiliser-irc-avec-pidgin
http://stfu.blogs.ablenet.org/100/how_to_connect_to_irc_with_pidgin_gaim

5.1.5. Les journaux de bord

Les journaux des apprenants, sont réalisés en DocBOOK ou en LaTeX. Ils retracent leurs activités et leurs travaux. Des archives d’anciennes sessions sont conservées pour consultations.

Tous les journaux d'activité des apprenants sur les sessions CPLL de l'Éof peuvent être consulté ici.


Session 2009-2010
   1. akh
   2. http://ferry.eof.eu.org/~bbr (Benoît BÉRENGER)
   3. http://ferry.eof.eu.org/~ccn (Christelle COPIN)
   4. http://ferry.eof.eu.org/~cpn (Christiane Paulin)
   5. http://ferry.eof.eu.org/~yoi (Ykhlef OUABI)
   6. http://ferry.eof.eu.org/~jar (Julien Aulagnier)
   7. http://ferry.eof.eu.org/~jbm (Not operationel ?)
   8. http://ferry.eof.eu.org/~jyg (JY GODARD)
   9. http://ferry.eof.eu.org/~jrf (Jimmy Rudolf)
  10. http://ferry.eof.eu.org/~krd (Not operationel ?)
  11. http://ferry.eof.eu.org/~kse (Not operationel ?)
  12. http://ferry.eof.eu.org/~pyt (Pierre-Yves TAILLARD)
  13. http://ferry.eof.eu.org/~rlr (mine :)
  14. http://ferry.eof.eu.org/~yoi (Ykhlef OUABI)
 
Paramètre de connection:
Server: ferry.eof.eu.org
Username: rlr

SSH: ssh rlr@ferry.eof.eu.org 
(voir configuration dans la partie SSH du journal)

RSYNC: rsync -av /mnt/hsubuntu/monjournal/* rlr@ferry.eof.eu.org:public_html 
(voir configuration dans la partie RSYNC du journal)

Repertoire local: /mnt/hsubuntu/monjournal
Repertoire distant: ~/public_html

5.2. Méthode de Travail

Source(s):


5.2.1. Bref résumé !

Lorsqu'un problème est rencontré :


1. Identifiez clairement le problème
2. Cherchez par soi-même
3. Utilisez les ressources en ligne (Upstream et Web)
4. Poser la bonne question
5. Aidez les autres 
    


5.2.2. Identifier le problème

Avant de chercher une solution à un problème, il faut identifier de manière précise la nature de ce problème. Ce qui peut paraître une évidence semble ne pas aller de soit pour tout le monde.

Un problème bien posé est à moitié résolu. Préciser la marque et le modèle d'un matériel, marque et version de logiciel et/ou système d'exploitation... Identifier un message d'erreur précis dans les logs... etc...

Cette approche a trois intérêts majeurs :

Elle aide à trouver une solution tout(e) seul(e). Des élèves à qui l'on demande d'exprimer clairement leur problème finissent par trouver eux-mêmes.

Elle permettra d'avoir des éléments pour les recherches sur des sites ou les forums. En dernier ressort, elle permettra de poster, le cas échéant, sur liste de distribution (ou forums) adapté et, si les interlocuteurs comprennent le problème, ils aideront plus volontiers et plus rapidement à trouver la solution.


5.2.3. Chercher la solution par soi-même avant de demander de l'aide

Tout le monde connaît le proverbe "Aide toi, le ciel t'aidera". Cette maxime trouve tout son sens ici. Avant de crier à l'aide, il vaut mieux commencer par chercher un peu. Cela permet souvent de trouver plus vite la solution et au pire, cela permettra d'éliminer les mauvaises pistes.

Ceci pour s'éviter les usuelles expressions favorites :


- RTFM  : Read The Fuck***ing Manual - http://www.readthefuckingmanual.com)
- UTFG  : Use The F*cking Google - http://www.utfg.net)
          "Don’t ask dumb questions. Google knows everything !" 
- PBKAC : Problem Between Keyboard And Chair
- ...
## et autres
-Laisse-moi chercher ça dans Google pour toi (Let me google that for you) 
    

Note

Si l'on ne trouve pas dès la première fois, ne pas laisser tomber, attendre un peu (quelques heure, 1 jour, etc...) puis faire une seconde recherche... c'est d'usage car parfois on ne cherche pas de la même façon la seconde fois et l'on trouve souvent ce que l'on cherche après une seconde recherche... donc éviter de demander de l'aide trop vite... !!!

Grâce à la première étape (identifier le problème), on sait où chercher : L'aide en ligne du logiciel/materiel ainsi que les ressources web pour des tutorials, de la formation ou du conseil... sont des atoût à ne pas sous-estimer...

Comme on pourrait dire : "La touche F1 est la meilleure amie de l'utilisateur" mais beaucoup ne savent pas utiliser l'aide.

A partir de l'énoncé de votre problème, déduir quelques mots-clés pour la recherche.


5.2.4. Les ressources des sites (upstream)

Quelque soit le problème, d'autres l'ont certainement rencontré, le rencontrent ou vont le rencontrer.

Il a donc certainement déjà été abordé quelque part.

Pour un programme, consulter le site du programme lui même (http://www.samba.org pour Samba par exemple)...

Sur la page d'accueil des site, vous trouverez les liens vers la documentation, les tutorials (howtos), forum et autre (wiki, etc...)

On peut penser aussi à consulter les comparatifs ou revu d'utilisateur si on cherche simplement un conseil sur un sujet précis. Par example resultat des tests effectués par les un groupe passionné (Phoronix) ainsi que les débats/conférences sur divers sujets.

Si votre question est du type "Comment fait-on ceci avec tel ou tel langage ?", consultez la FAQ du langage en question. Elles sont très complètes et bien documentées. Elles sont accessibles à partir de la page d'accueil ou à partir de l'onglet correspondant au langage. En fonction des langages, vous pouvez également trouver des codes sources.


5.2.5. Faire une recherche sur Internet

Si par le plus grand des hasards, vous n'avez pas trouvé votre bonheur, vous pouvez encore faire une recherche à l'aide des mots-clés identifiés lors de la première étape.

Le moteur de recherche est ton ami. Apprendre à bien s'en servir permet de rapidement trouver ce que l'on cherche. Ne pas hésiter à réduire les résultat de recherche à l'aide des option (mots clefs) de recherche (ET, OU, etc...)

Chercher sur des site de tutorials, articles ou sur des forums...


5.2.6. Poster une question

Si vraiment vous n'avez rien trouvé, il ne vous reste plus qu'à poster votre question sur une liste de distribution ou un forum adapté.

Comment bien s'y prendre :

Choisir le bon forum : Si vous avez suivi les étapes précédentes, cela devrait-être simple. Problème de syntaxe=forum du langage, question générale=forum général (choix de langage, SGBD, modélisation etc..)

Titrer la question : Résumez INTELLIGEMMENT l'énoncé du problème dans le titre du message ! Les messages du type "SVP, au secours, [débutant]etc..." ne servent à rien, la plupart du temps, ils ne sont mêmes pas lus. Evitez également les titres vagues du style "Problème de requête" dans le forum SQL. On se doute que ce n'est pas un problème de C++ (où alors vous postez n'importe où et vous devriez relire les règles du forum) et cela ne donne pas plus envie de lire ni de répondre.

La question : Evitez absolument le style SMS. C'est insupportable à lire et cela n'aide pas (loin de là) à la compréhension. L'abus d'émoticons ne facilite pas non plus la lisibilité. Enfin, utilisez les balises pour rendre vos exemples de codes lisibles. Pensez à indiquer les pistes que vous avez explorées, ce que vous avez fait, ce que vous n'avez pas fait. Ce sont autant d'éléments de recherches pour ceux qui vous répondront et cela évitera des solutions que vous avez déjà testées sans succès.

Le ton : Souvenez-vous de règles simple: soyez polis, évitez d'employer l'impératif, les polices à gros caractères, les couleurs agressives etc...


5.2.7. Problème résolu

Quand le problème est résolu, pensez à l'indiquer. Cela évitera aux autres de continuer à chercher et cela permettra à quelqu'un ayant le même problème de gagner du temps dans ses recherches.

Si le coeur vous en dit (et si le temps vous le permet), créer un mini howto (solution plus détaillée) et publier le sur Internet (forum, blog, etc...)

Si vous abandonnez un sujet, vous pouvez également l'indiquer aux interlocuteurs déjà contactés...


Chapitre 6. UI003 Environnement de travail - Installation d'une distribution

6.1. Distributions Linux: Laquelle choisir ?

6.1.1. Qu'est-ce qu'une distribution, Combien en existe-t-il ?

 

... Un coup d’oeil surDistrowatch (www.distrowatch.com), et c’est la nausée face à l’abondance des nouveautés. De nouvelles distributions avec de nouvelles versions du noyau, du système de base, des environnements de bureau et des applications surgissent toutes les semaines, les unes plus révolutionnaires que les autres. À peine a-t-on fini de lire la documentation de l’une d’elles qu’elle est déjà obsolète, car la mise à jour de l’autre nous tape à l’oeil.

...une distribution GNU/Linux est constituée d’un certain nombre de composants : le noyau, les bibliothèques et autres composants du système de base, le serveur graphique, l’environnement de bureau, la panoplie des applications, et d’autres choses encore. Chacun de ces composants est développé individuellement par une équipe de développeurs. L’équipe de développeurs du noyau par exemple, chapeautée par Linus Torvalds, s’occupe essentiellement du kernel Linux, dont elle publie régulièrement une nouvelle version sur kernel.org. La fondation X.Org (http://www.x.org) travaille sur tous les composants du serveur graphique. L’équipe de développeurs GNOME (gnome.org) se concentre sur l’environnement de bureau GNOME, et les équipes de kde.org ou xfce.org, sur les environnements respectifs KDE et XFCE. Il en va de même pour les applications. La fondation Mozilla gère le développement de logiciels comme Firefox, Thunderbird, Sunbird et autres. Les développeurs d’OpenOffice.org font de leur mieux pour maintenir la suite bureautique Open Office, comme nous l’avons vu. Etc.

Le travail du distributeur consiste maintenant à créer un système cohérent avec tous ces ingrédients. Chacun des distributeurs comme Red Hat, Fedora, Debian, Ubuntu, Slackware, Arch, Gentoo, SuSE, Mandriva, etc. devra donc opérer une série de choix :


quels composants seront inclus dans la distribution ?
quelle version de chacun des composants faudra-t-il choisir ?
     

Ces critères nous permettent de distinguer grossièrement deux tendances, deux extrémités d’une échelle graduée :


- les distributions plus ou moins conservatrices: , 
  qui n’incluent aucun composant sans que celui-ci ne 
  soit dûment testé pendant une période définie ;

- les distributions bleeding edge :
  qui incluent tout nouveau composant fraîchement publié 
  dans la distribution, en considérant que la simple publication 
  de l’application (ou de la bibliothèque, ou de l’environnement 
  bureautique, etc.) constitue déjà une garantie de stabilité 
  suffisante de la part des développeurs.
    
...

Red Hat Enterprise Linux suit en gros un cycle de dix-huit mois entre chaque version, composé de douze mois de développement et de six mois de tests. La même chose vaut pour CentOS, qui nage en quelque sorte dans son sillage.

La distribution Fedora, en revanche, publie une nouvelle version à peu près tous les six mois. Chaque nouvelle version est constituée des paquetages les plus récents.

La branche « stable » de Debian publie une nouvelle version tous les deux ans, en moyenne. Pour chaque version, l’équipe des développeurs procède à un gel (freeze) des versions avant une période de tests intenses. Debian est célèbre pour publier une nouvelle version when it’s ready (« lorsque c’est prêt »), c’est-à-dire lorsque les principaux bogues ont été corrigés. Il en résulte une distribution stable et fiable.

La branche « instable » de Debian (unstable, qui signifie ici « susceptible d’être soumis à des modifications de version » - à ne pas confondre avec « qui plantera tout le temps », donc) inclut les dernières versions disponibles de tous les composants.

Des distributions comme Arch ou Gentoo pratiquent le rolling release, c’est-à-dire la mise-à-jour perpétuelle. Peu importe quelle version vous installez, puisque le bon usage de la distribution préconise que vous fassiez des mises à jour régulières. C’est un peu comme un train qui ne s’arrête jamais, et qu’il faut prendre en marche.

 
-- Linux aux petits oignons - Chapitre 8 - Section 04  

Dans le cadre de la formation CP2L, le choix est portée sur Débian et Ubuntu.


6.1.2. Distribution et liberté : Combien de logiciel non-libre caché dans votre distribution GNU/Linux ?

Source(s):

 

...developing Free Software isn't enough to establish freedom for the users of GNU/Linux. We also need to educate them to value their freedom, and to recognize and reject non-Free Software. Otherwise, the products that require users to give up their freedom would continue to find willing customers...

Traduction libre : ...dévolopper des logicils libres n'est pas suffisant pour établir (ou garantir) la liberté des utilisateur de GNU/Linux. Nous devons aussi les éduquer à la valeur de leur liberté, and à reconnaître et rejeter les logiciels non-libres. Sinon, les produits qui requiert aux utilisateurs d'abandonner leur liberté vont continuer à trouver des consomateurs "consentants...

 
-- http://www.fsfla.org  

Il est donc recommandé :

- d'utiliser GNU/Linux-libre une version totalement libre du noyau GNU/Linux (ce qui n'est pas le cas du noyau officiel pour raison de compatibilité et flexibilité) ou tout autre noyau 100% libre tel que GNU/Hurd (basé sur une architecture Mach),

- de s'orienter vers des distributions totalement libre tel que gNewSense et autres consoeurs,

- de s'orienter vers du matériel libre (firmware libre, drivers libre, etc...) tel que OpenPC ou autres fournisseurs...

Note

La notion de matériel libre est en plaine essort et tente de se définir d'une façon similaire au logiciel libre tout en répondant aux particularités de ce domaine.


6.1.3. vrms (Virtual Richard M. Stallman) : Recherche de paquets non-free

Source(s):

Ce programme analyse la liste des paquets installés (disponible dans /var/lib/dpkg/status) à la recherche de paquets non-free. S'il en trouve, il les listera sur la sortie standard avec une courte explication de la raison pour laquelle le logiciel est considéré comme non libre. vrms dispose en local d'une liste de logiciels non libres et de l'explication associé dans le fichier /usr/share/vrms/reasons/vrms.

Si aucun paquet non-free n'est trouvé sur le système, vrms affichera la phrase « No non-free packages installed on ${hostname}! rms would be proud » (« Pas de paquets non libres installés sur $hostname! rms serait fier »).


$ apt-get install vrms
$ vrms
               Non-free packages installed on macfil

opera                     The Opera Web Browser
skype                     Skype
sun-java6-bin             Sun Java(TM) Runtime Environment (JRE) 6 (architecture
sun-java6-jre             Sun Java(TM) Runtime Environment (JRE) 6 (architecture
sun-java6-plugin          The Java(TM) Plug-in, Java SE 6
teamviewer5               Remote Control Application TeamViewer
unrar                     Unarchiver for .rar files (non-free version)
virtualbox-3.1            Sun VirtualBox

   Non-free packages with status other than installed on macfil

virtualbox-3.0            ( dei)  Sun VirtualBox

               Contrib packages installed on macfil

b43-fwcutter              Utility for extracting Broadcom 43xx firmware
flashplugin-installer     Adobe Flash Player plugin installer
nvidia-common             Find obsolete NVIDIA drivers
ttf-mscorefonts-installer Installer for Microsoft TrueType core fonts

  9 non-free packages, 0.5% of 1881 installed packages.
  4 contrib packages, 0.2% of 1881 installed packages.
   

6.1.4. Comment configurer Ubuntu Linux pour moins de 200$ ?

Source(s):

Est-ce que votre famille a besoin d'un extra PC ? Educateur, Mac expert and Linux enthousiast Phil Shapiro explique dans sa vidéo YouTube comment pour moins de 200$ (moins que certain système d'exploitation), vous pouvez configurer un ordinateur utile sans virus avec un ecran LCD 23 pouces (150$ en occasion) et un adaptateur Wi-Fi (15$). Projet facile executable en moins d'une heure :)

Si vous avez besoin d'aide pour configurer un ordinateur Ubuntu Linux, rechercher un Groupe d'utilisateurs Linux (GUL ou LUG) locale. Les volontaires GUL seront content de vous guider et de vous aviser. Le site Forums Ubuntu est un autre endroit où les utilisateur peuvent trouver des informations et des conseils. Vous pouvez aussi consulter des guide d'installation : Simple comme Ubuntu, Ubuntu Linux Easy Installation Guide.


6.2. Dual Boot Mac OS X 10.6 / Ubuntu 9.10 Karmic on MacBook Pro 5,5

Cette partie décrit l'installation d'une distribution GNU/Linux Ubuntu 9.10 Karmic Koala 64bits sur un tout nouveau modèle (Nov 2009) d'ordinateur Apple, le MacBook Pro 5,5.


6.2.1. Indentifier Modèle (Matériel) et Versions (Système d'Exploitation) du matériel Apple

La première chose à faire avant de procéder à une telle installation c'est d'identifier clairement les spécifications techniques du matériel et du système existant.

Une fois connecté sur le MacBook, aller dans le menu [Pomme] (en haut à gauche) > About this Mac.


OS X Version 10.6 (Leopard)
2.25 GHz Itel Core2Duo // 2GB 1067MHz DDR3 RAM
   

Cliquer sur le bouton More Info :


Modele Indentifier     MacBookPro 5,5       
   


6.2.2. Installation de Base

Source(s):

Avertissement

!!!Attention!!! BACKUP YOUR DATA !!!

Time Machine peut-être utile pour cela...

Dans mon cas je n'ai pas de données donc aucun risque :)


6.2.2.1. Installer rEFIt (Menu de boot)

Source(s):

Avertissement

Assurez vous qu'il fonctionne avant de continuer ! Le menu de boot doit apparaître au démarrage.

... En construction [notes papier à retrancscrire pour ce début] ...


6.2.2.2. Raccourcis clavier Ubuntu

 
2.bb 10 raccourcis Ubuntu que vous ne connaissez peut-etre pas !

1. Switch to the next/previous workspace

If you make use of the workspace very frequently, you can easily switch between different 
workspaces by pressing Ctrl + Alt + Left/Right Arrow. The Left key brings you to the previous 
workspace while the Right key brings you to the next adjacent. If you have enabled Compiz, 
you can even get it to show all the workspace by pressing Super + E on the keyboard.
2. Move the current window to another workspace

By pressing Shift+ Ctrl + Alt + Left/Right Arrow, you can easily move your current window to 
another workspace in the specified direction. This keyboard shortcut works very well with 
the one mentioned above. If you have the habit of opening many applications/windows when doing 
your work, but don’t like to see your desktop and menubar cluttered with all the application windows, 
you can use this shortcut key to move your applications to another workspace and get your desktop
 organized.
3. Show the desktop

Ctrl + Alt + D enables you to quickly minimize all windows and give focus to the desktop. 
When all windows are minimized, this shortcut can also maximize all the windows to their previous 
state.
4. Keyboard shortcut for the mouse right-click

In most applications, you can always right-click on the mouse to access the options menu. 
On the keyboard, you can simply press Shift + F10 to achieve this ‘right-click‘ effect
5. Restart session and recover from crashes

There are very few instances where Ubuntu will crash totally. But if it does, you can press 
Ctrl + Alt + Backspace to restart the session, and 90% of the time, it will recover from the crashes.
6. Lock the screen quickly

If you need to leave your workstation for a while, you can quickly lock up your screen by pressing 
Ctrl + Alt + L and prevent unauthorized access by others.
7. Switch between windows in the reverse direction

Alt + Tab is a common shortcut key that allow you to switch between open windows. 
But do you know that by including the ‘Shift‘ button, you can reverse the windows switching 
direction? This is useful when you press Alt + Tab too fast and passed the window that you 
want to switch to. Simply press down the ‘Shift‘ button to go back to the previous window in 
the switch cycle.
8. Move windows with arrow keys

Press Alt+F7 to activate the Move window function and use any arrows key (up, down, left, right) 
to move the window around the screen.
9. Show hidden files

Most of the time, you won’t need to view the hidden files in your home folder, but in the event 
that you need to, you can press Ctrl + H inside the Nautilus (the file manager for Ubuntu) to show 
all hidden files.
10. Show file properties without right-clicking the mouse

The conventional way to view a file/folder properties is to right-click the mouse and select 
‘Properties‘. Now you can just press Alt + Enter to get the Properties window to appear.

Of course, this is only the tip of the iceberg. If you want more shortcuts and not only for Ubuntu 
but also for Gmail, Google Search, Firefox and other programs then go straight to our Cheat Sheets 
Page. There are 9 PDF cheat sheets there for you to download.

6.2.3. Installation du pilote de carte réseau sans-fil (pour BCM4322 802.11a/b/g/n Wireless LAN Controller)

Le pilote Broadcom's IEEE 802.11a/b/g/n hybrid Linux (version 5.60.48.36) est disponible à Wireless 802.11 Linux STA driver en version 32bits (source originale) et 64bits (source originale).

L'installation normal du pilote Broadcom (wl0 version 5.10.91.9) avec le paquet fournit par défaut dans Ubuntu (procédure indiqué ci-avant) quoique simple et fonctionnelle, ne permet pas une utilisation normal des connections via Wifi. La connection est souvent difficile à établir avec certains point d'accès Wifi (time out) et parfois des déconnection peuvent survenir.

Les instructions ci-dessous permettent de compiler et d'installer une version récente du pilote Broadcom 64bits.

Cette méthode semble avoir été tester plusieur fois sur des MacBook Pro with Broadcom 4328 et je confirme que cela marche avec le Broadcom B4322.

Important

Ces opérations devront être réalisées au moins une fois sous chacun des noyaux GNU/Linux que l'on souhaite utiliser...

Les instructions suivantes sont tirées du fichier README.txt (source originale) et de cette page de forum :


## VERIFIER LE COMPATIBILITE

# A exécuter en tant que root
$ lspci -n | grep 14e4      // Vérifier que le modèle de carte est compatible avec le pilote
                            // Pour plus de détail consulter la section suivante 
                            // Information Matériel
   

## COMPILER LE PILOTE DEPUIS LE SOURCE

# Installer les paquets et outils nécessaire
$ apt-get install build-essential linux-headers-generic
$ apt-get build-dep linux

# Vérifier l'existance du repertoire suivant :
$ ls /lib/modules/`uname -r`/build

$ cd /tmp
$ wget http://www.broadcom.com/docs/linux_sta/hybrid-portsrc-x86_64-v5.60.48.36.tar.gz    # 64bits version of the pilote
$ mkdir hybrid_wl
$ cd hybrid_wl
$ tar xzf ../hybrid-portsrc-x86_64.tar.gz
$ make clean
$ make

# Assurer que la compilation se termine sans erreur
# La licence manquante est une erreur acceptable pour la suite :)

# Le resultat de compilation est un fichier 
# wl.ko (module noyau)
   

## FAIRE LE NETOYAGE AVANT D'INSTALLER LE PILOTE

# Enlever tous les autres pilotes pour les cartes réseau sans-fil Broadcom
# Plusieurs pilote existe pour les puces Broadcom 802.11 tel que b43 et ssb.
# Pour éviter tout conflit avec ces pilotes, il doivent être préalablement 
# entièrement désinstallés, ainsi que toute révision précédente du pilote wl

# Vérifier ceux qui sont installés
$ lsmod | grep "b43\|ssb\|wl"

# Enlever ceux qui sont installés
$ rmmod b43
$ rmmod ssb
$ rmmod wl

# Nous devons mettre sur liste noire les modules des pilotes que l'on ne va jamais utiliser pour s'assurer 
# qu'il ne seraient pas chargés automatiquement par le système dans le futur :
$ echo "# Replaced b43 and ssb by wl manally compiled by RL" >> /etc/modprobe.d/blacklist.conf  # Ajout d'une ligne de commentaire
$ echo "blacklist ssb" >> /etc/modprobe.d/blacklist.conf
$ echo "blacklist b43" >> /etc/modprobe.d/blacklist.conf

# Si un module wl.ko existe déjà d'une installation précédente il faut l'enlever (mise à jour !)
$ rmmod wl      # dissocier le module du noyau, normalement c'est déjà fait prédédement mais on s'en assure
$ mv /lib/modules/`uname -r`/kernel/net/wireless/wl.ko /lib/modules/`uname -r`/kernel/net/wireless/wl.ko.orig
   

## INSTALLER LE PILOTE NOUVELEMENT COMPILER

# On met en place le module noyau que l'on vient de compiler
$ cp /tmp/hybrid_wl/wl.ko /lib/modules/`uname -r`/kernel/net/wireless/wl.ko

# Puis on l'active dans le noyau
$ depmod        # Mise à jour de dépendance
$ modprobe wl   # Charger le nouveau module dans le noyau

==> La carte réseau Wi-fi apparaît dans le Network-Manager, et s'auto connecte sur point d'accès public disponible.
==> Il m'est enfin possible de me connecter à mon réseau wi-fi personnel !

   

## ACTIVATION AUTOMATIQUE AU DÉMARRAGE DU SYSTÈME

# Note: 
# Sur certains système tel que Ubuntu 9.10, le module ssb va se charger durant le démarrage (inclut dans initrd)
# même si il est mis sur la liste noire. 
# Comme il doit de toute facon être supprimé, on doit donc procéder de la facon suivante:

# Modifier le fichier /etc/rc.local pour inclure juste avant "exit(0)":
rmmod ssb || true    # Au démarrage, enlève le module "ssb"
modprobe wl || true  # charge le module "wl"

# Le module ssb doit être enlevé avant d'ajouter le module wl sinon cela ne fonctionnera pas
# En modifiant le fichier /etc/rc.local on s'assure que tous se passe dans le bon ordre.

# Note: 
# Le shabang du script rc.local existant par défaut est : #!/bin/sh -e
# L'option -e signifie que le script va arrêter de s'exécuter à la première commande qui retourne une erreur
# En ajoutant la || true après chacune des commandes on assure que toute erreur est ignorée explicitement
# et que le script peut continuer à s'exécuter.
# Sans cela, comme la commande "rmmod ssb" retourne une erreur due à l'absence du module (la plupart du temps), 
# le script s'arrêterait et la commande "modprobe wl" ne serait jamais exécuté, et donc 
# le module pas chargé et donc la carte réseau Wi-fi inaccessible :)

# Optionellement:
# Les commandes rmmod et modprobe accepte les options suivantes qui peuvent être eventuellement rajouter pour faciliter le debugage :
# -v : verbose
# -s : log les erreurs dans /var/log/syslog via syslog système
   

Note

Voici un exemple complet de mon script /etc/rc.local fonctionnel pouvant aider à débugger :


#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

logfile="/tmp/rc.local.log"
/bin/sleep 10
/bin/echo 'rc.local started' > $logfile
/bin/echo `date` >> $logfile
/sbin/rmmod -vs ssb || true
/sbin/modprobe -vs wl || true
/bin/echo 'rc.local ended normally' >> $logfile
exit 0
  

Le fichier de log /tmp/rc.local.log permet de s'assurer que le script a bien démarré et qu'il s'exécute jusqu'au bout :)

Le mieux est de toujours lancer le script manuellement pour le tester, s'il se comporte comme souhaiter, redémarrer le système et vérifier qu'il est bien pris en compte... :


$ sudo -i     # Passage en console root
# cd /etc
# ./rc.local  # Executer le script manuellement
              # La carte Wi-fi est maintenant disponible dans le Network Manager

# cat /tmp/rc.local.log   # Vérifier la bonne exécution du script
# tail /var/log/syslog    # Vérifier toute erreur retournée par rmmod ou modprobe
  

Note

Dans l'esprit du libre, j'ai posté mes retours d'experience sur les forums Ubuntu (ici[EN] et là[FR]) pour que cela puisse servir à d'autres...

Une autre solution potentielle de dernier recours est de coder un hack en dure comme suggéré dans le post numéro 20 de cette page de forum.


6.3. lshw - Information Matériel de votre ordinateur GNU/Linux !

Source(s):

Il est souvent nécessaire de connaître des informations détaillées sur le matériel composant son ordinateur.

lshw est la commande magique pour cette tâche :)

Exemples d'utilisation :


$ sudo aptitude install lshw      // Pour l'installer si elle n'est pas déjà disponible

$ sudo lshw                       // Executer en tant que root pour obtenir les 
                                  // informations matériel

$ lshw > /tmp/hwoutput.txt        // Transférer le résultat vers un fichier texte 
                                  // pour partager l'information

$ lshw -html > /tmp/hwhtml.html   // Formatter le resultat en HTML
$ lshw -xml > /tmp/hwxml.xml      // Formatter le resultat en XML

$ lshw -html -sanitize > /tmp/hwhtml.html  // Avant de rendre l'information publique, il est bon de netoyer (sanitize)
                                           // toute information sensible : adresse IP, numéro de série, etc...
  

Note

Pour ma carte wireless avec chipset Broadcom j'ai pu obtenir le modèle exact par cette commande :


  $ lspci -n | grep 14e4     # A executer en tant que root de préférence :)
  03:00.0 0280: 14e4:432b (rev 01)
  

Dans le fichier README.txt du pilote Broadcom (802.11 Linux STA driver), je trouve la référence suivante qui correspond :


BRCM		    PCI		  PCI
Product Name	  Vendor ID	Device ID	
-------------	 ----------	---------   	
4322 Dualband      0x14e4         0x432b
  

Voici le résultat des informations matériel pour mon ordinateur Apple MacBook Pro 5,5 (Nov 2009) :


$ lshw -sanitize
computer
    description: Notebook
    product: MacBookPro5,5
    vendor: Apple Inc.
    version: 1.0
    serial: [REMOVED]
    width: 64 bits
    capabilities: smbios-2.4 dmi-2.4 vsyscall64 vsyscall32
    configuration: boot=normal chassis=notebook uuid=2C7A2E5D-968A-C64D-A1E4-92CD72BB3256
  *-core
       description: Motherboard
       product: Mac-F2268AC8
       vendor: Apple Inc.
       physical id: 0
       serial: [REMOVED]
       slot: Part Component
     *-cpu:0
          description: CPU
          product: Intel(R) Core(TM)2 Duo CPU     P7550  @ 2.26GHz
          vendor: Intel Corp.
          physical id: 0
          bus info: cpu@0
          version: Intel(R) Core(TM)2 Duo CPU     P7550  @ 2.26GHz
          slot: U2E1
          size: 798MHz
          capacity: 798MHz
          width: 64 bits
          clock: 266MHz
          capabilities: fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic 
sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe 
syscall nx x86-64 constant_tsc arch_perfmon pebs bts rep_good pni dtes64 monitor 
ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm tpr_shadow vnmi flexpriority cpufreq
        *-cache
             description: L1 cache
             physical id: 2
             slot: Unknown
             size: 32KiB
             capacity: 32KiB
             capabilities: asynchronous internal write-back data
     *-cache:0
          description: L1 cache
          physical id: 1
          slot: Unknown
          size: 32KiB
          capacity: 32KiB
          capabilities: asynchronous internal write-back instruction
     *-cpu:1
          description: CPU
          vendor: Intel(R) Corporation
          physical id: 3
          bus info: cpu@1
          version: Intel(R) Core(TM)2 Duo CPU     P7550  @ 2.26GHz
          slot: U2E1
          size: 798MHz
          capacity: 798MHz
          clock: 266MHz
          capabilities: cpufreq
        *-cache
             description: L1 cache
             physical id: 5
             slot: Unknown
             size: 32KiB
             capacity: 32KiB
             capabilities: asynchronous internal write-back data
     *-cache:1
          description: L1 cache
          physical id: 4
          slot: Unknown
          size: 32KiB
          capacity: 32KiB
          capabilities: asynchronous internal write-back instruction
     *-memory
          description: System Memory
          physical id: 6
          slot: System board or motherboard
          size: 2GiB
        *-bank:0
             description: SODIMM Synchronous 1067 MHz (0.9 ns)
             product: 0x384A53463132383634485A2D314731463120
             vendor: 0x802C
             physical id: 0
             serial: [REMOVED]
             slot: DIMM0
             size: 1GiB
             clock: 1067MHz (0.9ns)
        *-bank:1
             description: SODIMM Synchronous 1067 MHz (0.9 ns)
             product: 0x384A53463132383634485A2D314731463120
             vendor: 0x802C
             physical id: 1
             serial: [REMOVED]
             slot: DIMM0
             size: 1GiB
             clock: 1067MHz (0.9ns)
     *-firmware
          description: BIOS
          vendor: Apple Inc.
          physical id: e
          version: MBP55.88Z.00AC.B03.0906151708 (06/15/09)
          size: 1MiB
          capacity: 4032KiB
          capabilities: pci upgrade shadowing cdboot bootselect acpi ieee1394boot smartbattery netboot
     *-pci
          description: Host bridge
          product: MCP79 Host Bridge
          vendor: nVidia Corporation
          physical id: 100
          bus info: pci@0000:00:00.0
          version: b1
          width: 32 bits
          clock: 66MHz
        *-memory:0 UNCLAIMED
             description: RAM memory
             product: MCP79 Memory Controller
             vendor: nVidia Corporation
             physical id: 0.1
             bus info: pci@0000:00:00.1
             version: b1
             width: 32 bits
             clock: 66MHz (15.2ns)
             capabilities: bus_master
             configuration: latency=0
        *-isa
             description: ISA bridge
             product: MCP79 LPC Bridge
             vendor: nVidia Corporation
             physical id: 3
             bus info: pci@0000:00:03.0
             version: b3
             width: 32 bits
             clock: 66MHz
             capabilities: isa bus_master
             configuration: latency=0
             resources: ioport:2000(size=256)
        *-memory:1 UNCLAIMED
             description: RAM memory
             product: MCP79 Memory Controller
             vendor: nVidia Corporation
             physical id: 3.1
             bus info: pci@0000:00:03.1
             version: b1
             width: 32 bits
             clock: 66MHz (15.2ns)
             configuration: latency=0
        *-serial
             description: SMBus
             product: MCP79 SMBus
             vendor: nVidia Corporation
             physical id: 3.2
             bus info: pci@0000:00:03.2
             version: b1
             width: 32 bits
             clock: 66MHz
             capabilities: pm cap_list
             configuration: driver=nForce2_smbus latency=0
             resources: irq:15 ioport:2180(size=64) ioport:2140(size=64) ioport:2100(size=64)
        *-memory:2 UNCLAIMED
             description: RAM memory
             product: MCP79 Memory Controller
             vendor: nVidia Corporation
             physical id: 3.3
             bus info: pci@0000:00:03.3
             version: b1
             width: 32 bits
             clock: 66MHz (15.2ns)
             configuration: latency=0
        *-memory:3 UNCLAIMED
             description: RAM memory
             product: nVidia Corporation
             vendor: nVidia Corporation
             physical id: 3.4
             bus info: pci@0000:00:03.4
             version: b1
             width: 32 bits
             clock: 66MHz (15.2ns)
             configuration: latency=0
        *-processor UNCLAIMED
             description: Co-processor
             product: MCP79 Co-processor
             vendor: nVidia Corporation
             physical id: 3.5
             bus info: pci@0000:00:03.5
             version: b1
             width: 32 bits
             clock: 66MHz
             capabilities: bus_master
             configuration: latency=0 maxlatency=1 mingnt=3
             resources: memory:93400000-9347ffff
        *-usb:0
             description: USB Controller
             product: MCP79 OHCI USB 1.1 Controller
             vendor: nVidia Corporation
             physical id: 4
             bus info: pci@0000:00:04.0
             version: b1
             width: 32 bits
             clock: 66MHz
             capabilities: pm bus_master cap_list
             configuration: driver=ohci_hcd latency=0 maxlatency=1 mingnt=3
             resources: irq:18 memory:93488000-93488fff
        *-usb:1
             description: USB Controller
             product: MCP79 EHCI USB 2.0 Controller
             vendor: nVidia Corporation
             physical id: 4.1
             bus info: pci@0000:00:04.1
             version: b1
             width: 32 bits
             clock: 66MHz
             capabilities: debug pm bus_master cap_list
             configuration: driver=ehci_hcd latency=0 maxlatency=1 mingnt=3
             resources: irq:20 memory:93489200-934892ff
        *-usb:2
             description: USB Controller
             product: MCP79 OHCI USB 1.1 Controller
             vendor: nVidia Corporation
             physical id: 6
             bus info: pci@0000:00:06.0
             version: b1
             width: 32 bits
             clock: 66MHz
             capabilities: pm bus_master cap_list
             configuration: driver=ohci_hcd latency=0 maxlatency=1 mingnt=3
             resources: irq:17 memory:93487000-93487fff
        *-usb:3
             description: USB Controller
             product: MCP79 EHCI USB 2.0 Controller
             vendor: nVidia Corporation
             physical id: 6.1
             bus info: pci@0000:00:06.1
             version: b1
             width: 32 bits
             clock: 66MHz
             capabilities: debug pm bus_master cap_list
             configuration: driver=ehci_hcd latency=0 maxlatency=1 mingnt=3
             resources: irq:19 memory:93489100-934891ff
        *-multimedia
             description: Audio device
             product: MCP79 High Definition Audio
             vendor: nVidia Corporation
             physical id: 8
             bus info: pci@0000:00:08.0
             version: b1
             width: 32 bits
             clock: 66MHz
             capabilities: pm bus_master cap_list
             configuration: driver=HDA Intel latency=0 maxlatency=5 mingnt=2
             resources: irq:23 memory:93480000-93483fff
        *-pci:0
             description: PCI bridge
             product: MCP79 PCI Bridge
             vendor: nVidia Corporation
             physical id: 9
             bus info: pci@0000:00:09.0
             version: b1
             width: 32 bits
             clock: 66MHz
             capabilities: pci bus_master cap_list
             resources: memory:93300000-933fffff
        *-network
             description: Ethernet interface
             product: MCP79 Ethernet
             vendor: nVidia Corporation
             physical id: a
             bus info: pci@0000:00:0a.0
             logical name: eth0
             version: b1
             serial: [REMOVED]
             size: 100MB/s
             capacity: 1GB/s
             width: 32 bits
             clock: 66MHz
             capabilities: pm msi bus_master cap_list ethernet physical mii 10bt 
10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
             configuration: autonegotiation=on broadcast=yes driver=forcedeth 
driverversion=0.64 duplex=full ip=[REMOVED] latency=0 link=yes maxlatency=20 mingnt=1 
multicast=yes port=MII speed=100MB/s
             resources: irq:27 memory:93486000-93486fff ioport:21e0(size=8) 
memory:93489000-934890ff memory:93489300-9348930f
        *-ide
             description: IDE interface
             product: MCP79 SATA Controller
             vendor: nVidia Corporation
             physical id: b
             bus info: pci@0000:00:0b.0
             logical name: scsi0
             logical name: scsi1
             version: b1
             width: 32 bits
             clock: 66MHz
             capabilities: ide pm msi bus_master cap_list emulated
             configuration: driver=ahci latency=0 maxlatency=1 mingnt=3
             resources: irq:26 ioport:21d8(size=8) ioport:21ec(size=4) ioport:21d0(size=8) 
ioport:21e8(size=4) ioport:21c0(size=16) memory:93484000-93485fff
           *-disk
                description: ATA Disk
                product: Hitachi HTS54502
                vendor: Hitachi
                physical id: 0
                bus info: scsi@0:0.0.0
                logical name: /dev/sda
                version: PB2O
                serial: [REMOVED]
                size: 232GiB (250GB)
                capabilities: partitioned partitioned:dos
                configuration: ansiversion=5
              *-volume:0 UNCLAIMED
                   description: EFI GPT partition
                   physical id: 1
                   bus info: scsi@0:0.0.0,1
                   capacity: 200MiB
                   capabilities: primary nofs
              *-volume:1
                   description: Darwin/OS X HFS+ partition
                   vendor: Mac OS X (journaled)
                   physical id: 2
                   bus info: scsi@0:0.0.0,2
                   logical name: /dev/sda2
                   version: 4
                   serial: [REMOVED]
                   size: 74GiB
                   capacity: 74GiB
                   capabilities: primary journaled bootable osx hfsplus initialized
                   configuration: boot=osx checked=2010-05-19 13:25:04 created=2010-05-19 05:25:04 
filesystem=hfsplus lastmountedby=HFSJ modified=2010-05-19 16:13:54 state=clean
              *-volume:2
                   description: EFI (FAT-12/16/32) partition
                   physical id: 3
                   bus info: scsi@0:0.0.0,3
                   logical name: /dev/sda3
                   capacity: 977KiB
                   capabilities: primary bootable boot
              *-volume:3
                   description: EXT4 volume
                   vendor: Linux
                   physical id: 4
                   bus info: scsi@0:0.0.0,4
                   logical name: /dev/sda4
                   logical name: /
                   version: 1.0
                   serial: [REMOVED]
                   size: 71GiB
                   capacity: 71GiB
                   capabilities: primary journaled extended_attributes large_files huge_files 
dir_nlink recover extents ext4 ext2 initialized
                   configuration: created=2010-05-19 16:25:20 filesystem=ext4 
lastmountpoint=[REMOVED Manualy] modified=2010-06-06 14:27:27 
mount.fstype=ext4 mount.options=rw,relatime,errors=remount-ro,barrier=1,data=ordered 
mounted=2010-06-07 12:58:23 state=mounted
           *-cdrom
                description: DVD writer
                product: DVDRW  GS23N
                vendor: HL-DT-ST
                physical id: 1
                bus info: scsi@1:0.0.0
                logical name: /dev/cdrom
                logical name: /dev/cdrw
                logical name: /dev/dvd
                logical name: /dev/dvdrw
                logical name: /dev/scd0
                logical name: /dev/sr0
                version: SB00
                capabilities: removable audio cd-r cd-rw dvd dvd-r
                configuration: ansiversion=5 status=open
        *-pci:1
             description: PCI bridge
             product: MCP79 PCI Express Bridge
             vendor: nVidia Corporation
             physical id: 10
             bus info: pci@0000:00:10.0
             version: b1
             width: 32 bits
             clock: 33MHz
             capabilities: pci pm msi bus_master cap_list
             resources: ioport:1000(size=4096) memory:92000000-930fffff ioport:80000000(size=301989888)
           *-display
                description: VGA compatible controller
                product: C79 [GeForce 9400M]
                vendor: nVidia Corporation
                physical id: 0
                bus info: pci@0000:02:00.0
                version: b1
                width: 64 bits
                clock: 33MHz
                capabilities: pm msi bus_master cap_list rom
                configuration: driver=nvidia latency=0
                resources: irq:22 memory:92000000-92ffffff memory:80000000-8fffffff(prefetchable) 
memory:90000000-91ffffff(prefetchable) ioport:1000(size=128) memory:93000000-9301ffff(prefetchable)
        *-pci:2
             description: PCI bridge
             product: MCP79 PCI Express Bridge
             vendor: nVidia Corporation
             physical id: 15
             bus info: pci@0000:00:15.0
             version: b1
             width: 32 bits
             clock: 33MHz
             capabilities: pci pm msi pciexpress bus_master cap_list
             configuration: driver=pcieport-driver
             resources: irq:24 memory:93200000-932fffff
           *-network
                description: Wireless interface
                product: BCM4322 802.11a/b/g/n Wireless LAN Controller
                vendor: Broadcom Corporation
                physical id: 0
                bus info: pci@0000:03:00.0
                logical name: eth1
                version: 01
                serial: [REMOVED]
                width: 64 bits
                clock: 33MHz
                capabilities: pm msi pciexpress bus_master cap_list ethernet physical wireless
                configuration: broadcast=yes driver=wl0 driverversion=5.10.91.9 latency=0 
multicast=yes wireless=IEEE 802.11abgn
                resources: irq:23 memory:93200000-93203fff
        *-pci:3
             description: PCI bridge
             product: MCP79 PCI Express Bridge
             vendor: nVidia Corporation
             physical id: 16
             bus info: pci@0000:00:16.0
             version: b1
             width: 32 bits
             clock: 33MHz
             capabilities: pci pm msi pciexpress bus_master cap_list
             configuration: driver=pcieport-driver
             resources: irq:25 memory:93100000-931fffff
           *-firewire
                description: FireWire (IEEE 1394)
                product: FW643 PCI Express1394b Controller (PHY/Link)
                vendor: Agere Systems
                physical id: 0
                bus info: pci@0000:04:00.0
                version: 07
                width: 64 bits
                clock: 33MHz
                capabilities: pm msi pciexpress bus_master cap_list
                configuration: driver=ohci1394 latency=0
                resources: irq:22 memory:93100000-93100fff
     *-scsi
          physical id: 2
          bus info: usb@2:5
          logical name: scsi6
          capabilities: emulated scsi-host
          configuration: driver=usb-storage
        *-disk
             description: SCSI Disk
             product: SD Card Reader
             vendor: APPLE
             physical id: 0.0.0
             bus info: scsi@6:0.0.0
             logical name: /dev/sdb
             version: 1.00
             capabilities: removable
           *-medium
                physical id: 0
                logical name: /dev/sdb
  *-battery
       product: Unknown
       vendor: Unknown
       physical id: 1
       version: Unknown
       serial: [REMOVED]
       slot: Unknown
  *-network DISABLED
       description: Ethernet interface
       physical id: 2
       logical name: vboxnet0
       serial: [REMOVED]
       capabilities: ethernet physical
       configuration: broadcast=yes multicast=yes
   

Pour voir l'action de l'option -sanitize :


$ sudo lshw > f1.txt
$ sudo lshw -sanitize > f2.txt
$ diff f1.txt f2.txt 
   


6.4. Virtual Box

6.4.1. Installation de Base


2.j Installation of Virtual box

Virtual Box version 3.0.8 (Version OSE) is currently available in Ubuntu 9.10 
Karmic but it is advisable to use instead the most current version en cours 3.0.10
 non OSE (Open Source Edition) which contains full features and remain pour utilisation personnel.

http://www.virtualbox.org/wiki/Editions

“...
The full VirtualBox package is available in binary (executable) form free of charge from the Downloads
 page. This version is free for personal use and evaluation under the terms of the VirtualBox Personal 
Use and Evaluation License. 
If, instead, you wish to purchase licenses for enterprise use and/or enterprise support for VirtualBox,
 please do not hesitate to contact your Sun representative. 
The VirtualBox Open Source Edition (OSE) is the one that has been released under the GPL and 
comes with complete source code. It is functionally equivalent to the full VirtualBox package, 
except for a few features that primarily target enterprise customers. This gives us a chance to 
generate revenue to fund further development of VirtualBox. 
...”
Download page:http://www.virtualbox.org/wiki/Downloads

Click on: VirtualBox 3.0.10 for Linux hosts
Click on: AMD64 on the line containing Ubuntu 9.10 ("Karmic Koala") i386 | AMD64
Save on the Desktop
Double click on package: virtualbox-3.0_3.0.10-54097_Ubuntu_karmic_amd64.deb saved to start 
installation and follow instruction (nothing in particular simply click forward)

Done!

Alternatively:
$ sudo gedit /etc/apt/sources.list

Add at the end of file...
deb http://download.virtualbox.org/virtualbox/debian karmic non-free
and save...

Then do
$ sudo aptitude update
(...)
Get:11 http://download.virtualbox.org karmic Release.gpg [197B]
Ign http://download.virtualbox.org karmic/non-free Translation-en_GB
Get:12 http://download.virtualbox.org karmic Release [3,459B]
Ign http://download.virtualbox.org karmic Release
Get:13 http://download.virtualbox.org karmic/non-free Packages [1,954B]
Fetched 68.4kB in 0s (72.5kB/s)  
Reading package lists... Done             
W: GPG error: http://download.virtualbox.org hardy Release: The following signatures 
couldn't be verified because the public key is not available: NO_PUBKEY DCF9F87B6DFBCBAE

Current status: 4 new [+4].

==> Public key is missing for new repository...

Get public key for new repository
$ wget -q http://download.virtualbox.org/virtualbox/debian/sun_vbox.asc -O- | sudo apt-key add -
OK
$ sudo aptitude update
(...)
Get:1 http://download.virtualbox.org karmic Release.gpg [197B]
Ign http://download.virtualbox.org karmic/non-free Translation-en_GB
Get:2 http://download.virtualbox.org karmic Release [3,459B]
Hit http://download.virtualbox.org karmic/non-free Packages
Fetched 198B in 0s (217B/s)
Reading package lists... Done

Installation des paquets nécessaires
     VirtualBox aura besoin de compiler un module pour votre machine hôte. Pour ce faire, il a également
besoin que soient préalablement installés des applications particulières. Faisons le tout de suite :
$ sudo aptitude install linux-headers-generic build-essential
filostene@macfil:~$ sudo aptitude install linux-headers-generic build-essential
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Reading extended state information      
Initialising package states... Done
The following NEW packages will be installed:
  build-essential dpkg-dev{a} g++{a} g++-4.4{a} libstdc++6-4.4-dev{a} 
0 packages upgraded, 5 newly installed, 0 to remove and 1 not upgraded.
Need to get 0B/7,606kB of archives. After unpacking 25.0MB will be used.
Do you want to continue? [Y/n/?] y
Writing extended state information... Done
Selecting previously deselected package libstdc++6-4.4-dev.
(Reading database ... 116696 files and directories currently installed.)
Unpacking libstdc++6-4.4-dev (from .../libstdc++6-4.4-dev_4.4.1-4ubuntu8_amd64.deb) ...
Selecting previously deselected package g++-4.4.
Unpacking g++-4.4 (from .../g++-4.4_4.4.1-4ubuntu8_amd64.deb) ...
Selecting previously deselected package g++.
Unpacking g++ (from .../g++_4.4.1-1ubuntu2_amd64.deb) ...
Selecting previously deselected package dpkg-dev.
Unpacking dpkg-dev (from .../dpkg-dev_1.15.4ubuntu2_all.deb) ...
Selecting previously deselected package build-essential.
Unpacking build-essential (from .../build-essential_11.4_amd64.deb) ...
Processing triggers for man-db ...
Setting up dpkg-dev (1.15.4ubuntu2) ...
Setting up libstdc++6-4.4-dev (4.4.1-4ubuntu8) ...
Setting up g++-4.4 (4.4.1-4ubuntu8) ...
Setting up g++ (4:4.4.1-1ubuntu2) ...
update-alternatives: using /usr/bin/g++ to provide /usr/bin/c++ (c++) in auto mode.

Setting up build-essential (11.4) ...
Reading package lists... Done             
Building dependency tree       
Reading state information... Done
Reading extended state information      
Initialising package states... Done
Writing extended state information... Done

Check what is availalbe...
$ sudo apt-cache search virtualbox
virtualbox - Sun xVM VirtualBox
virtualbox-2.0 - Sun xVM VirtualBox
virtualbox-2.1 - Sun xVM VirtualBox
virtualbox-2.2 - Sun VirtualBox
virtualbox-3.0 - Sun VirtualBox         # C’est celle-ci qui nous intéresse

Install version 3.0
$ sudo aptitude install virtualbox-3.0
# Validez l’installation du produit, il nécessite environ 50 Mo en téléchargement
# et 100 Mo sur disque une fois installé.
# S’en suit un téléchargement, une compilation  et l’installation
Dépaquetage de dkms (à partir de .../dkms_2.0.19-0ubuntu2_all.deb)...
Paramétrage de virtualbox-3.0 (3.0.4-50677_Ubuntu_hardy)...
Messages emitted during module compilation will be logged
to /var/log/vbox-install.log.
Success!
* Starting VirtualBox kernel module *  done.

Verify 
$ lsmod | grep -i vboxdrv
vboxdrv              1708492  1 vboxnetflt

==> OK... maintenant je peux demarrer VirtualBox

$ virtualbox
Ouhou! Ca marche ... euh ... enfin non ca marche pas :(( 

The program 'virtualbox' is currently not installed.  You can install it by typing:
sudo apt-get install virtualbox-ose-qt
virtualbox: command not found

Aaaaaaahhhhhhhh !!! J' y suis... problem de typo... attention au majuscule dans 
la commande Linux est tres sensible a ce niveau la !!!
L'EOF devrait rajouter ca dans la doc !!!

$ VirtualBox

HipHipHip Oura ca fonctionne !
Ouf! une etape de moins...

Préparation de l’environnement pour VirtualBox
La procédure d’installation est généralement assez simple.
– Créez une nouvelle VM (cliquer sur NEW).
– Donner une nom: DebianStableFromBusiness (...business.iso)
– Système: Linux
– Version: Debian, puis suivant,
– Taille de la mémoire: 512, puis suivant,
– Créez un nouveau disque dur, puis suivant,
– Sélectionnez ’Image disque à taille dynamique’, puis suivant,
– Emplacement, ici installez l’image sur un disque ou un volume sur lequel vous avez entre 5 et 10 Go
  de place libre. Cela peut-être un disque externe, par exemple :
  /media/sda1/MesVM/DebianStable.vdi. Laissez la taille par défaut, puis suivant

Dans mon cas:
Type: Dynamically expanding storage
Location: /home/filostene/.VirtualBox/HardDisks/DebianStableFromBusinessCard.vdi
Size: 10.00 GB (10737418240 Bytes)

– Terminez.

6.4.2. Installation d'une Machine Virtuelle (Debian)


  Manuel de Reference Debian: 
  http://www.debian.org/doc/manuals/debian-reference/index.fr.html

  Configurer le nombre d'espace de travail dans Debian, Ubuntu...
  http://www.noob-on-linux.com/article-configurer-le-nombre-d-espace-de-travail-39445906.html

- Installer debian a partir d'une cle USB (pas de lecteur cd rom)

1- telecharger les fichiers specifiques pour le boot hd-media
ftp://ftp.debian.org/debian/dists/lenny/main/installer-i386/current/images/hd-media/

- boot.img.gz (a decompresser a la racine de la cle usb)

zcat boot.img.gz > /dev/sdb (device associé à votre clé usb)

2- telecharger une image netinst de la version stable de debian
http://cdimage.debian.org/debian-cd/5.0.3/i386/iso-cd/debian-503-i386-netinst.iso

puis la copier sur la cle usb

doc:
http://www.debian.org/releases/stable/i386/apas02.html.fr

http://wiki.debian.org/VirtualBox

Ensuite s'assurer que la station puisse booter sur usb , 
le cas échéant l'activer dans le bios

2.k Debian Download

Download businesscard CD image (generally 20-50 MB) for i386 architecture
$ wget http://cdimage.debian.org/debian-cd/5.0.3/i386/iso-cd/debian-503-i386-businesscard.iso

MD5 sum 
$ md5sum debian-503-i386-businesscard.iso 
54d091a5491d1f36554cca8362af8a27  debian-503-i386-businesscard.iso
54d091a5491d1f36554cca8362af8a27 (in the text file)
Both match perfectly :))

Get MD5 sum from Debian.org
$ wget   wget http://cdimage.debian.org/debian-cd/5.0.3/i386/iso-cd/MD5SUMS
--2009-11-13 00:16:03--  http://wget/
Resolving wget... failed: Name or service not known.
wget: unable to resolve host address `wget'
--2009-11-13 00:16:03--  http://cdimage.debian.org/debian-cd/5.0.3/i386/iso-cd/MD5SUMS
Resolving cdimage.debian.org... 130.239.18.163, 130.239.18.137, 2001:6b0:e:2018::163, ...
Connecting to cdimage.debian.org|130.239.18.163|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2452 (2.4K) [text/plain]
Saving to: `MD5SUMS'

100%[======================================>] 2,452       --.-K/s   in 0.001s  

2009-11-13 00:16:03 (2.04 MB/s) - `MD5SUMS' saved [2452/2452]

FINISHED --2009-11-13 00:16:03--
Downloaded: 1 files, 2.4K in 0.001s (2.04 MB/s)
------------------------------------------------------

$ wget   wget http://cdimage.debian.org/debian-cd/5.0.3/i386/iso-cd/MD5SUMS.sign
--2009-11-13 00:16:23--  http://wget/
Resolving wget... failed: Name or service not known.
wget: unable to resolve host address `wget'
--2009-11-13 00:16:23--  http://cdimage.debian.org/debian-cd/5.0.3/i386/iso-cd/MD5SUMS.sign
Resolving cdimage.debian.org... 130.239.18.137, 130.239.18.163, 2001:6b0:e:2018::137, ...
Connecting to cdimage.debian.org|130.239.18.137|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 197 [text/plain]
Saving to: `MD5SUMS.sign'

100%[======================================>] 197         --.-K/s   in 0s      

2009-11-13 00:16:23 (5.69 MB/s) - `MD5SUMS.sign' saved [197/197]

FINISHED --2009-11-13 00:16:23--
Downloaded: 1 files, 197 in 0s (5.69 MB/s)
---------------------------------------------------------

Verify Signature

filostene@macfil:~/Downloads$ gpg --verify MD5SUMS.sign 
gpg: Signature made Mon 07 Sep 2009 21:43:49 BST using DSA key ID 88C7C1F7
gpg: Can't check signature: public key not found
filostene@macfil:~/Downloads$ gpg --recv-keys 88C7C1F7
gpg: requesting key 88C7C1F7 from hkp server keys.gnupg.net
gpg: key 88C7C1F7: public key "Steve McIntyre <steve@einval.com>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1
filostene@macfil:~/Downloads$ gpg --verify MD5SUMS.sign 
gpg: Signature made Mon 07 Sep 2009 21:43:49 BST using DSA key ID 88C7C1F7
gpg: Good signature from "Steve McIntyre <steve@einval.com>"
gpg:                 aka "Steve McIntyre <93sam@debian.org>"
gpg:                 aka "Steve McIntyre <stevem@chiark.greenend.org.uk>"
gpg:                 aka "Debian CD signing key <debian-cd@lists.debian.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: AC65 6D79 E362 32CF 77BB  B0E8 7C3B 7970 88C7 C1F7

2.l Installation de la distribution Debian

-Demarrer VirtualBox si il n'est pas deja en route
-Selectionner la Machine Virtuelle nouvellement creee DebianStableFromBusiness
-Dans tabulation Details, cliquer sur "CD/DVD-ROM" 
-Check Mount "CD/DVD Drive"
-Seclectionner "ISO Image File" 
-Clique sur l'icone jaune qui ressemble a un dossier pour invoquer le 
Virtual Media Manager, puis parcourir pour selectionner "debian-503-i386-businesscard.iso"
-Cliquer sur "Start" pour demarrer la machine virtuelle
       Sélectionnez Install et validez. Nous allons procéder à l’installation de Debian.
       Note : Quand vous avez cliqué dans la VM, le curseur, par défaut reste bloqué dans cette VM. Pour
  pouvoir accéder à votre bureau, appuyez sur la touche CTRL situé à droite de la barre d’espace.
       Ici, voici les grandes options que vous pouvez sélectionner lors de l’installation :
       – Prenez French
       – Français
       – Français (fr latin-9)
       – Nom de machines, ce sera le nom d’hôte
       – Domaine, si c’est un serveur déclaré, sinon vous pouvez laisser vide
       – Partitionnement, prenez utiliser un disque entier, ce sera l’espace que 
vous avez déclaré dans VirtualBox
       – Validez plusieurs fois jusqu’à arriver au schéma de partitionnement. 
         Ici, mettez tout sur une seule
          partition si vous êtes débutant, comme cela est préconisé. La séparation des 
         volumes n’est pas abordée
          ici. Validez, le disque sera créé et l’installateur installera le système de base.
       – Mettez un mot de passe pour l’administrateur root et confirmez
       – puis vous allez créer un compte utilisateur qui sera le vôtre, car on 
n’utilise pas le compte root par
          défaut.
       – Sélectionnez ensuite un Pays pour le téléchargement des paquets
       – La partie mandataire est plus délicate. Il vous faut savoir si vous 
avez un proxy ou pas. Si vous êtes
          chez vous, il n’y en a probablement pas, si vous êtes dans votre entreprise, 
il y en a probablement un. Il
          vous faut demander l’information à l’administrateur de votre réseau et 
renseigner la zone. Si le proxy
          est à l’adresse 192.168.1.1 et fonctionne sur le port 8080, il vous 
faudra mettre : http ://192.168.1.1 :8080.
          Ensuite, patientez un peu le temps que le processus récupère les listes des paquets.
       – Vous arrivez à la sélection des paquets. 
Puisque la VM va vous servir un peu à tout et ne sera pas qu’un
          serveur, sélectionnez les options par défaut Environnement 
graphique de bureau et Système standard
       – Là, vous pouvez aller boire un café car il peut y en avoir 
pour un petit moment (peut-être même plus
          d’une heure)
       – Ici GROSSE patience.
– Une fois les paquets téléchargés et installés, validez l’installation de Grub comme proposé 
par l’installateur.
-Puis redemarrer sur le nouveau systeme :))

2.m Change VirtualBox Host Key to switch from HOST to VM and vice versa...

Pour entree dans la machine virtuelle il suffit de cliquer dedans ainsi tout ce qui sera 
taper au clavier ou cliquer a la souris sera capture et interprete par la machine virtuelle 
comme etant des entree clavier et souris sur la machine Debian.

Pour en sortir, il faut appuyer sur la touche "Host Key" qui est par defaut CTRL Right 
(la touche control situe a droite sur le clavier)... malheureusement, sur le MacBookPro 
cette touche n'existe pas ! Il n'y a qu'une touche CTRL Gauche (situe a gauche sur le clavier)... 
ceci signifie que si on passe en mode pleine ou que l'on active simplement la VM, il n'est 
plus possible dans sortir... !!! C'est ce qui m'est arrive...

Pour eviter ce probleme, il faut donc changer la configuration de la Host Key pour 
refleter le clavier utilise:
- Demarrer VirtualBox
- Go to Fichier > Preferences > Input 
- Presser sur touche fn+F8 (ne pas utiliser CTRL Gauche sinon cela interfere avec 
les raccourcis clavier!), le changement de configuration devrait changer de CTRL 
Droit en F8 dans la fenetre de preference
- OK
==> Done :))

2.n Ajuster resolution ecran de la VM

La machine "host" est un MacBook pro 13" en 16/9 (Widescreen 1280x720) alors que 
la VM est en resolution 4/3 je ne vois pas tout l'ecran... malheureusment aucun parametre 
de resolution ne semble pour voir etre choisi, ils sont tous vide (pas de choix)

Sur un forum il est indique qu'il faut installe les add-ons virtualbox pour ce type de changement.
La procedure par defaut dans Virtual Box n'a pas fonctionne.
 
J'ai donc telecharge manuellement http://download.virtualbox.org/virtualbox/3.0.10
/VBoxGuestAdditions_3.0.10.iso et je l'ai manuellement monter dans la VM (meme procedure 
que pour monter l'image .iso de la Debian)

Le probleme c'est que je n'arrive toujours pas a executer le CD-ROM.

J'essaye de demarrer le autorun.sh j'ai l'erreur suivante:
Could not display /media/cdrom0/autorun.sh

Same en root. Je ne peux executer sudo car mon compte par defaut n'est pas dans 
le group sudousers and je ne sais pas comment l'ajouter...
Cela doit etre un pb de permission mais je vois pas trop comment le resoudre...

    il est fort probable que le cdrom soit monté sans les droits d'exécution, avec
    une ligne de ce genre dans /etc/fstab :
    /dev/scd1       /media/cdrom0   udf,iso9660 user,noauto,noexec,utf8 0       0
    -> c'est le noexec, que tu peux essayer de remplacer par exec, puis de
    remonter le cdrom.

Il n'y avait pas de noexec dans le fstab mais j'ai rajoute ",exec" apres le noauto 
comme tu conseillais et ca marche :))
Ensuite...

    - ouvre un terminal
    - tape "su -" puis le mot de passe root (pour devenir root)
    - tape "cd /media/cdrom0 (repetoire ou est monté l'iso des guests additions)
    - tape "sh autorun.sh"

Aie! Le script reclame que j'installe Make sur la VM et les linux-headers et les build-essential du noyau courant... humm aucune idee comment faire !

Les conseils d'un autre etudiant sur la liste de diffusion:
    "...

    Ce qui donne donc (de mémoire)
    "aptitude install linux-headers-[ton archi] build-essential" (le [ton archi] peut être 
récupéré avec la command "uname -a" (-a renvoyant toutes les infos))(sinon un "aptitude 
search linux-headers" te renvoie tous les paquets correspondants, tu devrais trouver le tien)

..."

Alors allons y...
 
En cherchant un peu j'ai trouve trois commande toute simple:

$sudo apt-get install build-essential linux-headers-`uname -r`
$sudo apt-get install make
$sudo apt-get install gcc

En voici le resultat

(TO COPY/PASTE FROM LOG INSTALL STORED ON DEBIAN VM...)

Then redo:

    - ouvre un terminal
    - tape "su -" puis le mot de passe root (pour devenir root)
    - tape "cd /media/cdrom0 (repetoire ou est monté l'iso des guests additions)
    - tape "sh autorun.sh"

It shall works fine now...

==> Installation successfull except that OpenGL is supported only starting at 
kernel version 2.6.27 or le kernel courrant est en version 2.6.26...
Pas vraiment grave pour le moment...

It is time to reboot for changes to take effect :))

And it works, now I can see the full screen... but only in 640x480 while I would 
need 1280x720 (as indicated in Ubuntu 9.10).
The problem is that in System > Preference > Screen Resolution I cannot choose any 
other resolution that 640x480 :((

After the restart i did modify /etc/X11/xorg.conf (Attention c'est un X majuscule). Again s
udo was needed to be able to save the result. So type "sudo gedit" (or su and root password) 
in a terminal session, open /etc/X11/xorg.conf and below is what i added (see indended text):

Section "Screen"
Identifier "Default Screen"
Device "Generic Video Card"
Monitor "Generic Monitor"

 DefaultDepth 24
 SubSection "Display"
 Modes "1280x720" "1280x800" "640x480"
 EndSubSection

EndSection

As you might notice I added "1280x720", which is the right resolution of my laptop's 
screen under Debian or Ubuntu (compared to the 1280x800 under Mac OS X)
It needs to be put in first place to be used as default...

After a restarted (ctrl-Alt + backspace (pour redémarrer X) or reboot of VM) I clicked 
in the main menu "System > Preferences > Screen Resolution". The Screen Resolution 
Preference" dialog is shown and the resolution "1280x720" CAN be chosen. 

==> It works, now if I start VM, I activate it and press Host Key (CTRL left) + F if 
shows up in full screen like it would be installed on the laptop directly.

Excellent.

2.o Debian in French ???

Pour reconfigurer son environnement correctement il suffit dans une console 
d’exécuter la commande suivante :

[root@tuxbihan.org]$ dpkg-reconfigure locales

Ensuite cochez les langues fr_FR, fr_FR avec euro et valider. Choisissez par défaut fr_FR et VOILA !
==> En fait j'ai cocher All Locales pour toutes les installer et choisi fr_FR-UTF8

Ensuite un petit...
$ update-locale

Déconnectez vous ou relancez une console et tapez la commande :
$ locale

Vous devriez voir apparaître votre environnement avec la variable fr_FR


LANG=fr_FR
LC_TYPE="fr_FR"
LC_NUMERIC="fr_FR"
LC_TIME="fr_FR"
LC_COLLATE="fr_FR"
LC_MONETARY="fr_FR"
LC_MESSAGES="fr_FR"
LC_PAPER="fr_FR"
LC_NAME="fr_FR"
lC_ADDRESS="fr_FR"
LC_TELEPHONE="fr_FR"(
LC_MEASUREMENT="fr_FR"
LC_IDENTIFICATION="fr_FR"
LC_ALL=

Apres un redemarrage de la VM tout est en francais (sauf les message d'erreur du noyau :)
Bon Debian en FR :))

MAN PAGES en francais :))
Installation des man-pages-fr et man-pages-fr-extra via synaptique 
--> Pareil que comme pour  des paquets habituels

2.p Quelques outils en plus...
apt-get install zim (wiki application for note taking)
apt-get install xournal (to make annotation of pdf in handwriting via tabler or via keyboard)

2.q Set up clavier configuration (Host)

Pour pouvoir taper en Francais :))
- Systeme > Preference > Clavier > Tab Agencement 
- Choisir model de clavier "MacBook/MacBook Pro (Intl)"
- Choisir agencement "Royaume Uni International (avec touches mortes)"

ALT Right + ;: + e = é
ALT Right + '" + e = ê (or SHIFT + 6 + e)
ALT Right + \| + e = è (or `¬ + e)
etc...

Ajustement de touche additionel.

Le clavier est gereer par XKB (X Keyboard Extension)
Tous les fichiers de XKB se trouve dans /usr/share/X11/xkb

Pour voir les fichiers utilisé pour la configuration courante :
$ setxkbmap -print
xkb_keymap {
	xkb_keycodes  { include "macintosh+macintosh(goodmap)+aliases(qwerty)"	};
	xkb_types     { include "complete+numpad(mac)"	};
	xkb_compat    { include "complete"	};
	xkb_symbols   { include "pc+macintosh_vndr/gb+inet(apple)+level3(enter_switch)+
gb(intl):2+level3(ralt_switch_for_alts_toggle):1+level3(ralt_switch_for_alts_toggle):2+
group(alts_toggle)+eurosign(e)"	};
	xkb_geometry  { include "macintosh(macbook79)"	};
};

les fichiers qui nous interesse sont ceux indiquer sur la ligne xkb_symbols ils sont 
localise dans /usr/share/X11/xkb/symbols
Pour creer la configuration clavier, XKB compile l'ensemble des fichiers ci-dessus: 
keycodes, types, compat, symbols, geometry...

Pour modifier le layout du clavier nous devons modifier le fichier de symbol suivant :
/usr/share/X11/xkb/symbols/gb qui correspond au differet type de clavier anglais :))

Edit le fichier de configuration clavier et modifier la partie intl (pour international) comme suit:
$ gedit /usr/share/X11/xkb/symbols/gb

"...

partial alphanumeric_keys 
xkb_symbols "intl" { 

    // Describes the differences between a very simple en_US 
    // keyboard and a very simple U.K. keyboard layout with 
    // dead keys. By Phil Jones (philjones1@blueyonder.co.uk) 

    // Includes the following keys: 
    // dead_grave 
    // dead_acute 
    // dead_circumflex 
    // dead_tilde 
    // dead_diaeresis 

    include "latin" 

    name[Group1]="United Kingdom - International (with dead keys)"; 

    key <AE02>  { [   2,                       at,           EuroSign,     onehalf ] };
    key <AE03>  { [   3,                 sterling,        twosuperior,    onethird ] };
    key <AE04>  { [   4,                   dollar,      threesuperior,  onequarter ] };
    key <AE06>  { [   6,          dead_circumflex,           NoSymbol,    onesixth ] };
    key <AD09>	{ [   o,                        O,                 oe,          OE ] };

    key <AC11>  { [ dead_acute,    dead_diaeresis,     dead_diaeresis,         bar ] }; 
//dead_doubleacute
    key <TLDE>  { [ section,            plusminus,            notsign,     notsign ] }; 
//dead_grave

    key <BKSL>  { [ backslash,                bar,         numbersign,         bar ] };
    key <LSGT>  { [ dead_grave,        dead_tilde,          brokenbar,         bar ] };

    include "level3(ralt_switch)"
};

// Describe the differences between the US Colemak layout
// and a UK variant. By Andy Buckley (andy@insectnation.org)

..."

Enregistrer les modification...

Pour appliquer les modfifications simplement faire:
$ setxkbmap

2.r Dossier partage entre VM and HOST
 
On HOST
- mkdir /home/filostene/vmdebian (creer le repertoire a partager sur le host)
- VirtualBox (to start VirtualBox)
- Right Click on VM avec laquelle on veut partager dossier, go to Preference > Repertoires Partages
- Ajouter un repertoire partage permanent
Chemin: /home/filostene/vmdebian
Nom (Share name): vmdebian
- OK, puis demarrer la VM
- Dans la VM, demarrer un terminal puis:
$ mkdir /mnt/filosteneUbuntu (creer le repertoire partage sur la VM)
$ mount -t vboxsf vmdebian /mnt/filosteneUbuntu (monter le repertoire partage du Host sur la VM)

For automounting add the following line in /etc/fstab
vmdebian /mnt/filosteneUbuntu vboxfs rw,uid=1000 0 0

UID c'est l'identifiant utilisateur du HOST et de la VM, les deux doivent 
etre identique pour que le partage soit monter en lecture et ecriture.

==> Success :))

2.s Kernel error to hide

$ gnome-session-properties
Then unckeck kerloop... module...

2.t Resolve intermittent freezing of mouse/keyboard appearing after a while when 
VM is running for long hours

Ce probleme semble affecte particulierement les MacBookPro sous Linux:
http://www.virtualbox.org/ticket/2836 (voir en bas de page)

La solution c'est de desactiver ACPI pour la MV:

- In VirtualBox
- Select Machine Virutelle (it must be powered OFF)
- Right click
- Aller dans Preferences > Systeme
- Decocher "Activer ACPI"
- Demarrer VM

==> It shall be fine from now on :))

2.cc Ajusting the date, time and time zone correctly...

Voir Section Ajuster la date
     Ajuster le fuseau horaire

6.4.3. Virtual LAN : 1 Hôte (Ubuntu) + 2 Machines Virtuelles (Debian)

- Dupliquer la machine virtuel pour en créer deux - Ajuster la mémoire disponible pour chacune d'elle (Avant: 512Mo pour une VM, Après: 400Mo each): *Ouvrir Virtual Box (executer commande "VirtualBox") *Clic droit sur la VM1 > Préférence > Système > Mémoire de base *Ajuster à 400Mo *Répéter pour la deuxième VM - Création du réseau virtuel: *Ouvrir Virtual Box (executer commande "VirtualBox") *Clic droit sur la VM1 > Préférence > Système > Réseau > Mode d'accès *Choisir "Accès par Pont" *Choisir Nom Carte Réseau de l'hôte "eth2" (wi-fi) ou "eth01" (cable) *Répéter pour la deuxième VM ==> Au démarrage, VirtualBox se chargera de créer une interface réseau eth2 dans les VM et de les activer avec une addresse IP - Configuration hosts pour chaque machine (pour la resolution par nom d'hôte et domaine (facultatif)) LINKTO: /etc/hosts (Ubuntu) - /etc/hosts (VM1 - debstafil3) - /etc/hosts (VM2 - debstafil4) Toutes les machines appartiennent maintenant au même réseau et peuvent accéder Internet via l'hôte Ubuntu (soit par cable soit par wi-fi)


6.4.4. Installation VM Windows XP Pro (VirtualBox) sur hôte Ubuntu 9.10 64bits, portable Apple MacBook Pro 5,5

Dans le cadre de la formation, l'étude de SAMBA requiert la disponibilité de machine Windows. Dans le but d'en avoir toujours une (ou deux) sous la main, j'ai décidé d'installer Windows XP Pro en tant que Machine Virtuelle (VM) VirtualBox 3.1.2 r56127 sur mon hôte Ubuntu 9.10 64bits sur mon portable Apple MacBook Pro 5,5

Cela a été beaucoup moins facile qu'il n'y paraît et a pris beaucoup de temps et de patience pour résoudre tout les problèmes afférant.

Voici un bref résumé de mémoire :

  1. Créer un nouveau disque virtuel WinXPpro.vdi (Taille Dynamique - 10GB) dans le Gestionnaire de supports virtuels.

    Avertissement

    Ne pas hésiter à choisir une grande taille de disque pour éviter toute limitation par la suite.

    En effet en choisissant le type de taille Dynamique le fichier .vdi restera petit (1,2Go dans mon cas correspondant à l'espace effectivement utilisé par la VM) mais pourra s'étendre au besoin jusqu'à 10Go automatiquement.

    En choisant une taille limite petite on risque de se retrouver limité dans la machine virtuelle. Dans mon cas, je n'ai par example pas pu installer le Service Pack 2 la première fois car il me manquait 128Mo octets d'espace pour cela !!! SP2 utilise beaucoup d'espace durant l'installation !!!

    Note

    VirtualBox n'offre pas de moyen direct de modifier la taille limite d'un disque virtuel même s'il est de taill dynamique.

    Toutefois il existe une méthode pour re-dimensionner un disque de machine virtuelle (VirtualBox)

  2. Créer une nouvelle machine virtuelle WinXPpro utilisant le disque virtuel WinXPpro.vdi

  3. Vérifier les paramètres (Préférence) de la VM :

    
* Microsoft Windows 
    * Windows XP 
    * Mem 512 
    * Controler IDE - PIIX4 
    * Carte Reseau Intel PRO/1000 MT Desktop
    

  4. Insérer le disque d'installation Win XP Pro dans le lecteur

  5. Démarrer la VM

  6. Accepter le montage du support optique pour pouvoir démarrer depuis le CD d'installation

  7. Procéder à l'installation de Windows en suivant les instructions jusqu'à l'apparition du bureau.

    Note

    Les premiers démarrage peuvent être très long et des 'freeze' intermittant peuvent apparaître.

  8. Une fois sur le bureau, logoff et faire un instantané (snapshot) de la machine en cours d'exécution.

    Note

    Pour faire un instantané (snapshot), dans les menus de la VM en cours execution cliqué sur Machine > Saisi d'un instantanée... ou taper HOST+S (F7+S dans mon cas)... puis saisir le nom et une description du 'snapshot'.

  9. Éteindre la VM puis aller dans les préférence.

  10. Désactiver l'ACPI (APIC) dans les préférences de la VM (Ceci est nécessaire pour éviter les freeze intermittant qui apparaissent avec hôte Linux 64bits sur machine Apple)

    Note

    Voir aussi point 43. ci-après qui résoud les freeze intermittant après installation du Service Pack 3. Ceci peut-être tenté avant l'étape 9. mais n'a pas été testé dans le cadre de cette installation.

    Avertissement

    Lors de la mise à jour du noyau dans la VM, il apparaît que cette dernière re-démarre avec le mode ACPI activé alors même qu'il est désactivé dans les préférences de la VM :

    
# Solution pour GRUB Version 1
    $ nano /boot/grub/menu.lst
    
    # Modifier les options du noyau
    ...
    kernel ... ro acpi=off quiet  # Désactiver l'ACPI au démarrage
                                                       # du noyau
    ...
       

  11. Redémarrer la VM, appuyer sur une touche pour démarrer du CD-ROM et réparrer l'installation de Windows : Choisir d'installer Windows de nouveau et au dernier moment (dernière étape) choisir 'Réparer' installation existante (à ne pas confondre avec l'option R pour accéder à la 'Recovery Console'.

  12. Une fois sur le bureau, logoff et faire un instantané (snapshot) de la machine en cours d'exécution.

  13. Éteindre la VM puis aller dans les préférence.

  14. Ajouter des supports optiques jusqu'a ce que VirtualBoxAdditions.iso apparaisse.

  15. Enlever tous les autres supports optiques existant (ceci inclut le lecteur de CD/DVD, il peut-être remis ultérieurement si nécessaire).

  16. Démarrer la VM

  17. Une fois sur le bureau, logoff.

  18. Sur la page de login, seul l'utilisateur par défaut apparaît.

    Pour ce connecter en tant qu'Administrator, depuis la page de login taper F7+FN +Backspace(deux fois), ceci simule un CTRL+ALT+SUPR (2 fois) pour obtenir le prompt de login standard permettant de se connecter en tant qu'Administrateur.

    F7 est la touhce HOST de VirtualBox. Cette touche dépends des préférence de configuration de VirtualBox. FN+Backspace = SUPR sur MacBook Pro under Linux, la touche SUPR n'existe pas sur les clavier Apple :)

  19. Une fois sur le bureau (de l'Administrateur), aller dans le menu Periphérique (Device) de la VM en cours d'execution et choisir Installer les Additions Invité... HOST+D. Un prompt d'installation devrait apparaître (sorte de CD-ROM Autoplay) puis suivre les instructions d'installation à l'écran.

  20. Changer l'apparance de Windows en Windows Classique ce qui est moins gourmand en ressource.

  21. Une fois terminer, logoff et faire un instantané (snapshot) de la machine en cours d'exécution.

  22. Éteindre la VM puis aller dans les préférence.

  23. Créer un Repertoire partagé pour permettre l'échange de donnée entre l'hôte et la VM. Dans mon cas je partage un repertoire Document/WinXP avec le nom de partage vmwinxp.

  24. Télécharger depuis le site Intel le pilote pour la carte réseau Intel PRO/1000 MT Desktop et le sauvegarder dans Document/WinXP.

  25. Démarrer la VM

  26. Une fois sur le bureau (de l'utilisateur par défaut), changer l'apparence en Windows Classique. (Précedement c'était fait pour Adminsitrator et non l'utilisateur par défaut).

  27. Logoff, et connecter en tant qu'Administrator (voir point 19.)

  28. Une fois sur le bureau, Start > Run > cmd (pour ouvrir un fenêtre de commande) et taper :

    
    cmd> net use z: \\vboxsrv\vmwinxp
        
    Ceci va monter notre partage créé précedement en tant que disque lecteur Z: dans l'explorateur de fichier.

  29. Ouvrir Z: et executer l'installation du pilote de carte réseau Intel précédement téléchargé.

    Note

    Il est plus que conseiller, avant d'exécuter l'installation, de copier l'exécutable dans un emplacement local tel que MyDocuments car la connexion de partage semble parfois s'interrompre quelques secondes pouvant provoquer des erreurs d'installation.

  30. Rédémarrer la VM, tester l'accès au réseau et créer un point de restauration.

  31. Logoff et faire un instantané (snapshot) de la machine en cours d'exécution.

  32. Depuis l'hôte ou la VM, télécharger le Service Pack 2 puis l'installer dans la VM en tant qu'Adminsitrator.

  33. Une fois fait, vérifier dans le gestionnaire de périphérique que tous les périphériques sont installés correctement. Si le périphérique "PCI\VEN_8086&DEV_265..." apparaît comme pas installé correctement, éteindre la machine, desactiver l'USB dans les préférences, redémarrer la machine, eteindre la machine, réactiver l'USB dans les préférences, démarrer la machine et re-installer les Additions Invité en tant qu'Administrator (voir point 19. et 20 ci-dessus).

    Si cela ne fonctionne pas, ré-installer le pilote manquant en autorisant Windows à le chercher sur le site des Windows Update. Cette étape peut même être suffisante.

  34. Pour tout autre périphérique inconnu, il faut installer les pilotes correspondant. Les logiciels tel que EVEREST peuvent aider à identifier les périphérique plus précisément que Windows ne le fait :)

  35. Re-démarrer la VM et créer un nouveau point de restauration.

  36. Logoff et faire un instantané (snapshot) de la machine en cours d'execution.

  37. Depuis l'hôte ou la VM, télécharger le Service Pack 3 puis l'installer dans la VM en tant qu'Adminsitrator.

  38. Redémarrer la VM

  39. Installer TOUTES les mises à jour de Windows disponible, ce qui va installer Internet Explorer 8 au passage :) Plusieurs étape et redémarrage nécessaire...

    Note

    Ceci provoque un retour des freeze intermittant de la VM, pas de panique on va les enlever (voir point 43.)

  40. Re-démarrer la VM et créer un nouveau point de restauration.

  41. Logoff et faire un instantané (snapshot) de la machine en cours d'exécution.

  42. Éteindre la VM

  43. Dans les préférences de la VM (Paramètre de configuration) ajouter le filtre USB clavier/touchpad (Apple Inc. Apple Internal keyboard/trackpad [0081]), puis démarrer la VM

    Note

    Les freezes intermittants ont disparu :)


6.4.8. Résoudre VM Windows XP Pro Freeze

Freeze intermittant de la VM Windows XP Pro sur Ubuntu 9.10 sur MacBook Pro 5,5

Solution1 :

 

...fixed it by disabling ACPI, inserting the WinXP CD and doing a "repair installation". Sometimes it boots fast, sometimes slow, but at least the freezes are gone if Windows is up.

Right now I'm only saving the machine state, so Windows has not to be shutdown and I don't have to wait too long when booting it again :-)

But still this is not satisfying, UNIX / Linux will not shutdown properly without ACPI and Windows boots slower.

 
-- http://forums.virtualbox.org/viewtopic.php?t=11206  

La solution 1 a fonctionner pour à la suite d'une fraiche installation de Win XP Pro.

La solution 2 ci-dessous aurait peut-être été tout aussi efficace et est peut-être préférable.

Solution2 :

Suite à l'installation du Service Pack3 + Mise à jour, le problème de freeze par intermittance est revenue :(

Il a été résolut facilement en ajoutant le clavier/touchpad (Apple Inc. Apple Internal keyboard/trackpad [0081]) comme filtre USB dans les préférences de la machine virtuelle. Changer l'architecture IDE n'est effectivement pas une solution puisque cela finit en écran bleu !


6.4.9. Re-dimensionner un disque de machine virutelle (VirtualBox)

Source: How to resize a VirtualBox disk partition

Avertissement

Je tiens à préciser que cette méthode n'a pas fonctionner pour moi :((

C'est très certainement du à l'architecture 64bits de l'hôte. Mais je ne saurais l'expliquer ou à un bug dans la dernière version stable de Gparted.

En effet, une erreur apparaît lors de l'arrêt du live CD comme si gparted conserve un verrou au niveau du système virtuel de fichier (VFS) après avoir essayer de rendre la partition de disque copier bootable (dernières des étapes listées ci-dessous).

Au démarrage de la VM, le secteur de boot est introuvable et le fichier de VM devient corrompu

  1. Créer un nouveau disque virtuel de taille adéquate

  2. Dans les préférence de la machine virtuelle :

    - Paramétrer CD/DVD comme premier périphérique de démarrage

    - Au niveau de la configuration des disques, paramètrer le nouveau disque virtuelle comme disque IDE Primary Slave. Laisser le disque virtuelle d'origine configuré comme IDE Primary Master.

  3. Télécharger l'image gparted-live-0.5.1-1.iso de l'utilitaire Gnome GParted (dernière version stable disponible à l'heure où ces ligne sont écrites...) et la rendre disponible au sein de la machine virtuelle comme CD/DVD virtuel.

  4. La rendre disponible au sein de la machine virtuelle comme CD/DVD virtuel.

  5. Démarrer la machine virtuelle. Elle devrait démarrer sur le CD GParted.

  6. Démarrer Gparted en 'Safe Mode' les autres options ne semble pas fonctionner.

  7. Dans GParted, selectionner le disque 'master' (/dev/hda) et cliquer (avec le bouton droit de la souris) sur la partition système. Dans le menu contextuel, choisir 'Copier'.

  8. Sélectionner ensuite le disque 'slave' (/dev/hdc). Clique dans le menu Device > Create Partition Table... attendre quelques secondes puis cliquer (avec le bouton droit de la souris) sur la partition non allouée. Dans le menu contextuel, choisir 'Coller'

  9. Valider pour appliquer les changements. Attendre quelques minutes la fin de réplication puis éteindre la machine virtuelle.

  10. Cliquer droit sur la partition sytème récemment coller sur la disque puis 'Manage Flags' > Check 'boot'.

  11. Dans les préférences de la machine virtuelle supprimer le disque virtuel master existant et le remplacer par le disque virtuel secondaire.

  12. Redémarrer la VM.


6.4.10. Utilitaires pratique (Sysprep, NewSID, BGInfo, HVRemote) pour la gestion des VMs Windows

Source(s):

Avertissement

Pour dupliquer un machine Windows, préférer la méthode Sysprep car NewSID ne procèdent pas à tous les changements requis pour un clonage (cf. liens article ci-avant)

Lorsque l’on est amené à travailler sur des environnements divers et variés, il est souvent intéressant d’avoir sous la main les utilitaires pratiques ou ceux que l’on utilise fréquemment.

Windows Sysinternals > BGInfo : permet d’afficher en fond d’écran un très grand nombre de caractéristiques d’un ordinateur (Nom DNS, Adresses IP, RAM, Espace disque disponible, etc …). Avis donc aux utilisateurs de multiple machines virtuelles qui ont parfois du mal à s’y retrouver parmi celles-ci ;)

HVRemote : Un script créé par John Howard, chef de projet dans l’équipe Hyper-V de Microsoft, qui permet de configurer rapidement les systèmes d’exploitation Windows Vista SP1 pour que ceux-ci puissent utiliser les outils d’administration d’Hyper-V.

Windows Sysinternals > NewSID : Utilitaire très connu des administrateurs systèmes qui permet la génération de nouveaux identifiants uniques de sécurité (SID) sur les environnements Microsoft, utile lorsque l’on a à cloner des machines virtuelles non « sysprepées » mais pas conseillé car cela peut provoquer certains problèmes (WSUS, communication réseau, etc...).


6.5. Autres Logiciels

6.5.1. xournal, claws-mail, firefox, emacs, skype


2.x installation of additional software via apt-get
- xournal
- firefox
- emacs (voir chapitre TP Shell plus loin)

2.y Installation de Claws-Mail

$ sudo apt-get install claws-mail claws-mail-plugins claws-mail-extra-plugins

Configuration ?
To come... :))

2.z Installation de Skype
  

6.5.2. Installer Google Chrome (Chromium) sous Ubuntu

Source(s):

"... installer sous Ubuntu Google Chrome, ou plutôt Chromium, la version Open Source du navigateur made in Google... Chromium offre l'avantage de ne pas intégrer les différents outils de tracking de Google..."


$ sudo add-apt-repository ppa:chromium-daily
...
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring /etc/apt/secring.gpg --trustdb-name /etc/apt/trustdb.gpg --keyring /etc/apt/trusted.gpg --keyserver keyserver.ubuntu.com --recv FBEF0D696DE1C72BA5A835FE5A9BF3BB4E5E17B5
gpg: requête de la clé 4E5E17B5 du serveur hkp keyserver.ubuntu.com
gpg: clé 4E5E17B5: clé publique « Launchpad PPA for chromium-daily » importée
gpg: aucune clé de confiance ultime n'a été trouvée
gpg: Quantité totale traitée: 1
gpg:               importée: 1  (RSA: 1)

$ sudo apt-get update
Atteint http://ppa.launchpad.net karmic Release.gpg
Ign http://ppa.launchpad.net karmic/main Translation-fr                        
Atteint http://archive.ubuntu.com karmic Release.gpg                           
Atteint http://ppa.launchpad.net karmic Release.gpg                            
Ign http://ppa.launchpad.net karmic/main Translation-fr                        
Réception de : 1 http://ppa.launchpad.net karmic Release.gpg [307B]            
Ign http://ppa.launchpad.net karmic/main Translation-fr                        
Atteint http://ppa.launchpad.net karmic Release                                
Réception de : 2 http://archive.ubuntu.com karmic/main Translation-fr [427kB]  
Atteint http://download.virtualbox.org karmic Release.gpg                      
Ign http://download.virtualbox.org karmic/non-free Translation-fr              
Atteint http://ppa.launchpad.net karmic Release                                
Atteint http://download.virtualbox.org karmic Release                          
Réception de : 3 http://ppa.launchpad.net karmic Release [66,0kB]              
Atteint http://download.virtualbox.org karmic/non-free Packages                
Atteint http://ppa.launchpad.net karmic/main Packages                          
Atteint http://ppa.launchpad.net karmic/main Sources                    
Atteint http://ppa.launchpad.net karmic/main Packages                          
Atteint http://ppa.launchpad.net karmic/main Sources                     
Réception de : 4 http://ppa.launchpad.net karmic/main Packages [3 439B]  
Réception de : 5 http://archive.ubuntu.com karmic/restricted Translation-fr [3 850B]
Réception de : 6 http://archive.ubuntu.com karmic/universe Translation-fr [675kB]
Réception de : 7 http://archive.ubuntu.com karmic/multiverse Translation-fr [72,5kB]
Réception de : 8 http://archive.ubuntu.com karmic-updates Release.gpg [189B]   
Ign http://archive.ubuntu.com karmic-updates/main Translation-fr               
Ign http://archive.ubuntu.com karmic-updates/restricted Translation-fr         
Ign http://archive.ubuntu.com karmic-updates/universe Translation-fr           
Ign http://archive.ubuntu.com karmic-updates/multiverse Translation-fr         
Réception de : 9 http://archive.ubuntu.com karmic-security Release.gpg [189B]  
Ign http://archive.ubuntu.com karmic-security/main Translation-fr              
Ign http://archive.ubuntu.com karmic-security/restricted Translation-fr        
Ign http://archive.ubuntu.com karmic-security/universe Translation-fr          
Ign http://archive.ubuntu.com karmic-security/multiverse Translation-fr        
Atteint http://archive.ubuntu.com karmic Release                               
Réception de : 10 http://archive.ubuntu.com karmic-updates Release [44,1kB]    
Réception de : 11 http://archive.ubuntu.com karmic-security Release [44,1kB]   
Atteint http://archive.ubuntu.com karmic/main Packages                         
Atteint http://archive.ubuntu.com karmic/restricted Packages                   
Atteint http://archive.ubuntu.com karmic/main Sources                          
Atteint http://archive.ubuntu.com karmic/restricted Sources                    
Atteint http://archive.ubuntu.com karmic/universe Packages                     
Atteint http://archive.ubuntu.com karmic/universe Sources                      
Atteint http://archive.ubuntu.com karmic/multiverse Packages                   
Atteint http://archive.ubuntu.com karmic/multiverse Sources                    
Réception de : 12 http://archive.ubuntu.com karmic-updates/main Packages [167kB]
Réception de : 13 http://archive.ubuntu.com karmic-updates/restricted Packages [14B]
Réception de : 14 http://archive.ubuntu.com karmic-updates/main Sources [51,2kB]
Réception de : 15 http://archive.ubuntu.com karmic-updates/restricted Sources [14B]
Réception de : 16 http://archive.ubuntu.com karmic-updates/universe Packages [99,3kB]
Réception de : 17 http://archive.ubuntu.com karmic-updates/universe Sources [25,0kB]
Réception de : 18 http://archive.ubuntu.com karmic-updates/multiverse Packages [6 844B]
Réception de : 19 http://archive.ubuntu.com karmic-updates/multiverse Sources [3 820B]
Réception de : 20 http://archive.ubuntu.com karmic-security/main Packages [64,8kB]
Réception de : 21 http://archive.ubuntu.com karmic-security/restricted Packages [14B]
Réception de : 22 http://archive.ubuntu.com karmic-security/main Sources [20,4kB]
Réception de : 23 http://archive.ubuntu.com karmic-security/restricted Sources [14B]
Réception de : 24 http://archive.ubuntu.com karmic-security/universe Packages [30,4kB]
Réception de : 25 http://archive.ubuntu.com karmic-security/universe Sources [5 663B]
Réception de : 26 http://archive.ubuntu.com karmic-security/multiverse Packages [1 519B]
Réception de : 27 http://archive.ubuntu.com karmic-security/multiverse Sources [577B]
1 812ko réceptionnés en 42s (42,7ko/s)                                         
Lecture des listes de paquets... Fait

$ sudo apt-get install chromium-browser
... 
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
  linux-backports-modules-alsa-2.6.31-15-generic calendar-timezones
Veuillez utiliser « apt-get autoremove » pour les supprimer.
Les paquets supplémentaires suivants seront installés : 
  chromium-browser-inspector chromium-codecs-ffmpeg
Paquets suggérés :
  chromium-browser-l10n
Les NOUVEAUX paquets suivants seront installés :
  chromium-browser chromium-browser-inspector chromium-codecs-ffmpeg
0 mis à jour, 3 nouvellement installés, 0 à enlever et 1 non mis à jour.
1 partiellement installés ou enlevés.
Il est nécessaire de prendre 12,6Mo dans les archives.
Après cette opération, 44,0Mo d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer [O/n] ? O
Réception de : 1 http://ppa.launchpad.net karmic/main chromium-browser 5.0.330.0~svn20100216r39077-0ubuntu2~ucd1~karmic [11,7MB]
Réception de : 2 http://ppa.launchpad.net karmic/main chromium-browser-inspector 5.0.330.0~svn20100216r39077-0ubuntu2~ucd1~karmic [584kB]
Réception de : 3 http://ppa.launchpad.net karmic/main chromium-codecs-ffmpeg 0.5+svn20100202r37783+36953+37593-0ubuntu1~ucd1~karmic [295kB]
12,6Mo réceptionnés en 3min 0s (69,7ko/s)                                      d
pkSélection du paquet chromium-browser précédemment désélectionné.
(Lecture de la base de données... 240724 fichiers et répertoires déjà installés.)
Dépaquetage de chromium-browser (à partir de .../chromium-browser_5.0.330.0~svn20100216r39077-0ubuntu2~ucd1~karmic_amd64.deb) ...
Sélection du paquet chromium-browser-inspector précédemment désélectionné.
Dépaquetage de chromium-browser-inspector (à partir de .../chromium-browser-inspector_5.0.330.0~svn20100216r39077-0ubuntu2~ucd1~karmic_all.deb) ...
Sélection du paquet chromium-codecs-ffmpeg précédemment désélectionné.
Dépaquetage de chromium-codecs-ffmpeg (à partir de .../chromium-codecs-ffmpeg_0.5+svn20100202r37783+36953+37593-0ubuntu1~ucd1~karmic_amd64.deb) ...
Traitement des actions différées (« triggers ») pour « desktop-file-utils »...
Traitement des actions différées (« triggers ») pour « hicolor-icon-theme »...
Traitement des actions différées (« triggers ») pour « man-db »...
Paramétrage de slapd (2.4.18-0ubuntu1) ...
  Backing up /etc/ldap/slapd.d/ in /var/backups/slapd-2.4.18-0ubuntu1... done.
Starting OpenLDAP: slapd.

Paramétrage de chromium-browser (5.0.330.0~svn20100216r39077-0ubuntu2~ucd1~karmic) ...
update-alternatives: utilisation de « /usr/bin/chromium-browser » pour fournir « /usr/bin/x-www-browser » (x-www-browser) dans mode automatique.

Paramétrage de chromium-browser-inspector (5.0.330.0~svn20100216r39077-0ubuntu2~ucd1~karmic) ...
Paramétrage de chromium-codecs-ffmpeg (0.5+svn20100202r37783+36953+37593-0ubuntu1~ucd1~karmic) ...
Traitement des actions différées (« triggers ») pour « libc-bin »...
ldconfig deferred processing now taking place
/sbin/ldconfig.real: /usr/lib32/libstdc++.so.5 n'est pas un lien symbolique

$ sudo apt-get install adobe-flashplugin  ## Skipped car déjà fait pour Firefox

$ sudo ln -s /etc/alternatives/mozilla-flashplugin \
             /usr/lib/chromium-browser/plugins/flashplugin.so 

$ chromium-browser --enable-plugins
   

## Pour démarrer Chromium
ALT+F2

# puis
$ chromium-browser
   

6.5.4. Qutecom installation (en remplacement de X-Lite)

Source(s):


$ sudo apt-get install qutecom

# puis 
Applications > Internet > QuteCom

# ==> Application crash peu de temps apres demarrage !!!
# C'est un bug sur Ubuntu 9.10 Amd 64 confirmé 
# par cerapport de bug

# Solution pour demarrer l'application utiliser :
$ qutecom -style plastique
# au lieu de 
$ qutecom

# J'ai creer un launcher personaliser dans le panel gnome du bureau avec la commande :
usr/bin/qutecom -style plastique (sans le usr/bin/ cela ne marche pas)

# En cas de probleme faire un :
$ killall qutecom 

# Puis re-essayer...

6.5.6. NetBeans (IDE) installation

Source(s):

Je choisi l'installation pour coder en PHP seulement (dans un premier temps) :


$ wget http://www.mirrorservice.org/sites/download.netbeans.org/6.8/bundles/netbeans-6.8-ml-php-linux.sh 
$ chmod +x netbeans-6.8-ml-php-linux.sh 
$ sudo ./netbeans-6.8-ml-php-linux.sh 

# ==> Erreur! L'installation requiert la presence de Java6 JDK
# Donc je l'installe...

$ sudo apt-get install sun-java6-jdk
# ==> J'accepte la licence (pas le choix!)

# Puis je retente l'installation
$ sudo ./netbeans-6.8-ml-php-linux.sh 

# L'installeur (Wizard) Netbeans s'ouvre alors en mode graphique...

# Install Netbean IDE to
# /usr/local/netbeans-6.8

# Le logiciel s'installe :)
# Une fois complete je demarre :)

$ bin/sh "/usr/local/netbeans-6.8/bin/netbeans"


6.5.7. xmlcopyeditor installation

Sous Ubuntu 9.10 64bits il semble que la compilation depuis les sources s'impose...

A voir plus tard...

Voir aussi la section dédié aux éditeurs XML.


6.6. Désactiver l'IPv6 sur Ubuntu 9.10

Source: Linux Ubuntu desactiver le support ipv6

Avant d'effectuer cette manipulation, assurez-vous d'avoir bien compris le pourquoi du comment en lisant cet article : Desactiver ipv6 permet d'accélérer les connexions Internet

Pour désactiver le support IPv6 dans Ubuntu, il existe deux solutions.


6.6.1. Méthode 1: Éditer /etc/modprobe.d/blacklist

Éditez le fichier /etc/modprobe.d/blacklist :


$ gksu gedit /etc/modprobe.d/blacklist.conf

Ajoutez à la fin de ce fichier la ligne :


blacklist ipv6

puis redémarrez votre système.


6.6.2. Méthode 2: via GRUB

Pour Ubuntu 9.10, IPv6 peux être desactivé par le grub :


$ gksu gedit /etc/default/grub
Changer cette ligne

GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”
en

GRUB_CMDLINE_LINUX_DEFAULT=”ipv6.disable=1 quiet splash”
Puis , mettre a jour grub :

$ sudo update-grub

puis redémarrez votre système.


6.6.3. Comment s'assurer que IPv6 est désactivé ?

Pour vous assurer que IPv6 est désactivé, tapez dans un terminal :


$ ip a | grep inet6

Si cette commande ne retourne aucune ligne, c'est que IPv6 est bien désactivé.


6.7. Debian Live sur une clef USB

Source(s):

Les images (.img) des versions Debian Live pour clef USB sont disponibles à http://cdimage.debian.org/cdimage/release/current-live/i386/usb-hdd.

Ma clef USB est identifiée sur mon système GNU/Linux comme étant le périphérique /dev/sdc. Utiliser Disk Utilisty ou gparted pour identifier votre clef avec une référence système (/dev/sdb, /dev/sdc, etc...).

Important

L'opération dd ci-dessous :


- efface complètement les données existante sur le périphérique de destination (ici /dev/sdc) et donc votre clef... vous êtes prévenu :)
- rend la clef illisible sous Windows à priori !


$ cd /tmp
$ wget http://cdimage.debian.org/cdimage/release/current-live/i386/usb-hdd/debian-live-504-i386-lxde-desktop.img
$ sudo dd if=debian-live-504-i386-lxde-desktop.img of=/dev/sdc   # Ici /dev/sdc est la référence de ma clef USB, 
                                                                 # à addapter pour correspondre a votre système

# Ensuite être très patient et attendre le retour automatique au prompt !!!
# Le transfert peut prendre plusieurs minutes.

Note

L'image contient par défaut deux partitions une pour le système, une autre non formattée pour les données éventuellement.

Là encore gparted ou Disk Utility peuvent être utilisé en mode graphique pour formatter la partition de données. Pour ma part j'ai formaté en FAT32 pour rester totalement compatible avec Windows.

Puis il suffit de démarrer un ordinateur depuis la clef USB nouvellement ré-initialisée. Et voilà :)


Chapitre 7. SR001 Commandes GNU/Linux (Shell)

Source(s):


7.1. SYS01: Système de fichier HFS


Sources: 
Sys01-sgf.pdf from EOF
http://pathname.com/fhs/pub/fhs-2.3.html
http://fr.wikipedia.org/wiki/Linux_Standard_Base

Filesystem Hierarchy Standard (« norme de la hiérarchie des systèmes de fichiers », 
abrégé en FHS) définit l'arborescence et le contenu des principaux répertoires des 
systèmes de fichiers des systèmes d'exploitation GNU/Linux et de la plupart des systèmes Unix.

La version actuelle est la 2.3, publiée en janvier 2004.

Ca fait partie de la Linux Standard Base (abréviation : LSB) est un projet joint par nombre de
 distributions Linux sous la structure organisationnelle du Free Standards Group afin de 
concevoir et standardiser la structure interne des systèmes d'exploitation basés sur GNU/Linux. 
La LSB est basée sur les spécifications POSIX, la « spécification unique d'UNIX », ainsi que 
sur d'autres nombreux standards ouverts, mais l'étend dans certains domaines.

D'après eux :

    « Le but du LSB est de développer et promouvoir un ensemble de standards qui augmenteront 
la compatibilité entre les différentes distributions Linux et permettront aux applications de 
s'exécuter sur n'importe quel système conforme au LSB. De plus, la LSB aidera à coordonner les 
efforts des vendeurs de logiciels pour porter et réaliser des produits pour Linux. »

La conformité à la LSB pour un produit doit être certifié par une procédure. La réalisation de 
cette dernière appartient à l'Open Group en coopération avec le Free Standards Group.

La LSB spécifie par exemple :

    * un ensemble de bibliothèques standards,
    * un nombre de commandes et d'utilitaires qui étendent le standard POSIX,
    * la structure de la hiérarchie du système de fichiers,
    * les différents run levels,
    * et plusieurs extensions à X Window System.


y'a-t-il une différence entre /bin, /sbin, /usr/bin, et /usr/sbin ? 
(le tableau et la suite y répondent mais j'ai tout de même du mal à 
voir la différence entre "Commandes binaires essentielles" et "Binaires systèmes essentiels")

il y a une différence entre chacun des dossiers que tu cites.

/bin, Essential user command binaries (for use by all users)
ce sont des commandes essentielles au démarrage, mais pas lié à un
usage avec des droits spécifiques, comme ceux de root.
Contains commands that may be used by both the system administrator and by users,
 but which are required when no other filesystems are mounted (e.g. in single user mode).
 It may also contain commands which are used indirectly by scripts.
There must be no subdirectories in /bin.


/sbin (System binaries), c'est essentiel au démarrage, mais ce sont des commandes qui
nécessitent des droits privilégiés. Comme ifconfig ou iptables. Par
exemple, si tu tapes "/sbin/iptables -L" sans être root, il va t'envoyer
péter.

Utilities used for system administration (and other root-only commands) are stored in 
/sbin, /usr/sbin, and /usr/local/sbin. /sbin contains binaries essential for booting, 
restoring, recovering, and/or repairing the system in addition to the binaries in /bin. 
[18] Programs executed after /usr is known to be mounted (when there are no problems) are 
generally placed into /usr/sbin. Locally-installed system administration programs should be 
placed into /usr/local/sbin. 

/usr is the second major section of the filesystem. /usr is shareable, read-only data. 
That means that /usr should be shareable between various FHS-compliant hosts and must not
be written to. Any information that is host-specific or varies with time is stored elsewhere.

Large software packages must not use a direct subdirectory under the /usr hierarchy.

C'est une arborescence secondaire, un second file system. Il peut
être monté, c'est à dire séparé au démarrage et les binaires sont non
essentiels au démarrage, c'est à dire avant le montage des disques.

En gros, si tu bootes sur un linux single (mode où aucune partition n'est
montée et où les applis ne sont pas démarrées), il vaudra mieux pour toi
que tu aies tes applis essentielles, alors que tu n'as rien à cirer de ce
qui n'est pas là...

Mais aussi /usr/local/bin, /usr/local/sbin
et aussi
~/bin

dans /usr/local on peut mettre des applications qui ne sont pas (ou mal)
gérées par le système de paquet, ça permet de sauvegarder/restaurer une
arborescence indépendante.

Pour le ~/bin, ça permet d'installer une application quand on est pas root, ou
de réaliser des tests sans risquer de véroler toute la machine.

 AM

ps : Le ~ correspond au $HOME, c'est à dire par défaut /home/foo pour le
compte foo

Il faut aussi
savoir que les distributions (au moins majeures) suivent un standard pour
être d'accord sur ce qu'elles font (le nom spécifique du standard
m'échappe à la minute). LSB ?
http://fr.wikipedia.org/wiki/Linux_Standard_Base

Tu peux faire ce que tu veux, mais tous les acteurs vont se baser sur le
FHS. Par exemple, tu pourrais très bien avoir /etc sous un répertoire
/config, mais tous les softs que tu installent iraient sous /etc.

On est libre de tout faire, mais après, faut tout gérer :)

> Autre question, qui est peut être hors sujet, j'ai constaté que le
> dossier /opt n'était que peu (voire pas du tout, en ce qui me
> concerne, sur ma machine personnelle, ni sur mes trois serveurs)
> utilisé sur Debian. Je m'interrogeais là dessus aussi, parce que je
> trouve qu'au niveau organisationnel, ce dossier est intéressant.

Perso, je ne m'en sers pas, je me suis toujours servi de /usr/local.

Par contre, sur des unices que j'ai administré, j'ai vu des gens se servir
de /opt.

Là, c'est franchement une question de goût...


The /etc hierarchy contains configuration files. A "configuration file" is a local file 
used to control the operation of a program; it must be static and cannot be an executable 
binary. No binaries may be located under /etc.

/lib : Essential shared libraries and kernel modules
The directory contains those shared library images needed to boot the system and run the 
commands in the root filesystem, ie. by binaries in /bin and /sbin. [12]

/lib/modules/	Directory for Loadable kernel modules (optional)

/lib<qual> : Alternate format essential shared libraries (optional)
There may be one or more variants of the /lib directory on systems which support more 
than one binary format requiring separate libraries.
This is commonly used for 64-bit or 32-bit support on systems which support multiple 
binary formats, but require libraries of the same name. In this case, /lib32 and /lib64 
might be the library directories, and /lib a symlink to one of them.

/media : Mount point for removeable media
Purpose
This directory contains subdirectories which are used as mount points for removeable media 
such as floppy disks, cdroms and zip disks.
Tip	Rationale
Historically there have been a number of other different places used to mount removeable 
media such as /cdrom, /mnt or /mnt/cdrom. Placing the mount points for all removeable media 
directly in the root directory would potentially result in a large number of extra directories 
in /. Although the use of subdirectories in /mnt as a mount point has recently been common, it 
conflicts with a much older tradition of using /mnt directly as a temporary mount point.

Specific Options

The following directories, or symbolic links to directories, must be in /media, if the 
corresponding subsystem is installed:

Directory	Description
floppy	Floppy drive (optional)
cdrom	CD-ROM drive (optional)
cdrecorder	CD writer (optional)
zip	Zip drive (optional)

On systems where more than one device exists for mounting a certain type of media, 
mount directories can be created by appending a digit to the name of those available 
above starting with '0', but the unqualified name must also exist. [16]

A compliant implementation with two CDROM drives might have /media/cdrom0 and /media/cdrom1 
with /media/cdrom a symlink to either of these.

File System Commands
mkfs (MaKe File System)
formater une partition
mkfs -t ext3 /dev/sda3 [format partition sda3 avec le format de fichier ext]
Il faut déterminer quel système de fichiers (filesystem) on souhaite utiliser (vfat, ext3, xfs. . .)
man mkfs donne la liste des systèmes de fichiers supportés et disponible sur le system

mount
monter (ajouter ou insérer) un volume formaté
mount /dev/sda3 /mnt/sda3

umount
démonter (enlever) un volume formaté
umount /mnt/sda3

mkdir (MaKe DIRectory)
creer un repertoire
mkdir /mnt/sda3
  
Les périphériques externes (disques, clé, CDROM. . .) se montent et se démontent de la même façon.

      Il est toujours conseillé de démonter proprement un périphérique monté en 
lecture/écriture afin d’éviter
de perdre des données. En effet, Linux utilise un système de cache. Le fait de démonter un périphérique
permet de s’assurer que les données contenues dans le cache sont bien écrites sur le 
disque. Certains systèmes
de fichiers, comme Vfat ne synchronisent les données que lors du démontage, dans ce cas, 
il est primordial
d’effectuer l’opération.
      Notez aussi que pour démonter un périphérique, aucun processus ne doit plus l
’utiliser. Si le démontage
vous est refusé c’est généralement parce qu’un processus utilise encore le périphérique, 
ou plus simplement
que vous vous trouvez dans le répertoire.

FSTAB
Le système comporte une table des volumes qu’il doit monter automatiquement au démarrage. 
Cette table est décrite dans le fichier /etc/fstab. Si vous souhaitez que le volume /dev/sda3 
soit monté automatiquement lors du démarrage, il faudra ajouter une ligne dans ce fichier 
concernant le volume qui pourrait être du type :

/dev/sda3 /mnt/sda3 ext3 defaults 0 0

FSTAB du Host Ubuntu:
# /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
# / was on /dev/sda4 during installation
UUID=d1af4bfa-301c-471d-850f-3f156773a4ce /               ext4    errors=remount-ro 0       1
# swap was on /dev/sda5 during installation
UUID=fc73e057-5016-468f-b8eb-818130c258e9 none            swap    sw              0       0
/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto,exec,utf8 0       0

FSTAB de la VM Debian:
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/hda1       /               ext3    errors=remount-ro 0       1
/dev/hda5       none            swap    sw              0       0
/dev/hdc        /media/cdrom0   udf,iso9660 user,noauto,exec     0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0
vmdebian	/mnt/filosteneUbuntu	vboxsf	rw,uid=1000	0	0  
 

7.2. SYS01: Base

7.2.1. Processus

Source(s):

Se refferer au Dictionnaire de Commande que j'ai créé... Pour chaque commande vous pouvez utiliser l’aide des manuels avec la commande man.


7.2.2. Commande de base sous Linux

Source(s):


7.2.2.2. grep

Cette commande recherche dans les fichiers ou sur son entrée standard des lignes de texte qui satisfont l'expression rationnelle (ou régulière, regexp) indiquée. Sa sortie peut être redirigée dans un fichier.

Syntaxe:


$ grep [options] expreg [fichiers]
    

Options:

  • -c donne seulement le nombre de lignes trouvées obéissant au critère

  • -l donne seulement le nom des fichiers où le critère a été trouvé

  • -v donne les lignes où le critère n'a pas été trouvé

  • -i ne pas tenir compte de la casse (ne pas différencier majuscules minuscules)

  • -n pour n'afficher que les numéros des lignes trouvées

  • -w pour imposer que le motif corresponde à un mot entier d'une ligne

Constructions: grep est souvent inclus dans un tube qui lui fournit en entrée le fichier à étudier.

Exemple:


$ cat /etc/passwd | cut -d: -f1 | grep -w "jean" > sortie
    

7.2.2.3. ps

desctription


ps affiche la liste des processus en cours d’exécution. C’est une commande qui se passe des ’-’ devant
   les options. Voir aussi les commandes pstree et pstree.x11 qui donnent une représentation hiérarchique des
   processus.
    ps fx | grep pts/7
1
    25262 pts/7          Ss      0:00   \_ /bin/bash
2
    25276 pts/7          S       0:00        \_ ksh
3
      3 http://www.pool.ntp.org/
Module sys02 - Programmation shell/système                                                                   13
                                                                                                           XX. sort
   25278 pts/7         R       0:00             \_ bash
4
   25314 pts/7         R+      0:00                  \_ ps fx
5
   25315 pts/7         S+      0:00                  \_ grep pts/7
6
        Ici on voit une console shell (bash) dans laquelle on a activé un shell ksh, dans lequel on a encore activé
  un shell bash et enfin dans lequel on a lancé une commande. L’exemple ne présente pas grand intérêt si ce
  n’est de montrer comment les processus sont affiliés à un processus parent. Arrêter le processus 25262 revient
  à arrêter tous les processus enfants.

   

7.2.2.4. kill & killall


kill permet d’envoyer un signal à un processus identifié par son numéro de processus (PID). (Voir la
  commande ps).
   ps u
1
   USER          PID %CPU %MEM       VSZ    RSS TTY          STAT START    TIME COMMAND
2
   mlx         6607    0.0   0.1    4688   2096 pts/0        Ss    Aug22   0:00 /bin/bash
3
   # Arrêter le processus N° 6607
4
   kill -9 6607
5
   # Donne la liste des signaux
6
   kill -l
7
       On peut s’amuser avec les signaux. Créer un script foo.sh dans /tmp contenant le code suivant :
   while [ 1 == 1 ]; do
1
      sleep 2
2
      echo coucou
3
   done
4
       et vous le lancez. Dans une autre console, identifiez avec ps son numéro de processus :
   ps aux | grep foo
1
   mlx        24792    0.0   0.0    4280   1464 pts/5        S+    11:12   0:00 sh ./foo.sh
2
   # Stopper le processus
3
   kill -sigtstp 24792
4
5
   # Relancer le processus
6
   kill -sigcont 24792
7  

7.2.2.5. ln : liens matériels (hard link) / liens symboliques (soft links)

Source(s):

Les liens matériels (pointe vers les données d'un fichier) sont notemment utiles pour réaliser des sauvegarde de données par snapshot (voir section dédiée ci-après. S'apparente à des "copie/alias" d'un même fichier.

Les liens symbolique (pointe vers le noms d'un fichier, une référence) s'apparente à des alias/raccourcis vers des noms de fichiers (pas le fichier lui même).


7.2.2.6. whereis

Rechercher les fichiers exécutables, les sources et les pages de manuel d’une commande.


$ whereis mysql
mysql: /usr/bin/mysql /etc/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz
   

7.2.2.7. which

Localiser une commande.


$ which mysql
/usr/bin/mysql

$ which php5
/usr/bin/php5

# which shutdown
/sbin/shutdown
   

7.2.3. Redirection des entrées/sortie (flux)

Source(s):

Redirection entrées/sorties :


$ ls >resultat_ls   # Rediriger la sortie standard, fichier écrasé
$ ls >>resultat_ls  # Concatenation, fichier complété

$ ls 1>resultat_ls  # Syntaxe complète, signe précédés de ID du flux à rediriger
$ ls 1>>resultat_ls # 1 = sortie standard
                    
$ ls 2>erreurs_ls  # Rediriger la sortie d'erreur standard 
$ ls 2>>erreurs_ls # 2 = sortie d'erreur standard

$ cat < mon_fichier.txt        # Rediriger l'entrée standard
                               # Entrer des données provenant d'un fichier au lieu du clavier.
$ ls 2>&1 1>stdout_stderr.txt  # Rediriger un flux vers un autre 
                               # Sortie erreur vers standard

$ ls 2>&3 1>&2 3>&1  # Échange des deux flux de sortie 
                        # 3 est un flux fictif intermediaire
    

Le pipe (un tube) :


# Redirige la sortie d'une commande vers l'entrée d'une autre commande. 
$ du | sort -rn  # Afficher la taille des fichiers et répertoires
                 # triés du plus grand au plus petit

$ du | sort -rn | more   # Même résultat, mais affiché page par page

$ ls -1 /usr/bin | wc -l # Connaître le nombre 
                         # de fichiers du répertoire /usr/bin 

$ dmesg | grep hd | more # Connaître tous les périphériques IDE détectés 
                         # par le noyau Linux et les afficher page par page

# Extraire l'adresse IP de la carte réseau eth0
$ ifconfig eth0 | grep 'inet adr' | cut -f2 -d':' | cut -f1 -d' '
 192.168.30.50
   


7.3. SYS01: Sauvegarde et archivage (Backup)

7.3.1. Introduction

Source(s):

"... Votre ordinateur, quel qu’en soit la marque, n’est pas à l’abri d’une déficience matérielle..."

"...Pour éviter de n’avoir que vos yeux pour pleurer, il faut mettre en place des redondances de données, encore appelées sauvegardes.

Il existe pour quantité de solutions dont:


– le système RAID, qui repose sur des capacités matérielles,
– la synchronisation, à la portée de tout un chacun ou presque,
– le robot de sauvegarde, réservé d’avantage aux entreprises qu’aux particuliers.
    

De tel système peuvent être combiné au sein d'une politique de sauvegarde.


7.3.2. Le système RAID (sauvegarder un poste)

Source(s):

Le RAID Redundant Array of Independent Disks est un système basé sur la redondance matérielle gérée par une couche logicielle. Il possède cinq possibilités d’associations différentes suppléées de deux propriétés.

Ce système ne protège cependant pas en cas d’incendie ni de vol de la machine.


7.3.3. La synchronisation (sauvegarder un poste)

C'est moyen entièrement logiciel de faire une copie de sécurité de vos système. La synchronisation locale ou distante vous assure l’intégrité de vos données et la réplication de celles-ci.

Sous linux, l’outil rsync qui permet aussi bien une copie locale qu’une copie distante, sur une couche chiffrée avec un apport de compression, une gestion des droits et une utilisation en différents modes : backup, archive ou personnalisé.

Intérêts majeur :


– automatisation totale de la tâche à l’aide d’une crontab
– nul besoin d’être root ou d’avoir un service dédié pour s’en servir
   


7.3.4. rsync - synchronisation/snapshot par copie (lien matériel - hard link)

Source(s):

Adéquate pour des (petits) fichiers qui ne changent pas souvent

rsync est un outil pour copier des fichiers à distance (ou localement) de façaon fiable, rapide et flexible

Utilisation de RSYNC :


### 
# Exemple pour la plublication de mon journal:
# Exclusion: ne pas transférer les documents créés par l'ÉOF (dans tout dossier eof/ ni les fichier temporaire *~
# Synchroniser: Effacer à la destination tous les fichiers existant qui n'existerais pas ou plus à la source (incluant les exclus)
rsync -av --del --delete-excluded --exclude='*/eof/' --filter="- *~" /mnt/hsubuntu/monjournal/public_html/ rlr@ferry.eof.eu.org:public_html
    

## Script de sauvegarde de mon repertoire home vers disque dur externe
#!/bin/bash
# Proper header for a Bash script.
BIN="/usr/bin"
rldate=`date +"%Y-%m-%d"`
media="/media/Transcend" # /media/SILVERKEY16
destination="$media/filostene-$rldate.bkp"

$BIN/rsync -Cavh --progress --exclude '*~' --exclude '.VirtualBox' 
      --exclude '.VirtualBox' --exclude '*.disk' 
      --exclude 'Documents/netkit/*' --exclude 'VirtualBox-VM-Backup' 
      --del --delete-excluded . $destination 

## Script de synchronisation de mon journal vers le serveur Éof
#!/bin/bash
$BIN/rsync -av --del --delete-excluded --exclude='*/eof/' 
      --filter="- *~" ${dir_dest} rlr@ferry.eof.eu.org:public_html
   

## Créez ensuite une tâche dans la crontab 
## qui exécute la sauvegarde toutes les dix minutes.
$ crontab -u filostene -e
*/10 * * * * /bin/sh /home/filostene/crontabscripts/backup.sh

   

Note

Vaut mieux utiliser des chemins absolus y compris pour l'appel des scripts ou des binaires. La raison en est que si on lance un script dans un shell, la commande tient compte de du $PATH, mais il peux y avoir des contextes où il n'y a pas de $PATH (ou incomplet).


## La commande devient donc : 
/usr/bin/rsync  # équivaut à $(which rsync)

## Pour faire un script portable (*nix) 
déclarer BIN="/usr/bin" puis 
utiliser $BIN/

## Pour chaque binaire, 
## utiliser également une variable
IPT=/sbin/iptables

## Variables avec des chemins absolus, 
## construite à partir de variables
SBIN=/sbin
IPT=$SBIN/iptables
...
  

7.3.5. rsync - Interface Web, Frontend, Outil GUI

Source(s):

grsync, Backup Monitor, QSync, Zynk, rsyncbackup, TKsync...


7.3.7. rsnapshot - Sauvegarde incrémentale par instantanné (snapshot)

Source(s):

rsnapshot est une application en ligne de commande de sauvegarde, basée sur rsync, et écrit en PERL.

C’est un logiciel libre sous licence GNU GPL.

Il permet de programmer la prise régulière d'instanné (snapshot) de donnée : sauvegarde incrémentale

Il permet prendre des instantanés (snapshot) des systèmes de fichiers à différents instants : Sauvegarde incrémentale.

Utilisant les liens matériel, rsnapshot créé l'illusion de l'existance de multiples sauvegardes complétes, tout en n'occupant que la place d'une seule plus les différences. Couplé avec ssh, il est également possible de prendre des instantanés de systèmes de fichiers distants. Ce document est un tutoriel d'installation et de configuration de rsnapshot.

Transparency : all versions of the backup are accessible as plain files.


7.3.8. rdiff-backup - synchronisation/snapshot par diff (delta compressé)

Source(s):

Adéquate pour de gros fichiers qui changent souvent

Transparency : only the current backup is accessible as plain files. Previous versions are stored as rdiff deltas. But there is a FUSE implementation called archfs that allows you to mount all snapshots in a read-only filesystem.


7.3.9. rdiff-backup versus rsync/rsnapshot

Source(s):

rdiff-backup is a program written in Python and C that uses the same rolling-checksum algorithm that rsync does. Although rdiff-backup and rsync are similar and use the same algorithm, they do not share any code and must be installed separately. When backing up, both rsnapshot and rdiff-backup create a mirror of the source directory. For both, the current backup is just a copy of the source, ready to be copied and verified like an ordinary directory. And both can be used over ssh in either push or pull mode. The most important conceptual differences between rsync-snapshots and rdiff-backup is how they store older backups and how they store file metadata. An rsync-snapshot system basically stores older backups as complete copies of the source. As mentioned earlier in the chapter, by being clever with hard links, these copies do not take long to create and usually do not take up nearly as much disk space as unlinked copies. However, every distinct version of every file in the backup is stored as a separate copy of that file. For instance, if you add one line to a file, or change a file’s permissions, that file is stored twice in the backup archive in its entirety. This can be troublesome especially with log files, which grow slightly quite often. On the other hand, rdiff-backup does not keep complete copies of older files in the backup archive. Instead, it stores only the compressed differences between current files and their older versions, called diffs or deltas. For log files, rdiff-backup would not keep a separate copy of the older and slightly shorter log. Instead, it would save a delta file to the archive, which contains the information “the older version is the current version, but without the last few lines.” These deltas are often much smaller than an entire copy of the older file. When a file has changed completely, the delta is about the same size as the older version (but is then compressed). When an rdiff-backup archive has multiple versions of a file, the program stores a series of deltas. Each one contains instructions on how to construct an earlier version of a file from a later one. When restoring, rdiff-backup starts with the current version and applies deltas in reverse order.

"... rdiff-backup, for me, was the inablility to perform different levels of backup, such as hourly, daily, weekly, monthly, etc. compared to rsnapthot..." Source: rsnapshot vs. rdiff-backup (vs. Time Machine)

Source: "http://ubuntuforums.org/showthread.php?t=223281" rsync just mirrors, so if you backup nightly, make a change on tuesday, make another change on wednesday and on thursday you want to revert to tuesdays backup because wednesdays changes were borked, you can't. With rdiff-backup you can. However, it ultimately depends on what you are backing up though. If you are backing up files which do not change much e.g. photos, music and video, then rsync may be better. I use a combination of both, rdiff-backup for nightlys of /home and rsync for media (photos, movies, mp3 etc). rdiff-backup works brilliantly for backing up to an external device. You cannot however, then do an rdiff-backup from the backup to a third device as I have been doing with rsync to keep things extra safe. It fails because of the special rdiff directory in the first backup. However, it is safer than rsync, as I still concern myself with running the wrong scripts and getting all the file additions and deletions in reverse. So I'm now trying to decide if one backup on my external drive is enough and to use rdiff-backup instead of rsync with two backups. I use rdiff-backup for incremental backups every day and once a month I make a whole backup by using partimage or mondo. There are several possibilities. Just a question of tastes.


7.3.10. Le robot de sauvegarde (sauvegarder un parc de machines)

C'est en général une machine pilotée par un logiciel, capable d’inscrire les sauvegardes sur bande magnétique, de manière totale ou incrémentale.

Un robot est en mesure de sauvegarder un parc de machines.

AMANDA (The Advanced Maryland Automatic Network Disk Archiver) : logiciel de sauvegarde libre développé par l’Université du Maryland

C'est une solution qui peut faire gagner du temps pour un parc de machine important.


7.3.11. Multi-archivage sous linux (TAR, SPLIT et CAT)

Source(s):


## Transforme votre repertoire toto/ 
## en une serie d'archives toto.aa toto.ab etc... de 1m chacune
$ tar -z -c toto/ | split -b 1m - toto.

## et pour faire l'opération inverse :
$ cat toto.* > toto.tar
    

7.4. Restauration de donnees (data recovery) / Récupération de données après un crash disque !


7.4.2. Suite à un accident inopiné : Quoi faire ! Quoi ne pas faire...!

Suite à un accident inopiné (chute du portable Apple au sol, mais à plat heureusement !), quand bien même la plupart du matériel n'a pas été endomagé (du moins en apparence !), il est devenu impossible de démarrer le système. Aucun des sytème installé ne veut démarrer après le chargeur de système (boot loader)... Forte chance que le disque dur est pris un gros coup à moins que ce ne soit la mémoire ou la carte mère !!!

Note

C'est dans ces cas là que l'on est content d'avoir une sauvegarde à jour et fonctionnelle :))

Malheureusement étant en déplacement, ma dernière sauvegarde date de quelques jours déjà et je souhaiterais récupérer quelques fichiers sur lesquels j'ai travaillé ce jour... de l'accident !

Par ailleurs, il est toujours bon de tenter une récupération de donnée pour plusieurs raisons :

- Pour le challenge que cela représente pour un informaticien !

- Aguérir son experience en matière de restauration... selon l'adage : "ce qui ne nous détruit pas nous renforce !"

- Une occasion inespéré de pouvoir tester tout type de solution libre :)

- Une meilleure garantie (limitée) d'avoir des données récupérées si pour raison X ou Y la restauration depuis la sauvegarde ne fonctionne pas à 100% ou certains fichiers n'ont pas été sauvegardés comme il se doit :)

Bref il y a toujours plein de bonnes raisons à vouloir restaurer des données d'un disque "crashé", transformons donc cet évènement horreur/malheur en un "success story !"

On s'en serait bien passé c'est clair, mais face à l'état de situation c'est la chose à faire ! Dans le malheur restons positif !!!

Important

NE PAS ESSAYER DE REPARER LE DISQUE !!! Cela pourrait rendre impossible la récupération de données !

Les premières chose à faire dans un tel cas est de :

-minimiser l'utilisation du disque dur au maximum pour maximiser les chances de récupération,

-tenter dès que possible de copier les données de facon binaire (disque-a-disque, partition-a-partition) vers un autre disque sain de même taille ou supérieure sur lequel la réparation, récupération et montage de données seront effectués.

Un rapide saut au magasin Apple confirmera que le disque dur est la source du problème (quoi que pas totalement inaccessible ouf !), en effet le portable démarre convenablement à partir de Max OS X installé sur un disque dur externe ou d'un CD Linux Live !

Le disque dur endomagé est accessible (c'est positif) mais lors de la vérification du disque dur de nombreuse erreurs apparaissent :(((

Note

Si le disque dur est inaccessible ou devient rapidement inaccessible, le seul recourt possible c'est de l'envoyer à une entreprise spécialisée dans la restauration des données. Cela coûte (très) cher mais cela reste une option possible. En effet, de telles entreprises sont capables d'extraire physiquement les disques physique où sont stockées les données et de les installer dans un autre boitier de disque dur similaire. Ceci peut permettre de pallier un défaut mécanique du disque dur et d'accéder aux données potentiellement récupérables.

La deuxième chose à faire c'est de disposer d'un espace disque sain vers lequel la copie binaire du disque endomagé (ou de l'une de ses partitions peut-être effectué. J'achète donc un nouveau disque dur interne (de plus grande taille que l'ancien :) et un boitier de disque dur 2.5 pouces externe pour pouvoir y installer le disque endomagé et y accéder via port USB.

Note

En interne, les ordinateurs Apple n'ont qu'une seule interface disque.

La troisième chose à faire c'est de télécharger et graver un système d'exploitation en Live CD permettant de démarrer l'ordinateur sans aucun système installé sur le disque dur ! (Voir lien en tête de cette section).

Note

Toutes mes tentatives pour démarrer l'ordinateur à partir d'une clef USB ou d'un disque dur externe USB ne contenant pas Mac OS X ont échoué. Apparement, le "BIOS" d'Apple n'autorise pas cet possibilité !

Le live CD est donc le meilleur choix.

A ce stade on passe au chose sérieuse et on mets les mains dans le cambouis...


7.4.3. Restauration de données - Étape par étape...

Note

Il est recommandé de bien lire les chapitres précédant avant de lire ce qui suit...

Ma première idée était de réparer le système de fichier à partir du Live CD, mais une fois encore, c'est une très mauvaise idée et le meilleur moyen de perdre toutes les données !

Comme déjà mentionné, la meileur chose à faire c'est une copie binaire du disque (ou partition) endomagé vers un nouveau disque (de taille egale ou supérieur).

Ma seconde idée c'était de cloner le disque avec l'outil Clonezilla. Mais ce fut bien entendu un echec.

Puis j'ai découvert (g)ddrescue (GNU Rescue) une version améliorée de la commande dd car elle permet une gestion optimal des erreurs de copie binaire !

Important

La procédure décrite ci-dessous n'a pas été écrite au fur et à mesure des opérations effectuées mais de mémoire plusieurs jours après les opérations donc il se peut qu'elle ne soit pas totalement exact... mais donne un bon ordre d'idée si c'était à refaire !

Aucune garantie que cela marche pour vous !!!

Procédure de récupération :


## Opération physique sur les disques
# Eteindre l'ordinateur
# Fermer/Replier l'écran
# Retourner l'ordinateur et dévisser en dessous pour accéder aux composants internes
# Dévisser/Enlenvé delicatement le disque interne endomagé (ceci requiert des tournevis spécifique en étoile)
# Installer le nouveau disque en interne en lieu et place de l'ancien disque
# Refermer l'ordinateur (revisser toutes les vis!)
# Installé l'ancien disque endomagé dans le boitier externe USB
# Branché le boitier sur l'ordinateur via un cable USB 

## Démarrer depuis un Live CD
# Télécharger/Graver puis démarrer depuis un Live CD GNU/Linux
# Pour ma part je choisi la version Ubuntu Netbook Edition 10.04 LTS 64bits
# qui vient tout juste d'être publiée
# Une occasion de pouvoir voir à quoi elle ressemble 
# et comment elle se comporte sur un ordinateur Apple :))
# Pour plus d'infos consulter la page dédiée : 
# Ubuntu Netbook Edition
# Une fois sur le bureau...

## Brancher une clef USB en plus (optionelle mais conseillé)
# Ceci va permettre de stocker des informations persistantes
# En effet avec un Live CD, toute données sauvegardée est perdu au redémarrage
# Pour la suite, supposons que la clef est accessible via /media/clefusb

## Obtenir des informations sur les disques (endomagé et nouveau)
# [Note: gparted ne permet pas d'accéder aux informations du disque endomagé]
# alternativement, via  
menu System > Administration > Disk Utility (Palimpsest Disk Utility)
# J'observe que mon disque : 
# - nouvau (en interne) est référencé comme étant /dev/sda
# - endomagé (en externe) est réferencé comme étant /dev/sdd
# Obtenir des informations détaillées sur le disque endomagé
$ parted -l /dev/sdd >> /media/clefusb/disque.txt
$ fdisk -l /dev/sdd >> /media/clefusb/disque.txt
$ fdisk -lu /dev/sdd >> /media/clefusb/disque.txt
# Voici mon fichier de log pour info : 
disque.log
# On voit bien les informations détaillées sur les partitions 
# et les sectors de début et fin de chacune.
# C'est une information qui peut eventuellement être utile, à conserver...

## Installer gddrescue

# Installer le paquet
$ sudo apt-get install gddrescue

# ou alernativement, compiler depuis le source
$ cd /media/clefusb
$ wget http://ftp.gnu.org/gnu/ddrescue/ddrescue-1.12.tar.gz  # Version d'Avril 2010
$ tar -xvzf ddrescue-1.12.tar.gz
$ cd ddrescue-1.12
$ sudo apt-get install g++                                   # Requis pour la compilation du program
$ ./configure
$ make							     							
$ make install                                               # Si action precedente est un succes :)

## Utiliser ddrescue (c'est le nom de la commande à utiliser) 
## Comme indiqué dans le manuel en ligne
$ sudo ddrescue -n /dev/sdd /dev/sda /media/clefusb/ddrescue-logfile.log
# puis 
$ sudo ddrescue -dr3 /dev/sdd /dev/sda /media/clefusb/ddrescue-logfile.log
# Ces opérations peuvent prendre des heures voir des jours !!!
# C'est pourquoi il est recommandé d'identifier la partition sur laquelle
# les données à restaurer sont localisées pour réduire la quantité de bits à traiter...

# Donc alternativement on pourrait faire quelque chose du genre
$ sudo ddrescue -n /dev/sdd4 /dev/sda1 /media/clefusb/ddrescue-logfile.log
# puis 
$ sudo ddrescue -dr3 /dev/sdd4 /dev/sda1 /media/clefusb/ddrescue-logfile.log
# Où /dev/sda1 représenterais la première partition existante 
# (de taille égale ou supérieure à /dev/sdd4) sur le nouveau disque
# Disk Utility peut-être utiliser pour créer cette partition /dev/sda1 
# avant de procéder à l'opération de ddrescue

# Enfin sachez qu'il est aussi possible de choisir un fichier image comme destination
# mais je n'ai pas testé :)
$ sudo ddrescue -n /dev/sdd4 /dev/sda/sdd4_image.img /media/clefusb/ddrescue-logfile.log
# puis 
$ sudo ddrescue -dr3 /dev/sdd4 /mnt/recovery/sdd4_image.img /media/clefusb/ddrescue-logfile.log
# La même opération pourrait être exécuter avec le disque entier /dev/sdd je suppose...

# /mnt/recovery/sdd4_image.img est une destination arbitraire 
# elle doit être choisi en adéquation avec votre système

# Dans tous les cas, la présence d'un fichier de log n'est pas obligatoire mais recommandé car
# il permet à tout moment de stopper l'opération CTRL+C et 
# de la relancer en partant de là on elle s'était arrêtée !
  
# L'option -i (--input-position) permet de spécifier l'endroit où l'opération doit démarrer
# La position peut être indiqué en different unités: 156104442bits, 156104Mo, 156Go 
$ ddrescue ... /dev/sdd4 ...
# équivaut plus ou moins à 
$ ddrescue ... -i 156104442 /dev/sdd       # 156104442 est le secteur de début de la partition sdd4
                                           # comme indiqué dans le fichier disque-logfile.log ci-avant.

## Réparation du système de fichier récupéré
# Avant de pouvoir récupérer les données proprement dites (c.a.d les fichiers),
# Il faut s'assurer que le système de fichier est sain sur la copie binaire récupérée
$ sudo e2fsck -v -f /dev/sda                     # si copié vers disque en entier
# ou
$ sudo e2fsck -v -f /dev/sda1                    # si copié vers partition seulement 
# ou 
$ sudo e2fsck -v -f /mnt/recovery/sdd4_image.img # si copié vers un fichier image

# Accessoirement on peut rajouter l'option -y à la commande 
# pour répondre "yes" automatiquement à chaque question posée

## Enfin...accéder aux données,
# En fonction de l'opération que vous avez choisit...

# Monter le disque
# ou monter la partition
Utiliser Disk Utility pour cela

# ou monter l'image
$ sudo mkdir /mnt/recovered_image
$ sudo mount -o loop /mnt/recovery/sdd4_image.img /mnt/recovered_image

# Puis accéder aux données ainsi montées :))
# Copier et restaurer ce qui peut l'être...


7.5. SYS02: Avancé

7.5.1. SYS02-01: Environnement et variables

Source(s):


7.5.1.1. Variables d’environnement courantes

La liste suivante donne quelques exemples de variables d’environnement parfois utilisées par les systèmes d’exploitation. Cette liste n’est en aucun cas exhaustive et peut être complétée en fonction des nécessités.

  • USER or LOGNAME : Le nom de l’utilisateur connecté (utilisé par des programmes de style BSD et System V respectivement)

  • HOME : Le répertoire de login d’un utilisateur, mis en place par login depuis le fichier des mots de passe passwd.

  • LANG : Le nom du lieu à utiliser pour les configurations locales, s’il n’est pas écrasé par LC_ALL ou d’autres variables comme LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME.

  • PATH : Une liste de préfixes de répertoires, que sh et de nombreux autres programmes utilisent pour trouver un fichier dont le chemin est incomplet. Les préfixes sont séparés par des ‘ :’. (De même il existe CDPATH utilisé par certains shells pour connaître le répertoire destination d’une commande cd, MANPATH utilisé par man pour trouver les pages de manuel, etc). Si une commande à exécuter n’est présente dans aucun chemin recensé par cette variable, le système ne l’exécutera pas (à moins de spécifier le chemin complet dans la ligne de commande : /bin/ls).

  • PWD : Le répertoire de travail actuel, renseigné par certains shells.

  • SHELL : Le nom de fichier du shell à la connexion de l’utilisateur.

  • TERM : Le type de terminal utilisé pour les affichages.

  • PAGER : L’application préférée de l’utilisateur pour afficher des textes (comme less ou more).

  • EDITOR : L’application préférée de l’utilisateur pour éditer des textes. (telle que emacs, joe, ou vi).

  • BROWSER : L’utilitaire préféré pour examiner des URLs. Une suite de noms de navigateurs séparés par des deux-points.

  • ROOTPATH : Cette variable a la même fonction que PATH, mais celle-ci liste les répertoires qui doivent être parcourus lorsque l’utilisateur root entre une commande.

  • LDPATH : Cette variable contient une liste de répertoires séparés par des deux-points dans lesquels l’éditeur de liens dynamiques cherche les bibliothèques.

  • MANPATH : Cette variable contient une liste de répertoires séparés par des deux-points dans lesquels la commande man cherche les pages de manuel.

  • INFODIR : Cette variable contient une liste de répertoires séparés par des deux-points dans lesquels la commande info cherche les pages info.

  • KDEDIRS : Cette variable contient une liste de répertoires séparés par des deux-points qui contiennent les éléments spécifiques à KDE.

  • CLASSPATH : Cette variable contient une liste de répertoires séparés par des deux-points qui contiennent les classes Java.

  • CONFIG_PROTECT : Cette variable contient une liste de répertoires séparés par des espaces qui doivent être préservés par Portage pendant les mises à jour.

  • CONFIG_PROTECT_MASK : Cette variable contient une liste de répertoires séparés par des espaces qui ne doivent pas être préservés par Portage pendant les mises à jour.

  • PS1 : Variable contenant une chaîne de texte réalisant la mise en forme du message d’attente (prompt) en ligne de commandes.


7.5.1.2. env, printenv, export

Ces commandes permettent de visualiser les variables voici les miennes:


# Afficher les variables actuelles
$ env
GPG_AGENT_INFO=/tmp/seahorse-Xj5Akr/S.gpg-agent:2320:1
SHELL=/bin/bash
DESKTOP_STARTUP_ID=
TERM=xterm
GTK_RC_FILES=/etc/gtk/gtkrc:/home/filostene/.gtkrc-1.2-gnome2
WINDOWID=41943273
USER=filostene
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40
;31;01:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.svgz=01
;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01
;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01
;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;
35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;
35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;
35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;
35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;
35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.aac=00;36:*.au=00;36:*.flac=00;
36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:
SSH_AUTH_SOCK=/tmp/keyring-FlSbjf/ssh
GNOME_KEYRING_SOCKET=/tmp/keyring-FlSbjf/socket
SESSION_MANAGER=local/debstafil:/tmp/.ICE-unix/2233
USERNAME=filostene
DESKTOP_SESSION=default
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games
GDM_XSERVER_LOCATION=local
PWD=/home/filostene
LANG=fr_FR.UTF-8
GNOME_KEYRING_PID=2232
GDM_LANG=fr_FR.UTF-8
GDMSESSION=default
HISTCONTROL=ignoreboth
HOME=/home/filostene
SHLVL=1
GNOME_DESKTOP_SESSION_ID=Default
LOGNAME=filostene
XDG_DATA_DIRS=/usr/local/share/:/usr/share/:/usr/share/gdm/
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-URg3G0ZLPF,guid=f7ab2f41c8e2725e05f5a10c4b22ded6
WINDOWPATH=7
DISPLAY=:0.0
COLORTERM=gnome-terminal
XAUTHORITY=/home/filostene/.Xauthority
_=/usr/bin/env
    

On y voit notemment mon shell par defaut (/bin/bash), quel utilisateur je suis (filostene), le group de chemin PATH (/usr/local/bin:/usr/bin:/bin:/usr/games), ma configuration linguistique (fr_FR.UTF-8), etc...

Mais quel difference entre env, printenv et export ? Faisons un petit test de comparaison...


# Comparer les methodes d'affichage
$ env > env.txt
$ printenv > printenv.txt
$ diff env.txt printenv.txt 
32c32                       #
< _=/usr/bin/env            # La différence est vraiment minimum
---                         #
> _=/usr/bin/printenv       #

$ export
declare -x COLORTERM="gnome-terminal"
declare -x DBUS_SESSION_BUS_ADDRESS="unix:abstract=/tmp/dbus-URg3G0ZLPF,guid=f7ab2f41c8e2725e05f5a10c4b22ded6"
declare -x DESKTOP_SESSION="default"
declare -x DESKTOP_STARTUP_ID=""
declare -x DISPLAY=":0.0"
declare -x GDMSESSION="default"
declare -x GDM_LANG="fr_FR.UTF-8"
declare -x GDM_XSERVER_LOCATION="local"
declare -x GNOME_DESKTOP_SESSION_ID="Default"
declare -x GNOME_KEYRING_PID="2232"
declare -x GNOME_KEYRING_SOCKET="/tmp/keyring-FlSbjf/socket"
declare -x GPG_AGENT_INFO="/tmp/seahorse-Xj5Akr/S.gpg-agent:2320:1"
declare -x GTK_RC_FILES="/etc/gtk/gtkrc:/home/filostene/.gtkrc-1.2-gnome2"
declare -x HISTCONTROL="ignoreboth"
declare -x HOME="/home/filostene"
declare -x LANG="fr_FR.UTF-8"
declare -x LOGNAME="filostene"
declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40
;33;01:or=40;31;01:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01
;31:*.svgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01
;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01
;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01
;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01
;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01
;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01
;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01
;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.aac=00
;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00
;36:*.ra=00;36:*.wav=00;36:"
declare -x OLDPWD
declare -x PATH="/usr/local/bin:/usr/bin:/bin:/usr/games"
declare -x PWD="/home/filostene"
declare -x SESSION_MANAGER="local/debstafil:/tmp/.ICE-unix/2233"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_AUTH_SOCK="/tmp/keyring-FlSbjf/ssh"
declare -x TERM="xterm"
declare -x USER="filostene"
declare -x USERNAME="filostene"
declare -x WINDOWID="56623181"
declare -x WINDOWPATH="7"
declare -x XAUTHORITY="/home/filostene/.Xauthority"
declare -x XDG_DATA_DIRS="/usr/local/share/:/usr/share/:/usr/share/gdm/"
    

On voit clairement qu'ormis à la ligne 32, les resultats sont totalement semblable entre env et printenv, par contre export semble donner un resultat légèrement différent! Un rapide coup d'oeil dans la page de man nous éclaira sur la difference réelle:

  • env : permet d'exécuter un programme dans un environnement modifié c.a.d d'initialiser des VARIABLES à une VALEUR dans l’environnement et exécuter une COMMANDE. Ceci peut-être utile dans un prompt de terminal ou dans un script.

  • printenv : permet uniquement d'afficher l’ensemble ou une partie des variables d’environnement (équivalent de echo $variable_name)

    
$ printenv PATH
    /usr/local/bin:/usr/bin:/bin:/usr/games
    $ echo $PATH
    /usr/local/bin:/usr/bin:/bin:/usr/games
          

  • export: permet d’ajouter ou de supprimer des paramètres ou des fonctions de l’environnement mais connaître les variables disponibles dans l’environnement.

    
$ man sh
    "...
    export [-fn] [nom[=mot]] ...
      export -p
            Les noms fournis sont marqués pour être exportés automatiquement
            dans l’environnement des commandes exécutées par  la  suite.  Si
            l’option  -f  est  indiquée,  les noms se rapportent à des fonc‐
            tions. Si aucun nom n’est donné ou si l’option -p  est  fournie,
            une  liste  est  affichée indiquant l’ensemble des noms exportés
            dans  cet  interpréteur.  L’option  -n   conduit   à   supprimer
            l’attribut d’exportation de chacune des variables nommées. Si un
            nom de variable est suivi par =mot, la valeur de la variable est
            mise  à  mot.  export renvoie un état final de 0, à moins qu’une
            option incorrecte soit rencontrée ou qu’un des noms ne soit  pas
            un  nom correct de variable de l’interpréteur ou que l’option -f
            soit fournie avec un nom qui n’est pas une fonction.
    ..."
           


7.5.1.3. Variables Communes (GLOBALES) pour tous les utilisateurs du système

Ce sont les variables d'environement disponibles pour tous les utilisateurs du système. Elles sont déclarées dans un fichier de configuration qui se charge précocement dans la séquence de lancement des services ou lors de la procédure d’ouverture de session par un utilisateur.

Dans le cas de bash (l’interpréteur de commande par défaut), on éditera le fichier /etc/profile (s’il existe).Par exemple, si, on souhaite définir la variable d’environnement relative à la présentation du message d’attente (prompt) en ligne de commandes pour tous les utilisateurs utilisant bash, on ajoutera dans le fichier /etc/profile :


PS1="Welcome$ " #Definit la variable et le format l'affichage au lieu de "[\u@\h:\w]\\$ " par défaut
export PS1      #Exporte la variable dans l'environement

# AVANT:
filostene@debstafil:~$

# APRÈS:
Welcome$ echo 'Ça marche!'
Ça marche!
Welcome$

# On aurait aussi pu faire... directement au prompt
$ PS1='Welcome$' && export PS1
    


7.5.1.4. Variables Particulières (LOCALES) uniquement pour l’utilisateur qui les a définies

Ce sont les variables d'environement qui ont une portée restreinte c.a.d disponibles uniquement par l’utilisateur qui les a définies. Elles sont déclarées dans un fichier qui se chargera uniquement au lancement de la session de l’utilisateur intéressé.

Pour l’interpréteur de commandes bash, les fichiers concernés sont placés dans le dossier personnel de l’utilisateur et sont désignés par les noms $HOME/.bash_profile et $HOME/.bashrc.

Testons avec deux utilisateurs aaaaa et bbbbb créés lors d'exercice précédent:


#### TEST1
#### Utilisateur aaaaa
$ su aaaaa
aaaaa$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games
aaaaa$ exit

#### Utilisateur bbbbb
$ su bbbbb 
bbbbb$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games

#### ==> Variable $PATH identique pour les deux...

#### Modifions la variable $PATH pour l'utilisateur bbbbb
bbbbb$ PATH=$PATH:/bin && export PATH
#### On verifie...
bbbbb$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games:/bin #### :/bin est bien ajouté à la fin
bbbbb$ exit

#### Qu'en est-il pour l'utilisateur aaaaa
$ su aaaaa
aaaaa$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games

##### ==> Variable $PATH inchangé pour l'utilisateur aaaaa
     

#### TEST2
# toto.sh qui contient les lignes suivantes :
# PATH=/sbin
# echo $PATH
# echo $MAVAR1
# echo $MAVAR2

#Dans une console
$ MAVAR1=bar      #Définir variable 1
$ echo $MAVAR1    #On l'affiche pour vérifier
bar
$ MAVAR2=blablah  #Définir variable 2
$ echo $MAVAR2    #On l'affiche pour vérifier
blablah
$ sh toto.sh      #1er démarage du script
/sbin


$ export MAVAR2   #Export de la variable 2 dans l'environement
$ sh toto.sh      #2nd démarrage du script
/sbin             #Affiche variable $PATH comme définit dans le script

blablah           #Affiche variable 2 comme exportée dans l'environement
$ echo $PATH      
/usr/local/bin:/usr/bin:/bin:/usr/games  #Variable $PATH de l'environement reste inchangé
     

Via TEST2 on a pu verifier que:

  • Le script affiche bien \sbin car c’est ce que contenait la valeur de la variable PATH pendant la durée du script, mais cela n’a pas modifié la valeur de la variable de votre environnement PATH.

  • Quand on ouvre une console (un shell), tous les scripts lancé dans la console sont des processus enfants du shell initial.

  • Qu'une variable exportée à partir d’un shell est bien visible pour les processus enfants de ce shell. La première variable n'est pas affichée par le script par contre la seconde oui.

  • Chaque script à son propre environnement, par contre on peut transmettre un environnement d’un processus père à un processus enfant avec la commande export. Un processus père export une variable, celle-ci sera utilisable par le processus enfant.


7.5.1.5. Variables et scripts shells

Ce qu’on vient de voir montre qu’une variable, à moins d’être exportée n’est visible que dans le shell courant. Pour le système cela correspond à un shell (environnement et ensemble de ressources allouées). Il est vraiment intéressant de savoir qu’une variable peut être redéfinie temporairement par un environnement de travail.

Le système GNU/Linux et les applications utilisent largement ce principe :

  • un ou des fichiers de configuration généraux définissant des variables globales pour tout l’environnement.

  • un ou des fichiers de configuration locaux propre à un processus ou à un utilisateur permettant de redéfinir, le temps d’un traitement, les valeurs de variables globales.


7.5.1.5.1. Transfert de variable d'environement d'un processus A vers un processus B appelé par A

Prenons maintenant l’exemple d’un processus A, appelant un processus B. Comment procéder, sachant que chaque processus aura son propre environnement pour qu’ils puissent utiliser des mêmes ensembles de variables et de valeurs ?

bash fournit une solution. La possibilité de sourcer un ensemble de variable et de valeurs. Il suffit de déclarer les couples ’variables/valeurs’ dans le script A et d’inclure la ligne dans le script B :

  • ’source A’ ou en plus concis ’. A’ (point espace A)

  • Le script B chargera les variables à partir du script A, tout cela sans modifier l’environnement global de travail, mais nous aurons l’occasion de revenir sur tout cela dans le temps, ne précipitons rien.


7.5.2. SYS02-02: Commandes avancées sous Linux

Source(s):


7.5.2.1. awk & mawk

Pour en savoir plus:

desctription


Introduction au langage Awk:

#####################################################################################################################
Présentation et caractéristiques:
#####################################################################################################################

Awk qui tient son nom des initiales de ses trois créateurs (Alfred AHO, Peter WEINBERGER et Brian KERNIGHAN)
est un langage qui permet d'effectuer des traitements sur les fichiers.

Pour un fichier donné, il extrait les champs contenus dans chaque ligne pour eventuellement effectuer un
traitement sur ces champs.

Exemple: le fichier /etc/passwd

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh

Lors d'un traitement AWK en spécifiant comme séparateur de champs le symbole ":", nous aurons pour le
traitement de la première ligne, le positionnement automatique de ses variables:

$1=root
$2=x
$3=0
$4=0
$5=root
$6=/root
$7=/bin/bash

Rq: on commence a $1 car $0 contient la ligne entière.

On devine par exemple, comment on pourrait n'afficher que les comptes ayant un shell particulier à l'aide de $6.

Il existe d'autre variables comme $NF, ... je vous invite à lire le man de la commande AWK


#####################################################################################################################
Mode de fonctionnement et syntaxe:
#####################################################################################################################

Un script (commande) AWK se présente de la manière suivante:

motif {action}

ou "motif" représente un critère de sélection (par exemple $7=/bin/bash ou expression régulière quelconque portant sur un des champs) et
"action" représente le traitement à effectuer (exemple d'action "print" qui permet d'afficher le résultat de la sélection à l'écran)

Rq: On peut directement traiter un fichier en entrée comme ceci:
awk -F":" '/root/{print $7}' < /etc/passwd

-F ici pour "Field separator" permet de spécifier que le séparateur de champs n'est pas "espace" mais ":".

Ou on traite le résultat d'une autre commande avec un pipe comme ceci:
cat /etc/passwd | awk -F":" '/root/{print $7}'

Dans les deux exemples ci dessus:

motif = /root/ c'est à dire les lignes qui contiennent root
action = print $7 on affiche le 7eme champs de la ligne c'est à dire le shell de root


Pour info voici une syntaxe plus complete:
awk -F":" 'BEGIN{instructions} critères END{instructions}' fichier

BEGIN et END permettent d'instancier une variable par exemple.
awk -F":" 'BEGIN{nb_lignes=0};nb_lignes=nb_lignes+1;END{print "Nombre de lignes= " nb_lignes}' /etc/passwd

dans cet exemple, nous allons compter et afficher le nombre de lignes du ficher /etc/passwd

Autre exemple avec une condition sur le 7eme champs (shell)
awk -F":" '{if ($7=="/bin/false") print $1}' /etc/passwd

Dans cet exemple, on affiche les comptes qui n'ont pas de shell.

(Important to complete)
   

Autres examples utiles


$ echo "hello world world hello world" | awk '{$1=$1}1' OFS=":"  # Remplacer espace et tabulation par un autre caractère
hello:world:world:hello:world                                    # Voir aussi sed pour equivalent

awk '{ print $2, $1 }' file                  # Affiche et inverse les deux premières colonnes
awk '{printf("%5d : %s\n", NR,$0)}' file     # Ajoute numéro de ligne aligné à gauche
awk '{print FNR "\t" $0}' files              # Ajoute numéro de ligne aligné à droite
awk NF test.txt                              # enlever les lignes blanches (equivalent de grep '.')
awk 'length > 80'                            # Affiche les lignes d'au moins 80 caractères
   

7.5.2.2. basename

Éliminer le chemin d’accès et le suffixe d’un nom de fichier. Utile pour renommer un ensemble de fichiers ou répertoires


#TEST1 
$ basename generate.bash                                    #Aucun effet sur un ficher simple
generate.bash                                               
$ basename generate.bash sh                                 #Enleve suffixe "sh" du fichier
generate.ba
$ basename generate.bash .bash                              #Enleve suffixe .bash (=extenstion) du fichier
generate
$ basename /mnt/hsubuntu/monjournal/generate.bash           #Enleve le chemin vers le fichier
generate.bash
$ basename /mnt/hsubuntu/monjournal/generate.bash .bash     #Enleve l'extension (en plus du chemin vers le fichier)
generate
$ basename /mnt/hsubuntu/monjournal/generate.bash ate.bash  #Enleve plus que l'extension :)
gener  
    

#TEST2
#Lister les pages html de mon journal au format multipage
$ cd /mnt/hsubuntu/monjournal/public_html/multipage/ $ ls *.html
c153.html  c157.html  c159.html  c161.html  c164.html  c26.html  c32.html  c38.html  c44.html    x49.html
c156.html  c158.html  c160.html  c163.html  c22.html   c29.html  c35.html  c41.html  index.html
#A partir de cette liste, préparer la commande pour changer toutes les extension .html en .htm, echo permet de verifier
$ for f in `ls *.html`;do echo $f `basename \$f .html`.htm;done
c153.html c153.htm
c156.html c156.htm
c157.html c157.htm
c158.html c158.htm
c159.html c159.htm
c160.html c160.htm
c161.html c161.htm
c163.html c163.htm
c164.html c164.htm
c22.html c22.htm
c26.html c26.htm
c29.html c29.htm
c32.html c32.htm
c35.html c35.htm
c38.html c38.htm
c41.html c41.htm
c44.html c44.htm
index.html index.htm
x49.html x49.htm
#On effectue le changement d'extension (renommer chaque fichier avec commande mv)
$ for f in `ls *.html`;do mv $f `basename \$f .html`.htm;done
#Verification
$ ls
c153.htm  c157.htm  c159.htm  c161.htm  c164.htm  c26.htm  c32.htm  c38.htm  c44.htm  images     style.css
c156.htm  c158.htm  c160.htm  c163.htm  c22.htm   c29.htm  c35.htm  c41.htm  docs     index.htm  x49.htm 
#==> OK
    

7.5.2.3. bc

bc est "un language de calcul de précision arbitraire" ou plus clairement une calculatrice évoluée.


######
# Calculer en mode batch
#
echo "((10+4)*2/4)^2" | bc
49

######
## Calculer en mode interactif
#
$ bc        #Démarre mode interactif avec message d'acceuil...
bc 1.06.94
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
quite
$ bc -q     #Démarre mode interactif sans message d'acceuil...
5+5
10          #5+5=10

######
## Traitement par lot
#
(10+4)*2/4 
7           #(10+4)*2/4=7  
2^4   
16          #2 puissance 4 egual 16
sqrt(16)    #Racine carré de 16 egual 4
4

/* un commentaire :)
sur plusieurs ligne */              #Un commentaire !
# un commmentaire sur une ligne...  #Un autre commentaire !  

length(1935.00054)        #Nombre de chiffre dans l'ensemble dur nombre
9
scale(1935.00054)         #Nombre de chiffre après la virgule
5
scale                     #Definit le nombre de chiffre après la virgule pour certaines operations (0=default)
0
4/3
1                         #4 divisé par 3 egual 1 si scale=0
scale+=2                  #définit scale à 2 par ajout (chiffres après la virgule)
scale                     #On vérifie
2
4/3                       #On test 
1.33
scale=5                   #définit scale à 5 par affectation
scale
5                         #On vérifie
4/3
1.33333                   #Ok ça marche!

######
## Calculer en plusieurs bases
#
A+B         
21          #A plus B en base 16 egual 21
A*2
20          #A fois 2 egual 20
B*2
22          #B fois 2 egual 22
ibase       #Définit la base de calcul pour les chiffres en entrée
10          #En base 10 par défaut (accepte entre 2 et 16 comme base de calcul)
obase       #Définit la base de calcul pour les chiffres en sortie
10          #En base 10 par défaut (accepte entre 2 et 16 comme base de calcul)
ibase=2     #Définit la base 2 pour les chiffres en entrée et les calculs
01+10             
3           #1 (binaire 01) + 2 (binaire 10) egual 3
ibase=8     #Calcul en base 8
ibase
8
222+333
365         #resultat de sortie en base décimal par defaut (obase=10)

######
## Supporte les variables
#
var1                      #par défaut les variables non définit ont pour valeur 0
0
var1=25                   #Affecte 25 à la variable var1
var1                      #Affiche valeur de var1
25
var2=25                   #Affecte 25 à la variable var2
var2
25
var1 + var2
50
var1+var2                 #var1 & var2 peuvent être utilisées dans les calculs...
50  
var1*var2
625
-var1                     #Nombre négatif
-25
--var1                    #Variable est décrémenté et nouvelle valeur est résultat de l'expression 
24
var1
24
var1++                    #Le résultat de l'expression est la valeur de la variable ensuite la variable est incrémenté
24
var1
35

######
## Supporte les booléen (0=faux 1=true)   
#  
var1 < var2
0
var1 > var2
0
var1==var2
1
var1>=var2
1
var1<=var2
1
!0          #Négation booléènne
1
1&&1        #ET booléen
1
1&&0
0
1||0        #OU booléen
1

######
## Supporte les structures de contrôle   
#  
if(var1==var2) print "egual" else print "KO"
egual
if(var1 < var2) print "inferieur" else print "KO"
KO
while(var1--) print "x"
xxxxxxxxxxxxxxxxxxxxxxxxx

######
## Supporte les functions   
#  
define mafonction (para) { return (2*para); }
mafonction (3)
6

quit
    

7.5.2.4. cat

cat sert à concaténer plusieurs fichiers en un seul ou encore pour vider un fichier sur la sortie standard (STDOUT).Voir aussi commande split


$ cat /etc/apt/sources.list  #Affichera le contenu de mes sources de dépôt de paquet sur STDOUT
# deb http://ftp.uk.debian.org/debian/ lenny main
# deb http://debian.org.ua/debian/ lenny main
deb http://ftp.fr.debian.org/debian/ lenny main
deb http://security.debian.org/ lenny/updates main
deb http://volatile.debian.org/debian-volatile lenny/volatile main
deb-src http://volatile.debian.org/debian-volatile lenny/volatile main

$cat f1 f2 f3 > f # concatène f1, f2 et f3 dans le fichier f
    

7.5.2.5. cut

cut sert à supprimer une partie de chaque ligne d’un fichier. Largement utilisé dans les scripts shell car cette commande permet de récupérer des parties de lignes sous forme de champs ou alors des bloc d’octets.


$ cat /etc/passed               #Afficher le contenu du fichier de mot de passe
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
...
$ cut -b 1-10 /etc/passwd       #Récupérer les 10 premiers octets de chaque ligne
root:x:0:0
daemon:x:1
...
$ cut -c 1-10 /etc/passwd       #Récupérer les 10 premiers charactères de chaque ligne
root:x:0:0
daemon:x:1
...
$ cut -f 1 -d':' /etc/passwd    #Récupérer le premier champ f1 si le séparateur ’d’ est ’:’
root
deamon
...
$ cut -f 1,3 -d':' /etc/passwd  #Récupérer le champ f1 et f3 si le séparateur ’d’ est ’:’
root:0
daemon:1
...
$ cut -f 1-3 -d':' /etc/passwd  #Récupérer le champ f1 à f3 si le séparateur ’d’ est ’:’
root:x:0
daemon:x:1
...
$ cut -f 1-3 -d':' /etc/passwd --output-delimiter '##'  #Délimiteur de sortie différent de l'entrée
root##x##0
daemon##x##1
...
$ cut -f 1-3 -d'/' /etc/passwd --output-delimiter '  # '
root:x:0:0:root:  # root:  # bin
daemon:x:1:1:daemon:  # usr  # sbin:
...      

#####
## Combinaison avec une autre commande
#
$ cat /etc/passwd | cut -f1 -d’:’
    

7.5.2.6. du & df

Source(s):

  • du : Évaluer l’espace disque occupé par des fichiers. Totaliser l’espace disque utilisé par chaque fichier, de façon récur‐ sive pour les répertoires.

  • df : Indiquer l’espace occupé par les systèmes de fichiers.


# Nous avons déjà vu ces commandes, voir section "SYS01-Chapitre08: Atelier/TP - Langage de commande shell" pour plus d'information...

#Affiche espace utilise par l'ensemble du systeme de fichier
$ df
Sys. de fich.        1K-blocs       Occupé Disponible Capacité Monté sur
/dev/hda1              9835552   3577760   5758176  39% /
tmpfs                   258148         0    258148   0% /lib/init/rw
udev                     10240       624      9616   7% /dev
tmpfs                   258148         0    258148   0% /dev/shm
vmdebian              73828436  33402892  40425544  46% /mnt/hsubuntu
/dev/hdc                 32016     32016         0 100% /media/cdrom0

#Affiche espace utilisé par un système de fichier en particulier dans un format lisible par l'homme :)
$ df -h /dev/hda1
Sys. de fich.         Tail. Occ. Disp. %Occ. Monté sur
/dev/hda1             9,4G  3,5G  5,5G  39% /

#Affiche espace utilisé par des fichiers ou repertoires (tmp dans l'example)
$ du -h /tmp
4,0K	/tmp/seahorse-nvhZyu
4,0K	/tmp/.ICE-unix
4,0K	/tmp/keyring-s22hSF
8,0K	/tmp/gconfd-filostene/lock
12K	/tmp/gconfd-filostene
4,0K	/tmp/virtual-filostene.hDz1GF
4,0K	/tmp/.X11-unix
8,0K	/tmp/orbit-filostene
48K	/tmp
   

7.5.2.7. date

date permet d’afficher ou de modifier la date système (en tant que root). La commande propose plusieurs formats d’affichage.


# Afficher la date
$ echo "Nous sommes le ‘date "+%d %M %Y"‘"
Nous sommes le 28 26 2009

# Afficher l'heure
$ echo "Il est ‘date "+%Hh:%Mm:%Ss%"‘"
Il est 08h:28m:30s%

# Ajuster la date aaaa-mm-jj...
$ date –set 2007-10-15 

# Ajuster l'heure HH:mm:ss...
$ date –set 16:47:30

# Synchroniser l'horloge materielle avec la date et l'heure introduite précédement...
$ hwclock –systohc
    

Note

Depuis la version 2.2 de Debian, le systeme sauve automatiquement l'heure systeme dans l'horloge materiel lorque l'ordinateur s'éteint et inversement lors du démarrage systeme (script: /etc/init.d/hwclock.sh)

Voir aussi section Ajuster le fuseau horaire


7.5.2.8. diff

Source(s):

diff permet de comparer deux fichiers texte ligne à ligne. Pour comparer deux fichiers texte il vaut mieux utiliser le programme graphique meld qui permet de comparer et fusionner différents fichiers. Ceci dit, diff est intéressant pour extraire les différences de 2 fichiers et réaliser ce qu’on appelle un patch. La technique est largement utilisée par les programmeurs pour corriger des bogues par exemple, au lieu de redistribuer un code source complet on ne distribue que le patch.


######
## Code source A (Bon)
#
a=3
if [ "$a" -gt 0 ]
then
 if [ "$a" -lt 5 ]
 then
   echo "The value of \"a\" lies somewhere between 0 and 5."
 fi
fi

# Same result as:
if [ "$a" -gt 0 ] && [ "$a" -lt 5 ]
then
 echo "The value of \"a\" lies somewhere between 0 and 5."
fi

######
## Code source B (Pas Bon)
#
a=3
if [ "a" > 0 ]
then
 if [ "$a" -lt 5 ]
 then
   echo "The value of "a" lies somewhere between 0 and 5."
 else
  echo "The value does not exist"
 fi
fi
# Same result as:
exit 0

if [ "$a" -gt 0 ] & [ "$a" -lt 5 ]
then
 echo "The value of \"a\" lies somewhere between 0 and 5."
fi

######
## Création du patch
#
$ diff A B > file.patch

######
## Patcher B
#
$ patch B < file.patch

######
## Diff de vérification
#
$ diff A B

#==> Pas de sortie, c'est que c'est bon :)
   

7.5.2.9. find

Source(s):

find permet de rechercher des fichiers dans une hiérarchie de répertoires (arborescence) en utilisant les information contenu dans l'annuaire des fichiers. On peut rechercher sur le nom, le type de fichier, la taille, la date de modification. . . cet utilitaire est très similaire à ls mais est bien plus puissant car il dispose de son propre language pour specifier les requètes.

Le premier argument de find est le(s) repertoire(s) de base pour la recherche ("search root"). Ils peuvent être multiple et ainsi permettre d'exclure cetains repertoire de la recherche. La liste des repertoires de recherche peut être générée par script.


$ find /bin /sbin /usr -name filename # Recherche filename uniquement dans les repertoires /bin, /sbin et /usr, exclue tous les autres
$ find `script_gen_dir` -name filename # Repertoire(s) de recherche généré(s) par commandes ou script 
   

Les arguments suivants attendu par find son les expressions de recherche ("searh expression"). Le premier argument commençant par "-" est considéré comme le début de l'expression de recherche. Chaque partie de l'expression de recherche est évalué à vrai ou faut et est utilisé pour determiner si le fichier en question satisfait ou non le(s) expression(s) de recherche.

$ find /usr /var/html -name "*.htm*" -print # Rechercher dans /usr/local et /var/www/html le(s) nom(s) de fichier contenant le motif .htm
    

######
## Autre Exemples      
# Recherche des fichiers de plus de 5 Mo dans le répertoire courant
$ find . -size +5M
# Recherche des répertoires
$ find . -type d
# Recherche de fichiers simples
$ find . -type f
# Recherche des répertoires ou des liens symboliques
$ find . -type d -o -type l
# Recherche des fichiers dont le nom commence par foo
$ find . -name "foo*"
# Recherche des fichiers      SUID dans /usr/bin
$ find /usr/bin -perm -4000
    

Note

Combinée avec des pipes et d’autres commandes (grep, xargs, exec. . .) cette commande est vraiment utile.


# Exécuter  « macommande » sur chaque entrée du répertoire courant ou de ses
  sous-répertoires. Attention à  bien  protéger  les  accolades  par  des
  guillemets  simples  afin  d’empêcher  leur  interprétation en tant que
  ponctuation du script shell. De la même  façon,  le  point-virgule  est
  protégé grâce à une barre oblique inverse, bien que l’apostrophe aurait
  aussi pu être utilisée.
$ find . -type f -exec macommande '{}' \;

#Ici on utilise l’option -exec pour afficher le détail des fichiers
$ find /usr/bin -perm -4000 -exec ls -l ’{}’ \;
$ find /usr/bin -perm -4000 -ls # commande équivalente à la précédente "-ls" liste les fichiers dans 
un format de sortie identique à la commande+options `ls -dils'

# Chercher les fichiers qui s’appellent noyau dans le répertoire /tmp  et
  ses  sous-répertoires,  puis les effacer, en veillant à ce que les noms
  de fichiers ou de répertoires qui contiennent des retours à  la  ligne,
  des  guillemets  simples  ou doubles ou des espaces soient correctement
  traités.
$ find /tmp -name noyau -type f -print0 | xargs -0 /bin/rm -f
$ find /tmp -name noyau -exec /bin/rm -f '{}' \;              # commande équivalente
$ find /tmp -name noyau -delete                               # commande équivalente si on utilise GNU find
    

7.5.2.10. fuser

fuser identifie les processus qui utilisent des fichiers ou des sockets. Peu souvent utilisée, elle est utile pour déterminer parfois quel processus utilise telle socket (service serveur) ou ressource.


$ netstat -nat # Voir un service serveur à l’écoute sur le port 631
Proto Recv-Q Send-Q Adresse locale           Adresse distante       Etat
tcp           0        0 127.0.0.1:631       0.0.0.0:*              LISTEN

$ sudo fuser 631/tcp # Récupèrer le PID du processus qui utilise cette socket
631/tcp:            5838

$ sudo cat /proc/5838/cmdline # On cherche quelle ligne de commande à activé ce processus
/usr/sbin/cups

==> Pas de problème pour cette fois il s’agit du serveur d’impression cups (Common Unix Printing System).
   

7.5.2.11. gzip & bzip2

Source(s):

gzip et bzip2 servent à compresser et à décompresser des fichiers ou une arborescence (option -r récursif).bzip2 offrant un taux de compression supérieur à gzip mais le traitement est plus lent.

Note

Ces deux commandes ne peuvent s'appliquer que sur un seul fichier à la fois... utiliser tar pour compresser plusieurs fichiers en une fois...


######
## Compression de fichier
# 
$ gzip monfichier.x       # Créer monfichier.x.gz
$ gunzip monfichier.x.gz  # Restaurer monfichier.x
$ bzip monfichier.x       # Créer monfichier.x.bz2
$ bunzip monfichier.x.bz2 # Restaurer monfichier.x
   

######
## TAR & Compression gzip
#
$ tar -zcvf monarchive.tar mondossier/ # -zcvf Archiver et compresser en gzip
# -z archive automatiquement compressée avec gzip.

# Décompresser
$ tar -zxvf monarchive.tar.gz # -zxvf dé-archiver et décompresser depuis gzip

######
## TAR & Compression bzip
#
$ tar -jcvf monarchive.tar.bz2 mondossier/ # -jcvf Archiver et compresser en bzip2
$ tar cvf - mondossier/ | bzip2 > monarchive.tar.bz2 # Equivaut à la commande précédente mais via un pipe et commande de compression bz2
# -j archive automatiquement compressée avec bzip2.

# Décompresser
$ tar -jxvf tutoriels.tar.bz2 tutoriels/ # -jxvf Dé-archiver et dé-compresser depuis bzip2  
   

7.5.2.12. info

info fait parti des sources de documentation sous GNU/Linux. Vous en avez trois : /usr/share/doc, man que vous connaissez déjà et info. Vous retrouverez sensiblement les mêmes documentations entre man et info sauf pour les programmes GNU (gawk par exemple) pour lesquels vous trouverez beaucoup plus de choses dans info. Sur votre poste, si vous utilisez KDE, vous pouvez mettre dans le navigateur konqueror "info:/", les pages info seront affichées au format html.


7.5.2.13. lsof

lsof liste les fichiers ouverts. Elle peut être utile dans bien des scénarios.


# On a un disque de monté sur /media/disque, il est temps de le démonter :
$ sudo umount /media/disk/
umount: /media/disk: périphérique occupé # Ici on a typiquement un processus qui empêche de libérer la ressource.
$ sudo lsof | grep disk
bash           30878     mlx  cwd     1 /media/disk # Ici on a le coupable. C’est un shell ouvert sur le disque.
$ ps ux | grep 30878
ameno           30878    0.0  0.1     4680    2068 pts/3      /bin/bash

# Résoudre le problème n’est plus qu’une question de secondes. 
# Il suffit d’identifier la fenêtre et la fermer ou
# envoyer un signal 9 au processus
   

7.5.2.14. mail ou mailx

mail est un client de messagerie pouvant être utilisé en mode commande ou appelé dans un script. Vous pouvez l’utiliser en mode interactif ou en mode batch. Il est aussi utiliser pour tester le bon fonctionnement des service SMTP. Vous devez avoir un serveur SMTP actif et fonctionnel comme exim, postfix ou autre sur la machine. mail est notamment utilisé dans les scripts cron pour envoyer des notifications au sysmaster.


# exemple d’envoi
$ echo coucou | mail petitjean -s "Test de la messagerie"
# autre exemple
$ mail petitjean -s "Test de la messagerie" << EOF
> coucou c’est un autre test
> EOF
# consultation
petitjean@localhost:$ mail
Mail version 8.1.2 01/15/2001.         Type ? for help.
"/var/mail/petitjean": 2 messages 2 new
>N   1 petitjean@localhost Fri Aug 28 09:31 Test de la messagerie
N   2 petitjean@localhost Fri Aug 28 09:31 Test de la messagerie
& 1
Message 1:
From petitjean@localhost        Fri Aug 28 09:31:50 2009
X-Original-To: petitjean
To: petitjean@localhost
Subject: Test de la messagerie
Date: Fri, 28 Aug 2009 09:30:50 +0200 (CEST)
From: petitjean@localhost (petitjean)
coucou
& q
   

7.5.2.15. mount

mount est la commande qui permet de monter ou démonter des systèmes de gestion de fichiers (disques internes ou externes, volumes virtuels, volumes distants. . .). La syntaxe simplifiée est : mount [-fnrsvw] [-t vfstype] [-o options] device dir


# Par exemple
$ mount -t ext3 /dev/sda1 /media/sda1
# Un disque nfs distant
$ mount -t nfs serveurdistant:/usr/share/doc /media/doc
   

mount permet également de monter des images ISO. Si vous avez téléchargé l’image systemrescuecd.iso et que vous vouliez voir ce qu’il y a dedans vous pouvez utiliser mount :


$ mkdir vram
$ mount -o loop systemrescuecd.iso vram
$ cd vram
   

Pour démonter un volume utilisez umount, mais attention le volume ne doit pas être utilisé par un processus. Voir aussi les fichiers /etc/fstab et /etc/mtab.


7.5.2.16. nl

nl numérote les lignes. C’est utile si vous réalisez des documentations et que vous vouliez référencer des lignes par des numéros pour les commenter.


$ nl monfichier
$ cat /etc/passwd | nl
  1	root:x:0:0:root:/root:/bin/bash
  2	daemon:x:1:1:daemon:/usr/sbin:/bin/sh
  3	bin:x:2:2:bin:/bin:/bin/sh
  4	sys:x:3:3:sys:/dev:/bin/sh
...
   

Note

nl numerote uniquement les lignes non vides !


7.5.2.17. ntpdate

ntpdate permet de mettre à jour l’heure système d’une machine à partir d’un serveur de temps. Voir le projet de cluster de serveur de temps

  
$ sudo ntpdate pool.ntp.org
28 Aug 08:32:48 ntpdate[5038]: \
adjust time server 91.121.104.170 offset -0.121994 sec
   

Note

Il est conseillé d’utiliser le démon ntpd.


7.5.2.18. patch

Permet de patcher (modifier) un fichier texte à partir d’un diff. Ce procédé est le plus généralement utilisé par les développeurs lors de corrections de bogues. Voir commande diff


7.5.2.19. sed

Source(s):


sed -e ’s/<[^>]*>//g’ foo.htm   # Enlever les tags d'un fichier xml/xhtml/html    

echo "hello world world hello world" | sed 's/[ \t]\+/:/g'
hello:world:world:hello:world         # Remplacer espace et tabulation par un autre caractère
                                      # Voir aussi awk commande equivalent

sed "s/<[^>]*>//g" monfichier.xhtml | sed "s/[ \t\n\r\a\0]\+/ /g" | wc`;
  # Supprime les tags XML, les tabulations et espace en excès 
  # puis compte le contenu  
  # wc retourne 3 chiffres : NumLignes NumMots NumCaractères
   

7.5.2.20. sort

sort permet de trier des fichiers ou un résultat sur la sortie standard.


$ sort /etc/passwd
$ cat /etc/passwd | sort
$ car /etc/passwd | sort -r # -r permet d’avoir le résultat dans l’ordre inverse
$ car /etc/passwd | sort -u # -u permet de supprimer les doublons.
   

7.5.2.21. split

split permet de scinder en plusieurs fichiers un gros fichier. Utiliser cat pour la reconstruction.


$ ls -alh debian-502-i386-netinst.iso
-rw-r--r-- 1 mlx mlx 151M 2009-06-29 13:07 debian-502-i386-netinst.iso

# On crée des fichiers de 15 M
# On utilise un préfixe xyz
$ split -b 15M     debian-502-i386-netinst.iso xyz
$ ls -alh xyz*
-rw-r--r-- 1 mlx mlx 15M 2009-08-23 12:32 xyzaa
-rw-r--r-- 1 mlx mlx 15M 2009-08-23 12:32 xyzab
-rw-r--r-- 1 mlx mlx 15M 2009-08-23 12:32 xyzac
-rw-r--r-- 1 mlx mlx 15M 2009-08-23 12:32 xyzad
-rw-r--r-- 1 mlx mlx 15M 2009-08-23 12:32 xyzae
-rw-r--r-- 1 mlx mlx 15M 2009-08-23 12:32 xyzaf
-rw-r--r-- 1 mlx mlx 15M 2009-08-23 12:32 xyzag
-rw-r--r-- 1 mlx mlx 15M 2009-08-23 12:32 xyzah
-rw-r--r-- 1 mlx mlx 15M 2009-08-23 12:32 xyzai
-rw-r--r-- 1 mlx mlx 15M 2009-08-23 12:32 xyzaj
-rw-r--r-- 1 mlx mlx 32K 2009-08-23 12:32 xyzak

# On reconstitue l’image iso
$ cat xyz* > disque.iso

# On vérifie le résultat
$ md5sum debian-502-i386-netinst.iso disque.iso
eb436947414480e2c8ad60248d64ae59          debian-502-i386-netinst.iso
eb436947414480e2c8ad60248d64ae59          disque.iso
   

7.5.2.22. stat

Affiche les informations sur un fichier ou un SGF.


$ touch a
$ ln a b
$ stat b
  File: ‘b’
  Size: 0                   Blocks: 0                IO Block: 4096
Device: 807h/2055d          Inode: 984298            Links: 2
Access: (0644/-rw-r--r--)       Uid: ( 1000/           mlx)      Gid: ( 1000/      mlx)
Access: 2009-08-23 12:37:13.000000000 +0200
Modify: 2009-08-23 12:37:13.000000000 +0200
Change: 2009-08-23 12:37:17.000000000 +0200
   

Notez le nombre de liens (Links). Le fichier ’b’ est en effet un lien physique.


7.5.2.23. su

su permet de changer d’ID utilisateur ou de passer root (Voir aussi la commande sudo ci-dessous).


filostene$ su           # Prendre l'identite de root
Mot de passe : 
debstafil# 
debstafil# exit
exit
filostene$   

filostene$ su eeeee     # Prendre l'identité de l'utilisateur eeeee
Mot de passe : 
eeeee$ 
   

7.5.2.24. sudo

Source(s):

sudo permet d’exécuter une commande avec des droits privilégiés. Toute action est archivée et la définition des droits, groupes et utilisateurs s’effectue grâce à la commande visudo qui s’assure également de la cohérence de la syntaxe du fichier.

Application :


$ nano /etc/sudoers

...
std ALL=NOPASSWD:/bin/more   # autorise sudo more /etc/sudoers
                             # à l'utilisateur std
                             # sans mot de passe
...
Defaults log_year, logfile=/var/log/sudo.log   # Active la journalisation dans 
                                               # dans le fichier /var/log/sudo.log

$ man sudo

# options 
-u : sudo execute une commande en tant que l'utilisateur spécifié en non plus root
-c : ci-dessous, lis les commandes depuis la chaîne de caractère au lieu de l'entrée standard

sudo -u yazza ls ~yazza                             # liste repertoire home de yazza
                                                    # sur une machine ou le système de fichier
                                                    # contenant ~yazza n'est pas exportable 
                                                    # en tant que root
sudo -u www vi ~www/htdocs/index.html               # editer un fichier html
                                                    # en tant qu'utilisateur www
sudo shutdown -r +15 "quick reboot"                 # redémarrer la machine
sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"  # Liste repertoire dans /home partition
                                                    # Execute dans un sous-shell pour faire 
                                                    # fonctionner cd et la redirection
    

Note

Sous Ubuntu, le compte root est désactivé par défaut et il est autement recommendé de ne pas l'activer.


$ sudo -i  # Obtenir un shell route sous Ubuntu
$ exit     # Pour en sortir

$ sudo passwd root # Pour utiliser le vrai compte root au lieu de sudo 

$ sudo passwd --lock root # Désactiver le compte root précedement activé
                          # Si vous aviez configuré sudo de façon à ce qu'il demande votre mot de passe root,
                          # effectuez la manipulation inverse ! Autrement, sudo sera complètement bloqué.
    

Ubuntu déconseillent (sans argumenter, d'ailleurs) d'activer le compte root ; quels sont les inconvénients/avantages entre compte root / utilisation de sudo ?

Il est difficile de savoir s'il y a vraiment des avantages et des inconvénients. Là il s'agit d'une stratégie ubuntu certainment lié au poste client. Les coordinateurs n'ont encore jamais vu de serveur ou le compte root n'avait pas de mot de passe ;-)


7.5.2.25. tail & head

tail et head permettent respectivement de lire un nombre de lignes en fin ou en début de fichier.


# Lire 50 lignes...
$ tail -n 50 /var/log/messages # ... les premières ...
$ head -n 50 /var/log/messages # ... les dernières ...

# Afficher tout ce qui arrive dans le fichier
$ tail -f /var/log/auth.log
   

7.5.2.26. tar

Source(s):

tar permet de réaliser des archives c.a.d de regrouper des fichiers et repertoires en un seul fichier.


######
## TAR uniquement
#
$ tar -cvf monarchive.tar fichier1 fichier2 fichier3 # -cvf Créer un archive \a partir de fichiers
$ tar -cvf monarchive.tar mondossier/ # -cvf Créer un archive à partir d'un repertoire (equivalent de la command précedente si mondossier contient les 3 fichiers :).
# -c cré une archive tar
# -v affichier le detail des operations
# -f assembler l'archive dans un fichier

# Il est toujours préferable de regrouper tous les fichiers dans un seul dossier avant de les archiver.

$ tar -tf monarchive.tar # -tf : afficher le contenu de l'archive sans l'extraire
# -t liste contenu de l'archive
# -f utilise fichier archive

$ tar -rvf monarchive.tar fichier4_en_plus # -rvf Ajouter un fichier
# -r Ajouter au fichier archives existant
# -v afficher le detail des operations
# -f assembler l'archive dans un fichier

$ tar -xvf monarchive.tar # -xvf Extraire les fichiers de l'archive
# -x pour eXtract) :
# -v afficher le detail des operations
# -f dé-assembler l'archive depuis un fichier

######
## TAR & Compression gzip
#
$ tar -zcvf monarchive.tar mondossier/ # -zcvf Archiver et compresser en gzip
# -z archive automatiquement compressée avec gzip.

# Décompresser
$ tar -zxvf monarchive.tar.gz # -zxvf dé-archiver et décompresser depuis gzip

######
## TAR & Compression bzip
#
$ tar -jcvf monarchive.tar.bz2 mondossier/ # -jcvf Archiver et compresser en bzip2
$ tar cvf - mondossier/ | bzip2 > monarchive.tar.bz2 # Equivaut à la commande précédente mais via un pipe et commande de compression bz2
# -j archive automatiquement compressée avec bzip2.
    
# Décompresser    
$ tar -jxvf tutoriels.tar.bz2 tutoriels/ # -jxvf Dé-archiver et dé-compresser depuis bzip2

######
## Exclure des fichiers
#
# L'option --exclure MOTIF permet de ne pas archiver certains type de fichiers selon le MOTIF. 
# Pour exclure plusieurs MOTIF, repéter l'option autant de fois que necessaire.
#
$ tar -jcvf monarchive.tar.bz2 mondossier/ --exclude='*.disk' --exclude '*~'
   

7.5.2.27. tee

Permet de lire un flux sur une entrée standard (console, fichier, socket. . . et d’écrire le flux sur la sortie standard et dans un fichier.

                
######
## TEST 
#
$ tee > out.txt
$ ls
$ ls -al
$ ps
# <-------- Ici faire CTRL Z pour arrêter (-eq fin de fichier)
[1]+   Stopped                     tee > out
$ more out.txt
ls
ls -al
ps
   

7.5.2.28. tr

tr permet de transformer ou supprimer des caractères.


# Conversion en majuscules
$ echo toto | tr "a-z" "A-Z"
TOTO
$ echo toto | tr "[:lower:]" "[:upper:]"
TOTO

# Remplacement de caractères
echo toto | tr "po" "ta"
tata

# Suppression de caractères
echo toto | tr -d o
tt
   

7.5.2.29. tzselect, tzconfig & tzdata

Ces commandes permettent d'afficher ou de configurer les fuseaux horaires (timezone) du système.


######
##  Afficher les fuseaux horaires (timezone)...  
#
$ tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
 1) Africa
 2) Americas
 3) Antarctica
 4) Arctic Ocean
 5) Asia
 6) Atlantic Ocean
 7) Australia
 8) Europe
 9) Indian Ocean
10) Pacific Ocean
11) none - I want to specify the time zone using the Posix TZ format.
#? 8
Please select a country.
 1) Aaland Islands	  18) Greece		    35) Norway
 2) Albania		  19) Guernsey		    36) Poland
 3) Andorra		  20) Hungary		    37) Portugal
 4) Austria		  21) Ireland		    38) Romania
 5) Belarus		  22) Isle of Man	    39) Russia
 6) Belgium		  23) Italy		    40) San Marino
 7) Bosnia & Herzegovina  24) Jersey		    41) Serbia
 8) Britain (UK)	  25) Latvia		    42) Slovakia
 9) Bulgaria		  26) Liechtenstein	    43) Slovenia
10) Croatia		  27) Lithuania		    44) Spain
11) Czech Republic	  28) Luxembourg	    45) Sweden
12) Denmark		  29) Macedonia		    46) Switzerland
13) Estonia		  30) Malta		    47) Turkey
14) Finland		  31) Moldova		    48) Ukraine
15) France		  32) Monaco		    49) Vatican City
16) Germany		  33) Montenegro
17) Gibraltar		  34) Netherlands
#? 15

The following information has been given:

	France

Therefore TZ='Europe/Paris' will be used.
Local time is now:	Mon Dec 14 11:36:37 CET 2009.
Universal Time is now:	Mon Dec 14 10:36:37 UTC 2009.
Is the above information OK?
1) Yes
2) No
#? 1

You can make this change permanent for yourself by appending the line
	TZ='Europe/Paris'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Europe/Paris

NoteVariable d'environement du fuseau horaire:
 

Le fuseau horaire est enregistré dans la variable d'environement $TZ, il peut donc être utilisé dans les scripts ou configuré différement pour chaque utilisateur via le fichier .profile dand leur repertoire personnel.

TZ='Europe/Paris'; export TZ # Modifie la variable d'environement


######
## Ajuster le fuseau horaire (timezone)...  [DEPRECATED]
#
$ tzconfig    
WARNING: the tzconfig command is deprecated, please use:
 dpkg-reconfigure tzdata

######
##  Ajuster le fuseau horaire (timezone)... [DEBIAN UI TEXTE INTERFACE]
#
$ dpkg-reconfigure tzdata  #Ajuster le fuseau horaire (timezone)... 
Current default timezone: 'Europe/Paris'
Local time is now:      Wed Dec  9 12:10:34 CET 2009.
Universal Time is now:  Wed Dec  9 11:10:34 UTC 2009.
   

7.5.2.30. wc

wc compte le nombre d’octets, de caractères ou de lignes d’un fichiers.


$ wc -l /var/log/auth.log
1671 /var/log/auth.log
   

7.5.2.31. xargs

xargs permet de récupérer la sortie standard d’une commande comme une liste de paramètres pour leur appliquer une autre commande.


# Rechercher tous les fichiers standards et leur appliquer
# de nouveaux droits
$ find . -type f | xargs chmod 755

# Ici pour des répertoires
$ find . -type d | xargs chmod 711

# Recherche tous les fichiers .bak et les supprime
$ find . -name "*.bak" | xargs rm

# Recherche tous les fichiers de plus de 50 Mo et les affiche
$ find . -size +50M | xargs ls -alh
   

Note

Attention à l’utilisation de cette commande, notamment si vous passez en paramètre une commande rm ou mv car s’il y a une erreur les conséquences peuvent être graves.


7.5.3. Applications

Toutes les commandes sont réalisées sur une ligne à l’aide de pipes si besoin.

7.5.3.1. Donner la liste de tous les comptes et uniquement ceux-la, issus du fichier passwd, triés par ordre alphabétique. Le résultat sera mis dans le fichier /tmp/out. Vous utiliserez cut et sort.
7.5.3.2. Donner le nombre de fichier dans /usr/bin. Vous utiliserez ls et wc.
7.5.3.3. Rechercher dans /usr/share/doc, tous les fichiers compressés (.gz) et indiquer le nombre. Vous utilis- erez find et wc.
7.5.3.4. Donner la liste des processus shell (bash) lancés par des utilisateurs. Vous utiliserez ps et un grep.
7.5.3.5. Réalisez une archive compressée avec bzip2 de /etc/. L’archive sera dans /tmp/etc.tar.bz2.
7.5.3.6. Répartissez etc.tar.bz2 à l’aide de split en autant de fichiers de 1 Mo que possible. Le préfixe sera ’etc’.
7.5.3.7. Reconstruisez à l’aide de cat et des fichiers split un fichier new-etc.tar.bz2
7.5.3.8. Vérifiez à l’aide de la commande md5sum que les deux fichiers etc.tar.bz2 et new-etc.tar.bz2 sont bien identiques.
7.5.3.9. Rechercher dans /home tous les fichiers appartenant au compte ’foo’ et changez le propriétaire et le groupe qui devient ’bar’. Vous utiliserez find, xargs et chown.
7.5.3.10. Que se passe t-il à la suite de la commande: cat /etc/passwd | tr '\n' '\r' > /tmp/newpasswd Testez les deux fichiers /etc/passwd et /tmp/newpasswd sous Linux et sous Windows.

7.5.3.1. Donner la liste de tous les comptes et uniquement ceux-la, issus du fichier passwd, triés par ordre alphabétique. Le résultat sera mis dans le fichier /tmp/out. Vous utiliserez cut et sort.


$ cut -f 1 -d':' /etc/passwd | sort > tmp.out
      

7.5.3.2. Donner le nombre de fichier dans /usr/bin. Vous utiliserez ls et wc.


$ ls -Al /usr/bin | wc -l
      

7.5.3.3. Rechercher dans /usr/share/doc, tous les fichiers compressés (.gz) et indiquer le nombre. Vous utilis- erez find et wc.


$ find /usr/share/doc -name "*.gz" | wc -l
      

7.5.3.4. Donner la liste des processus shell (bash) lancés par des utilisateurs. Vous utiliserez ps et un grep.


$ ps aux | grep bash
      

7.5.3.5. Réalisez une archive compressée avec bzip2 de /etc/. L’archive sera dans /tmp/etc.tar.bz2.


$ tar -jcvf /tmp/etc.tar.bz2 /etc/
$ tar -cf /etc | bzip2 > /tmp/etc.tar.bz2  # Equivalent
      

7.5.3.6. Répartissez etc.tar.bz2 à l’aide de split en autant de fichiers de 1 Mo que possible. Le préfixe sera ’etc’.


$ split -b 1M /tmp/etc.tar.bz2 etc
      

7.5.3.7. Reconstruisez à l’aide de cat et des fichiers split un fichier new-etc.tar.bz2


$ cat etc* > new-etc.tar.bz2  # Attention avec etc* sinon etc.tar.bz2 ou tout autre fichier commencant par "etc" risque d’être concaténé aussi
$ cat etcaa etcab etcac etcad etcae etcaf > new-etc.tar.bz2 
      

7.5.3.8. Vérifiez à l’aide de la commande md5sum que les deux fichiers etc.tar.bz2 et new-etc.tar.bz2 sont bien identiques.


md5sum new-etc.tar.bz2 /tmp/etc*
      

7.5.3.9. Rechercher dans /home tous les fichiers appartenant au compte ’foo’ et changez le propriétaire et le groupe qui devient ’bar’. Vous utiliserez find, xargs et chown.


$ find /home -user foo -print0 | xargs -0 /bin/chown bar:bar
$ find /home -user foo | xargs sudo chown bar :bar            # Variant
      

7.5.3.10. Que se passe t-il à la suite de la commande: cat /etc/passwd | tr '\n' '\r' > /tmp/newpasswd Testez les deux fichiers /etc/passwd et /tmp/newpasswd sous Linux et sous Windows.

La commande crée une copie du fichier de mot de passe en remplacant tous les caractères nouvelle ligne (\n) du fichier original par le caractère retour (\r). Sous linux, les deux fichiers apparaissent de façon identique (une entrée par ligne), sous windows, les lignes apparaissent concaténées les unes aux autres (toutes les entrées sur la même ligne) pour le fichier original /etc/passwd. 'n' est le caractère de contrôle de changement de ligne standard sous les systèmes *nix, ici il est remplacé par un CR/LF qui est plus standard pour Windows.


7.5.4. grep et les expressions rationnelles (ou regulières, regexp, ...)

Source(s):


7.5.4.1. Introduction

Les expressions rationnelles ("Regular Expression", "regexp" en Anglais) permettent de rechercher et selectionner une (ou des) chaînes de caratère à partir de l'interpretation d'un motif de critères ou modèles de recherche ("Pattern" en Anglais)

Une fois la (ou les) chaîne(s) selectionnée(s) suivant le motif, l'objectif est simplement d'effectuer des traitements comme des subtitutions, des validations, etc... sur les chaines trouvées.

Leur utilisation s'étend de certains filtres shell : grep, sed, awk, ... à des langages de scripts : perl, php, ... et aux éditeurs de texte : vi , emacs, ...

Note

!!! Attention !!! l’orthographe d’une expression peut varier d’un outil à un autre. Certains caractères (comme le « ? » ou le « | » avec vi) peuvent également ne pas être supportés. Il faut donc toujours se référer à la documentation de l’outil. certains caractères spéciaux sont communs avec les caractères génériques de désignation de fichiers, mais ils ont une interprétation différente. Donc il faut toujours prêter attention au contexte.


7.5.4.2. Syntaxe avec grep...

La syntaxe la plus courante est:


$ grep [options] expreg [fichiers]
   
Voir grep pour plus d'info sur cette commande.

Avec grep, les motifs doivent être saisis entre guillemets (exemple : “UnMotif”) ou entre apostrophes si le motif contient un $ (exemple : ’$UnMotif’).


7.5.4.3. Caractère particuliers ou "méta-caractères"

Appelés aussi caractères spéciaux, ce sont des caractères interprétés en contexte expression rationnelle comme des opérateurs.

En voici la liste avec un bref descriptif :


.       . (point) remplace tout caractère sauf \n
x*      (astérisque) chaîne contenant 0 ou n fois le caractère x = répetition du caractère qui précède
x+      chaîne contenant 1 ou n fois le caractère x = au moins une occurence 
x?      chaîne contenant 0 ou 1 fois x = au plus une occurence
x|y     chaîne contenant x ou bien alors y
[...]   (crochets) chaîne comprenant tout caractère contenu entre les crochets = un ensemble
[^...]  le ^ à l’intérieur des [ ] signifie le "non" booléen
        ou le complément = Ensemble complémentaire
[^0-9]  Par exemple [^0-9] signifie tout ce
        qui n’est pas un chiffre.
^abc    recherche la chaîne "abc" en début de ligne
abc$    recherche de la chaîne "abc" en fin de ligne

x{n}    chaîne contenant n fois le caractère x
x{n,}   chaîne contenant au moins n fois le caractère x
x{0,m}  chaîne contenant de 0 à m fois le caractère x
x{n,m}  chaîne contenant de n à m fois le caractère x = nombre de répétitions attendus du caractère qui précède

<abc   mot commençant pas la chaîne "abc"
abc>   mot se terminant pas la chaîne "abc"

\ annule le rôle de  méta-caractère, pour jouer le rôle du caractère usuel

Les principaux caractères de contrôles :
\t tabulation
\n retour ligne
\r retour chariot
\s espace
    

Note

L'antislash \ inhibe l'interprétation des caractères spéciaux et force leur interprétation usuelle.


.\.txt recherche les chaines du genre c.txt , où c est un caractère unique qcq 
\*$ recherche les chaines qui se terminent ($) par le caractère astérisque (\*)
     

Note

Un caractère particulier comme “ ?”, “*”. . . exprimé entre “[ ]” est pris dans son sens littéral. C’est à dire qu’il n’est pas interprété.

Note

Dans les expressions rationnelles simples, les méta-caractères “ ?”, “+”, “{”, “|”, “(”, et “)” perdent leur signification spéciale, il faut utiliser à la place leurs versions avec la contre-oblique “\ ?”, “\+”, “\{”, “\|”, “\(”, et “\)” pour leur conserver leur caractère particulier(interprétable) ou alors utiliser le mode étendu de grep avec l’option -E.


7.5.4.4. Jeu d'essai...


# Recherche la chaîne "perl"
$ grep perl jeu_essai.txt
perle
perlant
perl Parler parle perl langage
Le langage c ou perl
le le le langage gage ge ppppppperl ppeeerrrllll peeerrlllll peerrlllll

# Recherche la chaîne "Perl"
$ grep Perl jeu_essai.txt
Perl
le language C ou Perl

# Recherche la chaîne "perl" ou "Perl"
$ grep [pP]erl jeu_essai.txt
Perl
perle
perlant
perl Parler parle perl langage
Le langage c ou perl
le le le langage gage ge ppppppperl ppeeerrrllll peeerrlllll peerrlllll
le language C ou Perl
...

$ grep "<pe" jeu_essai.txt    # Mot commençant par "pe"
$ grep "rl>" jeu_essai.txt    # Mot finissat par "rl"
$ grep "<perl>" jeu_essai.txt # Mot "perl"
## Ces trois là donnent aucun resultat bizarre bizarre ?!
## En fait après un rapide coup d'oeil dans la page de man
## il apparaît qu'il faut plutôt utiliser:
$ grep "\Bpe" jeu_essai.txt    # Mot commençant par "pe"
le le le langage gage ge ppppppperl ppeeerrrllll peeerrlllll peerrlllll 
$ grep "rl\b" jeu_essai.txt    # Mot finissat par "rl"
Perl
perl Parler parle perl langage
Le langage c ou perl
le le le langage gage ge ppppppperl ppeeerrrllll peeerrlllll peerrlllll
le language C ou Perl
$ grep "\Bperl\b" jeu_essai.txt # Mot "perl"

# Ligne commençant par "perl"
$ grep "^perl" jeu_essai.txt
perle
perlant
perl Parler parle perl langage

# Exclure "abc"
$ grep "[^abc]" jeu_essai.txt
Perl
perle
perlant
parlant
Parlant
parler
perl Parler parle perl langage
alpha qwertz exe language
exe qwertz
qwertz alpha
exe qwertz
qwertz alpha
Langage
Language
Le langage c ou perl
le le le langage gage ge ppppppperl ppeeerrrllll peeerrlllll peerrlllll
le language C ou Perl
02.03.05.03
03.236.5696
zéro un deux trois quatre cinq six sept huit neuf
0 1 2 3 5 6 7 8 9
400000 401000 402000 403000 404000 405000
400 401 402 403 404 405
4 41 42 43 44 45
4 1 2 3 4 5
ami   tel            age
joe   05-55-33-22-55 23 ans
bar   10-23-22-55-63 35 ans
team 03-02-21-12-25 99 ans

# Ligne terminant par "Perl"
$ grep "Perl$" jeu_essai.txt
Perl
le language C ou Perl

# Le deuxième caractère est indifférent parl, pbrl, pcrl...
$ grep "p.erl" jeu_essai.txt
le le le langage gage ge ppppppperl ppeeerrrllll peeerrlllll peerrlllll

# Ligne commençant par un point
$ grep "^\." jeu_essai.txt
.juste pour le teste      # Cette a été rajouter manuellement à la fin du fichier jeu_essai.txt

# Chaîne commencée par une majuscule et terminée par la chaîne "erl"
$ grep "[A-Z]erl" jeu_essai.txt
Perl
le language C ou Perl

# Chaîne ayant 0, 1, ou n majuscules
$ grep "[A-Z]*" jeu_essai.txt
Perl
perle
perlant
parlant
Parlant
parler
perl Parler parle perl langage
alpha qwertz exe language

exe qwertz
qwertz alpha

exe qwertz
qwertz alpha

Langage
Language
Le langage c ou perl
le le le langage gage ge ppppppperl ppeeerrrllll peeerrlllll peerrlllll
le language C ou Perl
02.03.05.03
03.236.5696
zéro un deux trois quatre cinq six sept huit neuf
0 1 2 3 5 6 7 8 9
400000 401000 402000 403000 404000 405000
400 401 402 403 404 405
4 41 42 43 44 45
4 1 2 3 4 5
ami   tel            age
joe   05-55-33-22-55 23 ans
bar   10-23-22-55-63 35 ans
team 03-02-21-12-25 99 ans
.juste pour le teste

# Séquence alphanumérique
$ grep "[0-9a-zA-Z]*" jeu_essai.txt
$ grep "[[:alnum:]]*" jeu_essai.txt # Equivalent
Perl
perle
perlant
parlant
Parlant
parler
perl Parler parle perl langage
alpha qwertz exe language

exe qwertz
qwertz alpha

exe qwertz
qwertz alpha

Langage
Language
Le langage c ou perl
le le le langage gage ge ppppppperl ppeeerrrllll peeerrlllll peerrlllll
le language C ou Perl
02.03.05.03
03.236.5696
zéro un deux trois quatre cinq six sept huit neuf
0 1 2 3 5 6 7 8 9
400000 401000 402000 403000 404000 405000
400 401 402 403 404 405
4 41 42 43 44 45
4 1 2 3 4 5
ami   tel            age
joe   05-55-33-22-55 23 ans
bar   10-23-22-55-63 35 ans
team 03-02-21-12-25 99 ans
.juste pour le teste

# le chiffre 0 ou 3 ou 7
$ grep "[037]" jeu_essai.txt
02.03.05.03
03.236.5696
0 1 2 3 5 6 7 8 9
400000 401000 402000 403000 404000 405000
400 401 402 403 404 405
4 41 42 43 44 45
4 1 2 3 4 5
joe   05-55-33-22-55 23 ans
bar   10-23-22-55-63 35 ans
team 03-02-21-12-25 99 ans

# les chaînes "langage" ou "language" ou grep -E "lang[u]?age"
$ grep "lang[u]\?age" jeu_essai.txt
$ grep -e "lang[u]\?age" jeu_essai.txt # Equivalent
perl Parler parle perl langage
alpha qwertz exe language
Le langage c ou perl
le le le langage gage ge ppppppperl ppeeerrrllll peeerrlllll peerrlllll
le language C ou Perl

$ grep -E "lang[u]\?age" jeu_essai.txt
## Aucun resultat !

# Recherche des chaînes "ppp" ou "pppp"
$ grep "p{3,4}" jeu_essai.txt
## Aucun resultat ?!
$ grep -E "p{3,4}" jeu_essai.txt
le le le langage gage ge ppppppperl ppeeerrrllll peeerrlllll peerrlllll

# Chaîne au format mm.mmm.mmmm avec m compris entre 0 et 9
$ grep "[0-9]{2}\.[0-9]{3}\.[0-9]{4}" jeu_essai.txt
## Aucun resultat ?!
$ grep -E "[0-9]{2}\.[0-9]{3}\.[0-9]{4}" jeu_essai.txt
03.236.5696

# Recherche chaîne "e+"
$ grep "e+" jeu_essai.txt     # Caractère ’+’ est pris littéralement.
ce+ci est un autre essai...
$ grep -E "e+" jeu_essai.txt  # Caractère ’+’ est pris au sens étendu.
$ grep "e\+" jeu_essai.txt    # Equivalent
Perl
perle
perlant
parler
perl Parler parle perl langage
alpha qwertz exe language
exe qwertz
qwertz alpha
exe qwertz
qwertz alpha
Langage
Language
Le langage c ou perl
le le le langage gage ge ppppppperl ppeeerrrllll peeerrlllll peerrlllll
le language C ou Perl
zéro un deux trois quatre cinq six sept huit neuf
ami   tel            age
joe   05-55-33-22-55 23 ans
team 03-02-21-12-25 99 ans
.juste pour le teste
lang?age
ce+ci est un autre essai...

# Ne pas oublier les quotes !
$ grep -E p{3,} jeu_essai.txt
grep: p: Aucun fichier ou répertoire de ce type
$ grep -E "p{3,}" jeu_essai.txt
le le le langage gage ge ppppppperl ppeeerrrllll peeerrlllll peerrlllll

# Attention aux caractères spéciaux...
$ grep \\$ jeu_essai.txt
$ grep [$] jeu_essai.txt   # Equivalent
Encore un derni$r essai.
   

7.5.4.5. Exercice

 
# – 0 - Trouver les lignes vides
$ grep "^$" jeu_essai.txt
$ grep -v "[[:alnum:]+[:punct:]+]" jeu_essai.txt  # Equivalent ???

# – 1 - Chaîne contenant au minimum 3 "p"
$ grep "[p]{3,}" jeu_essai.txt   # Commande KO, donne aucun resultat, erreur de syntaxe
$ grep "[p]\{3,\}" jeu_essai.txt # Commande OK
$ grep ".p.p.p." jeu_essai.txt   # Equivalent ???
le le le langage gage ge ppppppperl ppeeerrrllll peeerrlllll peerrlllll

# – 2 - Mot terminé par "age"
$ grep "age>" jeu_essai.txt
## Dans me cas, cette command retourne aucun resultat ?! Bizarre
## Il faut plutôt utiliser:
$ grep "age\b" jeu_essai.txt
perl Parler parle perl langage
alpha qwertz exe language
Langage
Language
Le langage c ou perl
le le le langage gage ge ppppppperl ppeeerrrllll peeerrlllll peerrlllll
le language C ou Perl
ami   tel            age
lang?age

# – 3 - Mot terminé par "guage" ou "gage"
$ grep "g[u]*age>" jeu_essai.txt
## Dans me cas, cette command retourne aucun resultat ?! Bizarre
## Il faut plutôt utiliser:
$ grep "g[u]*age\b" jeu_essai.txt
perl Parler parle perl langage
alpha qwertz exe language
Langage
Language
Le langage c ou perl
le le le langage gage ge ppppppperl ppeeerrrllll peeerrlllll peerrlllll
le language C ou Perl

# – 4 - Chaîne contenant "rla"
$ grep "rla" jeu_essai.txt
perlant
parlant
Parlant

# – 5 - Lignes terminées par "ans"
$ grep "ans$" jeu_essai.txt
$ grep 'ans$' jeu_essai.txt # Equivalent  
joe   05-55-33-22-55 23 ans
bar   10-23-22-55-63 35 ans
team 03-02-21-12-25 99 ans

# – 6 - Chaîne contenant les sous-chaînes "alpha" ou "exe"
$ grep "alpha\|exe" jeu_essai.txt  # le caractère "|" matérialise le "ou"
alpha qwertz exe language
exe qwertz
qwertz alpha
exe qwertz
qwertz alpha

# – 7 - Ligne ne commençant pas par un chiffre
$ grep -v "^[[:digit:]]" jeu_essai.txt  # Fonctionne mais n'utilise pas complétement les expressions rationnelles
$ grep "^[^0-9]" jeu_essai.txt          # Mieux
$ grep "^[^[:digit:]]" jeu_essai.txt    # Equivalent du mieux :)
Perl
perle
perlant
parlant
Parlant
parler
perl Parler parle perl langage
alpha qwertz exe language

exe qwertz
qwertz alpha

exe qwertz
qwertz alpha

Langage
Language
Le langage c ou perl
le le le langage gage ge ppppppperl ppeeerrrllll peeerrlllll peerrlllll
le language C ou Perl
zéro un deux trois quatre cinq six sept huit neuf
ami   tel            age
joe   05-55-33-22-55 23 ans
bar   10-23-22-55-63 35 ans
team 03-02-21-12-25 99 ans
.juste pour le teste
lang?age
ce+ci est un autre essai...
Encore un derni$r essai. 2009

# – 8 - Ligne commençant par une voyelle ou un chiffre
$ grep "^[aeiouy]\|^[[:digit:]]" jeu_essai.txt
$ grep "^[aeiouy]\|^[0-9]" jeu_essai  # Equivalent
alpha qwertz exe language
exe qwertz
exe qwertz
02.03.05.03
03.236.5696
0 1 2 3 5 6 7 8 9
400000 401000 402000 403000 404000 405000
400 401 402 403 404 405
4 41 42 43 44 45
4 1 2 3 4 5
ami   tel            age

# – 9 - Ligne ne commençant pas par une voyelle
$ grep "^[^aeiouy]" jeu_essai.txt
alpha qwertz exe language
exe qwertz
exe qwertz
ami   tel            age

# – 10 - Ligne commençant ou se terminant par un chiffre
$ grep "^[[:digit:]]\|[[:digit:]]$" jeu_essai.txt
$ grep "^[0-9]\|[0-9]$" jeu_essai.txt   # Equivalent
02.03.05.03
03.236.5696
0 1 2 3 5 6 7 8 9
400000 401000 402000 403000 404000 405000
400 401 402 403 404 405
4 41 42 43 44 45
4 1 2 3 4 5
Encore un derni$r essai. 2009

# – 11 - Les lignes qui font moins de 10 caractères.
$ grep "^.\{1,10\}$" jeu_essai.txt
$ grep -E "^.{1,10}$" jeu_essai.txt  # Equivalent
Perl
perle
perlant
parlant
Parlant
parler
exe qwertz
exe qwertz
Langage
Language
lang?age

7.5.4.6. Extra...


# Ligne contenant "alpha" et "quertz"
$ grep "alpha" jeu_essai.txt | grep "qwertz"
alpha qwertz exe language
qwertz alpha
qwertz alpha

# Ligne avec mots contenant 401, 402, 403... 409
$ grep "40[0-9]" jeu_essai.txt
400000 401000 402000 403000 404000 405000
400 401 402 403 404 405

# Ligne avec mot commençant par 401, 402, 403... 409
$ grep "\B40[0-9]" jeu_essai.txt
400000 401000 402000 403000 404000 405000

# Ligne avec mot finissant par 401, 402, 403... 409
$ grep "40[0-9]\b" jeu_essai.txt
400 401 402 403 404 405

# Les numéros de téléphone composé de 10 chiffres.
$ grep -E "((([0-9]{2})-){4})[0-9]{2}" jeu_essai.txt 
joe   05-55-33-22-55 23 ans
bar   10-23-22-55-63 35 ans
team 03-02-21-12-25 99 ans

# Rechercher une adresse email
"\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b"

# Trouver les paires de tags HTML
"<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)</\1>" 

# Pour valider une adresse IP
"\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"  
   

7.5.5. Editeur en mode texte : VI(m), Emacs, Nano, mcedit, etc...

Source(s):

De multiple editeurs de texte sont disponible sous Linux: vi(m), emacs, nano, mcedit, etc...

Ils ont tous leurs avantages et défauts en terme de fonctionalités, de vitesse et d'utilisabilité (ergonomie)...

Pour l'instant ni VI(m), ni Emacs ne m'ont convaincus en terme d'utilisabilité... il faut peut-être plusieurs semaines de pratique avant de réellement maitriser les fonctionalités et les atoûts de ces éditeurs de texte.

Ils ont tous l'avantage d'être accessible en modem console et VI(m) semble être celui le plus disponsible par défaut sur les systemes Linux/Unix de tout genre... pour raison historique... quoi que Emacs soit aussi très répendu...

Chacun possède un tutorial (un petit logiciel d’entraînement incorporé à Vi, nommé vimtutor), qui vous permet de vous entraîner à souhait sur ces outils. C’est ce qu'il est conseillé de faire, en faisant fi de toutes les méthodes imprimées ou autres, car Emacs et Vi sont des outils de travail qui doit avant tout vous rentrer dans les doigts.

Il faut que je me penche sur Nano, qui semble être le vainceur d'un combat eternelle entre VI et Emacs... à tester pour faire son experience... d'un premier abord il semble plus facile d'accès sans experience et faire l'affaire pour l'administration de système :)) Dans Nano, le menu en bas de fenêtre semble être très conviviale... mais il est certainement moins évolué que VI ou Emacs...

Je regrette qu'aucun ne fournisse un simple copier/coller avec CTRL+C / CTRL+V par défaut... et je n'ai pas encore vraiment compris pourquoi... pour de raison historique certainement ou peut-être trop windowsien au goût des développeurs :)) ... En personalisant les raccourcis on doit pouvoir s'y retrouver...

Le raccourcis clavier devrait aussi faire l'objet d'un standard international partagé par tous :)... cela existe peut-être certainement mais j'ai pas encore eu l'occasion de chercher :))

Ce chapitre devra être approfondi ultérieurement...

Il existe évidement bien d'autre éditeur en mode graphique: gedit, kate, quanta, etc... peut-être pas aussi puissant mais ergonomique et modulaire...


7.5.5.1. vim


## Tutorial
$ vimtutor

## Ouvrir un fichier
$ vim monfichier       # Editer 'monfichier'

## Quitter/Enregistrer
:q! (ou ZQ)        # Quitter SANS enregistrer
:wq (ou ZZ ou :x)  # Enregistrer ET Quitter
:w monfichier      # Sauvegarder dans 'monfichier' mais rester dans fichier ouvert
:saveas monfichier # Sauvegarder dans 'monfichier' et ouvrir 'monfichier'

## Activer Mode
<Echap>        # Normal/Commande (par défaut)
v              # Visuel : démarrer la selection de texte
i              # Insertion : Insérer caractères SOUS le curseur
a (ou A)       # Insertion : Insérer caractères APRÈS (AVANT) le curseur
o (ou O)       # Insertion : Ouvrir un ligne SOUS (AU DESSUS) de la line courante

## Se déplacer en Mode Normal
         (haut)
           k
(gauche) h   l (droite)
           j
         (bas)

## Mouvements en Mode Normal
w             # Aller jusqu'au début du prochain mot
e             # Aller jusqu'à la fin du mot courant
0             # (zéro) Aller jusqu'au début de la ligne
$             # Aller jusqu'à la fin de ligne
#G            # Aller à la ligne numéro #
G             # Aller à la la FIN du fichier
gg            # Aller au début du fichier
CTRL-G        # Afficher position + chemin[état] du fichier

## Répéter un mouvement en Mode Normal
2w            # Aller au début du 3ième mot (saute 2 mots) 
3e            # Aller à la fin du 3ième mot (saute 3 mots)

## Operations en Mode Normal

# Couper/Effacer
x             # Effacer caractère sous le curseur
d             # Couper/Effacer
dd            # Couper/Efface une ligne

# Copier
y             # Copier
yy            # Copie une ligne

# Coller
p             # Coller (Après le curseur/En dessous de la ligne courante)
:<Echap>.

# Changer/Remplacer
rx            # (caractère) remplacer le caractère sous le curseur par caractère 'x'
R             # (caractère) remplacer plusieurs caractères sous le curseur jusqu'à <Echap>
c             # (mots) changer
ce            # (mots) remplacer le mot sous le curseur

# Annuler
u             # (Undo) Annule dernière commande
              # Appyer plusieurs fois pour annuler plusieurs commandes
U             # (Undo) Annule toutes les dernières commande sur la ligne
              # Récupère toute la ligne avant modification
CTRL-R        # (Redo) Annule les annulations :)

## Répéter une opération en Mode Normal
## Syntaxe: 
## [Operation][Mouvement]
## Nombre [Operation]
## [Operation] Nombre [Mouvement]
3x            # Effacer 3 caractères
dw            # Effacer 1 mot (jusqu'au mot suivant)
d2w           # Effacer 2 mots
d$	      # Effacer jusqu'à fin de ligne
3dd           # Coupe 3 lignes
4yy           # Copie 4 lignes

## Recherche
/texte        # Recherche 'texte' en AVANT
?texte        # Recherche 'texte' en ARRIÈRE

n             # Trouver le resultat suivant
N             # Trouver le resultat précédent
%             # Trouver ),] ou } correspondante

/texte\c      # Recherche avec option 'ignorer la case' !

## Substitution
## Remplacer 'ancien' par 'nouveau'
:s/ancien/nouveau      # Dans la 1ère occurance seulement de la ligne courante
:s/ancien/nouveau/g    # Dans toutes les occurances de la ligne courante
:#,#s/ancien/nouveau/g # Toutes les occurences d'un texte entre deux lignes
                       # - #,# numeros de ligne de la plage de substitution couverte
:%s/ancien/nouveau/g   # Toutes les occurences dans tout le fichier
:%s/ancien/nouveau/gc  # Avec confirmation

## Executer une commande externe
:!x                    # Executer la commande externe 'x' (shell)
:!ls                   # Execute la commande 'ls'
:!rm monfichier        # Execute la commande 'rm' - Efface monfichier

## Selection/Copier/Coller
v [Movement] y [Movement] p  # Selectionner/Copier/Coller dans fichier courant
v [Movement] :w monfichier   # Enregistrer une selection de texte dans un fichier externe

## Récupération et fusion de fichier
:r monfichier          # Inclure le contenu de 'monfichier' 
                       # à la position courante du curseur
:r !ls                 # Inclure le resultat de la commande externe 'ls'
                       # à la position courante du curseur

## Auto-complétion
: CTRL-D   # Affiche la liste de toutes les commandes disponibles
:e CTRL-D  # Affiche la liste des commandes commençant par 'e'
:e <TAB>   # Complétion automatique (nom de commande/fichier)
<Flêche-Haut>  # Affiche les commandes précédentes

## Activer les options
## Syntaxe: 
## :set xxx (xxx=option)
:set ic         # Activer l'option 'ignorer la case' pour la recherche
:set noic       # Désactiver l'option (idem précédente)
:set hls        # Active l'option 'Mise en lumière' des resultats de recherche 
:set hlsearch
:nohlsearch     # Desactive l'option (idem précédente)
:set is         # Montrer les appartenance partielles
:set ruler      # Affiche la barre de localisation du curseur (ligne, column, etc...)

## Fichier de configuration 
$ vim ~/.vimrc  # Editer fichier configuration depuis le shell      
:edit $MYVIMRC  # ---------------------------- depuis vim

:version        # Liste les fichiers de configurations pris en compte
:r $VIMRUNTIME/vimrc_example.vim     # Exemple de fichier de configuration

## Aide en Ligne
:help           # Accéder à la page d'aide
<F1>
CTRL-W CTRL-W   # Sauter d'une fenêtre à l'autre
:q<Entree># Quitter l'aide

## Accès par sujet
:help vimrc-intro
:help w
:help :edit
:help c_CTRL-D
:help c_<T
:help insert-index
:help user-manual

## Copier/Coller entre fichiers directement
#1. Depuis le Mode Normal (mode commande) presser : 
#2. Entrer le numéro de ligne début,fin
#3. Presser w
#4. Entrer le nom du fichier
:43,52w monfichier    # copie lignes 43 à 52 vers le nouveau fichier 'monfichier'
:43,52w>> monfichier  # ajouter à la fin d'un fichier existant

## Copier/Coller entre fichier via mémoir tampon
## Depuis le Mode Normal (mode commande) presser la suite de commande suivante:
"a5yy           # Copier 5 lignes dans la mémoire tampon nommée 'a'
:e monfichier   # Copier mémoire tampon vers un autre fichier, 
                # changer vers le nouveau fichier avec la syntaxe :e
"ap             # Colle le contenu de la mémoire tampon 'a' à l'emplacement du curseur
:w              # Sauvegarder les changements avant de retourner 
:e#             # Retour au fichier original

7.5.7. Editeur XML (XML Copy Editor)

Source(s):

XML Copy Editor est un logiciel bien pratique pour travailler avec des fichiers .xml, .xsl, .xsd, etc...

## FONCTIONALITES * Validation DTD/XML Schema/RELAX NG * XSLT * XPath * "Belle-Impression" * Coloration syntaxique * Pliage de code, repliage (folding en anglais) * Auto-completion de Tag * Editer ses propres Tag * Correction orthographique et syntaxique * Supporte XHTML, XSL, DocBook et TEI * Import/Export sans perte de documents Microsoft Word (seulement sous Windows)

Sous ubuntu, il devrait être inclu dans les paquets fournis. Toutefois dans la version 64bits il ne semble pas disponible.

Pour Ubuntu 9.10 64bits la compilation depuis le source semble donc s'imposer :)... à voir plus tard...


7.5.8. Environnement de développement intégré (IDE) : Eclipse, Netbeans, Aptana, etc...

Source(s):

Note

Tout comme les editeurs de texte, le meilleurs moyens d'en choisir un c'est d'en essayer plusieurs et d'utiliser quelques temps celui qui nous convient le mieux. Puis de retenter l'experience avec les autres après quelques versions de mise à jour :)

Un IDE est un programme regroupant un ensemble d'outils pour le développement de logiciels. En règle générale, un EDI regroupe un éditeur de texte, un compilateur, des outils automatiques de fabrication, et souvent un débogueur.

Ecrire du code, requiert au moins un éditeur de texte :) mais un IDE peut grandement aider à plus de productivité et de créativité :)

Sous Linux, plusieurs options (mais in fine cela dépend aussi grandement du language dans lequel on souhaite programmer) :

NetBeans, Eclipse (avec phpEclipse plugin), Apatana (avec radrails plugin), etc...

Voir aussi mon installation de Netbeans, que j'ai utilisé dans le cadre de la formation pour les développements PHP et XML.

Pour PHP, Sylvain utilise le projet PDT basé sur Eclipse qui est assez proche de netbean en terme de fonctionnalités.

Pour Python, Sylvain suggère eric-ide (un peu complexe à son goût), Netbean et Eclipse dispose tout deux d'un plugin Python (j'ai utilisé celui de Netbeans pour mes développements sous Python).


7.5.9. Programmation en Langage SHELL (Bash) sous Linux

Source(s):


7.5.9.1. Short Description du language

Cette information est disponible via man bash ou man sh


# Entête de déclaration de l’interpréteur de commande (après le sha-bang #!)   
#!/bin/bash  

# Rendre monscript.sh exécutable
$ chmod u+x monscript.sh

# Paramètres
# Quand on lance un script : sh ./foobar.sh blah1 blah2 bla3
# les paramètres sont passés automatiquement dans $1, $2...$n, par exemple :
# Dans le script
# $1 vaut blah1, $2 vaut blah2...

# Variables prédéfinies
$@ liste des paramètres
$# nombre de paramètres
$$ numéro (PID) du script
$0 nom du script
$? valeur de retour d’un script ou d’une fonction

# Varialbles affectées
$ nom="Pierrot"

# Chaîne de caractères
# Utiliser "(double quote) ou '(simple quote)
$ echo "Salut Pierrot"
Salut Pierrot
$ echo "Salut \"Pierrot\""
Salut "Pierrot"
$ echo "Salut $nom"
Salut Pierrot
$ echo 'Salut $nom'
Salut $nom
$ echo "Salut 'Pierrot'"
Salut 'Pierrot'
$ echo 'Salut 'Pierrot''
Salut Pierrot
$ echo 'Salut "Pierrot"'
Salut "Pierrot"

# Suite de commande
commande1;commande2;commande3;    # Séparée par des ;(points virgule)
# equivaut à
commande1                         # Séparée par des nouvelle ligne
commande2
commande3

# Structure IF
if expression ; then
  commande1;commande2;
  ...
  comandeN
elif expression ; then
  ...
else
  ...
fi

# Structure CASE
case chaîne
in
  regex) commande1;commande2;
         commande3
         commande4
         ...
         ;;
         
         ...
        
      *) ... ## Default action
         ;;
esac

# Structure FOR
for x [ in list ]   # list = * or ‘cat monfichierlist‘ or 1 2 3 or ...
do
  commandes
done

# Alternative
for ((i=0;i<10;i=i+1));do commande $i; done

# Structure JUSQUA
until test; do      # test = [ $a == 10 ] or ...
  commandes
  ...
done

# Structure TANTQUE
while test; do      # test = [ $a -lt 10 ] or ...
  commandes
  ...
done

function commande { ...
  # On accède aux paramètres avec $1...$n
  resultat = `commande $1`
}

# Function prédéfinies:
# LET 
# Initialisation (ajouter 1 à i)
let i=$i+1       # Là on ne met pas d’espace
let "i = $i + 1" # Ici mettez des espaces

# READ
#lecture d’une valeur au clavier
echo -n "Entrez votre nom :"   # l'option -n désactive le retour de chariot de fin de chaîne
read nom
echo $nom

# SELECT
# récupérer un élément dans une liste.
select CHOIX [ in liste ; ]
do
   commandes
done

# Le numéro du choix est affecté à la variable $REPLY, le nom du choix à la variable $CHOIX. 
# Exemple : Si l’utilisateur tape 1, $REPLY vaudra ’1’ et $CHOIX vaudra "Choix A".
select CHOIX in "Choix A" "Choix B";
do
 case $REPLY in
  1) echo "$CHOIX --> $REPLY";;
  2) echo "$CHOIX --> $REPLY";;
  *) echo "Vous avez tapé n’importe quoi !";;
 esac
done

# TEST
# Tester une expression booléenne. 
# On peut aussi noter un test entre des ’[’ ’]’, [ expression ]. 
# Attention laisser un espace après le ’[’ et avant le ’]’.
# Retourne 0 si Vrai, une autre valeur dans les autres cas.

# Test sur les entiers
if test $n1 -eq $n2 ... # n1 -eq n2, si n1 est égal à n2
if [ $n1 -eq $n2 ] ...
# opérateurs 
-ne not equal (!=) 
-eq equal (=)
-gt greater (>)
-lt lower (<)
-le lower or equal (<=)
-ge greater or equal (>=)
-a AND booléen # Ex: if [ a == a -a b == b ] ; then echo true ; fi
-o OR booléen  # Ex: if [ a == z -o b == b ] ; then echo true ; fi

# Test sur les fichiers
-d si c’est un répertoire # [ -d $1 ]
-e si le fichier existe   # [ -e $1 ]
-f si le fichier existe et si c’est un fichier standard # [ -f $1 ] 
       
# Test sur les chaînes
if test $1 == $2 ... # s1 == s2, si les chaînes s1 et s2 sont identiques
if [ $1 == $2 ]...   # equivalent
if test $1 == $2 ... # s1 != s2, si les chaînes sont différentes.

# SOURCE . (inclure un fichier externe)
.  fichier [arguments]       # Lire et exécuter les commandes contenues dans fichier avec  l’environnement
source fichier [arguments]   # de  l’interpréteur  courant, puis renvoyer l’état final de la dernière com‐
                             # mande exécutée dans fichier. Si le nom du fichier ne contient pas de  barre
                             # oblique,  les  chemins  d’accès  contenus  dans  PATH  sont  parcourus pour
                             # rechercher le répertoire contenant le fichier.
                             
# SOUS-SHELL
(cmd1;cmd2;...)		# Crée un sous shell avec son propre environement hérité du parent et modifiable localement.
                  # cmd1;cmd2;... est un suite de commande à exécuter (même syntaxe que pour une console ou un script. 
   

7.5.9.2. Exercices d’application sur la programmation SHELL

7.5.9.2.1. TP 1 utilisation de la fonction test

Écrivez un script qui dit si le paramètre passé est :

  • un fichier

  • un répertoire

  • n’existe pas

Par exemple, si le script se nomme "premier.sh" la commande ./premier.sh premier.sh, doit indiquer que c’est un fichier.

Resultat : SR001-sys02-ch06-rlscript01.sh SR001-sys02-ch06-eofscript01.sh


# Sans paramètre affiche l'aide
$ ./sys02-ch06-rlscript01.sh
Paramètre manquant
Usage: ./sys02-ch06-rlscript01.sh FICHIER
   
# Avec en paramètre un fichier inexistant
$ ./sys02-ch06-rlscript01.sh test
test n'existe pas !
   
# Avec en paramètre un dossier inexistent
$ ./sys02-ch06-rlscript01.sh /test/
/test/ n'existe pas !
   
# Avec en paramètre le fichier du script lui même
$ ./sys02-ch06-rlscript01.sh sys02-ch06-rlscript01.sh
sys02-ch06-rlscript01.sh existe
C'est un fichier
   
# Avec un dossier existant
$ ./sys02-ch06-rlscript01.sh /etc
/etc existe
C'est un repertoire
   
# Avec un lien symbolique ==> On voit qu'il est traité comme un simple fichier
$ ./sys02-ch06-rlscript01.sh /etc/locale.gen
/etc/locale.gen existe
C'est un fichier
     

Cet exercise m'a permis de bien comprendre l'importance de mettre un espace entre "[" et "]" entourant une expression à tester. Le message d'erreur étant peu explicite, une telle erreur devient vite invisible dans le cas ou le script n'est pas testé correctement en pas à pas.

Écrivez un script qui n’affiche que les répertoires.

Resultat : SR001-sys02-ch06-rlscript02.sh SR001-sys02-ch06-eofscript02.sh


# Resultat avec commande standard
$ ls --file-type
generate.bash~  generate.log  generate.sh  public_html/  source/
# Resultat avec script
$ ./sys02-ch06-rlscript02.sh 
public_html
source
     

Cet exercise m'a permis de bien comprendre l'importance de bien suivre les instructions telles qu'énoncées et faire attention aux interpretation par rapport à la méthode amenant au résultat. Mon script est bien différent de celui de l'EOF, ce dernier n'utilise que la fonction test comme cela etait demandé :)) Bon cela montre aussi que differents moyens sont bons pour parvenir à un résultat, le tout sera d'apprendre avec l'experience à obtenir le résultat avec le moindre effort en bon développeur :))

Écrivez un script qui n’affiche que les fichiers.

Resultat : SR001-sys02-ch06-rlscript03.sh SR001-sys02-ch06-eofscript02.sh


$ sys02-ch06-rlscript03.sh
jeu_essai.txt
jeu_essai.txt~
sys02-ch01-environnement.pdf
sys02-ch02-commandes-advanced.pdf
sys02-ch03-expression-rationnelle.pdf
sys02-ch04-vi.pdf
sys02-ch06-eofscript01.sh
sys02-ch06-eofscript02.sh
sys02-ch06-eofscript02.sh~
sys02-ch06-langage-shell.pdf
sys02-ch06-rlscript01.sh
sys02-ch06-rlscript01.sh~
sys02-ch06-rlscript02.sh
sys02-ch06-rlscript02.sh~
sys02-ch06-rlscript03.sh
sys02-ch06-rlscript03.sh~
sys02-ch06-sh-con.pdf
sys02-ch08-exercice3.pdf
tmp.out
toto.sh
     

Mon script dans cet exercise m'aura au moins permis de savoir comment lister simplement des repertoires avec la commande ls (ls -Ad */)

Écrivez un script qui donne le nombre de fichiers et de répertoires.

Resultat : SR001-sys02-ch06-rlscript04.sh SR001-sys02-ch06-eofscript02.sh


$ sys02-ch06-rlscript04.sh 
Nombre de fichiers:
8
Nombre de repertoires:
8
$ ls --file-type
01-UI003-Environnement-de-travail/
02-SR001-Commandes-de-bases-de-GNULinux-Shell/
03-UI004-Réaliser-des-documents-avec-LaTeX/
04-UI005-Publier-des-documents-techniques-avec-DocBook/
05-SR009-Interfacer-Apache-avec-un-langage-de-script-et-un-serveur-de-base-de-données/
06-SR004-Interconnecter-un-réseau-TCP-IP/
hello.c~
Links reference.txt
Logiciels reference.txt
Module summary.txt
monjournal/
shell_fc_tp2_correction.txt
tmp2~
tmp.txt
tmp.txt~
www.lagadec.org_oef/
      

Pour cette exercise, je trouvais interressant de capitaliser sur mes propres scripts. Toutefois, le script de l'EOF est clair et évident maintenant :))

Question: Pourquoi utiliser j=`expr $j + 1` au lieu de let j=j+1 ? Est-ce du pareil au même ou est-ce pour raison de portabilité ?

Attente de réponse de l'ÉOF...


7.5.9.2.2. TP 2 utilisation de la fonction selon que (case)

Resultat : SR001-sys02-ch06-rlscript05.sh SR001-sys02-ch06-eofscript05.sh


$ sh sys02-ch06-rlscript05.sh
*********** Menu général *************
 <1>      Comptabilité                
 <2>      Gestion commerciale         
 <3>      Paie                        
 <9>      Quitter                     
**************************************
Saisissez une option:1
Option 'Comptabilité' choisie

$ sh sys02-ch06-rlscript05.sh
*********** Menu général *************
 <1>      Comptabilité                
 <2>      Gestion commerciale         
 <3>      Paie                        
 <9>      Quitter                     
**************************************
Saisissez une option:2
Option 'Gestion commerciale' choisie

$ sh sys02-ch06-rlscript05.sh
*********** Menu général *************
 <1>      Comptabilité                
 <2>      Gestion commerciale         
 <3>      Paie                        
 <9>      Quitter                     
**************************************
Saisissez une option:4
4 est une option inconnue!

$ sh sys02-ch06-rlscript05.sh
*********** Menu général *************
 <1>      Comptabilité                
 <2>      Gestion commerciale         
 <3>      Paie                        
 <9>      Quitter                     
**************************************
Saisissez une option:9
Option 'Quitter' choisie... Goodbye !!!
     

Dans cet exercise, j'ai compris l'importance d'ecrire read option et non pas read $option, cette dernière ne fonctionne bien évidement pas et laisse la variable $option vide.

J'ai aussi compris qu'il est possible de concatener des chaîne de caractère comme ceci:


menu="part1\n"
menu+="part2\n"
menu+="part3\n"     
echo $menu			# Dans mon case toutefois le \n n'est pas correctement interpréter quesaquo ?
     

Question: Pourquoi l'option \n (retour à la ligne) ne fonctionne pas dans mes scripts ? Par exemple echo "test\ntest" affiche le resultat sur une ligne et non deux comme attendu !

La réponse est simple, il faut utiliser l'option -e de la commande echo pour interpréter les caractères déspécifiés par une contre-oblique: echo -e "test\ntest"


$ echo "test\ntest"
test\ntest
$ echo -e "test\ntest"
test
test
     

7.5.9.2.3. TP 3 Utilisation de la fonction pour (for)

Resultat : SR001-sys02-ch06-rlscript06.sh SR001-sys02-ch06-eofscript06.sh


$ sys02-ch06-rlscript06.sh -50 30 5
### Fonction y=2x+3 avec x allant de -10 à 10
x=-10 y=-20
x=-9 y=-18
x=-8 y=-16
x=-7 y=-14
x=-6 y=-12
x=-5 y=-10
x=-4 y=-8
x=-3 y=-6
x=-2 y=-4
x=-1 y=-2
x=0 y=0
x=1 y=2
x=2 y=4
x=3 y=6
x=4 y=8
x=5 y=10
x=6 y=12
x=7 y=14
x=8 y=16
x=9 y=18
x=10 y=20
###
### Fonction y=x^2 avec x allant de -10 à 10
x=-10 y=100
x=-9 y=81
x=-8 y=64
x=-7 y=49
x=-6 y=36
x=-5 y=25
x=-4 y=16
x=-3 y=9
x=-2 y=4
x=-1 y=1
x=0 y=0
x=1 y=1
x=2 y=4
x=3 y=9
x=4 y=16
x=5 y=25
x=6 y=36
x=7 y=49
x=8 y=64
x=9 y=81
x=10 y=100
###
### Fonction y=x^2 avec x allant de -10 à 10 avec la fonction JUSQUA
x=-10 y=100
x=-9 y=81
x=-8 y=64
x=-7 y=49
x=-6 y=36
x=-5 y=25
x=-4 y=16
x=-3 y=9
x=-2 y=4
x=-1 y=1
x=0 y=0
x=1 y=1
x=2 y=4
x=3 y=9
x=4 y=16
x=5 y=25
x=6 y=36
x=7 y=49
x=8 y=64
x=9 y=81
x=10 y=100
###
### Fonction y=x^2 avec x allant de MIN à MAX avec la fonction JUSQUA
### Usage: script.sh MIN MAX INCREMENT
### Resultat pour: ./sys02-ch06-rlscript06.sh -50 30 5
x=-50 y=2500
x=-45 y=2025
x=-40 y=1600
x=-35 y=1225
x=-30 y=900
x=-25 y=625
x=-20 y=400
x=-15 y=225
x=-10 y=100
x=-5 y=25
x=0 y=0
x=5 y=25
x=10 y=100
x=15 y=225
x=20 y=400
x=25 y=625
x=30 y=900
###
     

Dans cet exercise, j'ai découvert les boucles for et until et la nécessité de bien écrire les expressions de conditions. Double "((" et "))" pour la boucle for, les espaces avant et après "[" , "]", bien choisir l'opérateur pour les tests de conditions d'arrêt pour éviter les erreurs d'interprétation et de logique... Aussi bien faire attention à la syntaxe de la fonction let où le $ peut vite être oublié ou placé au mauvais endroit.


7.5.9.2.4. TP 4 Étude de la fonction si (if)

Resultat : SR001-sys02-ch06-rlscript07.sh


$ sys02-ch06-rlscript07.sh
*********** Menu général ************
 1>      Comptabilité                
 2>      Gestion commerciale         
 3>      Paie                        
 9>      Quitter                     
*************************************
Saisir une option:2
Option 'Gestion commerciale' choisie

$ ./sys02-ch06-rlscript07.sh
*********** Menu général ************
 1>      Comptabilité                
 2>      Gestion commerciale         
 3>      Paie                        
 9>      Quitter                     
*************************************
Saisir une option:4
4 est une option inconnue!

$ sys02-ch06-rlscript07.sh
*********** Menu général ************
 1>      Comptabilité                
 2>      Gestion commerciale         
 3>      Paie                        
 9>      Quitter                     
*************************************
Saisir une option:9
Option 'Quitter' choisie... Goodbye !!!

**********
Affichage d'enregistrement dont la valeur est > 10
Source: sys02-ch06-rlscript07-data.txt
troisième            25
cinquième            12
     

Cet exercice à permis de découvrir la lecture de donnée d'un fichier et le traitement de ces données...

Question: Pourquoi si je crée une variable lsup="Liste d'enregistrement" en dehors de la boucle, que je modifie cette variable globale par lsup+=$ligne dans la boucle, je n'arrive pas à obtenir le result de la concatenation avec un echo $lsup final en dehors de la boulce à la fin ? J'obiens uniquement la valeur intiale !!! :((


7.5.9.2.5. TP 5 Étude de la fonction répéter jusqu’à (until. . .do. . .done)

Resultat : SR001-sys02-ch06-rlscript08.sh SR001-sys02-ch06-eofscript08.sh


$ ./sys02-ch06-rlscript08.sh 
*******************************************************
 Saisissez une commande, commande Q ou q pour quitter. 
*******************************************************
Commande:
ps
  PID TTY          TIME CMD
 2493 pts/0    00:00:01 bash
 3108 pts/0    00:00:00 sys02-ch06-rlsc
 3109 pts/0    00:00:00 ps
*******************************************************
 Saisissez une commande, commande Q ou q pour quitter. 
*******************************************************
Commande:
pwd
/mnt/hsubuntu/02-SR001-Commandes-de-bases-de-GNULinux-Shell/sys02
*******************************************************
 Saisissez une commande, commande Q ou q pour quitter. 
*******************************************************
Commande:
pq
./sys02-ch06-rlscript08.sh: line 28: pq: command not found
*******************************************************
 Saisissez une commande, commande Q ou q pour quitter. 
*******************************************************
Commande:
q
Goodbye !
     

Dans cet exercise, j'ai vu au combien il est important de mettre des espaces pour chaque argument de toute expression à tester (entre crochet), la création d'une fonction, la concatenation de chaîne et l'utilisation de l'option -e de echo (pour évaluer \n). Cela a été aussi l'occasion de redécouvrir la fonction eval pour l'évaluation de commande.


7.5.9.2.6. TP 6 Étude de la fonction tant que (while)

Resultat : SR001-sys02-ch06-rlscript09.sh SR001-sys02-ch06-eofscript09.sh


$ ./sys02-ch06-rlscript09.sh 
******************* Menu général ***********************
 1>      Afficher la date (date)                         
 2>      Afficher le nombre de personnes connectées (who)
 3>      Afficher la liste des processus (ps)            
 9>      Quitter                                         
*********************************************************
Commande: 1
Commande choisie: 1
dimanche 20 décembre 2009, 23:02:19 (UTC+0100)
******************* Menu général ***********************
 1>      Afficher la date (date)                         
 2>      Afficher le nombre de personnes connectées (who)
 3>      Afficher la liste des processus (ps)            
 9>      Quitter                                         
*********************************************************
Commande: 2
Commande choisie: 2
filostene tty7         2009-12-20 19:04 (:0)
filostene pts/0        2009-12-20 19:10 (:0.0)
******************* Menu général ***********************
 1>      Afficher la date (date)                         
 2>      Afficher le nombre de personnes connectées (who)
 3>      Afficher la liste des processus (ps)            
 9>      Quitter                                         
*********************************************************
Commande: 3
Commande choisie: 3
  PID TTY          TIME CMD
 2493 pts/0    00:00:01 bash
 3235 pts/0    00:00:00 sys02-ch06-rlsc
 3239 pts/0    00:00:00 ps
******************* Menu général ***********************
 1>      Afficher la date (date)                         
 2>      Afficher le nombre de personnes connectées (who)
 3>      Afficher la liste des processus (ps)            
 9>      Quitter                                         
*********************************************************
Commande: 4
Commande choisie: 4
Commande inconnue, tentative d'évaluation:
./sys02-ch06-rlscript09.sh: line 55: 4: command not found
******************* Menu général ***********************
 1>      Afficher la date (date)                         
 2>      Afficher le nombre de personnes connectées (who)
 3>      Afficher la liste des processus (ps)            
 9>      Quitter                                         
*********************************************************
Commande: whoami
Commande choisie: whoami
Commande inconnue, tentative d'évaluation:
filostene
******************* Menu général ***********************
 1>      Afficher la date (date)                         
 2>      Afficher le nombre de personnes connectées (who)
 3>      Afficher la liste des processus (ps)            
 9>      Quitter                                         
*********************************************************
Commande: 9
Au revoir ! 
     

Dans cet exercise, j'ai pris conscience de l'utilité de toujour initialiser ses variables et de la commande clear. La boucle while étant très similaire à la boucle jusqu'à cela n'a pas posé de problème majeur


7.5.9.2.7. TP 7 Étude de la fonction select

Resultat : SR001-sys02-ch06-rlscript10.sh SR001-sys02-ch06-eofscript10.sh

    
*********************** Menu général ***************************
1) Afficher la liste des utilisateurs connectés
2) Afficher la liste des processus
3) Afficher à l’utilisateur son nom, son UID, son GID, son TTY1
4) Terminer
#? 1
Utilisateurs Connectés:
filostene tty7         2009-12-20 19:04 (:0)
filostene pts/0        2009-12-20 19:10 (:0.0)
#? 2
Liste des processus:
  PID TTY          TIME CMD
 2493 pts/0    00:00:02 bash
 3598 pts/0    00:00:00 sys02-ch06-rlsc
 3601 pts/0    00:00:00 ps
#? 6
Action inconnue, essayer encore... taper 1, 2, 3 ou 4
#? 3
Info Utilisateur filostene:
uid=1000(filostene) gid=1000(filostene) groupes=20(dialout),24(cdrom),25(floppy),29(audio),44(video),46(plugdev),110(netdev),115(powerdev),1000(filostene)
#? 4
Au revoir !
     

Dans cet exercise, on a pu voir que la commande select permet de rapidement construire un menu de selection. Si on utilise des variables pour la selection il faut bien faire attention de les entourer de guillement "(double quote) après "in", sinon le formatage du menu peut-être erroné!

L'utilisation de variable n'est pas nécessaire, la liste du menu peut-être directement construite à partir d'une suite de chaîne séparé par le caractére \ et une nouvelle ligne (voir script ÉOF)

Il paraît aussi important de toujours bien penser à créer un cas d'action par defaut "*)" pour s'assurer que toute action non définit est traité avec au moins l'affichage d'un message d'erreur !


7.5.9.2.8. TP 8 Création de fonction shell

Resultat : SR001-sys02-ch06-rlscript11-1.sh (mul.sh) SR001-sys02-ch06-rlscript11-2.sh (calculatrice) SR001-sys02-ch06-eofscript11-1.sh


$ ./sys02-ch06-rlscript11-1.sh
1 ou 3 paramètres attendues...
Usage:
--Table de multiplication de N (borne 1 à 10):
 ./sys02-ch06-rlscript11-1.sh N
--Table de multiplication de N (borne MIN à MAX):
 ./sys02-ch06-rlscript11-1.sh N MIN MAX

$ ./sys02-ch06-rlscript11-1.sh 4
Table de multiplication de 4 (borne 1 à 10):
4 x 1   = 4
4 x 2   = 8
4 x 3   = 12
4 x 4   = 16
4 x 5   = 20
4 x 6   = 24
4 x 7   = 28
4 x 8   = 32
4 x 9   = 36
4 x 10  = 40

$ ./sys02-ch06-rlscript11-1.sh 4 5 12
Table de multiplication de 4 (borne 5 à 12):
4 x 5   = 20
4 x 6   = 24
4 x 7   = 28
4 x 8   = 32
4 x 9   = 36
4 x 10  = 40
4 x 11  = 44
4 x 12  = 48

Calculatrice:
Saisir un nombre:14
Saisir un operande (+,-,*,/,=) suivit d'un espace puis un nombre: + 1
Saisir un operande (+,-,*,/,=) suivit d'un espace puis un nombre: -1
Erreur: \-1 n'est pas un opérande reconnu, essayer encore...
Saisir un operande (+,-,*,/,=) suivit d'un espace puis un nombre: - 1
Saisir un operande (+,-,*,/,=) suivit d'un espace puis un nombre: / 2
Saisir un operande (+,-,*,/,=) suivit d'un espace puis un nombre: * 2
Saisir un operande (+,-,*,/,=) suivit d'un espace puis un nombre: =
Total= 14
     

Dans cet exercise, j'ai approfondis l'utilisation de fonctions et notament le passage de paramètre ainsi que la possiblité d'affecter des variables multiple avec la fonction read en une seule fois. J'ai aussi appris la nécessité d'échapper certains caractères spéciaux et la comparaison de chaîne de caractère lors de test de boucle...


7.5.9.2.9. TP 9 Appels et contrôles de scripts - Communication inter-scripts.

Resultat : SR001-sys02-ch06-rlscript12-pere.sh SR001-sys02-ch06-rlscript12-enfant1.sh SR001-sys02-ch06-rlscript12-enfant2.sh SR001-sys02-ch06-rlscript12-enfant3.sh SR001-sys02-ch06-eofscript12.sh


$ ./sys02-ch06-rlscript12-pere.sh
pere(PID=6009)
enf1(PID=6010) started
ping
ping
ping
Kill enf1(6010): kill -9 6010
enf2(PID=6016) started
pong
pong
pong
./sys02-ch06-rlscript12-pere.sh: line 45:  6010 Processus arrêté      $enf1
Kill enf1(6016): kill -9 6016
./sys02-ch06-rlscript12-pere.sh: line 45:  6016 Processus arrêté      $enf2
pere(PID=6009)
enf1(PID=6023) started
ping
Kill enf1(6023): kill -9 6023
enf2(PID=6027) started
pong
./sys02-ch06-rlscript12-pere.sh: line 69:  6023 Processus arrêté      $enf1
Kill enf1(6027): kill -9 6027
./sys02-ch06-rlscript12-pere.sh: line 32:  6027 Processus arrêté      $enf2
enf3(PID=6031) started
pang
Kill enf1(6031): kill -9 6031
enf2(PID=6035) started
pong
./sys02-ch06-rlscript12-pere.sh: line 69:  6031 Processus arrêté      $enf3
Kill enf1(6035): kill -9 6035
./sys02-ch06-rlscript12-pere.sh: line 32:  6035 Processus arrêté      $enf2
pere(PID=6009)
enf1(PID=6039) started
ping
Kill enf1(6039): kill -9 6039
enf2(PID=6043) started
pong
./sys02-ch06-rlscript12-pere.sh: line 69:  6039 Processus arrêté      $enf1
Kill enf1(6043): kill -9 6043
enf3(PID=6047) started
pang
./sys02-ch06-rlscript12-pere.sh: line 69:  6043 Processus arrêté      $enf2
Kill enf1(6047): kill -9 6047
enf2(PID=6051) started
pong
./sys02-ch06-rlscript12-pere.sh: line 69:  6047 Processus arrêté      $enf3
Kill enf1(6051): kill -9 6051
./sys02-ch06-rlscript12-pere.sh: line 70:  6051 Processus arrêté      $enf2
     

Dans cet exercise, la notion de processus pere et enfant a été revue. Le débugage d'un enchainement de script ne me semble pas très aisé. Peut-être est-ce un problème de méthode ou d'experience ! On verra avec le temps :)). C'etait aussi l'occasion de découvrir la fonction sleep qui permet de pause un processus en cours d'execution.

Question: La commande kill provoque l'affichage d'un message que je n'ai pas su réorienter pour le gérer à meilleur escient et éviter le charbiat ! A voir plus tard... avec l'ÉOF !


7.5.9.3. Script: Compter les mots d'un fichier xml/xhtml/html

Resultat : countwords.sh


$ ./countwords.sh
./xml/siteMap/fr_FR.xml 39 80 635          # wc retourne 3 chiffres :
./xml/home/fr_FR_homeIntro.xml 27 36 291   # NumLignes NumMots NumCaractères
./xml/home/fr_FR_homeNews.xml 15 4 62
./xml/support/fr_FR.xml 337 1672 11423
./xml/who/fr_FR.xml 16 274 1785
./xml/newAccount/fr_FR.xml 65 241 1673
./xml/contact/fr_FR.xml 28 139 981
./xml/ogoneReturn/fr_FR.xml 21 110 806
./xml/auth/fr_FR.xml 39 200 1316
./xml/cart/fr_FR.xml 150 588 4160
./xml/customer/fr_FR_customerActivate.xml 31 124 853
./xml/customer/fr_FR_customerApps.xml 10 2 37
./xml/customer/fr_FR_customerIds.xml 16 49 386
./xml/customer/fr_FR_customerBilling.xml 22 15 153
./xml/customer/fr_FR_customerGodfather.xml 15 58 409
./xml/customer/fr_FR_customerAddCredit.xml 13 13 108
./xml/customer/fr_FR_customerSupport.xml 68 282 1701
./xml/customer/fr_FR_customerMyAccess.xml 15 8 72
./xml/customer/fr_FR_customerCommand.xml 50 82 626
./xml/customer/fr_FR_customerInfos.xml 31 49 402
./xml/customer/fr_FR_customer.xml 23 23 227
./xml/cgv/fr_FR.xml 306 7884 51999
./xml/press/fr_FR.xml 12 5 57
./xml/concept/fr_FR.xml 10 6 57
./xml/fr_FR.xml 146 466 3293
./xml/legal/fr_FR.xml 54 1300 9162
./xml/popUp/fr_FR_popupConfirm.xml 7 1 17
./xml/popUp/fr_FR_popupbuy.xml 11 21 155
./xml/popUp/fr_FR_popupLanguage.xml 10 12 113
./xml/popUp/fr_FR_popuplogout.xml 10 39 280
./xml/popUp/fr_FR_popupDelete.xml 9 22 171
./xml/products/fr_FR_overviewPack.xml 49 88 766
./xml/products/fr_FR_overviewDetectOuv.xml 22 371 2621
./xml/products/fr_FR_introductionAcc.xml 40 267 1981
./xml/products/fr_FR_overviewT2T.xml 21 143 967
./xml/products/fr_FR_overviewDetectFuiteau.xml 21 268 1666
./xml/products/fr_FR_overviewMyAlertI.xml 24 679 4582
./xml/products/fr_FR_overviewMotionDetector.xml 17 145 933
./xml/products/fr_FR_overviewDetectIR.xml 21 324 2198
./xml/products/fr_FR_overviewClavierCommand.xml 21 224 1456
./xml/products/fr_FR_overviewClavierCommande.xml 17 223 1407
./xml/products/fr_FR_overviewPPADist.xml 21 208 1360
./xml/products/fr_FR_overviewAcc.xml 37 76 661
./xml/products/fr_FR_introductionProducts.xml 33 80 780
./xml/products/fr_FR_overviewMyAlertD.xml 23 394 2774
./xml/products/fr_FR_overviewMyAlertP.xml 23 555 3786
./xml/products/fr_FR_overviewDetectSirInt.xml 21 277 1725
./xml/products/fr_FR_overviewDetectFumee.xml 21 214 1374
./xml/products/fr_FR_overviewMyAlertS.xml 24 377 2694
     

7.5.10. Programmation en Langage SHELL (Bash) dans une console - Exercices

Source(s):


###
# Les lignes ci-dessous comportent des erreurs. Essayez de les identifiez et proposez des corrections :
   
KO: if [ a == a] ; then echo true ; fi   # Espace manquant entre a et le crochet ]
OK: if [ a == a ] ; then echo true; fi 
   
KO: if [ a == a ] ; echo true ; fi 		   # instruction then manquante dans la déclaration if
OK: if [ a == a ] ; then echo true; fi    
   
KO: a=3 ; echo ’$a’ # On souhaite afficher la valeur de a
OK:
   
KO?: if [ a != b ] ; then echo true ; fi # Je ne vois pas d'erreur ici... et vous ?
   
??: Pourquoi le premier sous-shell affiche 3 et le second affiche 2 dans le code ci-dessous ?
a=3; (echo \$a); a=3; (a=2; echo \$a)
==> Parce que :
- dans le premier cas, l'environement est hérité du parent donc il a accès à la varialbe $a telle que définit par le parent.
- dans le second cas, l'environement est hérité du parent mais est immédiatement modifié (nouvel affectation de $a à 2) dans l'environement local du sous shell (chaque shell a son propre environement, environement parent accessible mais pas inversement).   
   

7.5.11. Evaluation - Exercice 3

Source(s):

7.5.11.1. Dans quels répertoires sont stockés les scripts qui activent les serveurs (deamons) ?
7.5.11.2. Dans quel(s) répertoire(s) sont généralement stockés les fichiers logs ?
7.5.11.3. Dans quel(s) répertoire(s) sont généralement stockés les numéros des processus une fois lancés ?
7.5.11.4. Que fait le bloc d’instruction suivant, tiré du paquet acct ?
7.5.11.5. De quel fichier peut-on s’aider pour écrire un script de lancement d’un service serveur ?

7.5.11.1. Dans quels répertoires sont stockés les scripts qui activent les serveurs (deamons) ?

  • /etc/init.d (Debian, Ubuntu, etc...)

  • /etc/rc.d/init.d (RedHat, Mandriva, etc...)

  • 7.5.11.2. Dans quel(s) répertoire(s) sont généralement stockés les fichiers logs ?

    /var/log

    7.5.11.3. Dans quel(s) répertoire(s) sont généralement stockés les numéros des processus une fois lancés ?

  • /var/run (pour la plupart)

  • ~/ (comme fichier caché dans le repertoire utilisateur parfois)

  • 7.5.11.4. Que fait le bloc d’instruction suivant, tiré du paquet acct ?

    
if [ -f /etc/default/acct ]
    then
     . /etc/default/acct
    else
     ACCT_ENABLE="1"
     ACCT_LOGGING="30"
    fi
          

    Si le fichier /etc/default/acct existe, lit et execute, dans l'environement du shell courant, les commandes contenu dans acct et retourne le status de completion de la dernière commande executer depuis acct. Sinon modifie les variables d'environement ACCT_ .

    La commande . filename [arguments] est équivalent à source filename [arguments]

    7.5.11.5. De quel fichier peut-on s’aider pour écrire un script de lancement d’un service serveur ?

    /etc/init.d


    7.7. Examples de commandes utiles

    
Source: http://sleepyhead.de/howto/?href=scripting
    $ sort -t. -k1,1n -k2,2n -k3,3n -k4,4n                              # Sort IPv4 ip addresses
    $ echo 'Test' | tr '[:lower:]' '[:upper:]'                          # Case conversion
    $ echo foo.bar | cut -d . -f 1                                      # Returns foo
    
    $ PID=$(ps | grep script.sh | grep bin | awk '{print $1}')          # PID of a running script
    $ PID=$(ps axww | grep [p]ing | awk '{print $1}')                   # PID of ping (w/o grep pid)
    
    $ IP=$(ifconfig $INTERFACE | sed '/.*inet addr:/!d;s///;s/ .*//')   # Linux
    $ IP=$(ifconfig $INTERFACE | sed '/.*inet /!d;s///;s/ .*//')        # FreeBSD
    
    $ if [ `diff file1 file2 | wc -l` != 0 ]; then [...] fi             # File changed?
    
    $ cat /etc/master.passwd | grep -v root | grep -v \*: | awk -F":" \ # Create http passwd
    $ '{ printf("%s:%s\n", $1, $2) }' > /usr/local/etc/apache2/passwd
    
    $ testuser=$(cat /usr/local/etc/apache2/passwd | grep -v \          # Check user in passwd
    $ root | grep -v \*: | awk -F":" '{ printf("%s\n", $1) }' | grep ^user$)
    $ :(){ :|:& };:                                                 # bash fork bomb. Will kill your machine
    $ tail +2 file > file2                                              # remove the first line from file
    
    $ ls *.cxx | awk -F. '{print "mv "$0" "$1".cpp"}' | sh
    $ ls *.c | sed "s/.*/cp & &.$(date "+%Y%m%d")/" | sh        # e.g. copy *.c to *.c.20080401
    $ rename .cxx .cpp *.cxx                                            # Rename all .cxx to cpp
    $ for i in *.cxx; do mv $i ${i%%.cxx}.cpp; done                     # with bash builtins
     

    Chapitre 8. UI004 Réaliser des documents avec LaTeX [EMPTY]

    ..latex +++


    Chapitre 9. UI005 Publier des documents techniques avec DocBook [EMPTY]

    Source(s):


    Chapitre 10. SR009 Interfacer Apache avec un langage de script et un serveur de base de données

    10.1. SR009 Base

    10.1.1. Presentation Séquence

    Source(s):


    10.1.1.1. But

    • Savoir configurer un environnement pour qu'il fonctionne

    • Acquérir une méthodologie pour intégrer une ensemble de composants logiciels dans un environnement complexe


    10.1.1.2. Démarche

    • Réaliser les opérations par étapes

    • S’assurer que chaque composant fonctionne parfaitement avant de les intégrer

    • Appliquer des procédures pour diagnostiquer de façon méthodique la source d’un dysfonctionnement

    • Acquérir le réflexe de se référer à la documentation d’un produit ou aux ressources mises à disposition


    10.1.2. Architecture logicielle de l’environnement de développement (Server HTTP + BD + script PHP)

    Source(s):

    Mise en place d'une station de développement permettant la conception ou le déploiement d’applications accessibles par internet et dont les données sont stockées dans une base de données: pages web dynamiques.


    10.1.3. Serveur Web - Apache - Installation et configuration

    Source(s):

    La première brique dont nous avons besoin c'est le service server HTTP (server Web) pour pouvoir publier des pages HTML (statique ou dynamique).

     

    Un serveur HTTP ou daemon HTTP ou HTTPd (HTTP daemon) ou (moins précisément) serveur Web, est un logiciel servant des requêtes respectant le protocole de communication client-serveur Hypertext Transfer Protocol (HTTP), qui a été développé pour le World Wide Web.

     
    -- http://fr.wikipedia.org/wiki/Serveur_HTTP  

    Ici nous installerons Apache mais il en existe d'autres: lightpd, zeus, etc


    10.1.3.1. Installation de base

    Je pourrais compiler Apache et l'installer depuis la source mais dans le cadre d'une première découverte je me contenterais du paquet Debian avec la configuration par défaut. Ce sera gage d'une meilleure stabilité dans un premier temps.

    
## Listons les paquets disponibles dans Debian lié à Apache
    $ apt-cache search apache
    alpine - Text-based email client, friendly for novices but powerful
    alpine-dbg - Text-based email client's debugging symbols
    ...
    libapache-asp-perl - perl Apache::ASP - Active Server Pages for Apache with mod_perl
    libapache-authenhook-perl - Perl API for Apache 2.1 authentication
    ...
    libapache2-mod-auth-openid - OpenID authentication module for Apache2
    ...
    libapache2-mod-proxy-html - Apache2 filter module for HTML links rewriting
    libapache2-mod-python - Python-embedding module for Apache 2
    libapache2-mod-python-doc - Python-embedding module for Apache 2 - documentation
    ...
    libapr1 - The Apache Portable Runtime Library
    ...
    libcommons-codec-java - encoder and decoders such as Base64 and hexadecimal codec
    libcommons-csv-java - a Java library for working with csv (comma separated values) files
    ...
    libconfig-general-perl - Generic Configuration Module
    libdotconf-dev - Configuration file parser library - development files
    ...
    liblemonldap-ng-conf-perl - Lemonldap::NG apache administration interface part
    ...
    mod-chroot-common - run Apache in a secure chroot environment
    ...
    php-auth-http - HTTP authentication
    php-config - Your configuration's swiss-army knife
    ...
    tomcat5.5-admin - Java Servlet engine -- admin & manager web interfaces
    tomcat5.5-webapps - Java Servlet engine -- documentation and example web applications
    ...
    apache2 - Apache HTTP Server metapackage
    apache2-dbg - Apache debugging symbols
    apache2-doc - Apache HTTP Server documentation
    apache2-mpm-event - Apache HTTP Server - event driven model
    apache2-mpm-itk - multiuser MPM for Apache 2.2
    apache2-mpm-prefork - Apache HTTP Server - traditional non-threaded model
    apache2-mpm-worker - Apache HTTP Server - high speed threaded model
    apache2-prefork-dev - Apache development headers - non-threaded MPM
    apache2-src - Apache source code
    apache2-suexec - Standard suexec program for Apache 2 mod_suexec
    apache2-suexec-custom - Configurable suexec program for Apache 2 mod_suexec
    apache2-threaded-dev - Apache development headers - threaded MPM
    apache2-utils - utility programs for webservers
    apache2.2-common - Apache HTTP Server common files
    ...
         

    Beaucoup de librairie et modules liés à Apache !!! Je vais réstraindre la recherche

    
$ apt-cache search "Apache HTTP Server"
    emboss-explorer - web-based GUI to EMBOSS
    libtcnative-1 - Tomcat native library using the apache portable runtime
    wu-ftpd - powerful and widely used FTP server
    apache2 - Apache HTTP Server metapackage
    apache2-doc - Apache HTTP Server documentation
    apache2-mpm-event - Apache HTTP Server - event driven model
    apache2-mpm-prefork - Apache HTTP Server - traditional non-threaded model
    apache2-mpm-worker - Apache HTTP Server - high speed threaded model
    apache2.2-common - Apache HTTP Server common files
         

    Bon maintenant installons ce qui paraît indispensable: le server & la doc !

    
# Installation de l'essentiel :)
    $ apt-get install apache2 apache2-doc
    
    Lecture des listes de paquets... Fait
    Construction de l'arbre des dépendances       
    Lecture des informations d'état... Fait
    apache2-doc est déjà la plus récente version disponible.
    Les paquets supplémentaires suivants seront installés : 
      apache2-mpm-worker apache2-utils apache2.2-common libapr1 libaprutil1 libpq5
    Paquets suggérés :
      apache2-suexec apache2-suexec-custom
    Les NOUVEAUX paquets suivants seront installés :
      apache2 apache2-mpm-worker apache2-utils apache2.2-common libapr1
      libaprutil1 libpq5
    0 mis à jour, 7 nouvellement installés, 0 à enlever et 14 non mis à jour.
    Il est nécessaire de prendre 0o/1765ko dans les archives.
    Après cette opération, 5829ko d'espace disque supplémentaires seront utilisés.
    Souhaitez-vous continuer [O/n] ? O
    ATTENTION : les paquets suivants n'ont pas été authentifiés.
      libapr1 libpq5 libaprutil1 apache2-utils apache2.2-common apache2-mpm-worker
      apache2
    Faut-il installer ces paquets sans vérification (o/N) ? o
    Sélection du paquet libapr1 précédemment désélectionné.
    (Lecture de la base de données... 143263 fichiers et répertoires déjà installés.)
    Dépaquetage de libapr1 (à partir de .../libapr1_1.2.12-5+lenny1_i386.deb) ...
    Sélection du paquet libpq5 précédemment désélectionné.
    Dépaquetage de libpq5 (à partir de .../libpq5_8.3.8-0lenny1_i386.deb) ...
    Sélection du paquet libaprutil1 précédemment désélectionné.
    Dépaquetage de libaprutil1 (à partir de .../libaprutil1_1.2.12+dfsg-8+lenny4_i386.deb) ...
    Sélection du paquet apache2-utils précédemment désélectionné.
    Dépaquetage de apache2-utils (à partir de .../apache2-utils_2.2.9-10+lenny6_i386.deb) ...
    Sélection du paquet apache2.2-common précédemment désélectionné.
    Dépaquetage de apache2.2-common (à partir de .../apache2.2-common_2.2.9-10+lenny6_i386.deb) ...
    Sélection du paquet apache2-mpm-worker précédemment désélectionné.
    Dépaquetage de apache2-mpm-worker (à partir de .../apache2-mpm-worker_2.2.9-10+lenny6_i386.deb) ...
    Sélection du paquet apache2 précédemment désélectionné.
    Dépaquetage de apache2 (à partir de .../apache2_2.2.9-10+lenny6_all.deb) ...
    Traitement des actions différées (« triggers ») pour « man-db »...
    Paramétrage de libapr1 (1.2.12-5+lenny1) ...
    Paramétrage de libpq5 (8.3.8-0lenny1) ...
    Paramétrage de libaprutil1 (1.2.12+dfsg-8+lenny4) ...
    Paramétrage de apache2-utils (2.2.9-10+lenny6) ...
    Paramétrage de apache2.2-common (2.2.9-10+lenny6) ...
    Paramétrage de apache2-mpm-worker (2.2.9-10+lenny6) ...
    Starting web server: apache2.
    Paramétrage de apache2 (2.2.9-10+lenny6) ...
         

    On voit que d'autres paquets sont par défaut nécessaire au bon fonctionement d'Apache notemment des utilitaires (apache2-utils) que j'avais hésité à installé !

    On observe aussi que le server est démarré automatiquement après l'installation.

    
$ ps x | grep apache
    9700 ?        Ss     0:00 /usr/sbin/apache2 -k start
    
    # -k start|restart|graceful|stop|graceful-stop
        Signal apache2 de démarrer, re-démarrer, ou s'arrêter
    
    ### Attention à ne pas se tromper
    ## Sous Unix, le programme httpd est lancé en mode démon et 
    ## s'exécute de manière permanente en arrière-plan pour gérer les requêtes. 
    $ ps x | grep httpd
    9806 pts/1    S+     0:00 grep httpd
    
    ## Afficher la version et les paramètres de compilation
    ## Très utile quand on a pas compiler soit même !!!
    $ apache2 -V  ## option -V (en majuscule)
    Server version: Apache/2.2.9 (Debian)
    Server built:   Nov 14 2009 20:21:34
    Server's Module Magic Number: 20051115:15
    Server loaded:  APR 1.2.12, APR-Util 1.2.12
    Compiled using: APR 1.2.12, APR-Util 1.2.12
    Architecture:   32-bit
    Server MPM:     Worker
    threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
    Server compiled with....
    -D APACHE_MPM_DIR="server/mpm/worker"
    -D APR_HAS_SENDFILE
    -D APR_HAS_MMAP
    -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
    -D APR_USE_SYSVSEM_SERIALIZE
    -D APR_USE_PTHREAD_SERIALIZE
    -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
    -D APR_HAS_OTHER_CHILD
    -D AP_HAVE_RELIABLE_PIPED_LOGS
    -D DYNAMIC_MODULE_LIMIT=128
    -D HTTPD_ROOT=""
    -D SUEXEC_BIN="/usr/lib/apache2/suexec"
    -D DEFAULT_PIDLOG="/var/run/apache2.pid"
    -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
    -D DEFAULT_ERRORLOG="logs/error_log"
    -D AP_TYPES_CONFIG_FILE="/etc/apache2/mime.types"
    -D SERVER_CONFIG_FILE="/etc/apache2/apache2.conf"
    
    ## Afficher la version seulement    
    $ apache2 -v   ## option -v (en minuscule)
    Server version: Apache/2.2.9 (Debian)
    Server built:   Nov 14 2009 20:21:34
    
    # La version est toute récente !
    # Apache v2 fait partie d'une nouvelle génération du server web Apache.
    # Cette version a été totalement ré-écrite pour introduire de nouvelles 
    # amélioration tel que : le "threading", une nouvelle API, 
    # le support de l'IPv6, filtrage de requête/reponses, etc...
         

    10.1.3.2. Accéder à la documentation


    10.1.3.3. Arrêt/Démarrage du service HTTPD (daemon) - apache2ctl

    Si la directive Listen spécifiée dans le fichier de configuration est à sa valeur par défaut de 80 (ou tout autre port inférieur à 1024), il est nécessaire de posséder les privilèges root pour pouvoir démarrer apache2, et lui permettre d'être associé à ce port privilégié.

    Il est recommandé d'utiliser le script de contrôle apache2ctl pour invoquer l'exécutable httpd.

    apache2ctl accepte des arguments de ligne de commande, ainsi toute option de httpd.

    Il est donc possible d'éditer directement le script apache2ctl en modifiant la variable HTTPD située en début de script pour spécifier la localisation du binaire httpd et tout argument de ligne de commande que l'on souhaite voir systématiquement présent.

    Note

    La configuration par défaut de Debian requiert les variable d'environement APACHE_RUN_USER, APACHE_RUN_GROUP, et APACHE_PID_FILE d'être configuré dans /etc/apache2/envvars.

    
$ cat /etc/apache2/envvars 
    # envvars - default environment variables for apache2ctl
    
    # Since there is no sane way to get the parsed apache2 config in scripts, some
    # settings are defined via environment variables and then used in apache2ctl,
    # /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
    export APACHE_RUN_USER=www-data
    export APACHE_RUN_GROUP=www-data
    export APACHE_PID_FILE=/var/run/apache2.pid
         

    Arrêt/Démarrage de HTTPD:

    
## Avec le script de service activé au démarrage de la machine
    $ /etc/init.d/apache2 start # | stop | restart
    
    ## Avec /usr/sbin/apache2ctl
    $ apache2ctl start         # Donne une erreur si déjà en cours d'exécution
                              # Équivaut à apache2ctl -k start
    
    $ apache2ctl restart       # Re-démarrage brut
                              # Vérifie le fichier de configuration avant de rédémarrer
    
    $ apache2ctl graceful      # Re-démarrage doux
                              # Les connections ouvertes ne sont pas abandonnées
                              # Les vieux fichiers de log ne sont pas fermés immédiatement
                              # Équivaut à apache2ctl -k graceful
    
    $ apache2ctl stop          # Arrêt brut (même effet que gracefull)
                              # Équivaut à apache2ctl -k stop
    
    $ apache2ctl graceful-stop # Arrêt brut
                              # Équivaut à apache2ctl -k graceful-stop
                              
    $ apache2ctl status			 # Affiche un brief raport de status
    Apache Server Status for localhost
    
    Server Version: Apache/2.2.9 (Debian)
    Server Built: Nov 14 2009 20:21:34
    __________________________________________________________________
    
    Current Time: Tuesday, 29-Dec-2009 18:03:47 GMT
    Restart Time: Tuesday, 29-Dec-2009 17:52:22 GMT
    Parent Server Generation: 0
    Server uptime: 11 minutes 25 seconds
    1 requests currently being processed, 49 idle workers
    ...
         


    10.1.3.4. Fichier de Configuration - apache2.conf, httpd.conf, ports.conf

    Au démarrage, la première chose qu'effectue httpd est de localiser et lire le fichier de configuration httpd.conf.

    La localisation de ce fichier est définie à la compilation, mais il est possible d'en spécifier une autre à l'exécution en utilisant l'option de ligne de commande -f comme suit:

    
$ /usr/local/apache2/bin/apache2ctl -f /usr/local/apache2/conf/httpd.conf
     		 

    Note

    Tout changement dans le fichier de configuration peut-être testé avec la commande :

    
$ apache2ctl configtest   # Exécuter un test de syntaxe du fichier de configuration
                              # retourne OK ou une erreur
    # OU
    
    $ apache2ctl -t					 # Équivalent à httpd -t
     		 

    Où se trouve le fichier de configuration utilisé par le serveur lors de l'installation par défaut (Debian package)

    Pour connaître à tous moment quel fichier de configuration est utilisé :

    
## Fichier de configuration par défaut
    $ apache2ctl -V | grep SERVER_CONFIG
    -D SERVER_CONFIG_FILE="/etc/apache2/apache2.conf"   ## Localisation définit à la compilation
    
    ## On peut vérifier qu'au démarrage un autre chemin de fichier n'est pas indiqué dans les fichiers suivants :
    $ cat /usr/sbin/apache2ctl ## Script de controle d'Apache2 serveur HTTPD
    $ cat /etc/init.d/apache2  ## Script de service au démarrage
         

    QUESTION: Si un autre fichier de configuration a été indiqué lors d'un démarrage manuel du server, il semble que qu'il ne soit pas possible de le voir directement sans faire des recherche de tout les .conf existant et dans les fichiers de log...?

    La configuration global du serveur (/etc/apache2/apache2.conf) inclus d'autres fichiers:

    • /etc/apache2/ports.conf : ports d'écoute du server (80 par défaut)

    • /etc/apache2/httpd.conf : configuration utilisateur (additionelle)

    • /etc/apache2/mods-enabled/*.load & /etc/apache2/mods-enabled/*.conf : chargement des modules

    • /etc/apache2/sites-enabled/[^.#]* : chargement vhosts

    • /etc/apache2/conf.d/[^.#]* : autre configuration local (ajouté manuellement ou par d'autre paquets)

    • S'execute en tant que: www-data (user) www-data (group)

    • /usr/sbin/apache2 : Fichier de commande binaire Apache2

    • /usr/sbin/apache2ctl : Script/Interface de controle Apache2

    Note

    Apache2 supporte IPv4 et IPv6, par contre pour le faire fonctionner sur les deux types d'adresses il faut mettre les @ IPv6 entre [] puisque le séparateur des digits est le ':' or pour Apache le ':' indique les ports :

    Listen 10.0.0.1:80

    Listen [2001::1]:80

    Quelques commandes utiles:

    
$ apache2ctl -S     ## Affiche les paramètres chargé depuis le fichier de configuration
                        ## à présent affiche uniquement les paramètres virtualhost
    VirtualHost configuration:
    wildcard NameVirtualHosts and _default_ servers:
    *:80                   is a NameVirtualHost
        default server debstafil4.ermansion.net (/etc/apache2/sites-enabled/000-default:1)
        port 80 namevhost debstafil4.ermansion.net (/etc/apache2/sites-enabled/000-default:1)
    Syntax OK
    
    $ apache2ctl -L     ## Affiche la liste des directives et leurs arguments
    $ apache2ctl -l     ## Affiche la liste des modueles compilés dans le serveur.
    $ apache2ctl -M     ## Affiche la liste des modules statique et partagés
         

    Comme on le voit ci-dessus l'option -S ne donne pas beaucoup d'info allons donc voir directement la configuration dans les fichiers.

    
### Config UTILISATEUR
    $ cat /etc/apache2/httpd.conf
    (empty)
    
    ### Config PORTS
    $ cat /etc/apache2/ports.conf
    # If you just change the port or add more ports here, you will likely also
    # have to change the VirtualHost statement in
    # /etc/apache2/sites-enabled/000-default
    # This is also true if you have upgraded from before 2.2.9-3 (i.e. from
    # Debian etch). See /usr/share/doc/apache2.2-common/NEWS.Debian.gz and
    # README.Debian.gz
    
    NameVirtualHost *:80
    Listen 80
    
    <IfModule mod_ssl.c>
    # SSL name based virtual hosts are not yet supported, therefore no
    # NameVirtualHost statement here
    Listen 443
    </IfModule>
    
    ## Config GLOBAL
    $ cat /etc/apache2/apache2.conf
    (voir lien en bas de ce listing)
    
    ## Config SITES (hosts)
    $ cat /etc/apache2/sites-enabled/000-default 
    <VirtualHost *:80>
      ServerAdmin webmaster@localhost
     DocumentRoot /var/www/
      <Directory />
        Options FollowSymLinks
        AllowOverride None
      </Directory>
      <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
      </Directory>
    
      ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
      <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
      </Directory>
    
      ErrorLog /var/log/apache2/error.log
    
      # Possible values include: debug, info, notice, warn, error, crit,
      # alert, emerg.
      LogLevel warn
    
      CustomLog /var/log/apache2/access.log combined
    
      Alias /doc/ "/usr/share/doc/"
      <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
      </Directory>
    </VirtualHost>
         
    apache2.conf (configuration par défaut)

    On voit notemment la configuration est établit par des directives encadré par des tag XML, que le serveur est sensé écouter le port 80; que Server Root "/etc/apache2" est le repertoire contenant les fichiers de configuration, erreur, logs, etc; que des sites par défaut est configuré et pointe vers /var/www

    Si je pointe mon navigateur sur http://localhost ou http://debstafil4.ermansion.net, je vois bien par le bien du serveur HTTP le contenu du repertoire /var/www.


    10.1.3.5. Règle d'OR: Vérifier l'installation du serveur Web avec le système

    Note

    Ne jamais faire confiance aux scripts de démarrage et à ce qu'ils renvoient à l'écran !!! Toujours vérifier l'installation avec le système.

    
###==> Par défaut le service http (indiqué www ici) utilise le port 80 par défaut
    $ grep http /etc/services
    # Updated from http://www.iana.org/assignments/port-numbers and other
    # sources like http://www.freebsd.org/cgi/cvsweb.cgi/src/etc/services .
    www		80/tcp		http		# WorldWideWeb HTTP
    https		443/tcp				  # http protocol over TLS/SSL
    https		443/udp
    http-alt	8080/tcp	webcache	# WWW caching service
    http-alt	8080/udp			# WWW caching service
    
    
    ### Pas besoin de le démarrer il fonctionne déjà
    $ apache2ctl start
    httpd (pid 12090) already running   
    
    ### Vérifions la table de processus
    $ ps aux | grep apache
    root     12090  0.0  0.6  13252  2764 ?        Ss   21:19   0:04 /usr/sbin/apache2 -f /etc/apache2/apache3.conf
    www-data 12091  0.0  0.4  13160  1984 ?        S    21:19   0:00 /usr/sbin/apache2 -f /etc/apache2/apache3.conf
    www-data 12092  0.0  0.8 234732  3384 ?        Sl   21:19   0:00 /usr/sbin/apache2 -f /etc/apache2/apache3.conf
    www-data 12095  0.0  0.6 234732  2608 ?        Sl   21:19   0:00 /usr/sbin/apache2 -f /etc/apache2/apache3.conf
    root     12713  0.0  0.1   3940   776 pts/7    S+   23:39   0:00 grep apache
    
    ### Le service est actif, verifions qu'il le port 80 
    $ netstat -natupw | grep 80
    tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      4580/mysqld     
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      12090/apache2   
    udp6       0      0 :::58033                :::*                                1649/avahi-daemon: 
    
    ### Test de connection
    $ telnet 10.0.1.5 80
    Trying 10.0.1.5...
    Connected to 10.0.1.5.
    Escape character is '^]'.
    GET index.html
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>400 Bad Request</title>
    </head><body>
    <h1>Bad Request</h1>
    <p>Your browser sent a request that this server could not understand.<br />
    </p>
    <hr>
    <address>Apache/2.2.9 (Debian) Server at debstafil4.ermansion.net Port 80</address>
    </body></html>
    Connection closed by foreign host.
        

    A ce stade, je suis sûr que le service est bien opérationnel. S’il y a un problème, cela ne vient pas de sa configuration de base. Soit cela vient d’extensions (domaines virtuels, configuration sur des répertoires, droits d'accès...), mais le service globalement fonctionne.

    Note

    À la place du client telnet on aurait pu utliser le client nc de l’application netcat.


    10.1.3.6. Fichier de trace (logs)

    Source(s):

    • Trace d'Erreur (Error log) : Nom et localisation paramètrés par la directive ErrorLog (/var/log/apache2/error.log par défaut). Trace les erreurs rencontrées lors du traitement des requête et des information de diagnostic. A regarder en premier. La directive LogLevel (niveau de gravité) permet d'ajuster le type d'erreur enregistré.

      
$ tail -f /var/log/apache2/error.log  ## Monitorer en temps réel ce qui se passe sur le serveur
                                            ## Ideal en période de test :)
          

    • Trace d'Accès (Access log) : Nom et localisation paramètré par la directive CustomLog (/var/log/apache2/access.log par défaut). Trace toutes les requêtes traitées par la serveur. La directive LogFormat permet de simplifier la selection du contenu.

    • Trace de sites (Vhost Access log) : Si les directives CustomLog ou ErrorLog sont placés à l'interieur de la section <VirtualHost> (/var/log/apache2/other_vhosts_access.log par défaut), toutes les requêtes ou erreurs pour l'hôte virtuel irrons s'enregistrer dans le fichier spécifié. Les traces de tout hôte virtuel qui n'ont pas ces directives renseignées, sont simplement enregistrées avec les traces du serveur.

    • Autres (Module logs) : Trace des octets émis et reçu, "Forensic Logging", Fichier de PID (PID File), Trace de Script (Script Log), Trace de ré-écriture des URL (Rewrite Log), etc...


    10.1.4. Base de données - MYSQL - Installation et configuration

    Source(s):

    La deuxième brique dont nous avons besoin, c'est une base de données pour enregistrer les informations de nos pages dynamique

     

    Une base de données (Abr. : « BD » ou « BDD ») est un stock d'informations organisé et structuré de manière à pouvoir être facilement manipulé et stocker efficacement de très grandes quantités d'informations

     
    -- http://fr.wikipedia.org/wiki/Base_de_données  

    Petit point d'actualité sur MySQL :)

     

    In April 2009, Oracle Corporation entered into an agreement to purchase Sun Microsystems, current owners of the MySQL intellectual property. Sun's board of directors unanimously approved the deal, it was also approved by Sun's shareholders, and by the U.S. government on August 20, 2009. On December 14 2009, Oracle pledged to continue to enhance MySQL. In Europe the merge is under scrutiny by EU antitrust regulators, whose main concerns are on conflict of interests with existing database software by Oracle. Michael Widenius, father of MySQL, launched a petition to pledge EU Commission to stop the deal.

     
    -- http://en.wikipedia.org/wiki/MySQL#Product_History  

    Ici nous installerons MySQL mais il en existe d'autres: PostgreSQL, SQLlite, IngresDB, etc


    10.1.4.1. Installation de base

    Je pourrais compiler Mysql et l'installer depuis la source mais dans le cadre d'une première découverte je me contenterais du paquet Debian avec la configuration par défaut. Ce sera gage d'une meilleure stabilité dans un premier temps.

    
## Installation
    $ apt-get update
    $ apt-get install mysql-server-5.0
    
    ## En fin d'installation le mot de passe root 
    ## pour l'accès à la BD est requis comme paramètre obligatoire
    
    ## Vérification Version
    $ mysql --version
    mysql  Ver 14.12 Distrib 5.0.51a, for debian-linux-gnu (i486) using readline 5.2
    
    ## Localisation
    $ whereis mysqld
    mysqld: /usr/sbin/mysqld /usr/share/man/man8/mysqld.8.gz
    
    ## Processus
    $ ps aux | grep mysql
    root      4541  0.0  0.1   4692   560 ?        S    Dec28   0:00 /bin/sh /usr/bin/mysqld_safe
    mysql     4580  0.1  0.7 119332  2836 ?        Sl   Dec28   4:54 /usr/sbin/mysqld --basedir=/usr 
                                                                      --datadir=/var/lib/mysql --user=mysql 
                                                                      --pid-file=/var/run/mysqld/mysqld.pid 
                                                                      --skip-external-locking --port=3306 
                                                                      --socket=/var/run/mysqld/mysqld.sock
    root      4581  0.0  0.1   3800   492 ?        S    Dec28   0:00 logger -p daemon.err -t mysqld_safe -i -t mysqld
    
    ## Connection
    $ mysql -u root
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
    
    $ mysql -h localhost -u root -p  ## localhost c'est ma machine, 
    Enter password:                  ## -p est indispensable pour pouvoir entrer le mot de passe  
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 39
    Server version: 5.0.51a-24+lenny2 (Debian)
    
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    
    mysql> 
    
    ## Sortie XML
    $ mysql --xml -u root -e "SHOW VARIABLES LIKE 'version%'" -p
    Enter password: 
    
    
    <resultset statement="SHOW VARIABLES LIKE 'version%'
    " xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <row>
    	<field name="Variable_name">version</field>
    	<field name="Value">5.0.51a-24+lenny2</field>
      </row>
    
      <row>
    	<field name="Variable_name">version_comment</field>
    	<field name="Value">(Debian)</field>
      </row>
    
      <row>
    	<field name="Variable_name">version_compile_machine</field>
    	<field name="Value">i486</field>
      </row>
    
      <row>
    	<field name="Variable_name">version_compile_os</field>
    	<field name="Value">debian-linux-gnu</field>
      </row>
    </resultset>
        

    10.1.4.2. Mot de passe: root, debian-sys-maint

    Lors de l’installation de MySQL, un certain nombre d’utilisateurs sont créés automatiquement :

    
– debian-sys-maint : utilisateur qui sert à certains scripts Debian : il ne doit pas être supprimé !
    – root@localhost : il s’agit du compte administrateur, ayant tous les droits sur toutes les bases de données.
         

    Les utilisateurs de MySQL (ainsi que d’autres informations relatives notamment aux droits d’accès) sont contenus dans la table user d’une base de données nommée mysql.

    
mysql> use mysql                             ## Selectionner la BD named "mysql" 
    mysql> select host,user,password from user;  ## Lancer une requête sur la table "user" 
    +------------+------------------+-------------------------------------------+
    | host       | user             | password                                  |
    +------------+------------------+-------------------------------------------+
    | localhost  | root             | *F83365F186D5B45C390EBD9B01A200B1D113D0BC | 
    | debstafil4 | root             | *F83365F186D5B45C390EBD9B01A200B1D113D0BC | 
    | 127.0.0.1  | root             | *F83365F186D5B45C390EBD9B01A200B1D113D0BC | 
    | localhost  | debian-sys-maint | *2377A473D938D4CE7A0C76D42F6DE68BB247CF68 | 
    +------------+------------------+-------------------------------------------+
    4 rows in set (0.00 sec)
        

    Note

    Pour changer le mot de passe root:

    
mysql> set password for root@localhost=PASSWORD(’mot_de_passe_root’);
        
    Choisir un bon mot de passe, c’est-à-dire d’au moins huit caractères, et contenant des majuscules, minuscules et au moins un chiffre.


    10.1.4.3. Accéder à la documentation

    • En local :

      
$ man mysql
            

    • Au promt serveur :

      
$ mysql> help chaîne_rechercher ## indiquer dans la chaîne_rechercher les mots clefs de recherche
      
      ## Par exemple
      mysql> help         ## Liste MySQL commandes
      mysql> help content ## Affiche le contenu de l'aide
      mysql> help set     ## Obtenir information sur la commande 'SET'
      Name: 'SET'
      Description:
      Syntax:
      SET variable_assignment [, variable_assignment] ...
      
      variable_assignment:
            user_var_name = expr
          | [GLOBAL | SESSION] system_var_name = expr
          | [@@global. | @@session. | @@]system_var_name = expr
      
      The SET statement assigns values to different types of variables that
      affect the operation of the server or your client. Older versions of
      MySQL employed SET OPTION, but this syntax is deprecated in favor of
      SET without OPTION.
      
      URL: http://dev.mysql.com/doc/refman/5.0/en/set-option.html
            

    • En ligne (web) : MySQL 5.0 Reference Manual (EN) MySQL 5.0 Reference Manual (FR)


    10.1.4.4. Arrêt/Démarrage du service de BD (daemon) - mysql

    
## Le mieux est d'utiliser le script de démarrage utilisé lors de l'initialisation de la machine
    ## En tant que root...        
    ## start|stop|restart|reload|force-reload|status
    
    $ /etc/init.d/mysql stop
    Stopping MySQL database server: mysqld.
    
    $ /etc/init.d/mysql start
    Starting MySQL database server: mysqld ..
    Checking for corrupt, not cleanly closed and upgrade needing tables..
    
    $ /etc/init.d/mysql reload
    $ /etc/init.d/mysql force-reload
    Reloading MySQL database server: mysqld.
    
    $ /etc/init.d/mysql status
    /usr/bin/mysqladmin  Ver 8.41 Distrib 5.0.51a, for debian-linux-gnu on i486
    Copyright (C) 2000-2006 MySQL AB
    This software comes with ABSOLUTELY NO WARRANTY. This is free software,
    and you are welcome to modify and redistribute it under the GPL license
    
    Server version		5.0.51a-24+lenny2
    Protocol version	10
    Connection		Localhost via UNIX socket
    UNIX socket		/var/run/mysqld/mysqld.sock
    Uptime:			27 sec
    
    Threads: 1  Questions: 80  Slow queries: 0  Opens: 23  Flush tables: 1  Open tables: 17  Queries per second avg: 2.963.
    
    ## Alternatives
    /usr/sbin/mysqld      ## Démarrer le service de BD
    /usr/bin/mysqld_safe  ## Essaie de déterminer les options correctes avant de lancer mysqld  
        

    10.1.4.5. Fichier de Configuration (my.conf) et de données

    Source(s):

    Il y a trois fichiers de configuration, qui sont lus successivement dans l’ordre ci-dessous, les options définies en dernier écrasant celles définies précédemment.

    • GLOBAL - /etc/mysql/my.cnf : Il s’agit du fichier de configuration global du serveur MySQL fonctionnant sur la machine.

    • SERVEUR - DATADIR/my.cnf : est le fichier de configuration propre à chaque serveur MySQL. Il se trouve dans le dossier de base du serveur. Aucun existant par défaut.

    • UTILISATEUR - ~/.my.cnf : placé dans le dossier d’un utilisateur, ce fichier de configuration donne les options pour cet utilisateur. Aucun existant par défaut.

    • SPECIFIC - defaults-extra-file : Le fichier spécifié par --defaults-extra-file=#

    On peut placer dans ce fichier le login et le mot de passe, en s’assurant évidemment qu’il ne soit pas lisible par d’autres utilisateurs.

    MySQL serveur maintient un system de plusieurs variables qui indiquent comment il est configuré. Chaque variables a une valeur par défaut. Ces variables peuvent-être paramètrées au démarrage du service avec les options de ligne de commande ou via un fichier de configuration. La plupart peuvent changer dynamiquement lorsque le serveur est en cours d'execution en utilisant la commande SET qui permet des modifications sans stopper ou redémarrer le serveur.

    Il y a plusieurs moyens de connaîtres ses variables et leur valeur:

    
$ mysqld --verbose --help               ## Afficher les variables/valeurs par défaut à la compilation 
                                            ## et modifiées par le fichier de configuration.
    $ mysqld --no-defaults --verbose --help ## Afficher les variables/valeurs par défaut à la compilation,
                                            ## ignorant toute modification ultérieure.
    $ mysql > SHOW VARIABLES;               ## Afficher les variables/valeurs courantes du serveur en cours d'execution
    $ my_print_defaults client mysql        ## Afficher les options des groupes [client] et [mysql]
        

    Plus d'information à : Variables du serveur MySQL

    
## Extrait 1
    $ mysqld --verbose --help
    mysqld  Ver 5.0.51a-24+lenny2 for debian-linux-gnu on i486 ((Debian))
    Copyright (C) 2000 MySQL AB, by Monty and others
    This software comes with ABSOLUTELY NO WARRANTY. This is free software,
    and you are welcome to modify and redistribute it under the GPL license
    
    Starts the MySQL database server
    
    Usage: mysqld [OPTIONS]
    
    Default options are read from the following files in the given order:
    /etc/mysql/my.cnf ~/.my.cnf /usr/etc/my.cnf 
    The following groups are read: mysql_cluster mysqld server mysqld-5.0
    The following options may be given as the first argument:
    --print-defaults	Print the program argument list and exit
    --no-defaults		Don't read default options from any options file
    --defaults-file=#	Only read default options from the given file #
    --defaults-extra-file=# Read this file after the global files are read
    
      -?, --help          Display this help and exit.
      --abort-slave-event-count=# 
                          Option used by mysql-test for debugging and testing of
                          replication.
      --allow-suspicious-udfs 
                          Allows use of UDFs consisting of only one symbol xxx()
                          without corresponding xxx_init() or xxx_deinit(). That
                          also means that one can load any function from any
                          library, for example exit() from libc.so
      -a, --ansi          Use ANSI SQL syntax instead of MySQL syntax. This mode
                          will also set transaction isolation level 'serializable'.
      --auto-increment-increment[=#] 
                          Auto-increment columns are incremented by this
      --auto-increment-offset[=#] 
                          Offset added to Auto-increment columns. Used when
                          auto-increment-increment != 1
      ...
      
      --log-slave-updates Tells the slave to log the updates from the slave thread
                          to the binary log. You will need to turn it on if you
                          plan to daisy-chain the slaves.
      --log-slow-admin-statements 
                          Log slow OPTIMIZE, ANALYZE, ALTER and other
                          administrative statements to the slow log if it is open.
      ...
      --old-passwords     Use old password encryption method (needed for 4.0 and
                          older clients).
      --old-style-user-limits 
                          Enable old-style user limits (before 5.0.3 user resources
                          were counted per each user+host vs. per account)
      --pid-file=name     Pid file used by safe_mysqld.
      ...
      --wait_timeout=#    The number of seconds the server waits for activity on a
                          connection before closing it.
    
    Variables (--variable-name=value)
    and boolean options {FALSE|TRUE}  Value (after reading options)
    --------------------------------- -----------------------------
    help                              TRUE
    abort-slave-event-count           0
    allow-suspicious-udfs             FALSE
    auto-increment-increment          1
    auto-increment-offset             1
    ...
    master-retry-count                86400
    master-ssl                        FALSE
    ...
    old-passwords                     FALSE
    old-style-user-limits             FALSE
    pid-file                          /var/run/mysqld/mysqld.pid
    port                              3306
    port-open-timeout                 0
    profiling_history_size            15
    relay-log                         (No default value)
    ...
    sysdate-is-now                    FALSE
    tc-heuristic-recover              (No default value)
    temp-pool                         TRUE
    timed_mutexes                     FALSE
    tmpdir                            /tmp
    ...
    wait_timeout                      28800
    
    To see what values a running MySQL server is using, type
    'mysqladmin variables' instead of 'mysqld --verbose --help'.
        
    
## Extrait 2
    $ mysql> show variables;
    +---------------------------------+-----------------------------+
    | Variable_name                   | Value                       |
    +---------------------------------+-----------------------------+
    | auto_increment_increment        | 1                           | 
    | auto_increment_offset           | 1                           | 
    | automatic_sp_privileges         | ON                          | 
    | back_log                        | 50                          | 
    | basedir                         | /usr/                       | 
    | binlog_cache_size               | 32768                       | 
    | bulk_insert_buffer_size         | 8388608                     | 
    | character_set_client            | latin1                      | 
    | character_set_connection        | latin1                      | 
    ...
    | version_comment                 | (Debian)                    | 
    | version_compile_machine         | i486                        | 
    | version_compile_os              | debian-linux-gnu            | 
    | wait_timeout                    | 28800                       | 
    +---------------------------------+-----------------------------+
    232 rows in set (0.00 sec)
        

    Pour savoir où se trouve le repertoire DATADIR :

    
$ mysql> show variables where Variable_name like 'datadir';
    +---------------+-----------------+
    | Variable_name | Value           |
    +---------------+-----------------+
    | datadir       | /var/lib/mysql/ | 
    +---------------+-----------------+
    1 row in set (0.01 sec)
    
    # Alternative
    $ mysqld --verbose --help | grep datadir
      -h, --datadir=name  Path to the database root.
    datadir                           /var/lib/mysql/
        

    Par défaut on voit que, MySQL DATADIR (repertoire de données) est /var/lib/mysql. C'est à cet endroit que les base de données sont stockées. Un dossier par base de données.

    
## Fichiers associés à la base de donnée 'mysql' sur le serveur
    $ ls /var/lib/mysql/mysql
    columns_priv.frm   help_relation.MYI  time_zone_leap_second.frm
    columns_priv.MYD   help_topic.frm     time_zone_leap_second.MYD
    columns_priv.MYI   help_topic.MYD     time_zone_leap_second.MYI
    db.frm		   help_topic.MYI     time_zone.MYD
    db.MYD		   host.frm	      time_zone.MYI
    db.MYI		   host.MYD	      time_zone_name.frm
    func.frm	   host.MYI	      time_zone_name.MYD
    func.MYD	   proc.frm	      time_zone_name.MYI
    func.MYI	   proc.MYD	      time_zone_transition.frm
    help_category.frm  proc.MYI	      time_zone_transition.MYD
    help_category.MYD  procs_priv.frm     time_zone_transition.MYI
    help_category.MYI  procs_priv.MYD     time_zone_transition_type.frm
    help_keyword.frm   procs_priv.MYI     time_zone_transition_type.MYD
    help_keyword.MYD   tables_priv.frm    time_zone_transition_type.MYI
    help_keyword.MYI   tables_priv.MYD    user.frm
    help_relation.frm  tables_priv.MYI    user.MYD
    help_relation.MYD  time_zone.frm      user.MYI
        

    Note

    Il est possible de changer le repertoire DATADIR simplement en changeant dans le fichier de configuration. Attention à migrer toutes base de données existantes: Moving the MySQL's datadir directory.

    Dans les scripts Shell, on peut aussi utiliser le programme my_print_defaults pour analyser les fichiers d'options. L'exemple suivant montre le résultat que my_print_defaults peut produire lorsqu'on lui demande d'afficher les options des groupes [client] et [mysql] :

    
$ my_print_defaults client mysql
    --port=3306
    --socket=/var/run/mysqld/mysqld.sock
    
    ## Sans préciser des groupes on obtient...
    $ my_print_defaults
    my_print_defaults  Ver 1.6 for debian-linux-gnu at i486
    This software comes with ABSOLUTELY NO WARRANTY. This is free software,
    and you are welcome to modify and redistribute it under the GPL license
    
    Prints all arguments that is give to some program using the default files
    Usage: my_print_defaults [OPTIONS] groups
      -c, --config-file=name 
                          Deprecated, please use --defaults-file instead.  Name of
                          config file to read; if no extension is given, default
                          extension (e.g., .ini or .cnf) will be added
      -#, --debug[=#]     This is a non-debug version. Catch this and exit
      -c, --defaults-file=name 
                          Like --config-file, except: if first option, then read
                          this file only, do not read global or per-user config
                          files; should be the first option
      -e, --defaults-extra-file=name 
                          Read this file after the global config file and before
                          the config file in the users home directory; should be
                          the first option
      -g, --defaults-group-suffix=name 
                          In addition to the given groups, read also groups with
                          this suffix
      -e, --extra-file=name 
                          Deprecated. Synonym for --defaults-extra-file.
      -n, --no-defaults   Return an empty string (useful for scripts).
      -?, --help          Display this help message and exit.
      -v, --verbose       Increase the output level
      -V, --version       Output version information and exit.
    
    Default options are read from the following files in the given order:
    /etc/mysql/my.cnf ~/.my.cnf /usr/etc/my.cnf 
    
    Variables (--variable-name=value)
    and boolean options {FALSE|TRUE}  Value (after reading options)
    --------------------------------- -----------------------------
    config-file                       my
    defaults-file                     my
    defaults-extra-file               (No default value)
    defaults-group-suffix             (No default value)
    extra-file                        (No default value)
    
    Example usage:
    my_print_defaults --defaults-file=example.cnf client mysql
        

    Comme indiqué ci-dessus et observé dans le fichier de configuration my.cnf, les options peuvent être regroupées par groupes :

    • [mysql] ou [mysqld] : sont des options lus et appliqués uniquement par le serveur MySQL.

    • [client] : sont des options de group lus et appliqués par tous les programs client mais pas par le serveur mysqld. Elle specifie les options à appliquer au client. Par example on peut specifier le mot de passe à utiliser pour se connecter au serveur (,dans ce cas le fichier ne doit pas être lu par d'autres utilisateurs !!!).

    Quelques options de base interressantes :

    
[client]
    port		= 3306                          ## Port à utiliser par les programmes client
    socket		= /var/run/mysqld/mysqld.sock ## Prise de communication à utiliser par les programmes client
    ...
    
    [mysqld]
    user     = mysql                       ## Utilisateur par défaut si non spécifié sur la ligne de commande
    pid-file = /var/run/mysqld/mysqld.pid  ## Fichier d'identifiant du processus
    socket   = /var/run/mysqld/mysqld.sock ## Prise de communication
    port     = 3306                        ## Port d'écoute du serveur
    basedir  = /usr
    datadir  = /var/lib/mysql              ## Repertoire de données
    tmpdir   = /tmp
    language = /usr/share/mysql/english    ## Language par défaut du serveur
       

    Modifions la langue utilisée pour que les messages d’erreur apparaissent en français:

    
$ ls /usr/share/mysql/  ## pour voir les options disponible
    charsets
    czech
    danish
    ...
    english
    ...
    french
    ...
    ukrainian               ## Beaucoup de langues disponible par défaut...
    
    ## Mofifions le fichier de configuration /etc/mysql/my.cnf
    language	= /usr/share/mysql/french
    
    ## Puis redémarrons le service pour qu'il prenne en compte le changement
    $ /etc/init.d/mysql restart
    
    ## Vérifions
    $ mysql  ## Sans spécifier d'utilisateur 
    ERROR 1045 (28000): Accès refusé pour l'utilisateur: 'root'@'@localhost' (mot de passe: NON)
        

    Définissons des options propres à l'utilisateur root dans le fichier de configuration /root/.my.cnf. On pourrait faire de même pour un autre utilisateur.

    
# /root/.my.cnf
    [client]
    user = root
    password = mot_de_passe_root  ## Bien prendre soin de remplace mot_de_passe_root par le mdp réel !!!
    [mysql]
    database = mysql
        
    
## TEST OK
    $ mysql
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 29
    Server version: 5.0.51a-24+lenny2 (Debian)
    
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    
    mysql> prompt (\u@\h) [\d]>\_       ## En changeant l'affichage du prompt (man mysql)
    PROMPT set to '(\u@\h) [\d]>\_'
    
    (root@localhost) [mysql]>           ## Je vois bien que je suis connecté en tant que 'root' à la base 'mysql'
    
    ## Alternativement pour vérifier qui je suis et quelle BD est en cours d'utilisation
    mysql> status
    --------------
    mysql  Ver 14.12 Distrib 5.0.51a, for debian-linux-gnu (i486) using readline 5.2
    
    Connection id:		32
    Current database:	mysql             ## Base de données 'mysql' OK
    Current user:		root@localhost      ## Utilisateur root OK
    SSL:			Not in use
    Current pager:		stdout
    Using outfile:		''
    Using delimiter:	;
    Server version:		5.0.51a-24+lenny2 (Debian)
    Protocol version:	10
    Connection:		Localhost via UNIX socket
    Server characterset:	latin1
    Db     characterset:	latin1
    Client characterset:	latin1
    Conn.  characterset:	latin1
    UNIX socket:		/var/run/mysqld/mysqld.sock
    Uptime:			16 min 50 sec
    
    Threads: 1  Questions: 145  Slow queries: 0  Opens: 23  Flush tables: 1  Open tables: 17  Queries per second avg: 0.144
    --------------
        

    Note

    Ce fichier de configuration contient des données sensibles (mot de passe), il est donc nécessaire d’assurer sa confidentialité :

    
$ ls -l .my.cnf                                 ## Droits par défaut 
    -rw-r--r-- 1 root root 66 jan  1 23:55 .my.cnf
    
    $ chmod go-rwx .my.cnf                          ## Enlève tous les droits au groupe et 
                                                    ## aux utilisateurs autres que le propriétaire 
    $ ls -l .my.cnf
    -rw------- 1 root root 66 jan  1 23:55 .my.cnf  ## Véfification nouveaux droits
        

    Note

    Plusieurs possibilités pour changer les prompt MySQL à '(user@host) [database]>' par exemple. Pour plus d'information voir la page : man mysql (section MYSQL COMMANDES).

    
# Utiliser les variables d'environements
    $ export MYSQL_PS1="(\u@\h) [\d]> "
    
    # Utiliser l'option de ligne de commande mysql --prompt
    $ mysql --prompt="(\u@\h) [\d]> "
          
    # Utliser une option de configuration dans le groupe [mysql]
    [mysql]
    prompt=(\\u@\\h) [\\d]>\\_   ## Les anti-slashe doivent être doublés dans ce cas...
    
    # Utiliser la méthode inter-active
    mysql> prompt (\u@\h) [\d]>\_
        


    10.1.4.6. Règle d'OR: Vérifier l'installation de la Base de Données avec le système

    Note

    Ne jamais faire confiance aux scripts de démarrage et à ce qu'ils renvoient à l'écran !!! Toujours vérifier l'installation avec le système.

    S’assurer que le service de BD est bien actif et opérationnel:

    
### Un serveur de base de données comme MySQL ou PostgreSQL attend des requêtes sur un port. 
    ### pour PostgreSQL il s’agit du port 5432.
    ### Par défaut le service mysql (indiqué mysqld ici) utilise le port 3306
    $ grep mysql /etc/services
    mysql		3306/tcp
    mysql		3306/udp
    
    ### Pas besoin de le démarrer le service fonctionne déjà
    $ /etc/init.d/mysql start
    Starting MySQL database server: mysqld already running.
    
    ### Vérifions la table de processus
    $ ps aux | grep mysql
    root      3649  0.0  0.3   4692  1288 ?        S    Jan01   0:00 /bin/sh /usr/bin/mysqld_safe
    mysql     3688  0.1  4.2 127376 16972 ?        Sl   Jan01   0:02 /usr/sbin/mysqld --basedir=/usr 
                                                                --datadir=/var/lib/mysql --user=mysql 
                                                                --pid-file=/var/run/mysqld/mysqld.pid 
                                                                --skip-external-locking --port=3306 
                                                                --socket=/var/run/mysqld/mysqld.sock
    root      3689  0.0  0.1   3800   612 ?        S    Jan01   0:00 logger -p daemon.err -t mysqld_safe -i -t mysqld
    root      3889  0.0  0.1   3940   768 pts/1    R+   00:28   0:00 grep mysql
    
    ### Le service est actif, verifions qu'il écoute le port 3306 
    $ netstat -natupw | grep 3306
    tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      3688/mysqld  
    
    ### Test de connection
    $ telnet 10.0.1.5 3306
    Trying 10.0.1.5...
    telnet: Unable to connect to remote host: Connection refused
    
    $ telnet 127.0.0.1 3306
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    
    5.0.51a-24+lenny2...Connection closed by foreign host.
    
    $ mysql -h 10.0.1.5 -u root -p
    Enter password: 
    ERROR 2003 (HY000): Can't connect to MySQL server on '10.0.1.5' (111)
    
    $ mysql -h 127.0.0.1 -u root -p
    Enter password: 
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 36
    Server version: 5.0.51a-24+lenny2 (Debian)
    
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    
    mysql> 
        

    A ce stade, je suis sûr que le service est bien opérationnel. S’il y a un problème, cela ne vient pas de sa configuration de base. Soit cela vient d’extensions, mais le service globalement fonctionne.

    QUESTION : On voit bien ci-dessus qu'il est possible de se connecter que par l'addresse 127.0.0.1 et pas 10.0.1.5 est-ce normal ? Puisque cette dernière n'est pas à l'écoute ? Ou pas autorisé dans la base MySQL ?

    QUESTION : Les commandes indiquées dans le cours sont tapées en majuscules mais elles fonctionnent sans soucis en minuscules. S'agit-il d'une convention dans le monde des bases de données ? juste pour le cours ? Doit-on prendre cette habitude ?

    Oui, c'est purement conventionnel afin de distinguer les mots réservés du reste.


    10.1.4.7. Création d’un compte utilisateur et mise en place des droits

    Création d'un utilisateur nommé « mysqlUser » auquel nous n’assignerons aucun droit sur aucune base dans un premier temps

    
mysql> GRANT USAGE ON *.* TO 'mysqlUser'@'localhost' IDENTIFIED BY 'mdpmysqlUser';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT user FROM users;
    ERROR 1146 (42S02): La table 'mysql.users' n'existe pas
    mysql> SELECT user FROM user;
    +------------------+
    | user             |
    +------------------+
    | root             | 
    | root             | 
    | debian-sys-maint | 
    | mysqlUser        | 
    | root             | 
    +------------------+
    5 rows in set (0.01 sec)
        
    
## Test de connection
    $ mysql -u mysqlUser -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 36
    Server version: 5.0.51a-24+lenny2 (Debian)
    
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    
    mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema | 
    +--------------------+
    1 row in set (0.00 sec)
    
    mysql> SHOW TABLES;
    +---------------------------------------+
    | Tables_in_information_schema          |
    +---------------------------------------+
    | CHARACTER_SETS                        | 
    | COLLATIONS                            | 
    | COLLATION_CHARACTER_SET_APPLICABILITY | 
    | COLUMNS                               | 
    | COLUMN_PRIVILEGES                     | 
    | KEY_COLUMN_USAGE                      | 
    | PROFILING                             | 
    | ROUTINES                              | 
    | SCHEMATA                              | 
    | SCHEMA_PRIVILEGES                     | 
    | STATISTICS                            | 
    | TABLES                                | 
    | TABLE_CONSTRAINTS                     | 
    | TABLE_PRIVILEGES                      | 
    | TRIGGERS                              | 
    | USER_PRIVILEGES                       | 
    | VIEWS                                 | 
    +---------------------------------------+
    17 rows in set (0.00 sec)
    
    mysql> USE mysql;            ## Accès à une autre base refusé !
    ERROR 1044 (42000): Acc�s refus� pour l'utilisateur: 'mysqlUser'@'@localhost'. Base 'mysql'
        

    La base de données information_schema fournit un accès aux métadonnées sur les bases de données. Chaque utilisateur MySQL a le droit d’accéder à ces données, mais seules les lignes concernant des objets pour lesquels il a des droits seront visibles.


    10.1.4.8. Création d’une base de donnée et d’une table

    Note

    En mode interactif, les guillemets simple (') et double (") ne sont pas accepter par l'interpréteur... pour la création d'une base de donnée ou d'une table il ne sont pas requis...dans ce mode

    Création d'une petite base de données permettant de gérer une bibliothèque. Creating and Selecting a Database :

    
mysql> CREATE DATABASE bibliotheque;            ## Créer la BD 'bibliotheque'
    Query OK, 1 row affected (0.00 sec)
    
    mysql> USE bibliotheque;                        ## Utiliser la BD 'bibliotheque'
        

    Cette base de données ne contient qu’une seule table livre, dont les champs sont définis dans le tableau suivant :

    
champ     Type          Taille            Commentaire
    idLivre   entier        3 chiffres        doit s’incrémenter automatiquement, unique pour chaque livre
    titre     chaîne        128 caractères    titre du livre
    auteur    chaîne        128 caractères    auteur du livre
    annee     type année    4 chiffres        année de parution
        

    Creating a Table :

    
mysql> CREATE TABLE livre (                     ## Créer une nouvelle table 'livre' dans cette BD avec
    -> idLivre INT (3) NOT NULL AUTO_INCREMENT,     ## Identifiant du livre 3 chiffres, champs non-vide, incrémentation automatique
    -> titre VARCHAR(128) NOT NULL,                 ## Titre de 128 charactères maximum, champs non-vide
    -> auteur VARCHAR(128) NOT NULL,                ## Auteur de 128 charactères maximum, champs non-vide
    -> annee YEAR(4) NOT NULL,                      ## Année 4 chiffres, champs non-vide
    -> UNIQUE(idLivre)                              ## Identifiant du livre doit être unique
    -> )TYPE=MYISAM;                                ## Choix du type de table: MYISAM
    Query OK, 0 rows affected, 1 warning (0.04 sec)
    
    mysql> SHOW TABLES;                             ## Afficher les tables de la BD 'bibliotheque'
    +------------------------+
    | Tables_in_bibliotheque |
    +------------------------+
    | livre                  | 
    +------------------------+
    1 row in set (0.00 sec)
    
    mysql> DESCRIBE livre;                           ## Afficher la structure de la table 'livre'
    +---------+--------------+------+-----+---------+----------------+
    | Field   | Type         | Null | Key | Default | Extra          |
    +---------+--------------+------+-----+---------+----------------+
    | idLivre | int(3)       | NO   | PRI | NULL    | auto_increment | 
    | titre   | varchar(128) | NO   |     | NULL    |                | 
    | auteur  | varchar(128) | NO   |     | NULL    |                | 
    | annee   | year(4)      | NO   |     | NULL    |                | 
    +---------+--------------+------+-----+---------+----------------+
    4 rows in set (0.00 sec)    
        

    Ajouter un enregistrement dans cette table. Loading Data into a Table :

    
mysql> INSERT INTO livre (idLivre,titre,auteur,annee) VALUES ('','Une brève histoire du temps', 'Stephen Hawking', '1990');
    Query OK, 1 row affected, 1 warning (0.05 sec)
    
    mysql> INSERT INTO livre (idLivre,titre,auteur,annee) VALUES ('','MySQL 5', 'Cyril Thibaud', '2006');
    Query OK, 1 row affected, 1 warning (0.00 sec)
        

    Note

    idLivre s'incrémente automatiquement...

    Affichons le contenu de notre table. Retrieving Information from a Table :

    
mysql> SELECT * FROM livre;                ## Afficher tous les enregistrements de la table
    +---------+------------------------------+-----------------+-------+
    | idLivre | titre                        | auteur          | annee |
    +---------+------------------------------+-----------------+-------+
    |       1 | Une brève histoire du temps  | Stephen Hawking |  1990 | 
    |       2 | MySQL 5                      | Cyril Thibaud   |  2006 | 
    +---------+------------------------------+-----------------+-------+
    2 rows in set (0.02 sec)
    
    mysql> SELECT annee, auteur FROM livre;   ## Filtrer sur les colonnes
    +-------+-----------------+
    | annee | auteur          |
    +-------+-----------------+
    |  1990 | Stephen Hawking | 
    |  2006 | Cyril Thibaud   | 
    +-------+-----------------+
    2 rows in set (0.00 sec)
    
    mysql> SELECT * FROM livre WHERE auteur LIKE 'Stephen Hawking';  ## Filtrer sur les enregistrements (lignes)
    +---------+------------------------------+-----------------+-------+
    | idLivre | titre                        | auteur          | annee |
    +---------+------------------------------+-----------------+-------+
    |       1 | Une brève histoire du temps | Stephen Hawking |  1990 | 
    +---------+------------------------------+-----------------+-------+
    1 row in set (0.00 sec)
    
    
    mysql> SELECT annee, auteur FROM livre WHERE annee='1990';   ## Filter sur lignes et colonnes
    +-------+-----------------+
    | annee | auteur          |
    +-------+-----------------+
    |  1990 | Stephen Hawking | 
    +-------+-----------------+
    1 row in set (0.02 sec)        
        

    Mettre à jour un enregistrement existant :

    
mysql> UPDATE livre SET annee='2000' WHERE auteur='Stephen Hawking';
    Query OK, 1 row affected (0.01 sec)
    Enregistrements correspondants: 1  Modifiés: 1  Warnings: 0
    
    mysql> SELECT * FROM livre WHERE auteur LIKE 'Stephen Hawking';
    +---------+------------------------------+-----------------+-------+
    | idLivre | titre                        | auteur          | annee |
    +---------+------------------------------+-----------------+-------+
    |       1 | Une brève histoire du temps  | Stephen Hawking |  2000 | 
    +---------+------------------------------+-----------------+-------+
    1 row in set (0.00 sec)    
        

    Autoriser l’utilisateur mysqlUser à accéder à la base de données bibliotheque. En root, on exécute la commande suivante :

    
mysql> GRANT select ON bibliotheque.* TO mysqlUser@localhost;   ## bibliotheque.* accorde les droits sur
    Query OK, 0 rows affected (0.07 sec)                            ## toutes les tables de la base de données
        
    
## Vérification...
    (mysqlUser@localhost) [(none)]> USE bibliotheque
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    (mysqlUser@localhost) [bibliotheque]> SELECT * FROM livre;
    +---------+------------------------------+-----------------+-------+
    | idLivre | titre                        | auteur          | annee |
    +---------+------------------------------+-----------------+-------+
    |       1 | Une brève histoire du temps | Stephen Hawking |  2000 | 
    |       2 | MySQL 5                      | Cyril Thibaud   |  2006 | 
    +---------+------------------------------+-----------------+-------+
    2 rows in set (0.00 sec)
    
    (mysqlUser@localhost) [bibliotheque]> INSERT INTO livre (idLivre, titre, auteur, annee) 
        > VALUES ('', "On a perdu la moitié de l'Univers", 'Jean-Pierre Petit', '2001');
    ERROR 1142 (42000): La commande 'INSERT' est interdite à l'utilisateur: 'mysqlUser'@'@localhost' sur la table 'livre'
    ##==> mysqlUser peut pas ajouter un enregistrement
        

    Autoriser l'utilisateur mysqlUser à ajouter des données dans la table livre :

    
mysql> GRANT insert ON bibliotheque.* TO mysqlUser@localhost;
    Query OK, 0 rows affected (0.00 sec)
        
    
## Vérification...
    (mysqlUser@localhost) [bibliotheque]> INSERT INTO livre (idLivre, titre, auteur, annee) 
      > VALUES ('', "On a perdu la moitié de l'Univers", 'Jean-Pierre Petit', '2001');
    Query OK, 1 row affected, 1 warning (0.00 sec)
    
    (mysqlUser@localhost) [bibliotheque]> UPDATE livre SET annee='1995' WHERE auteur='Stephen Hawking';
    ERROR 1142 (42000): La commande 'UPDATE' est interdite à l'utilisateur: 'mysqlUser'@'@localhost' sur la table 'livre'
    ##==> mysqlUser peut pas modifier un enregistrement
        

    Note

    Pour que le changement de droits soit effectif, il semble nécessaire que l'utilisateur se déconnecte/re-connecte au serveur MySQL

    Accorder tous les droits sur la base de données (sélection, insertion, création de nouvelles tables. . .), la syntaxe est la suivante :

    
mysql> GRANT ALL PRIVILEGES ON bibliotheque.* TO mysqlUser@localhost;
    Query OK, 0 rows affected (0.00 sec)
        
    
## Vérification...
    (mysqlUser@localhost) [bibliotheque]> UPDATE livre SET annee='1995' WHERE auteur='Stephen Hawking';
    Query OK, 1 row affected (0.00 sec)
    Enregistrements correspondants: 1  Modifiés: 1  Warnings: 0
        


    10.1.4.9. Executer des requètes SQL dans un script (batch file)

    Il est possible d'executer des requètes SQL dans un script via un fichier (batch file mode)

    Syntaxe :

    
$ mysql db_name < script.sql > output.tab
        


    10.1.4.10. Sauvegarde & Restauration

    Differentes méthodes disponible en bref...

    Pour plus d'information : Backup and Recovery

    Méthode1: Copier les fichiers de tables (via commande système cp, scp, tar, rsync) :

    
Pour l'engin de stockage qui représente chaque table dans son propre fichier, 
    les tables peuvent être sauvegardés en copiant simplement ces fichiers. 
    Par example, les tables MyISAM sont stockés dans des fichiers :*.frm, *.MYD, and *.MYI,
    il suffit simplement des les copiers. Pour obtenir une sauvegarde consistent, 
    il est nécessaire de stopper le serveur ou 
    de faire un LOCK TABLES sur chacune des tables suivit d'un FLUSH TABLES pour les tables. 
        

    Méthode2 : Créer des fichiers texte contenu des tables :

    
## Syntaxe
    mysql> SELECT * INTO OUTFILE 'file_name' FROM tbl_name;
    
    ## Example
    mysql> SELECT * INTO OUTFILE 'livre.txt' FROM livre;
    Query OK, 3 rows affected (0.01 sec)
    
    mysql> SELECT * INTO OUTFILE '/home/filostene/livre.txt' FROM livre;
    ERROR 1 (HY000): Can't create/write to file '/home/filostene/livre.txt' (Errcode: 13) 
        

    Note

    Par défaut, le fichier 'livre.txt' est créé dans le repertoire /var/lib/mysql/bibliotheque/. Il n'est pas possible de changer cette location à moins de donner accès à l'utilisateur système mysql à cette dite location

    Méthode3 : mysqldump (programme)

    
## Syntaxe
    $ mysqldump db_name > dump_file
    $ mysqldump --tab=/path/to/some/dir db_name  ## Alternative
    
    ## Example
    $ mysqldump bibliotheque > bibliotheque.txt
    
    $ mkdir /tmp/dump/
    $ chgrp mysql /tmp/dump/
    $ chmod g+w /tmp/dump/
    $ mysqldump --tab=/tmp/dump/ bibliothequels
    $ ls -l /tmp/dump/
    -rw-r--r-- 1 root  root  1403 jan  2 15:42 livre.sql
    -rw-rw-rw- 1 mysql mysql  141 jan  2 15:42 livre.txt
        
    Resultat : bibliotheque.txt livre.sql livre.txt

    Note

    mysqldump est plus général parce qu'il peut sauvegarder tout type de tables tandis que mysqlhotcopy ne fonctionne pas avec tous les engins de stockage.

    RESTAURER : les fichiers dump au format SQL on peut utiliser le client mysql. Pour les fichiers text-délémités on peut utiliser la commande MySQL LOAD DATA INFILE ou le script mysqlimport.

    Méthode4: mysqlhotcopy (script pour tables MyISAM), ibbackup (script pour tables InnoDB) :

    
## Syntaxe
    $ mysqlhotcopy db_name /path/to/some/dir
    
    ## Example
    $ mysqlhotcopy bibliotheque /tmp/dump/
    Locked 1 tables in 0 seconds.
    Flushed tables (`bibliotheque`.`livre`) in 1 seconds.
    Copying 4 files...
    Copying indices for 0 files...
    Unlocked tables.
    mysqlhotcopy copied 1 tables (4 files) in 1 second (1 seconds overall).
    
    $ ls -l /tmp/dump/bibliotheque
    -rw-rw---- 1 mysql mysql   65 jan  2 12:05 db.opt
    -rw-rw---- 1 mysql mysql 8664 jan  2 12:40 livre.frm
    -rw-rw---- 1 mysql mysql  152 jan  2 14:02 livre.MYD
    -rw-rw---- 1 mysql mysql 2048 jan  2 15:52 livre.MYI
        

    RESTAURER: Utiliser mysqlhotcopy (ou ibbackup pour InnoDB) pour copier en retour les tables dans le repertoire d'origine


    10.1.6. Language de script - PHP - Installation et configuration

    Source(s):

    La troisième brique dont nous avons besoin est un language de script pour interfacer nos page Web dynamique avec la base de données.

     

    Un langage de script est un langage de programmation qui permet de manipuler les fonctionnalités d'un système informatique configuré pour fournir à l'interpréteur de ce langage un environnement et une interface qui déterminent les possibilités de celui-ci. Le langage de script peut alors s'affranchir des contraintes de bas niveau — prises en charge par l'intermédiaire de l'interface — et bénéficier d'une syntaxe de haut niveau.

     
    -- http://fr.wikipedia.org/wiki/Langage_de_script  

    Ici nous installerons PHP mais il en existe d'autres: python, ruby, perl, etc...

     

    PHP (officiellement, ce sigle est un acronyme récursif pour PHP: Hypertext Preprocessor) est un langage de scripts généraliste et Open Source, spécialement conçu pour le développement d'applications web. Il peut être intégré facilement au HTML.

     
    -- http://www.php.net/manual/fr/intro-whatis.php  

    10.1.6.1. Installation de base

    Source(s):

    Dans le cadre d'une première découverte je me contenterais du paquet Debian avec la configuration par défaut. Ce sera gage d'une meilleure stabilité dans un premier temps.

    Description des paquets de base :

         
          php5  Il s’agit d’un métapaquet qui, une fois installé, vous guarantit que vous dispo-
                sez d’un interpréteur php5 coté serveur fonctionnel. Si Apache 2 est installé
                sur votre machine, alors le paquet libapache2-mod-php5 sera automatique-
                ment installé. Pour Apache 1.3, ce sera le paquet libapache-mod-php5.
    
      php5-cli  ce paquet vous fournit l’interpréteur de commande /usr/bin/php5 utile
                pour tester les scripts php dans un terminal, ou même pour écrire de véri-
                tables scripts si python ou perl vous font peur.
    
    php5-mysql  ce paquet fournit un module php pour les connexions directes aux bases de
                données MySQL depuis un script php.
         

    Installation :

    
$ apt-get update
    $ apt-get install php5 php5-cli php5-mysql
    Lecture des listes de paquets... Fait
    Construction de l'arbre des dépendances       
    Lecture des informations d'état... Fait
    Les paquets supplémentaires suivants seront installés : 
      apache2-mpm-prefork libapache2-mod-php5 php5-common
    Paquets suggérés :
      php-pear
    Les paquets suivants seront ENLEVÉS :
      apache2-mpm-worker
    Les NOUVEAUX paquets suivants seront installés :
      apache2-mpm-prefork libapache2-mod-php5 php5 php5-cli php5-common php5-mysql
    0 mis à jour, 6 nouvellement installés, 1 à enlever et 2 non mis à jour.
    Il est nécessaire de prendre 5628ko dans les archives.
    Après cette opération, 12,0Mo d'espace disque supplémentaires seront utilisés.
    ...
    Stopping web server: apache2 ... waiting ..
    ...
    Starting web server: apache2.
    ...
    Paramétrage de php5-common (5.2.6.dfsg.1-1+lenny4) ...
    Paramétrage de libapache2-mod-php5 (5.2.6.dfsg.1-1+lenny4) ...
    
    Creating config file /etc/php5/apache2/php.ini with new version
    Reloading web server config: apache2.
    Paramétrage de php5 (5.2.6.dfsg.1-1+lenny4) ...
    Paramétrage de php5-cli (5.2.6.dfsg.1-1+lenny4) ...
    
    Creating config file /etc/php5/cli/php.ini with new version
    Paramétrage de php5-mysql (5.2.6.dfsg.1-1+lenny4) ...
         
    Le serveur Apache a été redémarré durant l'opération... Deux fichiers de configuration on été créés...


    10.1.6.2. Test en ligne de commande - Premier script

    Vérifier si l’interpréteur en ligne de commande est correctement installé et fonctionnel:

    
$ ls -lh /usr/bin/php
    lrwxrwxrwx 1 root root 21 jan  2 16:39 /usr/bin/php -> /etc/alternatives/php
    
    $ ls -lh /etc/alternatives/php
    lrwxrwxrwx 1 root root 13 jan  2 16:39 /etc/alternatives/php -> /usr/bin/php5
        
    
## Test mode interactif
    $ php -a                   ## lancer l’interpréteur en mode interactif
    Interactive mode enabled
    
    <?php
    echo "Hello world!";
    Hello world!
    ?>
    ^C                         ## Appuyez sur ctrl+C pour quitter l’interpréteur.
        
    
## Test mode script
    $ cat > test.php <<EOF
    > <?php
    > echo "Ceci est un script php\n";
    > \$i=1;
    > echo "i vaut \$i\n";
    > ?>
    > EOF
    
    $ php test.php
    Ceci est un script php
    i vaut 1
        

    Note

    En mode interactif, il n'est pas forcément nécessaire d'introduire le script par <?php, cette commande peut parfois ne pas être reconnue par l'interpréteur et peut génèrer une erreur. Pour PHP, lorsqu'on lance l'interpréteur en cli, il est normal de ne pas avoir besoin de lui préciser qu'on vas faire du PHP, puisqu'on es déjà dans l'interpréteur php :)

    Rendons le script exécutable directement :

    
## Ajouter simplement la ligne suivante au début du programme 
    ## pour indique directement dans le script l’interpréteur à utiliser :
    
    #!/usr/bin/php   
    
    ## Rendre le script executable
    $ chmod u+x test.php
    
    ## Lancer le script
    $ ./test.php
    Ceci est un script php
    i vaut 1
        


    10.1.6.3. Interrogation d'une base de données

    Un script minimaliste bibliotheque.php permet de se connecter à la base de données bibliotheque que nous avez créée précédemment et y faire une requête. La connexion à la base de données se fera avec l’utilisateur mysqlUser. Il est supposé que la base de données bibliotheque est créée et que l’utilisateur peut effectivement se connecter à cette base de données.

    
$ chmod u+x bibliotheque.php 
    $ ./bibliotheque.php 
    connexion réussie !
    la sélection de la base a réussi !
    
    résultat :
    ========
    
    Une brève histoire du temps
    Stephen Hawking
    1995
    
    MySQL 5
    Cyril Thibaud
    2006
    
    On a perdu la moitié de l'Univers
    Jean-Pierre Petit
    2001
        

    Note

    Si une erreur du type suivant avait été obtenu :

    
Fatal error: Call to undefined function mysql_pconnect() in /home/grossard/bibliotheque.php on line
          
    Il aurait fallut vérifiez que la ligne suivante soit décommentée dans le fichier /etc/php5/cli/php.ini :
    
extension=mysql.so    ## Module PHP de connection à la base de données MySQL
          


    10.1.6.4. Test avec le serveur HTTP (Apache)

    L’objectif est ici de vérifier que Apache est capable d’interpréter correctement un script php : test.php

    On copie le fichier à la racine des documents du serveur Apache /var/www, on ouvre un navigateur et on saisiel’URL :

    
http ://localhost/test.php
        

    Note

    La page ne s’affiche pas correctement, le navigateur propose simplement de la télécharger ! Apache doit être configurer pour interprèter les script PHP.

    Configurer Apache :

     
    Modifier le fichier de configuration de Apache afin de l’informer :
    1. qu’il doit utiliser la bilbiothèque de php5,
    2. qu’il doit considérer les fichiers portant 
        les extensions php, php3 ou php4 (ou ce que vous voulez)
        comme des scripts php,
    3. qu’il doit automatiquement interpréter index.php s’il existe.
        
    Les modifications n'ont pas été effectuées automatiquement lors de l’installation de PHP. Vérifiez tout de même la présence des lignes suivantes dans les fichier de configuration d’Apache.
    
$ ls /etc/apache2/mods-enabled/                            ## Le fichier existe
    ...  php5.load	...
    
    $ cat /etc/apache2/mods-enabled/php5.load                  ## Contenu OK
    LoadModule php5_module /usr/lib/apache2/modules/libphp5.so ## Indique à Apache où trouver 
                                                                ## la bibliothèque de fonctions php.
    
    $ ls -l /usr/lib/apache2/modules/libphp5.so                ## Bibliothèque bien présente
    -rw-r--r-- 1 root root 5450680 nov 22 02:49 /usr/lib/apache2/modules/libphp5.so
        
    
$ ls -l /etc/apache2/mods-available/php5.conf
    -rw-r--r-- 1 root root 133 nov 22 02:48 /etc/apache2/mods-available/php5.conf
    
    $ cat /etc/apache2/mods-available/php5.conf
    <IfModule mod_php5.c>
      AddType application/x-httpd-php .php .phtml .php3  ## indique à Apache que les fichiers avec les extensions 
      AddType application/x-httpd-php-source .phps       ## .php .phtml et .php3 sont à interpréter 
    </IfModule>                                    ## comme des scripts php
        

    La configuration est correcte ! Essayons de re-démarrer le serveur pour qu'il reprenne en compte cet configuration :

    
$ /etc/init.d/apache2 restart
    Restarting web server: apache2 ... waiting .
    
    ## Testons à nouvau dans le navigateur...
    http ://localhost/test.php    
        

    Note

    Cette fois ça marche, la page s'affiche correctement, le script test.php est correctement interprèté. Si on le renome en index.php, le serveur Apache le prends en compte directement.

    Figure 10-1. Script PHP avec Apache


    10.1.6.5. Accéder à la documentation


    10.1.6.6. Fichier de Configuration - php.ini

    Toutes les options de configuration de php sont regroupées dans un fichier unique nommé php.ini se trouvant dans les dossiers :

    
$ find / -name 'php.ini' -print
    /etc/php5/apache2/php.ini        ## Utilisé par le serveur web Apache
    /etc/php5/cli/php.ini            ## Utilisé par la librairie CLI (ligne de commande - Interface interactive)
        

    On peut y configurer des choses comme les balises à prendre en compte, la gestion de la sécurité ou encore les ressources du système allouées à php. Ce fichier est également lu par Apache à chaque démarrage du serveur web ou par utilisé par la librairie CLI (php en ligne de commande - Interface interactive).

    Dans un premier temps, laissons les fichiers d’origine avec les options par défaut : /etc/php5/apache2/php.ini & /etc/php5/cli/php.ini

    La différence entre les deux fichiers est minime :

    
$ diff /etc/php5/apache2/php.ini /etc/php5/cli/php.ini 
    270c270
    < memory_limit = 128M      ; Maximum amount of memory a script may consume (128MB)
    ---
    > memory_limit = 32M      ; Maximum amount of memory a script may consume (32MB)
        

    Quelques options de configuration intéressantes :

    
Option                        Description
    doc_root répertoire           Nom du répertoire racine de php. Quand l’option safe_mode
                                  est activée, seuls les scripts php accessibles sont ceux situés sous
                                  ce répertoire
    open_basedir répertoire       liste des répertoires accessibles aux fonctions d’accès aux fichiers
                                  de php. « . » indique que seuls les fichiers du répertoire courant
                                  peuvent être ouverts
    include_path répertoire       liste des répertoires dans lesquels chercher les fichiers appelés
                                  par les fonctions include et require. Ceci permet de créer des
                                  bibliothèques de fonctions communes à plusieurs sites
    magic_quotes_gpc on|off       Si cette option est activée, les apostrophes, \ et NULL sont au-
                                  tomatiquement précédés d’un \ pour les variables GET, POST et
                                  les cookies
    magic_quotes_runtime on|off   Si cette option est activée, les apostrophes, \ et NULL sont auto-
                                  matiquement précédés d’un \ pour les chaînes provenant d’une
                                  base de données ou d’un fichier
    max_execution_time secondes   Temps maximal d’exécution d’un script
    memory_limit octets           mémoire maximale allouée à un script
    track_vars on|off             Si cette option est activée, les tableaux asso-
                                  ciatifs HTTP_GET_VARS, HTTP_POST_VARS et
                                  HTTP_COOKIE_VARS sont créés au début de chaque script
    file_uploads on|off           Si cette option est activée, le client peut envoyer des fichiers
                                  sur le serveur
    upload_tmp_dir répertoire     répertoire dans lequel sont stockés les fichiers envoyés par le
                                  client (/tmp par défaut sous Linux)
    upload_max_filesize taille    taille maximale des fichiers envoyés par le client
    safe_mode on|off              Si cette option est activée, php est exécuté en mode sécurisé. Dans
                                  ce cas, seuls les scripts situés sous doc_root peuvent être exécutés
    safe_mode_exec_dir répertoire si l’option safe_mode est activée, seuls les programmes situés 
                                  dans ce répertoire pourront être exécutés avec la fonction system
        


    10.1.6.7. Afficher configuration courante : phpinfo()

     

    La fonction phpinfo() permet d'afficher de nombreuses informations sur PHP, concernant sa configuration courante : options de compilation, extensions, version, informations sur le serveur, et l'environnement (lorsqu'il est compilé comme module), environnement PHP, informations sur le système, chemins, valeurs générales et locales de configuration, en-têtes HTTP et la licence PHP.

    Comme tous les systèmes sont configurés différemment, phpinfo() sert généralement à vérifier la configuration ainsi que les variables prédéfinies, pour une plate-forme donnée.

    phpinfo() est un bon outil de débogage, car il affiche le contenu de toutes les variables EGPCS (Environnement, GET, POST, Cookie, Serveur).

     
    -- http://uk3.php.net/manual/fr/function.phpinfo.php  

    Créons un fichier info.php contenant le code suivant, et plaçons le dans repertoire /var/www/ :

    
$ cat > /var/www/info.php <<EOF
    > <?php
    > phpinfo();
    > ?>
    > EOF
        
    Puis ouvrons le navigateur à :
    
http://localhost/info.php
        

    Figure 10-2. Script PHPinfo() avec Apache

    Cé ti pa bo ça !!!


    10.1.6.8. Règle d'OR: Vérifier l'installation de PHP avec le système

    Note

    Ne jamais faire confiance aux scripts de démarrage et à ce qu'ils renvoient à l'écran !!! Toujours vérifier l'installation avec le système.

    S’assurer que PHP est bien actif et opérationnel.

    Le langage doit être installé, éventuellement avec ses bibliothèques. Comment vérifier qu’il est bien présent (on ne parle pas encore des bibliothèques).

    Il y a plusieurs façons de faire :

    
## Liste des paquets php qui sont installés
    $ dpkg -l '*' | grep php | grep ^ii
    ii  libapache2-mod-php5   5.2.6.dfsg.1-1+lenny4    server-side, HTML-embedded scripting languag
    ii  php5                  5.2.6.dfsg.1-1+lenny4    server-side, HTML-embedded scripting languag
    ii  php5-cli              5.2.6.dfsg.1-1+lenny4    command-line interpreter for the php5 script
    ii  php5-common           5.2.6.dfsg.1-1+lenny4    Common files for packages built from the php
    ii  php5-mysql            5.2.6.dfsg.1-1+lenny4    MySQL module for php5
    
    ## Emplacement de l’interpréteur (vue du système donnée par la variable $PATH)
    $ which php5 | xargs ls -al
    -rwxr-xr-x 1 root root 5318592 nov 22 02:49 /usr/bin/php5
    
    ## Version installée
    $ php -v
    PHP 5.2.6-1+lenny4 with Suhosin-Patch 0.9.6.2 (cli) (built: Nov 22 2009 02:38:03) 
    Copyright (c) 1997-2008 The PHP Group
    Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
    
    ## Vérifions que l’interpréteur fonctionne avec un script
    $ cat > test.php <<EOF
    > <?php
    > echo 'coucou';
    > ?>
    > EOF
    $ php test.php 
    coucou
        

    Là plus de soucis, ça fonctionne :))


    10.1.7. phpMyAdmin - Installation et configuration

    Source(s):

     

    phpMyAdmin (PMA) est une interface de gestion pour système de gestion de base de données MySQL réalisée en PHP et distribuée sous licence GNU GPL.

     
    -- http://fr.wikipedia.org/wiki/PhpMyAdmin  

    10.1.7.1. Installation de base

    J'aurais pu télécharger et installer la dernière version disponible de phpMyAdmin mais dans le cadre d'une première découverte je me contenterais du paquet Debian avec la configuration par défaut. Ce sera gage d'une meilleure stabilité dans un premier temps.

    L’installation de phpMyAdmin est immédiate :

    
$ apt-get install phpmyadmin
    Lecture des listes de paquets... Fait
    Construction de l'arbre des dépendances       
    Lecture des informations d'état... Fait
    Les paquets supplémentaires suivants seront installés : 
      libgd2-xpm libmcrypt4 libt1-5 php5-gd php5-mcrypt
    Paquets suggérés :
      libgd-tools libmcrypt-dev mcrypt
    Les paquets suivants seront ENLEVÉS :
      libgd2-noxpm
    Les NOUVEAUX paquets suivants seront installés :
      libgd2-xpm libmcrypt4 libt1-5 php5-gd php5-mcrypt phpmyadmin
    0 mis à jour, 6 nouvellement installés, 1 à enlever et 2 non mis à jour.
    Il est nécessaire de prendre 3384ko dans les archives.
    Après cette opération, 11,3Mo d'espace disque supplémentaires seront utilisés.
    ...
    Paramétrage de phpmyadmin (4:2.11.8.1-5+lenny3) ...
    Reloading web server config: apache2.
        
    Durant l'installation, l'écran suivant est apparu et a été renseigné comme suit :

    Figure 10-3. phpMyAdmin Install Prompt

    À l’issue de l’installation, tous les scripts de phpMyAdmin (et autres fichiers) sont placés dans le répertoire /usr/share/phpmyadmin et il y a normalement un lien symbolique dans /var/www qui pointe sur le répertoire d’installation :

    
$ ls /usr/share/phpmyadmin/
    browse_foreigners.php  license.php	       server_sql.php
    calendar.php	       main.php		       server_status.php
    changelog.php	       navigation.php	       server_variables.php
    ...
    config.header.inc.php  phpinfo.php	       tbl_addfield.php
    config.inc.php	       phpmyadmin.css.php      tbl_alter.php
    ...
    db_sql.php	       print.css	       tbl_replace.php
    db_structure.php       querywindow.php	       tbl_row_action.php
    docs.css	       readme.php	       tbl_select.php
    Documentation.html     scripts		       tbl_sql.php
    error.php	       server_binlog.php       tbl_structure.php
    ...
    lang		       server_privileges.php   user_password.php
    libraries	       server_processlist.php  view_create.php
    
    $ ls -l /var/www/
    drwxr-xr-x 2 root root 4096 déc 25 01:12 htdig
    -rw-r--r-- 1 root root  117 jan  2 17:47 index.php
    -rw-r--r-- 1 root root   20 jan  3 15:18 info.php
        

    Note

    Pour une raison que j'ignore il n'y a pas de lien symbolique dans /var/www/ mais cela ne semble pas utile.

    Vérifions que cela fonctionne, naviguons à :

    
http://localhost/phpmyamdin  ## Il faut évidemment au préalable lancer les serveurs Apache et MySQL.
        

    Figure 10-4. phpMyAdmin - Page d'accueil


    10.1.7.3. Configuration de phpMyAdmin

    Source(s):

    Il y a les fichiers de configuration dans /etc/phpmyadmin c’est là que l'on peut modifier les paramètres :

    
## Fichiers utilisés sur Debian
    $ ls -l /etc/phpmyadmin/
    -rw-r--r-- 1 root root      983 oct 24 12:34 apache.conf            ## Ce fichier est copier à /etc/apache2/conf.d/phpmyadmin.conf 
    -rw-r--r-- 1 root root      168 oct 24 12:34 config.footer.inc.php  ## Pied de page
    -rw-r--r-- 1 root root      168 oct 24 12:34 config.header.inc.php  ## En-tête de page
    -rw-r--r-- 1 root root     1936 oct 24 12:34 config.inc.php         ## Configuration principal
    -rw-r----- 1 root www-data    8 jan  3 18:24 htpasswd.setup
    -rw-r--r-- 1 root root      500 oct 24 12:34 lighttpd.conf
    
    ## Fichiers non utilisés sur Débian
    $ ls -l /usr/share/phpmyadmin/conf*
    -rw-r--r-- 1 root root  181 oct 24 12:34 /usr/share/phpmyadmin/config.footer.inc.php
    -rw-r--r-- 1 root root  181 oct 24 12:34 /usr/share/phpmyadmin/config.header.inc.php
    -rw-r--r-- 1 root root 1263 oct 24 12:34 /usr/share/phpmyadmin/config.inc.php
    -rw-r--r-- 1 root root 1751 jui 28  2008 /usr/share/phpmyadmin/config.sample.inc.php
    
    $ diff /etc/apache2/conf.d/phpmyadmin.conf /etc/phpmyadmin/apache.conf
    ## Aucune différence. Le premier est celui effectivement utilisé par Apache... 
       

    Presque toutes les données de configuration sont placées dans config.inc.php.

    Note

    Attention, il y a un fichier dans /etc/phpmyadmin et un autre dans /usr/share/phpmyadmin qui fait les inclusions de fichiers (de /etc/phpmyadmin et autres...) et configure des valeurs par défaut si besoin.

    Sur Debian, le fichier de configuration est maintenu dans /etc/phpmyadmin et peut-être different à certains égard de la documentation phpMyAdmin (source: Distribution Debian spécifique).

    Les paramètres relatifs à la conception (comme les couleurs), se trouvent dans themes/themename/layout.inc.php.

    Il est possible également de modifier les fichiers config.footer.inc.php et config.header.inc.php pour ajouter du code spécifique à inclure en en-tête et en pied de chaque page.

    Quelques options interressantes :

    
$cfg['blowfish_secret'] chaîne
        Le mode d'authentification par « cookie » utilise l'algorithme blowfish 
        pour chiffrer le mot de passe.
        
    $cfg['Servers'] tableau
        Contient les informations de connexions pour les différents serveurs. 
        Le premier $cfg['Servers'][$i]['host'] contient le nom d'hôte du premier serveur, 
        le second $cfg['Servers'][$i]['host'] le nom d'hôte du second serveur, etc.
    
    $cfg['Servers'][$i]['host'] chaîne
        Le nom d'hôte ou l'adresse IP de votre $i-ème serveur MySQL. C'est-à-dire localhost.
    
    $cfg['Servers'][$i]['port'] chaîne
        Le numéro de port de votre $i-ème serveur MySQL. 
        Par défaut : 3306 (laissez à blanc pour utiliser la valeur par défaut).
    
    $cfg['Servers'][$i]['socket'] chaîne
        Le chemin d'accès vers le socket à utiliser. 
        Laissez à blanc pour utiliser la valeur par défaut.
        
    $cfg['Servers'][$i]['ssl'] booléen
        Pour activer ou pas une connexion SSL vers le serveur MySQL. 
    
    $cfg['Servers'][$i]['connect_type'] chaîne
        Quel type de connexion utiliser avec le serveur MySQL. Vos choix sont 'socket' et 'tcp'. 
        Par défaut, c'est 'tcp'...
        
    $cfg['Servers'][$i]['extension'] chaîne
        Définit l'extension php MySQL utilisée pour la connexion. Les options autorisées sont :
    
        mysql  : L'extension MySQL classique. 
                 C'est l'option recommandée et par défaut à ce jour.
        mysqli : L'extension MySQL améliorée. Cette extension devient disponible avec php 
                 version 5.0.0, et recommandée pour se connecter sur un serveur exécutant 
                 MySQL version 4.1.x ou suivantes.
    
    $cfg['Servers'][$i]['compress'] booléen
        Pour utiliser ou non un protocole compressé pour la connexion au serveur MySQL (expérimental).
        Cette fonctionnalité requiert PHP version 4.3.0 ou ultérieure.
    
    $cfg['Servers'][$i]['auth_type'] chaîne ['HTTP'|'http'|'cookie'|'config'|'signon']
        Définit le mode d'authentification config, cookie, signon ou HTTP qui sera utilisé sur le serveur.
        ...
        Veuillez consulter la section Installation sur « Utiliser les modes d'authentification » 
        pour plus de renseignements. 
    
    $cfg['Servers'][$i]['user'] chaîne
    $cfg['Servers'][$i]['password'] chaîne
        En utilisant auth_type = 'config', c'est la paire utilisateur/mot de passe qu'utilisera 
        phpMyAdmin pour se connecter au serveur MySQL. Cette paire  utilisateur/mot de passe 
        n'est pas nécessaire quand les modes d'authentification HTTP ou cookie sont utilisés, 
        et doit rester vide.
    
    $cfg['Servers'][$i]['only_db'] chaîne ou tableau
        S'il est indiqué un nom de base de données (ou un tableau de noms de bases de données) , 
        seule(s) cette (ces) base(s) sera (seront) affichée(s) à l'utilisateur. 
        
    $cfg['Servers'][$i]['pdf_pages'] chaîne
        Depuis la version 2.3.0, phpMyAdmin peut créer des pages PDF montrant les relations 
        entre vos tables. Pour ce faire, il a besoin de deux tables « pdf_pages » 
        (qui stocke les informations sur les pages PDF disponibles) et « table_coords » 
        (qui stocke les coordonnées où chaque table sera placée sur le schéma PDF réalisé).
    
        ... Astuce d'utilisation : Réalisation de PDF. 
    
    $cfg['Servers'][$i]['AllowRoot'] booléen
        Autoriser ou non un accès à la racine. Il s'agit seulement d'un raccourci 
        pour les règles AllowDeny ci-dessous. 
    
    $cfg['Servers'][$i]['AllowNoPassword'] booléen
        Permet d'autoriser les connexions sans mot de passe. La valeur par défaut est false...
    
    $cfg['Servers'][$i]['AllowDeny']['order'] chaîne
        Si votre règle « order » est vide, alors l'authentification IP est désactivée.
    
        Si votre règle « order » est définie à 'deny,allow' alors le système applique toutes les 
        règles « deny » puis les règles « allow ». L'accès est autorisé par défaut...
    
    $cfg['Servers'][$i]['SignonURL'] chaîne
        URL où sera redirigé l'utilisateur pour se connecter avec le mode 
        d'authentification 'signon'. Doit être absolue et inclure le protocole. 
    
    $cfg['Servers'][$i]['LogoutURL'] chaîne
        URL où sera redirigé l'utilisateur après la déconnexion 
        (ceci n'affecte pas la mode d'authentification 'config'). 
        Doit être absolue et inclure le protocole. 
    
    $cfg['ServerDefault'] entier
        Si vous avez plus d'un serveur, vous pouvez définir $cfg['ServerDefault'] 
        sur n'importe lequel d'entre eux pour s'auto-connecter sur celui-ci 
        quand phpMyAdmin est démarré, ou le définir à 0 sur tous les serveurs pour
        avoir une liste de serveurs auxquels se connecter.
        Si vous n'avez qu'un seul serveur, $cfg['ServerDefault'] DOIT être défini sur ce serveur.
    
    $cfg['PersistentConnections'] booléen
        Définit si les connexions persistantes doivent être utilisées (mysql_connect ou mysql_pconnect).
    
    $cfg['ForceSSL'] booléen
        Pour forcer ou pas l'utilisation de https lors de l'accès à phpMyAdmin.
    
    $cfg['ExecTimeLimit'] entier ['nombre de secondes']
        Définit le nombre de secondes allouées à un script pour s'exécuter. 
        Si le nombre de secondes est défini à zéro, aucune limite de temps n'est imposée.
    
    $cfg['MemoryLimit'] entier ['nombre d'octets']
        Définit le nombre d'octets qu'un script est autorisé à allouer. 
        Si ce nombre est défini à zéro, aucune limite n'est imposée.
        
    $cfg['ShowSQL'] booléen
        Définit si les requêtes SQL générées par phpMyAdmin doivent être affichées.
    
    $cfg['ShowPhpInfo'] booléen
    $cfg['ShowChgPassword'] booléen
    $cfg['ShowCreateDb'] booléen
        Définit si on affiche les liens « Afficher les informations relatives à PHP » et 
        « Modifier le mot de passe » ou le formulaire de crétion de base de données 
        dans le cadre principal (de droite) de démarrage. 
        ...
        
    $cfg['MaxRows'] entier
        Nombre de colonnes affichées lors de la navigation sur un ensemble de résultats. 
        Si le nombre des colonnes est supérieur, des liens « Suivant » et « Précédent » seront affichés.
    
    $cfg['ZipDump'] booléen
    $cfg['GZipDump'] booléen
    $cfg['BZipDump'] booléen
        Définit si on utilise la compression zip/GZip/BZip2 lors de la création de fichiers d'exportation.
    
    $cfg['CompressOnFly'] booléen
        Définit si on autorise la compression à la volée pour des exportations au formats GZip/BZip2. 
    
    $cfg['DefaultLang'] chaîne
        Définit la langue par défaut à utiliser, si ce n'est pas le cas, 
        la configuration du navigateur ou celle de l'utilisateur sera utilisée.
        Voir le script select_lang.lib.php pour connaître les valeurs autorisées pour ce paramètre.
        
    $cfg['Lang'] chaîne
        Force : toujours utiliser cette langue (doit être défini dans le script select_lang.lib.php).
    
    $cfg['FilterLanguages'] chaîne
        Limite la liste des langues disponibles à celle concordant à une expression régulière donnée.
        Par exemple, si vous ne voulez que le tchèque et l'anglais, 
        vous devrez définir le filtre suivant : '^(cs|en)'.
    
    $cfg['TrustedProxies'] tableau
        Liste les proxies et les en-têtes HTTP qui sont sûrs pour IP Allow/Deny. 
        Cette liste est vide par défaut. 
        
    $cfg['SaveDir'] chaîne
        Le nom du répertoire où les fichiers d'exportation peuvent être sauvegardés.
        Si vous voulez un répertoire différent pour chaque utilisateur, 
        %u sera remplacé par le nom d'utilisateur...
    
    $cfg['TempDir'] chaîne
        Le nom du répertoire où les fichiers temporaires peuvent être stockés...
    
    $cfg['Export'] tableau
        Dans ce tableau sont définis les paramètres par défaut pour les fichiers d'exportation; 
    
    $cfg['Import'] tableau
        Dans ce tableau sont définis les paramètres par défaut pour l'importation.  
    ...
       


    10.1.7.4. Modes d’authentification

    Il existe trois modes d’authentification dans phpMyAdmin :

    
- par HTTP
    - par cookie (par défaut) 
    - à partir du fichier de configuration
       

    Note

    Quelle que soit la méthode d’authentification utilisée, gardons à l’esprit que le mot de passe transite en clair, à moins d’utiliser le protocole HTTPS. Pour ma part je choisis de conserver la méthode par défaut pour le moment.


    10.1.7.4.1. Par HTTP

    Avec ce mode d’authentification, lors de la connexion à phpMyAdmin, le serveur Apache propose une boîte d’authentification dans laquelle il demande le nom d’utilisateur et le mot de passe. Il doit s’agir d’un compte MySQL valable. Si c’est le cas, une session est ouverte.

    Pour ce mode d’authentification, phpMyAdmin a besoin d’un utilisateur de contrôle - « pma » - ayant seulement le privilège SELECT sur les tables mysql.user. Sur Debian, lors de l’installation de phpMyAdmin, cet utlisateur est automatiquement créé dans MySQL et ses droits correctements positionnés. Si aucun compte n'a encore été créé, le comte root du serveur de base de données peut être utilisé.

    Pour activer ce mode d’authentification, assurez-vous que la ligne suivante est présente dans le fichier config.inc.php :

    
$cfg[’Servers’][$i][’auth_type’] = ’http’;
        


    10.1.7.4.2. Par cookie (mode par défaut)

    Bien sûr, avec cette méthode d’authentification, l’utilisateur doit activer les cookies dans son navigateur.

    Avec ce mode, l’utilisateur peut réellement se déconnecter de phpMyAdmin et se reconnecter avec le même nom d’utilisateur.

    La méthode d’authentification par cookie utilise l’algorithme blowfish pour chiffrer le mot de passe. Voici la ligne correspondante dans le fichier de configuration /var/lib/phpmyadmin/blowfish_secret.inc.php :

    
$cfg[’blowfish_secret’] = ’mettez ici la phrase de votre choix’;  ## Fait ;-)
        

    Note

    Il y a un fichier de créé par défaut dans /etc/phpmyadmin qui est inclus (directive include) dans /usr/share/phpmyadmin/

    J'y est rentré la phrase de mon choix. Elle sera utilisée de manière interne par l’algorithme blowfish : cette phrase mot de passe ne m'est plus demandée. Le nombre maximum de caractères pour ce paramètre semble être 46.

    La méthode d’authentification sur « cookie » peut également être paramétrer dans le fichier de configuration config.inc.php :

    
$cfg[’Servers’][$i][’auth_type’] = ’cookie’;
        


    10.1.7.4.3. Par fichier de configuration (le moins sécurisé)

    Ce mode est le moins sécurisé car il requiert de remplir les champs $cfg[’Servers’][$i][’user’] et $cfg[’Servers’][$i][’password’] dans le fichier de configuration. Mais vous n’avez pas besoin de définir un utilisateur de contrôle - « pma », ici l’utilisation de $cfg[’Servers’][$i][’only_db’] s’avère suffisante.

    Il est recommendé de ne pas d’utiliser cette méthode d’authentification, d’autant plus que l’utilisateur de contrôle « pma » est déjà créé sur mon système.


    10.1.7.4.4. Test de connection

    Figure 10-5. phpMyAdmin - Connection Root

    Figure 10-6. phpMyAdmin - Connection Utilisateur


    10.1.7.5. Conseils pour sécuriser phpMyAdmin

    Si vous utilisez un serveur qui ne peut pas être accédé par d’autres personnes, il est suffisant d’utiliser la protection de répertoire fournie avec votre serveur web (avec Apache vous pouvez utiliser les fichiers .htaccess, par exemple).

    Si d’autres personnes ont un accès telnet à votre serveur, vous devriez utiliser la fonctionnalité d’authentification HTTP de phpMyAdmin.

    Suggestions :

    
– Votre fichier config.inc.php devrait être chmod 660.
    – Tous les fichiers phpMyAdmin devraient être chown -R phpmy :apache, où phpmy est un utilisateur
        dont le mot de passe est connu de vous seul, et apache (en général www-data sur les distribution basées
        sur Debian) est le groupe avec lequel Apache est exécuté.
    – Vous devriez utiliser le mode sécurisé de PHP, pour vous protéger des autres utilisateurs qui pourraient
        inclure votre fichier config.inc.php dans leurs scripts.
        


    10.1.7.6. phpMyAdmin, apprenons à nous en passer !

    Le mode interactif "mysql>" n'est pas si terrible à prendre en main ; il faut être bien au fait des commandes et syntaxe SQL, ce qui demande un certain apprentissage que phpMyAdmin peut aider à acquérir.

    MySQLnavigator est un autre outil en interfaces graphiques qui semble plus léger à utiliser que phpMyAdmin, il ne nécessite pas de browser web.

    Dans le cadre de la formation CP2LL, on nous demande d'installer phpMyAdmin, mais par la suite, il faudra qu'on sache faire sans (interfaces graphiques), cela nous rendra d'autant plus performant...

    En matière d'administation de serveur on a rarement les machines sous la main et quasiment jamais d'interface graphique.


    10.1.7.7. Didacticiel

    En suivant le didacticiel contenu dans le poly ÉOF...les requêtes ci-dessous s'affichent...

    
## Root execute :
    # requête SQL 1:
    CREATE DATABASE `videotheque` ;
    
    # requête SQL 2:
    CREATE USER 'michel'@'localhost' IDENTIFIED BY '******';
    
    GRANT USAGE ON * . * TO 'michel'@'localhost' IDENTIFIED BY '******' WITH 
    MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
    
    # requête SQL 3:
    GRANT SELECT , INSERT , UPDATE , DELETE , CREATE , DROP , INDEX , 
    ALTER , CREATE TEMPORARY TABLES , CREATE VIEW , SHOW VIEW , CREATE ROUTINE, 
    ALTER ROUTINE, EXECUTE ON `videotheque` . * TO 'michel'@'localhost';
       

    Figure 10-7. phpMyAdmin - Connection Michel

    
## Michel execute :
    # requête SQL 4:
    CREATE TABLE `videotheque`.`dvd` (
    `idDvd` INT( 3 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `titre` VARCHAR( 128 ) NOT NULL ,
    `realisateur` VARCHAR( 128 ) NOT NULL ,
    `annee` YEAR( 4 ) NOT NULL
    ) ENGINE = MYISAM 
    
    # requête SQL 5:
    INSERT INTO `videotheque`.`dvd` (
    `idDvd` ,
    `titre` ,
    `realisateur` ,
    `annee`
    )
    VALUES (
    NULL , 'Harry Potter le Prince de sang mêlé', 'David Yates', '2009'
    ), (
    NULL , 'Là-haut', 'Pete Docter', '2009'
    );
        

    Figure 10-8. phpMyAdmin - Table DVD (Resultant du Didacticiel)


    10.1.8. Atelier - Installation d’une application (Promethée) téléchargée à partir d’un zip ou d’un tar.gz

    Source(s):

    Installation de l'application « Promethée » http ://promethee.eu.org/ qui est un logiciel visant à fournir un intranet pédagogique et administratif « clef en main » aux établissements de l’enseignement public.


    10.1.8.1. Télécharger les sources de l'application et la documentation

    
## Télécharger la dernière version francaise disponible...
    $ mkdir /mnt/hsubuntu/promethee
    $ cd /mnt/hsubuntu/promethee/
    $ wget http://promethee.eu.org/demo/download/source/promethee.zip
    
    ## Télécharger la documentation
    $ wget http://promethee.eu.org/index.php?file=download/ftp/docs/documentation francaise/Debian.pdf
    $ wget http://promethee.eu.org/index.php?file=download/ftp/docs/documentation francaise/Installation Debian.pdf
    $ wget http://promethee.eu.org/index.php?file=download/ftp/docs/documentation francaise/Guide installation.pdf
    $ wget http://promethee.eu.org/index.php?file=download/ftp/docs/documentation francaise/Guide administrateur.pdf
    $ wget http://promethee.eu.org/index.php?file=download/ftp/docs/documentation francaise/Guide enseignant.pdf
    $ wget http://promethee.eu.org/index.php?file=download/ftp/docs/documentation francaise/Guide utilisateur.pdf
    $ wget http://promethee.eu.org/index.php?file=download/ftp/docs/documentation francaise/eof.pdf
    $ wget http://promethee.eu.org/index.php?file=download/ftp/docs/documentation francaise/plaquette.pdf
    
    ## Autres Documents collaboratifs dipsonible :
    http://promethee.eu.org/index.php?item=34&IDgroup=0&IDroot=5
       


    10.1.8.2. Installation de base

    Pour installer PROMETHEE sur ma machine, il faut au préalable vérifier que mon système d'exploitation donne accès :

    
- à un serveur de pages internet (ex : Apache – www.apache.org)
    - au langage de programmation PHP4 ou supérieur (www.php.org)
    - au système de base de données MySQL (www.mysql.com)
        
    Suite aux différentes étapes décritent dans les sections précédente de mon journal, je peux dire que c'est déjà le cas :) L'infrastructure LAMP existe et est entièrement opérationnel.

    Je souhaite que l'application soit disponible via http://localhost/promethee et que les fichiers de l'application Web soit dans le repertoire /var/www/promethee

    La première étape est de créer le repertoire où sera localisé l'application :

    
$ mkdir /var/www/promothee
        
    Il ne doit être accessible que par l'application elle même (le serveur web), donc on change les droits...
    
$ chown -R www-data:www-data /var/www/promothee
    # ls -l /var/www/
    ...
    drwxr-xr-x 2 www-data www-data 4096 jan  4 00:31 promethee
        

    La deuxième étape est donc de configurer le serveur Web Apache pour que cela soit le cas :))

    Je crée le fichier /etc/apache2/conf.d/promethee.conf qui contient :

    
# phpMyAdmin default Apache configuration
    
    Alias "/promethee" "/var/www/promethee/"
    <Directory "/var/www/promethee/">
          Options Indexes FollowSymLinks Includes
          AllowOverride All
          #Order allow,deny
          Allow from all
    </Directory>
        

    Puis je redémarre Apache pour prendre en compte la configuration :

    
$ /etc/init.d/apache2 restart
        
    Le serveur a bien redémarré, je vérifie les logs /var/log/apache2/error.log pour être sûr... mais rien de particulier à signaler...

    Soyons fou, je copie /var/www/test.php et /var/www/info.php (mes deux scripts de tests créés dans les sections précédente lors de l'installation de l'infrastructure LAMP) et je tente une tentative de connection :

    
http://localhost/promethee/         ## Affiche index.php
    http://localhost/promethee/info.php ## Affiche info sur PHP
        
    Ourah ! Ça marche impecable :))

    Cette application peut apparement fonctionner sans base de données mais comme conseillé, il est préférable d'en utiliser une pour améliorer la gestion. Nous utiliserons MySQL.

    Je vais donc créer une base "epl" et un utilisateur "epl-admin" dédié pour la gestion de cette base. Il aura tous les droits sur cette base et pourra donner des droits à d'autres. Ceci permettrais ou permettra de déléguer la gestion de la base au besoin sans donner accès au compte root ou à d'autres bases.

    A l'aide de phpMyAdmin connecté en tant que root :

    
# requête SQL 1:
    CREATE DATABASE `epl` ;
    
    # requête SQL:
    CREATE USER 'epl-admin'@'localhost' IDENTIFIED BY '*********';
    
    GRANT USAGE ON * . * TO 'epl-admin'@'localhost' IDENTIFIED BY '*********'
    WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 
    MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
    
    # requête SQL:
    CREATE USER 'epl-admin'@'localhost' IDENTIFIED BY '*********';
    
    GRANT USAGE ON * . * TO 'epl-admin'@'localhost' IDENTIFIED BY '*********' 
    WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 
    MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
        
    On vérifie la connection à la base de donnée :
    
$ mysql -u epl-admin -p epl
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 115
    Server version: 5.0.51a-24+lenny2 (Debian)
    
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    
    mysql> status
    --------------
    mysql  Ver 14.12 Distrib 5.0.51a, for debian-linux-gnu (i486) using readline 5.2
    
    Connection id:		115
    Current database:	epl
    Current user:		epl-admin@localhost
    SSL:			Not in use
    Current pager:		stdout
    Using outfile:		''
    Using delimiter:	;
    Server version:		5.0.51a-24+lenny2 (Debian)
    Protocol version:	10
    Connection:		Localhost via UNIX socket
    Server characterset:	latin1
    Db     characterset:	latin1
    Client characterset:	latin1
    Conn.  characterset:	latin1
    UNIX socket:		/var/run/mysqld/mysqld.sock
    Uptime:			10 hours 48 min 40 sec
    
    Threads: 1  Questions: 1578  Slow queries: 0  Opens: 26  Flush tables: 1  Open tables: 19  Queries per second avg: 0.041
    --------------
    
    mysql> 
        
    Connection OK !

    Maintenant il nous faut dézipper l'application téléchargé et copier le contenu dans le repertoire Web :

    
$ unzip /mnt/hsubuntu/05-SR009-Interfacer-Apache-avec-un-langage-de-script-et-
    un-serveur-de-base-de-données/promethee/promethee.zip -d /var/www/promethee/
        

    Afin que les utilisateurs de promethee puissent disposer des sources PROMETHEE, on copie l'archive ZIP dans le répertoire download/source.

    
$ cp /mnt/hsubuntu/05-SR009-Interfacer-Apache-avec-un-langage-de-script-et-
    un-serveur-de-base-de-données/promethee/promethee.zip /var/www/promethee/download/source/
        

    En fait il faut que le propriétaire et le groupe soient bien Apache (www-data) et les droits Unix soient positionnés à rwxr-xr-x pour les fichiers et les sous répertoires, comme indiqué dans la doc :

    
$ chown -R www-data:www-data /var/www/promethee/
    $ ls -l /var/www/promethee/
    -rw-r--r--  1 www-data www-data  4815 nov 10 21:22 absent_flash.php
    -rw-r--r--  1 www-data www-data 12551 oct  8 15:14 absent_gestion.htm
    ...
    
    $ chmod -R 755 /var/www/promethee/*
    $ ls -l /var/www/promethee/
    total 4592
    -rwxr-xr-x  1 www-data www-data  4815 nov 10 21:22 absent_flash.php
    -rwxr-xr-x  1 www-data www-data 12551 oct  8 15:14 absent_gestion.htm
    -rwxr-xr-x  1 www-data www-data  1789 sep 16 19:06 absent_mvc.php
    ...
        

    Je me connecte maintenant à Promethee pour me laissez-vous guider par la procédure d'installation automatisée en 4 étapes.

    
http://localhost/promethee/setup.php  ## Se référer au guide d'installation pour plus d'info...
        

    Figure 10-9. Promethée - Installation 1/7

    Figure 10-10. Promethée - Installation 2/7

    Figure 10-11. Promethée - Installation 3/7

    Figure 10-12. Promethée - Installation 4/7

    Figure 10-13. Promethée - Installation 5/7

    Figure 10-14. Promethée - Installation 6/7

    Figure 10-15. Promethée - Installation 7/7

    Figure 10-16. Promethée - Ecran de connexion

    Je me connecte avec :

    
ID Utilisateur : admin 
    Mot de passe   : (laisser vide)
        

    Figure 10-17. Promethée - Ecran d'Accueil

    La première chose à faire c'est de changer le mot de passe de l'utilisateur "admin" et de supprimer le fichier "setup.php" dans le dossier /var/www/promethee :))

    Ca y est ! PROMETHEE est configuré et opérationnel.

    Il ne reste plus qu'à :

    
- créer les comptes des utilisateurs (table user_id),
    - créer les comptes des élèves (table user_student),
    - éventuellement, renseigner les adresses IP des postes clients connectés au serveur intranet
      (table ip) afin d’identifier les stations et de sécuriser l’intranet par filtrage IP7.
        
    Il existe deux méthodes pour créer un compte :
    
- par invitation,
    - par importation de données.
        

    Pour le reste consulter le guide d'installation et d'administration.


    10.1.9. Développement d’une application et mise à disposition sous la forme d’un tgz

    Source(s):

    C'est loin d'être parfait... mais dans l'ensemble cela devrait répondre au cahier des charges...


    Chapitre 11. SR004 Interconnecter un réseau TCP/IP

    11.1. Outils de test - Laboratoire: Netkit & Clownix

    Source(s):


    11.1.1. Netkit

    11.1.1.1. Installation

    
# Netkit installation
    # Créer un dossier d'installation
    $ mkdir ~/netkit
    $ cd ~/netkit
    
    # Télécharger Netkit Core, Filesystem et Kernel
    $ wget http://wiki.netkit.org/download/netkit/netkit-2.7.tar.bz2
    $ wget http://wiki.netkit.org/download/netkit-filesystem/netkit-filesystem-i386-F5.1.tar.bz2
    $ wget http://wiki.netkit.org/download/netkit-kernel/netkit-kernel-i386-K2.8.tar.bz2
    
    # Décompresser
    $ tar -xjSf netkit-2.7.tar.bz2 
    $ tar -xjSf netkit-filesystem-i386-F5.1.tar.bz2 
    $ tar -xjSf netkit-kernel-i386-K2.8.tar.bz2 
    
    # Ajouter les lignes suivante dans le fichier ~/.bashrc
    ######
    ## RL Customisation :)
    #
    # Environment variable for netkit  
    export NETKIT_HOME=/home/filostene/Documents/netkit/netkit
    export MANPATH=:$NETKIT_HOME/man
    export PATH=$NETKIT_HOME/bin:$PATH
    
    # Tester
    $ cd  ~/netkit/netkit
    $ ./check_configuration.sh
    
    # Si tout OK, démarrer un simple machine virtuelle
    $ vstart pc1
    
    # Afficher les machines virtuelles démarrées 
    $ vlist
    USER             VHOST               PID       SIZE  INTERFACES
    filostene        pc1                4486      61588  
    
    Total virtual machines:       1    (you),        1    (all users).
    Total consumed memory:    61588 KB (you),    61588 KB (all users).  
    
    # Arrêter la machine virtuelle depuis l'hôte des machines
    $ vhalt pc1
    Halting virtual machine "pc1" (PID 4486) owned by filostene [.....   # Par défaut conserve le disk virtuel et donc la configuration 
                                                                          # pour les démarrages suivant...
    # OU
    $ vhalt -r pc1
    Halting virtual machine "pc1" (PID 4486) owned by filostene [.....
    Removing filesystem "/home/filostene/Documents/netkit/netkit/pc1.disk"... done.    # Option -r = supprime le disque virtuel pc1.disk 
                                                                                        # et la configuration
    ## On peut aussi maintenant enlever le fichier log : pc1.log
    
    ## Alternativement, les machines virtuelles (VM) peuvent être arrêter directement depuis la VM
    $ halt
       

    11.1.1.2. Un petit lab ! en trois temps trois mouvement

    Source(s):

    Note

    Avant de se lancer dans la configuration d'un lab Netkit on prendra soin de toujours faire un diagramme claire du scenario que l'on souhaite émuler!

    
## Un petit lab avec 2 babasses et un routeur au milieu
    ## Merci qui ? Merci Alix pour le tuyau !!!
    
    $ mkdir myLAB && cd myLAB
    $ mkdir -p pc1 pc2 routeur
    $ cat  << EOF >lab.conf
    pc1[0]=A
    pc2[0]=B
    routeur[0]=A
    routeur[1]=B
    EOF
    $ lstart
    
    ##Y a plus qu'à jouer avec la commande ifconfig ou ip ;-)
    $ ifconfig eth0 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255 up
    
    # OU alternativement pour obtenir une configuration permanente
    # il suffit d'éditer avec vi ou mcedit le fichier
    # /etc/network/interfaces (à l'interieur de la VM pc1, 2 ou routeur) et d'ajouter:
    auto eth0
    iface eth0 inet static
      address 10.0.0.1
      network 10.0.0.0
      netmask 255.255.255.0
    # Répéter pour chacune des machines.
    # La configuration sera permante jusqu'a tout changement ultérieur 
    # ou que le système de fichier est effacé lors de l'arrêt de la VM
       

    11.1.1.3. Connecter son Lab à une réseau réel (LAN, Internet,...)

    Connecter une VM à un réseau externe à un réseau réel est possible. Les droits administrateur son requis pour cela (root ou sudo). Suivant comment Netkit est configuré, le mot de passe root peut-être demandé par Netkit.

    
######
    ## Attacher une interface réseau virtuel eth0 à la VM pc1, 
    # 
    # Executer:
    $ vstart pc1 --eth0=tap,TAP-ADDRESS,GUEST-ADDRESS
    # OU
    # Ajouter une option dans le fichier de configuration lab.conf:
    vm[0]=tap,TAP-ADDRESS,GUEST-ADDRESS
    
    # TAP-ADDRESS est l'adresse IP d'une nouvelle interface du côté de l'hôte qui est utilisé pour router le traffic vers/depuis le réseau réel. 
    # GUEST-ADDRESS est l'adresse IP automatiquement assigné à l'interface à l'interieur de la machine virutelle.
    # TAP-ADDRESS et GUEST-ADDRESS doivent appartenir au même réseau local quel qu'il soit (Netkit cache ces adresses via NAT)
    
    # Voir la page man de vstart pour plus d'information.
        

    Note

    La mot de passe root ne sera demandé qu'une seule fois.

    TAP-ADDRESS s'appliquera uniquement à la première machine virtuelle qui démarrera avec l'interface tap. Pour utiliser une autre TAP-ADDRESS pour une autre interface du lab ou d'un autre lab, il est necessaire de ré-initialiser la TAP-ADDRESS.

    
######
    ## Re-initialiser la TAP-ADDRESS
    # 
    # Arrêter toutes les machines virtuelles puis executer:
    $ vclean -T
    
    # Rarement utilisé car comme netkit utilise NAT, la TAP-ADDRESS a rarement besoin d'être changée.
         


    11.2. NET01 Base

    11.2.1. En Bref

    Source(s):

    Ceci est une bref introduction à la configuration réseau sous Debian. Elle est comparable aux autres distributions GNU/Linux, notemment dans la configuarion DNS (Domain Name Server = Server de Nom de Domaine).


    11.2.1.1. Quatres points essentiels: Nom d'hôte / Addresse IP / Passerelle / Domaine (Nom et DNS)

    Les éléments suivants constituent les quatres points essentiels de configuration d'un réseau:

    • le nom d'hôte (Hostname): Ceci est le nom de la machine qui completé avec le nom de domaine forme le FQDN (fully qualified domain name = Nom de domaine qualifié complet)

    • l'addresse IP (IP Address) : Numero identifiant la machine de façon unique sur le réseau

    • la passerelle par défaut (default gateway - GW) : Adresse IP de la machine permettant de communiquer avec d'autres réseaux

    • le nom de domaine et le(s) server(s) DNS (Domain Name Server = Server de Nom de Domaine) : permettent d'identifier l'adresse d'une machine sur un domaine via son nom.


    11.2.1.2. Configurer le nom d'hôte

    Le nom d'hôte est habituellement configuer lors de l'installation

    Il peut être affiché ou changer à tout moment avec la commande hostname.

    
# Voir le nom d'hôte
    $ /bin/hostname 
    debstafil
    
    # Changer le nom d'hôte temporairement
    $ /bin/hostname newname
    
    # Changer le nom d'hôte de façaon permanente
    Editer le fichier /etc/hostname et indiquer un nouveau nom.
    Ce fichier est lu automatiquement au démarrage du système.
    Le changement sera effective au prochain démarrage.
         


    11.2.1.3. Configuer l'addresse IP

    L'addresse IP associée à une carte réseau est lue depuis le fichier /etc/network/interfaces (man interfaces pour plus d'info)

    
#####
    ## Pour une machine avec addresse IP static
    ## Adresse IP 192.168.1.90
    ## Passerelle par défaut 192.168.1.1
    ## Masque réseau 255.255.255.0
    ## le fichier de configuration serait:
    
    # The loopback network interface
    auto lo
    iface lo inet loopback
    
    # The primary network interface
    auto eth0
    iface eth0 inet static
      address 192.168.1.90
      gateway 192.168.1.1
      netmask 255.255.255.0
      network 192.168.1.0
      broadcast 192.168.1.255
    
    #####
    ## Pour une machine configurée via DHCP
    ## le fichier de configuration serait:
    
    # The loopback network interface
    auto lo
    iface lo inet loopback
    
    # The primary network interface - use DHCP to find our address
    auto eth0
    iface eth0 inet dhcp
          

    Note

    La configuration DHCP requiert l'installation d'un client DHCP : paquet pump ou dhcp-client.

    Pour rendre tout changement de configuration dans ce fichier effectif, executer:

     
    $ /etc/init.d/networking restart
    ou 
    $ ifup -a
          


    11.2.1.4. Configuer la passerelle par défaut (Gateway GW)

    Comme indiqué dans la section précédente, la passerelle par défaut pour une machine avec une adresse IP statique est configurée dans le fichier /etc/network/interfaces.

    
# Afficher la passerelle par défaut courante:
    $ netstat -nr
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
    0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 eth0
    
    # Commande alternative
    $ /sbin/route           # ou $ /sbin/route pour afficher les numeros de réseau au lieu de leur nom
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
    default         router          0.0.0.0         UG    0      0        0 eth0
    
    # Pour changer la passerelle par défaut, il faut d'abbord supprimer la courante:
    $ /sbin/route del default gw 192.168.1.1
    
    # Sans passerelle, la machine sera incapable de communiqer avec d'autres localisé hors du réseau local.
    # Ajouter un nouvelle passerelle par défaut
    $ /sbin/route add default gw 192.168.1.100
         

    11.2.1.5. Configuer nom de domaine et DNS (serveur de nom)

    Pour des resolutions de noms static ajouter des entrées (Adresse IP Nom d'hôte.Domain Alias) dans le /etc/hosts

    La machine peut aussi consulter des servers de nom (DNS), pour cela il suffit d'indiquer leur adresse IP dans le fichier /etc/resolv.conf

    
######
    ## Pour le serveur DNS (IP address 192.168.1.1)
    ##  le ficher serait :
    # 
    
    search my.flat
    nameserver 192.168.1.1
         

    11.2.2. Cours IP (Protocole Internet) - Concept à retenir :)

    Source(s):


    11.2.2.1. TCP/IP

    TCP/IP (Transmission Control Protocol/Internet Protocol) est une famille de protocoles réseaux qui gère le routage sur les systèmes informatiques (Unix/Linux, Windows. . .) et l’Internet.

    Ses spécifications sont définies dans des documents RFC (Request For Comments - Appels à commentaires) du domaine public. Ils sont produits par l’IETF ( Internet Engineering Task Force) au sein de l’IAB (Internet Architecture Board).

    TCP/IP et OSI: Chaque couche du modèle TCP/IP correspond à une ou plusieurs couches du modèle OSI (Open Systems Interconnection) défini par l’ISO (International Standards Organization). Comparer

    Figure 11-1. Datagramme IP

    TCP (Transmission Control Protocol,Protocole de contrôle de la transmission) - FIABLE fournit un service sécurisé de remise des paquets. TCP fournit un protocole fiable, "sécurisé", orienté connexion, au-dessus d’IP (ou encapsulé à l’intérieur d’IP). TCP/IP est adapté pour la transmission de données basée sur la session, les applications client-serveur et les services critiques tels que le courrier électronique ... Ce protocole exige du destinataire un accuse réception (ACK) ... Sur une connexion TCP entre deux machines du réseau, les messages (ou paquets TCP) sont acquittés et délivrés en séquence.

    UDP (User Datagram Protocol) - MULTICAST UDP est un protocole de transport, comme TCP, mais qui offre un service de datagrammes sans connexion qui ne garantit ni la remise ni l’ordre des paquets délivrés (sommes de contrôle facultatives) ... permet d’échanger des données sur des réseaux à fiabilité élevée sans utiliser inutilement des ressources réseau ou du temps de traitement ... Les messages (ou paquets UDP) sont transmis de manière autonome (sans garantie de livraison) ... Le protocole UDP prend également en charge l’envoi de données d’un unique expéditeur vers plusieurs destinataires (Multicast).

    ICMP (Internet Control Message Protocol) - PING ICMP (Internet Control Messaging Protocol) est un protocole de maintenance utilisé pour les tests et les diagnostics, qui véhicule des messages de contrôle. Il permet à deux systèmes d’un réseau IP de partager des informations d’état et d’erreur.

    RIP (Routing Information Protocol) RIP est un protocole de routage dynamique qui permet l’échange d’informations de routage sur un inter-réseau.

    ARP (Address Resolution Protocol) Le protocole ARP permet de déterminer l’adresse physique (ou MAC) d’un noeud à partir de son adresse IP ...

    Informations transmises et leur enveloppe, selon le niveau:

    • message(ou de flux) entre applications

    • datagramme (ou segment) au niveau TCP

    • paquet au niveau IP

    • trames au niveau de l’interface réseau (Ethernet ou Token Ring)

    Les protocoles application connus :

    • HTTP (Hyper Text Transfer Protocol) : accès aux documents HTML et le transfert de fichiers depuis un site WWW

    • FTP (File Transfer Protocol) : pour le transfert de fichiers (TCP)

    • Telnet (remplacé par ssh) : connexion à distance en émulation terminal, à un hôte Unix/Linux

    • SMTP (Simple Mail Transfer Protocol) : messagerie électronique (UDP et TCP)

    • SNMP (Simple Network Management Protocol) : l’administration du réseau

    • NFS (Network File System) : partage des fichiers Unix/Linux

    • POP/IMAP : remise de courrier

    ...

    Figure 11-2. Applications TCP/IP : Modèle client/serveur

    Sur la machine serveur un processus serveur (en jargon daemon qui n'est autre qu'un service) traite les requêtes des clients. Client et serveur dialoguent en échangeant des messages qui contiennent des requêtes et des réponses.

    Différents Services: Email, Web, FTP, Serveur de Noms, ...

    Par exemple un navigateur Internet (Firefox) envoie une requête TCP à un serveur Web tournant sur un autre noeud du réseau. Mais imaginons que le noeud qui fait tourner un serveur Web dispose aussi d'un serveur de courrier électronique, d'un serveur FTP et d'un serveur de noms: comment savoir à quel serveur est destinée la connexion TCP?

    C'est pour ça que le TCP et l'UDP possèdent le concept de `ports'. Chaque paquet contient un espace mémoire où il stocke son 'port de destination', qui dit à quel service le paquet est adressé. Par exemple, le port TCP 25 est le serveur mail, et le port TCP 80 le serveur Web (bien qu'on puisse parfois trouver des serveurs Web sur des ports différents). Une liste de ports peut être trouvée dans `/etc/services'.

    De même, lorsque deux fenêtres Firefox accèdent chacune à une partie différente d'un même site Web, comment fait la machine Linux pour distinguer quels paquets TCP sont destinés à un Firefox plutôt qu'à l'autre ?

    C'est ici que le `port source' entre en jeu: chaque nouvelle connexion TCP reçoit un port source différent, pour que chacune puisse être différenciée, même si elles sont dirigées vers la même adresse IP et le même port de destination. Habituellement le premier port source donné sera le port 1024 et sera incrémenté au fur et à mesure des connexions.

    Note

    Protocole de communication entre applications = un numéro de protocole + un numéro de port (pour identifier l'application)

    Des numéros de port [entre 0 et 1023] sont réservés pour les applications standards. Ce sont les ports bien connus (Well Known Ports) comme assignés par l’IANA1

    Des numéros de port [entre 1024 et 65535] sont disponibles pour les applications développées par les utilisateurs

    Liste des ports de services (/etc/services)

    Réseaux et Adresses physiques (MAC) ; Réseaux et adresses logiques (IP) ; Toute machine sur un réseau IP a 2 adresses:

    • une adresse MAC (Medium Access Control) : 48 bits soit six octets (par exemple : 08-00-14-57-69-69) - Addresse physique unique (et permanante) de la carte réseau qui sert à communiquer au niveau de la couche liaison. Réseaux physique.

      ET

    • une adresse IP : IPv4 32 bits soit quatres octets (par exemple : 172.18.1.2) ou IPv6 [TOCOMPLETE] - Addresse logique unique (et modifiable) du poste réseau qui sert à communiquer au niveau de la couche transport. Réseaux logiques. L'Icann de l’Inter-NIC (Network Information Center) garantie l’unicité des identificateurs de réseau IP sur toute la planète.

    Le protocole ARP (Adress Resolution Protocol) assure la correspondance entre l’adresse IP et l’adresse MAC en effectuant une diffusion (multicast) du type "qui est X.X.X.X ?" et en conservant la réponse dans une cache (Table IP<=>MAC) pour une une durée de vie limitée (TTL ou Time To Leave).

    Note

    Adresse IP = Numéro de réseau + Numéro d'hôte (noeud n au sein du réseau)

    Different classe d'adresse IPv4 existe:

    • X.0.0.0 (Classe A, X de 1 à 126)

    • X.Y.0.0 (Classe B, X.Y de 128.0 à 191.255)

    • X.Y.Z.0 (Classe C, X.Y.Z de 192.0.0 à 223.255.255)

    Voir poly ÉOF pour plus d'information.

    Blocs d'adresse reservées:

    • 0.0.0.0 (route par defaut)

    • 127.0.0.0 (blouclage=loopack)

    • A X.0.0.0|B X.Y.0.0|C X.Y.Z.0 (réseau)

    • A X.255.255.255|B X.Y.255.255|C X.Y.Z.255 (diffusion=multicast)

    • A 10.0.0.0/8->255.0.0.0|B 172.16.0.0/16->172.31.0.0|C C 192.168.0.0/24->192.168.255.0 (privée)

    • 169.254.0.0/16(auto-configuration)

    Voir RFC 3330 et RFC 1918 pour les block d'adresses spéciaux et réservées.

    Figure 11-3. Découpage des blocs d'adresses IPv4

    Autres formats disponibles avec liens actifs pour ce document: PDF, ODS.

    Note

    Pour les réseaux privés de classe C, ne serait-ce pas plutôt 192.168.0.0/16 comme indiqué sur la RFC 3330 de Septembre 2002 ?

    Il est exact que c'est l'intégralité de la plage qui est réservée à l'usage privé, mais, pour les raisons de classe vu précédemment, des raisons historiques donc, on découpe en /24 dans ce range. C'est donc un abus de langage. Toute la plage est effectivement réservée à cet usage, en /16, mais avec des découpages la plupart du temps en /24. La 3330 le dit bien, mais la référence est la 1918.

    Le masque de réseau (netmask) sert à identifier précisément les bits qui concernent le N° de réseau d’une adresse IP (il "masque" la partie hôte de l’adresse): A 255.0.0.0|B 255.255.0.0|C 255.255.255.0

    Les masques de sous-réseaux (subnet mask) permettent de segmenter un réseau en plusieurs sous-réseaux. On utilise alors une partie des bits de l’adresse d’hôte pour identifier des sous-réseaux. Toutes les machines appartenant à un sous-réseau possèdent le même numéro de réseau. Pour connaître l’adresse du sous-réseau auquel une machine appartient, on effectue en réalité un ET logique entre l’adresse de la machine et le masque.

    Une passerelle (gateway) ou un routeur est un équipement qui fait le lien (routage) entre différents réseaux ou entre sous-réseaux. Pour cela elle utilise une table de routage pour déterminer la meilleure route pour transférer les paquets IP hors du réseau local vers un réseau distant. Si l’hôte de destination se trouve sur le réseau local, les données sont transmises à l’hôte destination directement (pas de routage).

    Routage Dynamique: RIP (Routing Information Protocol) et le protocole OSPF (Open Shortest Path First) sont des protocoles d’échange dynamique des tables de routage IP sur un réseau local. Mis en oeuvre pour construire dynamiquement les chemins entre routeurs.

    Domaine d’acheminement: EGP (Exterior Gateway Protocol) et BGP (Border Gateway Protocol) sont des protocoles particuliers d'échanges entre passerelles de chaque domaine de routage.


    11.2.2.2. Exercices d’application

        
    ## On donne l’adresse 193.12.10.195/26, on demande :
    – À quelle classe appartient le réseau d’origine ?
    1er octet entre 192 et 223 donc classe C
    – Combien de sous-réseaux ont été créés ?
    /26 signifie que les 26 premiers bits du masque sont à 1
    Le masque réseaux est donc: 11111111.11111111.11111111.11000000 soit 255.255.255.192
    Nombre de 1 dans le dernier octet = 2
    Donc 2 ^ 2 = 4 sous-réseaux possible
    – À quel sous réseau appartient la machine ?
    255.255.255.192/26 (voir réponse précedente)
    – Combien peut-on mettre d’hôtes par sous-réseau ?
    Nombre de 0 dans le dernier octet = 6
    Donc 2 ^ 6 - 2 (reservée: réseau/diffusion) = 62 adresses d'hôtes
    – Quelle est l’adresse de la machine dans le sous-réseau ?
    IP:193.12.10.195/26 donc Numéro d'hôte 0.0.0.3 (195 - 192 = 3)
    – Quelle est l’adresse de diffusion du sous-réseau ?
    Si on place tout les bits d'hôte à 1 on obtient 11111111 = 255
    193.12.10.255
    
    ## On donne l’adresse 160.1.129.195/17, on demande :
    – À quelle classe appartient le réseau d’origine ?
    1er octets entre 128 et 191 donc classe B
    – Combien de sous-réseaux ont été créés ?
    /17 signifie que les 17 premiers bits du masque sont à 1
    Le masque réseau est donc: 11111111.11111111.10000000.00000000 soit 255.255.128.0
    Nombre de 1 dans l'avant dernier octets = 1
    Donc 2 ^ 1 = 2 sous-réseaux
    – À quel sous réseau appartient la machine ?
    255.255.128.0/17 (voir réponse précedente)
    – Combien peut-on mettre d’hôtes par sous-réseau ?
    Nombre de 0 dans les deux derniers octets = 15
    Donc 2 ^ 15 - 2 (reservée: réseau/diffusion) = 32766 adresse d'hôtes
    – Quelle est l’adresse de la machine dans le sous-réseau ?
    IP:160.1.129.195/17 donc Numéro d'hôte 0.0.1.195 (129.195 - 128.0 = 1.195)
    – Quelle est l’adresse de diffusion du sous-réseau ?
    Si on place tout les bits d'hôte à 1 on obtient 11111111.11111111 = 255.255
    160.1.255.255
    
    ## On donne l’adresse 13.0.0.0/8, on demande :
    – Quel masque faut-il pour avoir 3 sous-réseaux ?
    2 ^ 1 = 2
    2 ^ 2 = 4 # Pour avoir 3 sous-réseaux il faut au moins 2 bits supplémentaire pour le numéro réseau
    Donc 11111111.11000000.00000000.00000000 soit 255.196.0.0
    – Quel masque faut-il pour avoir 256 sous-réseaux ?
    2 ^ 8 = 256 # Pour avoir 256 sous-réseaux il faut au moins 8 bits supplémentaire pour le numéro réseau
    Donc 11111111.11111111.00000000.00000000 soit 255.255.0.0
    – Combien d’adresses dispose t-on si on masque sur 20 bits ?
    Masque de 20 bits: 11111111.11111111.11110000.00000000
    32-20 = 12 bits disponibles pour l'addressage des hôtes soit
    2 ^ 12 - 2 (reservée: réseau/diffusion) = 2094 adresse d'hôtes
      

    11.2.3. Adresse IP publique et privée

    Toutes adresse IP appartenant au block d'adresse non reservé est considéré comme une addresse IP Publique. Elle est potentiellement accessible par tous via le réseau Internet.

    Identifier mon adresse IP publique : mon-ip.com whatismyip.com adresseip.com


    11.2.4. Outil pour les calculs IP (masque, etc...) : gip, sipcalc

    outil de calcul IP/masque pour calculer les ip en binaire, les sous réseaux, les masques, l’adresse de diffusion, etc...

    gip : en mode graphique

      
    # Installation
    $ sudo apt-get install gip
    
    # Démarrage
    $ gip
        

    sipcalc : outil en ligne de commande

    
# Installation
    $ sudo apt-get install sipcalc
    
    # Calculer
    sipcalc 10.0.1.5/24
    -[ipv4 : 10.0.1.5/24] - 0
    
    [CIDR]
    Host address            - 10.0.1.5
    Host address (decimal)  - 167772421
    Host address (hex)      - A000105
    Network address         - 10.0.1.0
    Network mask            - 255.255.255.0
    Network mask (bits)     - 24
    Network mask (hex)      - FFFFFF00
    Broadcast address       - 10.0.1.255
    Cisco wildcard          - 0.0.0.255
    Addresses in network    - 256
    Network range           - 10.0.1.0 - 10.0.1.255
    Usable range            - 10.0.1.1 - 10.0.1.254
        

    11.2.5. DMZ - Zone démilitarisée

    Voir section dédiée SR010 Sécurité > Un epace hermétique > DMZ (Zone démilitarisée)


    11.2.6. Les fichiers importants

    Source(s):


    11.2.6.1. /etc/hostname : nom d’hôte de la machine locale (modifiable par l'administrateur avec la commande hostname).

    
# cat /etc/hostname 
    debstafil
    # hostname debstafil4  # Renomer l'hôte avec un nouveau nom
    # cat /etc/hostname 
    debstafil
    # hostname
    debstafil4
          

    Question: Pourquoi sur ma machine, la commande hostname n'affiche pas la même chose que la commande cat ? Voir commande hostname pour l'explication...


    11.2.6.2. /etc/hosts : table statique pour la résolution de noms d’hôtes

    Ligne au format AdresseIP Nom1 [Nom2 ...]

    
$ cat /etc/hosts
    127.0.0.1	localhost
    127.0.1.1	debstafil4.ermansion.net	debstafil4      fil4
    10.0.1.4        macfil.ermansion.net            macfil  hsbuntu
    10.0.1.3        debstafil3.ermansion.net        debstafil3
    
    # The following lines are desirable for IPv6 capable hosts
    ::1     localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    ff02::3 ip6-allhosts
          

    11.2.6.3. /etc/host.conf : configurer le processus de résolution de nom de la machine

    
$ cat /etc/host.conf 
    multi on
          

    Question: Pourquoi le fichier host.conf sur ma Debian ne contient ni la mention hosts, ni la mention bind (service DNS) comme cela devrait ? Est-ce parce que l'option multi est à ON ?


    11.2.6.4. /etc/resolv.conf : déclarer les serveurs de noms (DNS) utilisés par le poste.

    Source(s):

    
# cat /etc/resolv.conf 
    ### BEGIN INFO
    #
    # Modified_by:  NetworkManager
    # Process:      /usr/bin/NetworkManager
    # Process_id:   2044
    #
    ### END INFO
    
    
    ###
    # Example ÉOF
    search foo.bar          # Par défaut, rechercher à résoudre le nom "blabla.foo.bar" 
                            # si uniquement le nom hôte "blabla" est indiqué
    nameserver 192.168.1.1
    nameserver 192.168.1.2
    nameserver 192.168.1.3
          

    Question: Le fichier /etc/resolv.conf est vide par défaut. Il n'est utile que si le host utilise un service DNS pour la resolution de noms. Ce fichier ne devrait-il pas contenir au moins des DNS publique par défaut ?

    Réponse: non. DNS fonctionne indépendamment de ton fichier host. Par contre, il est utile, voire recommandé d'avoir le localhost défini dans le fichier, sinon, on peux rencontrer des problèmes. Pour savoir pourquoi il est vide, il faudrait demander aux développeurs Debian. Souvent il ne l'est pas :))


    11.2.6.5. /etc/network/interfaces : configuration des interfaces réseau (utiliser man interfaces pour connaître les options disponibles).

    Ce fichier est utilisé par les commandes ifup et ifdown pour configurer/deconfigurer les interfaces réseaux.

    
####
    # Sur ma Debian :-)
    
    $ cat /etc/network/interfaces 
    # This file describes the network interfaces available on your system
    # and how to activate them. For more information, see interfaces(5).
    
    # The loopback network interface
    auto lo
    iface lo inet loopback
    
    # The primary network interface
    allow-hotplug eth0
    iface eth0 inet dhcp
          
    
# Autre configuration possible pour
    # la carte réseau principale eth0
    ...
    auto eth0
    iface eth0 inet static
      address 192.168.1.90
      gateway 192.168.1.1
      netmask 255.255.255.0
      network 192.168.1.0
      broadcast 192.168.1.255
    
      ## Utilisation de resolvconf avec une interface de type « eth0 »
      dns-nameservers 192.168.0.1 212.27.53.252 212.27.52.252   ## Serveur DNS de la Gateway et du FAI
      dns-search mon-domaine.local
    ...
           

    Voir un autre exemple de fichier de configuration: section above.

    eth0 est la première interface ethernet, eth0 serait la deuxième, etc...

    Note

    Au démarrage la command "ifup -a" est executée (via script de démarrage) pour activer les interfaces réseaux dont la ligne commence par "auto" dans le fichier /etc/network/interfaces

    Note

    La configuration DHCP requiert l'installation d'un client DHCP : paquet pump ou dhcp-client.

    Pour rendre tout changement de configuration dans ce fichier effectif, executer:

     
    $ /etc/init.d/networking restart
    ou
    $ ifup -a
          

    ALIAS: Une interface peut avoir plusieurs adresses, par exemple:

    
eth0:0    192.168.0.1
    eth0:1    192.168.0.2
    ...
          

    Note

    La notion d'alias est intéressante car elle permet de configurer plusieurs adresses IP à la fois sur une seule et unique carte réseau physique. A tester plus tard !

    Note

    Sous RedHat et similaires (Fedora/Mandrake), les scripts ou paramètres de démarrage du réseau se trouvent sous /etc/sysconfig/network

    Sous FreeBSD /etc/rc.network


    11.2.6.6. /etc/networks : affecter un nom logique à un réseau

    Pour pouvoir afficher un réseau ou l'adresser par son nom au lieu de son adresse. Le(s) nom(s) peuvent être utiliser pour modifier la table de routage.

    
# cat /etc/networks
    default		0.0.0.0        # Passerelle par défaut
    loopback	127.0.0.0      # Hôte lui même
    link-local	169.254.0.0
          

    11.2.6.7. /etc/services : décrit pour chaque grand service le ou les ports utilisés

    Utile de s’y référer quand on ne connaît pas le port utilisé par un service. Utilisé par les commandes réseau comme netstat pour afficher les noms des services eu lieu des ports.

    
### 
    # Liste des services utilisant le protocole SSL et leur numéro de port
    $ cat /etc/services | grep SSL
    https		443/tcp				# http protocol over TLS/SSL
    nntps		563/tcp		snntp		# NNTP over SSL
    ldaps		636/tcp				# LDAP over SSL
    ftps-data	989/tcp				# FTP over SSL (data)
    telnets		992/tcp				# Telnet over SSL
    imaps		993/tcp				# IMAP over SSL
    ircs		994/tcp				# IRC over SSL
    pop3s		995/tcp				# POP-3 over SSL
    suucp		4031/tcp			# UUCP over SSL
    suucp		4031/udp			# UUCP over SSL
    ssmtp		465/tcp		smtps		# SMTP over SSL
          

    Par exemple le protocole HTTPs utilise le port 443 pour les communications encryptés.


    11.2.6.8. /etc/protocols : référence par protocole, son numéro et son nom

    ce fichier est utilisé par les analyseurs de trame pour afficher les noms des protocoles en lieu et place des numéros.

    
$ grep tcp /etc/protocols
    tcp	6	TCP		# transmission control protocol 
    $ grep udp /etc/protocols                   ## Protocole NUM=6
    udp	17	UDP		# user datagram protocol
    udplite	136	UDPLite		# UDP-Lite            ## Protocole NUM=136
          

    11.2.7. Les commandes réseaux importantes : ip, ifconfig, ifup/ifdown, arp, route, netstat, traceroute, dig, host, hostname, whois, ping, mtr, bing, telnet, curl, nc(netcat), iftop

    Source(s):


    11.2.7.1. ifconfig

    configuration des interfaces réseau et de visualiser la configuration IP d’une interface. Voir aussi la commande ip

    Syntaxe: ifconfig interface adresse [parametres]

    
# OPTIONS USUELLES
    interface      logique ou physique, il est obligatoire,
    up             active l’interface
    down           désactive l’interface
    mtu            définit l’unité de transfert des paquets
    netmask        affecter un masque de sous-réseau
    broadcast      définit l’adresse de broadcast
    arp  ou !-arp  activer ou désactiver l’utilisation
                    du cache arp de l’interface
    metric         paramètre utilisé pour l’établissement
                    des routes dynamiques, et déterminer
                    le “~coût~” (nombre de sauts ou “~hops~”)
                    d’un chemin par le protocole RIP.
    multicast      active ou non la communication avec des machines
                    qui sont hors du réseau.
    promisc   ou !-promisc
                    activer ou désactiver le mode promiscus
                    de l’interface. En mode  promiscuous, tous
                    les paquets qui transitent sur le réseau
                    sont reçus également par l’interface. Cela
                    permet de mettre en place un analyseur de trame
                    ou de protocole.
         

    
## Afficher information sur la configuration de mes interfaces réseaux
    $ /sbin/ifconfig  # Le chemin complete doit être indiqué dans mon cas, sinon la commande est introuvable !
    eth3      Link encap:Ethernet  HWaddr 08:00:27:89:1d:4f  
              inet adr:10.0.2.15  Bcast:10.0.2.255  Masque:255.255.255.0
              adr inet6: fe80::a00:27ff:fe89:1d4f/64 Scope:Lien
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:2434 errors:0 dropped:0 overruns:0 frame:0
              TX packets:2289 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 lg file transmission:1000 
              RX bytes:2254590 (2.1 MiB)  TX bytes:380079 (371.1 KiB)
              Interruption:11 Adresse de base:0xd020 
    
    lo        Link encap:Boucle locale  
              inet adr:127.0.0.1  Masque:255.0.0.0
              adr inet6: ::1/128 Scope:Hôte
              UP LOOPBACK RUNNING  MTU:16436  Metric:1
              RX packets:42 errors:0 dropped:0 overruns:0 frame:0
              TX packets:42 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 lg file transmission:0 
              RX bytes:3120 (3.0 KiB)  TX bytes:3120 (3.0 KiB)
    ## Désactiver les interfaces
    $ /sbin/ifconfig lo down
    $ ping localhost
    PING localhost (127.0.0.1) 56(84) bytes of data.
    
    --- localhost ping statistics ---
    17 packets transmitted, 0 received, 100% packet loss, time 16127ms
    
    $ /sbin/ifconfig lo up ## Réactiver loopback
    $ ping localhost
    PING localhost (127.0.0.1) 56(84) bytes of data.
    64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.042 ms
    64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.039 ms
    64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.036 ms
    ^C
    --- localhost ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 1998ms
    rtt min/avg/max/mdev = 0.036/0.039/0.042/0.002 ms
    
    $ route -n  # L'option -n pour afficher les addresses IP des reseaux au lieu de leur noms (par défaut)
    Table de routage IP du noyau
    Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
    10.0.2.0        0.0.0.0         255.255.255.0   U     0      0        0 eth3
    0.0.0.0         10.0.2.2        0.0.0.0         UG    0      0        0 eth3
    
    $ route del -net 10.0.2.0/24 dev eth3
    $ route -n
    Table de routage IP du noyau
    Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
    0.0.0.0         10.0.2.2        0.0.0.0         UG    0      0        0 eth3
     
    # 3 machines Host Ubuntu (10.0.1.4), VM3 Debian Fil3 (10.0.1.3), VM4 Debian Fil4 (10.0.1.5)
    # – Sur 10.0.1.5 faites un ifconfig, relevez les valeurs des registres TX/RX.
    debstafil4:~# ifconfig
    eth3...  RX packets:530 ...
             TX packets:613 ...
    
    # – sud 10.0.1.4 faites un ping 10.0.1.5
    macfil:~$ ping debstafil4
    PING debstafil4.ermansion.net (10.0.1.5) 56(84) bytes of data.
    64 bytes from debstafil4.ermansion.net (10.0.1.5): icmp_seq=1 ttl=64 time=18.9 ms
    ...
    
    # – sur 10.0.1.5 relevez les nouvelles valeurs des registres TX/RX. Il y a bien eu échange Réception et envoi de paquets.
    debstafil4:~# ifconfig
    eth3...  RX packets:539 ...
             TX packets:621 ...
    
    # – 10.0.1.4 faites un ping 10.0.1.3
    macfil:~$ ping debstafil3
    PING debstafil3.ermansion.net (10.0.1.3) 56(84) bytes of data.
    64 bytes from debstafil3.ermansion.net (10.0.1.3): icmp_seq=1 ttl=64 time=16.7 ms
    ...
    
    # – sur 10.0.1.5 relevez les nouvelles valeurs des registres TX/RX. 
    debstafil4:~# ifconfig
    eth3...  RX packets:547 ...  # Rx est bien modifié
             TX packets:623 ...  # mais pas Tx. La machine à bien reçu des paquets (arp) mais n’a pas eu à répondre.
         
    # – sur 10.0.1.4 faites un ping 10.0.1.4. ifconfig n’indique aucun registre modifié, donc les paquets ne circulent pas jusqu’à l’interface physique avec un # ping sur l’interface locale.
    debstafil4:~# ping 10.0.1.5
    PING 10.0.1.5 (10.0.1.5) 56(84) bytes of data.
    64 bytes from 10.0.1.5: icmp_seq=1 ttl=64 time=0.000 ms
    ...
    debstafil4:~# ifconfig
    eth3...  RX packets:547 ...
             TX packets:623 ...
    
    # – sur 10.0.1.5 modifiez le MTU ( Message Transfert Unit ) qui détermine l’unité de transfert des paquets. 
    # Il est par défaut à 1500, mettez le à 300, avec la commande :
    debstafil4:~# ifconfig
    eth3...  MTU:576 ...      # Tiens mon MTU d'origine est inferieur a celui par défaut :)) 
                              # Certainement du a la virtualisation et/ou au pont réseau...
                              # sur l'hôte Ubuntu il est à 1500
    debstafil4:~# ifconfig eth3 mtu 300
    debstafil4:~# ifconfig
    eth3... MTU:300 ...
         

    Note

    • Pour chaque interface (couche 1) il faudra indiquer une route au protocole de routage (couche 3) pour atteindre le réseau ; sinon aucun paquet ne va jusqu’à la carte, donc ne sort sur le réseau ;

    • Le ping sur une adresse locale ne teste pas les routes, cela signifie que la pile de protocoles TCP/IP peut fonctionner tandis que le système ne descend pas jusqu’à la couche 2 ou 1 (interface physique). Pas de communication entre l'hôte et son voisin sur le même réseau locale.

    Note

    LOOPBACK (ou bouclage): cette interface permet de tester un programme utilisant le protocole IP sans envoyer de paquets sur le réseau physiquement.

    Questions: -- Pourquoi /sbin/ifconfig requit au lieu de ifconfig ? -- Pourquoi mon interface eth03 ne peut pas être désactivé ? Elle semble réactivée automatiquement... udev ? upstart ?

    Remarques: erreur dans le poly ÉOF c'est route del -net 10.0.2.0/24 dev eth3 et non pas route -del net 10.0.2.0/24 dev eth3


    11.2.7.2. ifup / ifdown

    Démarrer/Stopper l'interface réseau. Configure / Déconfigurer les interfaces réseaux suivant les paramètres du fichier /etc/network/interfaces.

    
#Stopper l'interface réseau eth0 :
    $ ifdown eth0
    
    # Démarrer l'interface réseau eth0 :
    ifup eth0
    
    # Ceci ne doit pas être confondu avec la commande qui suit, qui relance explicitement tous les services réseaux :
    /etc/init.d/networking restart
         

    11.2.7.3. arp (Address Resolution Protocol)

    Visualiser ou modifier la table du cache de l’interface (correspondance entre une adresse IP et une adresse Ethernet (MAC)).Cette table peut être statique et(ou) dynamique.

    
# Afficher la table ARP
    $ arp
    Address                  HWtype  HWaddress           Flags Mask            Iface
    macfil.ermansion.net     ether   00:26:bb:13:31:96   C                     eth3
    Base-Station-e1c421.loc  ether   00:17:f2:e1:c4:21   C                     eth3
    
    $ arp -va
    macfil.ermansion.net (10.0.1.4) at 00:26:bb:13:31:96 [ether] on eth3
    Base-Station-e1c421.local (10.0.1.1) at 00:17:f2:e1:c4:21 [ether] on eth3
    Entrées: 2	Ignorées: 0	Trouvées: 2
    
    # Ajouter une entrée statique - option -s
    $ arp -s 10.0.1.6 00:71:f2:1e:4c:21      
    $ arp -va
    ? (10.0.1.6) at 00:71:f2:1e:4c:21 [ether] PERM on eth3
    Base-Station-e1c421.local (10.0.1.1) at 00:17:f2:e1:c4:21 [ether] on eth3
    Entrées: 2	Ignorées: 0	Trouvées: 2
    
    # Supprimer une entrée - option -d
    $ arp -d 10.0.1.6 
    $ arp -va
    ? (10.0.1.6) at incomplete> on eth3
    Base-Station-e1c421.local (10.0.1.1) at 00:17:f2:e1:c4:21 [ether] on eth3
    Entrées: 2	Ignorées: 0	Trouvées: 2
    
    # Utilisation
    # a. Première partie
    (aucun commentaire)
    
    # b. Deuxième partie
    ...
    ## – Quel est le contenu, après cela de la table ARP ?
    $ arp -av
    Base-Station-e1c421.local (10.0.1.1) à 00:17:f2:e1:c4:21 [ether] sur eth2
    debstafil3.ermansion.net (10.0.1.3) à 08:00:27:89:1d:4f [ether] sur eth2
    debstafil4.ermansion.net (10.0.1.5) à 08:00:27:89:1d:4f [ether] sur eth2
    ==> Conflit d'addressage 1 MAC pour 2 IP ?!
         

    11.2.7.4. route

    Le routage définit le chemin emprunté par les paquets entre son point de départ et son point d’arrivée. Cette commande permet d'afficher et de configurer la talbe de routage IP de pc, de switchs, de routeurs, etc...

    Deux types de routages: statique et dynamique.

    • Le routage statique (adapté pour les réseau locaux) consiste à imposer aux paquets la route à suivre.

    • Le routage dynamique (adapté pour les réseaux importants ou étendus) met en oeuvre des algorithmes, qui permettent aux routeurs d’ajuster les tables de routage en fonction de leur connaissance de la topologie du réseau. Cette actualisation est réalisée par la réception des messages reçus des n œuds (routeurs) adjacents. Le routage dynamique permet d’avoir des routes toujours optimisées, en fonction de l’état du réseau (nouveaux routeurs, engorgements, pannes).

    Note

    En général, les deux types de routages sont combinés

    
######
    ## SYNTAXE: route add [net | host] addr [gw passerelle] [métric coût] [ netmask masque] [dev interface]
    ###### 
    – net ou host indique l’adresse de réseau ou de l’hôte pour lequel on établit une route
    – adresse de destination,
    – adresse de la passerelle,
    – valeur métrique de la route,
    – masque de la route à ajouter,
    – interface réseau à qui on associe la route.
    
    #####
    ## Example d'ajout/suppression de route
    #####
    # Ajoute la route par défaut vers la passerelle 192.3.2.254
    # Identique au champs gateway dans /etc/network/interfaces 
    $ route add default gw 192.3.2.254
    
    # Ajoute la route vers le réseau 130.2.0.0 via la passerelle 192.3.2.1 sur l'interface 0
    $ route add -net 130.2.0.0 netmask 255.255.0.0 gw 192.3.2.1 dev eth0 
    
    # Efface la route vers le réseau 130.2.0.0
    $ route del 130.2.0.0
    
    ######
    ## Example table de routage
    ######
    Kernel IP routing table
    Destination      Gateway          Genmask      Flags Metric Ref Use Iface
    192.168.1.0      *                255.255.255. 0U    0      0   2   eth0
    127.0.0.0        *                255.0.0.0    U     0      0   2   lo
    default          192.168.1.9      0.0.0.0      UG    0      0   10   eth0
    
    ## Explication
    – Destination : adresse de destination de la route,
    – Gateway : adresse IP de la passerelle pour atteindre la route, * sinon (voir note ci-dessous)
    – Genmask : masque à utiliser.
    – Flags : indicateur d’état (U -> Up, H -> Host, G -> Gateway, D -> Dynamic, M -> Modified),
    – Metric : coût métrique de la route (0 par défaut),
    – Ref : nombre de routes qui dépendent de celle-ci,
    – Use : nombre d’utilisation dans la table de routage,
    – Iface : interface eth0, eth1, lo. . .
         

    Note

    Les *(astérisque) dans une table de routage IP désignent les routes d'interface qui sont des itinéraires assignés à l'une des interfaces réseau (cartes réseau connectées directement dans la machine), et non à une adresse IP fixe (c'est-à-dire celle de la passerelle). De cette façon, il est possible de configurer des routes pour des destinations dont l'adresse IP de passerelle n'est pas encore connue au moment de la configuration ou lorsque aucune adresse IP n'est associée à l'interface du poste local.


    11.2.7.4.1. Petite étude de cas

    Le diagramme de l'étude de cas a été réalisé avec le logiciel Dia. Le laboratoire d'étude a été réalisé avec Netkit

    Figure 11-4. Diagramme - Etude de cas

    
###### 
    ## On veut :
    #
         – que les stations de chaque réseau puissent accéder à Internet,
         – que les stations de chaque réseau puissent communiquer entre-elles,
         – que les stations du réseau B, utilisent le serveur de noms le moins possible.
    
    ######
    ## On demande :
    #
         – Configuration des postes du réseau B,
    
    1. Configuer Nom d'hôte sur chaque machine
    Avec netkit le nom d'hôte est configuré automatiquement à partir du fichier lab.conf
    Sinon on peut editer /etc/hostname et indiquer:
    quartz sur la machine 1 puis executer /etc/init.d/hostname.sh
    silex sur la machine 2 puis executer /etc/init.d/hostname.sh
    
    2. Configurer l'interface réseau eth0
    Il est supposé que que chaque machine ne possède qu'une seule interface réseaux Ethernet eth0 connecté au réseau B.
    Ni le réseaux A ni le réseau B ne sont équipés de service DHCP donc l'addresse IP de chaque machine doit être configurer manuellement: 
    130.2.0.0 est de classe B, donc le masque réseau 255.255.0.0 considérant que B n'a pas de sous-réseau
    Pour la machine quartz executer: 
    $ ifconfig eth0 130.2.0.2 (ou configurer /etc/network/interfaces)
    Pour la machine silex executer: 
    $ ifconfig eth0 130.2.0.3 (ou configurer /etc/network/interfaces)
    ==> le masque devrait être configuré automatiquement
    
    3. Verifier le routage et la communication
    Voir ci-dessous pour les routes
    
    4. Configurer les réseaux dans /etc/networks (pour pAB seulement) 
    
    5. Configuer le nom de domaine, sur chacune des machines dans le fichier /etc/hosts
    Voir ci-dessous pour le contenu :))
    ==> ceci permettra aux machines sur le net B d'être interconnecté et de pouvoir communiquer l'une vers l'autres...
    ==>Vérifier la resolution des noms locaux.
    
    6. Configurer le DNS sur chacune des machines dans le fichier /etc/resolv.conf
    ==> Le server DNS n'etant pas actif pour le moment les autres poste ne sont pas accessible par noms.
    
         – Configuration des postes du réseau A,
    
    Similaire aux poste B hormis le fichier /etc/hosts pas nécéssaire car utilisation du DNS.
    

    – Fichiers de configuration pour chaque machine (hosts , resolv.conf , fichier de configuration de carte).

    
         – de donner la liste des routes à mettre :
    
    ## sur les postes du réseau A,
    route add default gw 192.3.2.254 ==> définit dans le fichier /etc/network/interfaces (gateway)
    
    ## sur les postes du réseau B,
    route add default gw 130.2.0.1 ==> définit dans le fichier /etc/network/interfaces (gateway)
    
    ## pAB - Passerelle qui relie les 2 réseaux,
    route add default gw 192.3.2.254 dev eth0 ==> définit dans le fichier /etc/network/interfaces (gateway)
    
    ## rGW - Routeur du réseau A.
    route add -net 130.2.0.0 netmask 255.255.0.0 gw 192.3.2.1 dev eth0 ==> peut-être définit dans le fichier rGW.statup dans le lab ou dans un script de 									       démarrage local de la machine.
    
    route add default gw 10.0.5.1 dev eth1 ==> définit automatiquement par netkit lors qu'on utilise une adresse TAP (connection au réseau externe)
         

    11.2.7.5. netstat

    Tester la configuration du réseau, visualiser l’état des connexions, établir des statistiques (surveillance).

    
###### (Sans argument) Donne l’état des connexions 
    $ netstat
    Connexions Internet actives (sans serveurs)
    Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat      
    tcp        1      0 macfil.local:60882      77.67.21.51:www         CLOSE_WAIT 
    tcp        1      0 macfil.local:35879      weather.noaa.gov:www    CLOSE_WAIT 
    Sockets du domaine UNIX actives (sans serveurs)
    Proto RefCnt Flags       Type       State         I-Node   Chemin
    unix  2      [ ]         DGRAM                    3125     @/org/kernel/udev/udevd
    unix  2      [ ]         DGRAM                    5365     @/org/freedesktop/hal/udev_event
    unix  18     [ ]         DGRAM                    4820     /dev/log
    unix  2      [ ]         DGRAM                    63258    
    unix  3      [ ]         STREAM     CONNECTE      51077    @/tmp/.X11-unix/X0
    unix  3      [ ]         STREAM     CONNECTE      51076    
    ...
    
    ######
    #-a afficher toutes les informations sur l’état des connexions,
    $ netstat -a
    Connexions Internet actives (serveurs et établies)
    Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat      
    tcp        0      0 localhost:ipp           *:*                     LISTEN     
    tcp        1      0 macfil.local:60882      77.67.21.51:www         CLOSE_WAIT 
    tcp        1      0 macfil.local:35879      weather.noaa.gov:www    CLOSE_WAIT 
    tcp6       0      0 localhost:ipp           [::]:*                  LISTEN     
    udp        0      0 *:mdns                  *:*                                
    udp        0      0 *:58305                 *:*                                
    udp        0      0 *:bootpc                *:*                                
    Sockets du domaine UNIX actives (serveurs et établies)
    Proto RefCnt Flags       Type       State         I-Node   Chemin
    unix  2      [ ACC ]     STREAM     LISTENING     9224     /tmp/orbit-filostene/linc-84b-0-5bf7fe57a6597
    unix  2      [ ACC ]     STREAM     LISTENING     9247     /tmp/orbit-filostene/linc-858-0-699e3d8bc428
    unix  2      [ ACC ]     STREAM     LISTENING     9332     /tmp/orbit-filostene/linc-87a-0-16713218e4325
    unix  2      [ ACC ]     STREAM     LISTENING     10674    /tmp/orbit-filostene/linc-8d7-0-36911431f15c
    unix  2      [ ACC ]     STREAM     LISTENING     13048    /tmp/orbit-filostene/linc-97b-0-7e36405d16f3c
    unix  2      [ ACC ]     STREAM     LISTENING     34732    /tmp/orbit-filostene/linc-cdb-0-6051ee2775b56
    unix  2      [ ACC ]     STREAM     LISTENING     5139     /var/run/acpid.socket
    ...
    
    ######-i affichage des statistiques,
    $ netstat -i
    Table d'interfaces noyau
    Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
    eth0       1500 0         0      0      0 0             0      0      0      0 BMU
    eth2       1500 0     20667      0      0 0         25814    551      0      0 BMRU
    lo        16436 0        24      0      0 0            24      0      0      0 LRU
    
    ######-c rafraîchissement périodique de l’état du réseau,
    $ netstat -c | grep gdm
    unix  3      [ ]         STREAM     CONNECTE      7464     @/tmp/gdm-session-NgtqpKET
    unix  3      [ ]         STREAM     CONNECTE      7464     @/tmp/gdm-session-NgtqpKET
    unix  3      [ ]         STREAM     CONNECTE      7464     @/tmp/gdm-session-NgtqpKET
    unix  3      [ ]         STREAM     CONNECTE      7464     @/tmp/gdm-session-NgtqpKET
    unix  3      [ ]         STREAM     CONNECTE      7464     @/tmp/gdm-session-NgtqpKET
    ...
    
    ######-n affichage des informations en mode numérique sur l’état des connexions
    $ netstat -n 
    Connexions Internet actives (sans serveurs)
    Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat      
    tcp        1      0 10.0.1.4:60882          77.67.21.51:80          CLOSE_WAIT 
    tcp        1      0 10.0.1.4:35879          140.90.128.70:80        CLOSE_WAIT 
    Sockets du domaine UNIX actives (sans serveurs)
    Proto RefCnt Flags       Type       State         I-Node   Chemin
    unix  2      [ ]         DGRAM                    3125     @/org/kernel/udev/udevd
    unix  2      [ ]         DGRAM                    5365     @/org/freedesktop/hal/udev_event
    unix  18     [ ]         DGRAM                    4820     /dev/log
    unix  2      [ ]         DGRAM                    63258    
    unix  3      [ ]         STREAM     CONNECTE      51077    @/tmp/.X11-unix/X0
    unix  3      [ ]         STREAM     CONNECTE      51076    
    unix  3      [ ]         STREAM     CONNECTE      50975    /home/filostene/.pulse/dd63a3c0cc335feb225b27864afb044c-runtime/native
    unix  3      [ ]         STREAM     CONNECTE      50974    
    unix  3      [ ]         STREAM     CONNECTE      50933    @/tmp/dbus-grsV2mLnzq
    ...
    
    ######-r affichage des tables de routage,
    $ netstat -r     # Même resultat que route
    Table de routage IP du noyau
    Destination     Passerelle      Genmask         Indic   MSS Fenêtre irtt Iface
    10.0.1.0        *               255.255.255.0   U         0 0          0 eth2
    link-local      *               255.255.0.0     U         0 0          0 eth2
    default         Base-Station-e1 0.0.0.0         UG        0 0          0 eth2
    
    ######-t informations sur les sockets TCP
    $ netstat -t
    Connexions Internet actives (sans serveurs)
    Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat      
    tcp        1      0 macfil.local:60882      77.67.21.51:www         CLOSE_WAIT 
    tcp        1      0 macfil.local:35879      weather.noaa.gov:www    CLOSE_WAIT 
    ...
    
    ######-u informations sur les sockets UDP.
    $ netstat -u
    Connexions Internet actives (sans serveurs)
    Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat 
    
    ...
    
    ######-p indique quel programme (PID) utilise la socket
    $ netstat -p | more
    Connexions Internet actives (sans serveurs)
    Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        
    PID/Program name
    Sockets du domaine UNIX actives(sans serveurs)
    Proto RefCnt Flags       Type       State         I-Node   PID/Program name    C
    hemin
    unix  2      [ ]         DGRAM                    2325     682/udevd           @
    /org/kernel/udev/udevd
    unix  2      [ ]         DGRAM                    5535     2004/hald           @
    /org/freedesktop/hal/udev_event
    ...
         

    11.2.7.5.1. Exercices sur la commande netstat

    On donne les résultats de 3 commandes netstat ci-dessous, extraites de la même machine :

       
    $ netstat -nr
    Kernel IP routing table
    Destination   Gateway      Genmask        Flags MSS   Window irtt Iface
    198.5.203.0   0.0.0.0      255.255.255.0  U     1500  0      0    eth0
    127.0.0.0     0.0.0.0      255.0.0.0      U     3584  0      0    lo
    0.0.0.0       198.5.203.3  0.0.0.0        UG    1500  0      0    eth0
       
    $ netstat
    Active    Internet connections (w/o servers)
    Proto   Recv-Q Send-Q Local Address   Foreign Address      State
    Tcp     0      127    uranus:telnet   194.206.6.143:1027   ESTABLISHED
    
    $ netstat -i
    Iface MTU  Met   RX-OK    RX-OVR   TX-OK   Flags
    Lo    3584 0     764      764      89      BLRU
    eth0  1500 0     410856   33286    210     BRU
         

    On demande :

    
## – Quels sont les noms et adresse de la machine consultée ?
    Comme indiqué dans le champs Local Address la machine s'appelle uranus
    Son addresse est 198.5.203.X (ou X est un nombre qui ne peut être déterminé mais different de 3)
    
    ## – Quel type de session est-elle en train de supporter ?
    Comme indiqué dans le champs Local Address une session Telnet
    
    ## – À quoi correspond l’adresse 198.5.203.3 ?
    C'est l'addresse IP de la passerelle (Gateway) par défaut pour cette machine
     
    ## – Pourquoi une interface porte-t-elle les Flags BLRU et l’autre BRU ?
    L'interface avec le Flag L est l'interface de bouclage (loopback)
    
    ## – Quelle est la taille des paquets utilisée par la passerelle par défaut ?
    1500 comme indiqué dans la troisième ligne de la colonne MMS de la table de routage
          

    11.2.7.6. traceroute

    Source(s):

    traceroute est un outil de diagnostic des réseaux, présents sur la plupart des systèmes d'exploitation, permettant de déterminer le chemin suivi par un paquet. La commande traceroute permet ainsi de dresser une cartographie des routeurs présents entre une machine source et une machine cible. Cette commande est importante, car elle permet d’équilibrer la charge d’un réseau, en optimisant les routes.

    Note

    La commande traceroute permet de suivre à la trace le passage de routeur en routeur pour atteindre un hôte sur le réseau tandis que la commande ping permet de vérifier la fiabilité d’une route donnée.

    Il semble plus complexe d'atteindre le server de l'ÉOF qu'un server google !

    
$ traceroute google.fr
    traceroute to google.fr (209.85.229.104), 30 hops max, 40 byte packets
     1  Base-Station-e1c421.local (10.0.1.1)  7.996 ms  3.998 ms  3.998 ms
     2  10.175.104.1 (10.175.104.1)  11.994 ms  15.992 ms  15.992 ms
     3  osr01camd-v15.network.virginmedia.net (62.30.250.97)  15.992 ms  15.992 ms  15.992 ms
     4  osr02hari-tenge71.network.virginmedia.net (62.30.250.45)  15.992 ms  15.992 ms  15.992 ms
     5  pop-bb-b-ae1-0.network.virginmedia.net (195.182.178.169)  15.992 ms  15.992 ms  15.992 ms
     6  pop-bb-a-ae0-0.network.virginmedia.net (213.105.174.229)  11.994 ms  31.984 ms  31.984 ms
     7  man-bb-b-as1-0.network.virginmedia.net (212.43.162.86)  63.968 ms  63.968 ms  63.968 ms
     8  tele-ic-3-ae0-0.network.virginmedia.net (212.43.163.70)  35.982 ms  35.982 ms  35.982 ms
     9  158-14-250-212.static.virginmedia.com (212.250.14.158)  35.982 ms  35.982 ms  39.980 ms
    10  209.85.252.76 (209.85.252.76)  35.982 ms  35.982 ms 209.85.255.175 (209.85.255.175)  35.982 ms
    11  66.249.95.170 (66.249.95.170)  67.966 ms  39.980 ms 72.14.232.134 (72.14.232.134)  39.980 ms
    12  216.239.49.45 (216.239.49.45)  39.980 ms 72.14.236.191 (72.14.236.191)  31.984 ms 209.85.252.83 (209.85.252.83)  67.966 ms
    13  209.85.243.85 (209.85.243.85)  31.984 ms 209.85.243.81 (209.85.243.81)  31.984 ms 209.85.243.73 (209.85.243.73)  43.978 ms
    14  ww-in-f104.1e100.net (209.85.229.104)  31.984 ms  31.984 ms  31.984 ms
    
    $ traceroute ferry.eof.eu.org
    traceroute to ferry.eof.eu.org (195.202.1.13), 30 hops max, 40 byte packets
     1  Base-Station-e1c421.local (10.0.1.1)  7.996 ms  7.996 ms  3.998 ms
     2  10.175.104.1 (10.175.104.1)  11.994 ms  15.992 ms  15.992 ms
     3  osr01camd-v15.network.virginmedia.net (62.30.250.97)  39.980 ms  39.980 ms  39.980 ms
     4  osr01hari-tenge71.network.virginmedia.net (62.30.250.33)  27.986 ms  27.986 ms  27.986 ms
     5  bre-bb-a-ae1-0.network.virginmedia.net (195.182.178.165)  47.976 ms  47.976 ms  43.978 ms
     6  bre-bb-b-ae0-0.network.virginmedia.net (213.105.174.226)  23.988 ms  27.986 ms  27.986 ms
     7  telc-ic-1-as0-0.network.virginmedia.net (62.253.185.74)  27.986 ms  11.994 ms  11.994 ms
     8  195.66.226.85 (195.66.226.85)  11.994 ms  31.984 ms  31.984 ms
     9  * * *
    10  212.161.179.106 (212.161.179.106)  39.980 ms  39.980 ms  39.980 ms
    11  195.141.236.206 (195.141.236.206)  39.980 ms  35.982 ms  35.982 ms
    12  e513-e-rci65-3-ne2.cern.ch (192.65.184.78)  39.980 ms  39.980 ms  31.984 ms
    13  192.65.184.61 (192.65.184.61)  31.984 ms  31.984 ms  27.986 ms
    14  gw1-cri.citic74.net (195.202.0.132)  27.986 ms  27.986 ms  27.986 ms
    15  * * *
    16  * * *
    17  * * *
    18  * * *
    19  * * *
    20  * * *
    21  * * *
    22  * * *
    23  * * *
    24  * * *
    25  * * *
    26  * * *
    27  * * *
    28  * * *
    29  * * *
    30  * * *
         

    11.2.7.7. dig

    Source(s):

    Note

    Voir aussi la section SR005 Administrer un serveur DNS > TP1 pour d'autres exemple d'utilisation de la commande dig

    La commande dig remplace ce qui était la commande nslookup. Cette commande sert à diagnostiquer des dysfonctionnements (ou le bon fonctionnement) dans la résolution de nom. (Service DNS).

    
# Retourne les informations sur le domaine concerné.
    $ dig freenix.org	# Information de type A (par défaut)
    $ dig ns freenix.org    # Information de type NS (Name Server = Serveur de Nom)
    $ dig nx freenix.org    # Information de type NX (MX ou Mail eXchanger = Serveur SMTP)
    $ dig any freenix.org   # Tout type d'information
    
    ; >> DiG 9.6.1-P1 >> any freenix.org
    ;; global options: +cmd
    ;; Got answer:
    ;; (HEADER) opcode: QUERY, status: NOERROR, id: 17031
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;freenix.org.			IN	ANY
    
    ;; ANSWER SECTION:
    freenix.org.		259200	IN	SOA	cabale.usenet-fr.net. hostmaster.freenix.org. 2009122101 21600 7200 3600000 259200
    freenix.org.		259200	IN	NS	ns.eu.org.
    freenix.org.		259200	IN	NS	ns6.gandi.net.
    freenix.org.		259200	IN	NS	cabale.usenet-fr.net.
    freenix.org.		259200	IN	NS	ns2.freenix.org.
    freenix.org.		259200	IN	NS	ns.frmug.org.
    freenix.org.		259200	IN	MX	10 ns2.freenix.org.
    
    ;; Query time: 77 msec
    ;; SERVER: 10.0.1.1#53(10.0.1.1)
    ;; WHEN: Thu Dec 24 23:32:52 2009
    ;; MSG SIZE  rcvd: 211
         

    11.2.7.8. host (hôte)

    host interroge les serveurs de noms (DNS). Utilisée pour détecter des dysfonctionnements sur un réseau (serveurs hors services) ou tout simplement pour obtenir le nom d’une machine à partir d’une adresse IP ou l’inverse.

    domainname:

    
$ host ferry.eof.eu.org
    ferry.eof.eu.org has address 195.202.1.13
    $ host 195.202.1.13
    13.1.202.195.in-addr.arpa domain name pointer eof.hosting.cri74.org.     
    $ host linux-france.org
    linux-france.org has address 80.247.225.35
    linux-france.org mail is handled by 50 mx2.nfrance.com.
    linux-france.org mail is handled by 100 mx3.nfrance.com.
    linux-france.org mail is handled by 10 tuxinette.linux-france.org.
         

    11.2.7.9. hostname (nom d'hôte - affiche/configure) // dnsdomainname (nom de domaine - affiche)

    Source(s):

    Le noyau conserve le nom de machine du système. Dans Debian, le script d'initialisation du niveau de fonctionnement S qui est lié symboliquement à « /etc/init.d/hostname.sh » définit le nom de machine « hostname » au moment du démarrage (en utilisant la commande hostname) avec le nom qui est enregistré dans « /etc/hostname ». Ce fichier ne devra contenir que le nom de machine du système et pas un nom de domaine pleinement qualifié.

    
# hostname Commande Options
    $ hostname	# Afficher nom de l'hôte
    debstafil4
    $ hostname -s	# idem
    debstafil4
    $ hostname -a   # Afficher les alias
    debstafil4  fil4 
    $ hostname -f   # Afficher le FQDN (Fully Qualified Name = NomHôte.Domain)
    debstafil4.ermansion.net
    $ hostname -d   # Afficher le domaine (à utiliser au lieu de domainname à proscrire)
    ermansion.net   
    $ dnsdomainname
    ermansion.net   # Même résultat que la commande précédente (à utiliser au lieu de domainname à proscrire)
        
    
# Afficher le nom de l'hôte
    $ hostname			# Méthode 1 et 2: lit le fichier /etc/hostname			
    $ cat /etc/hostname
    $ uname -n			# Méthode 3,4 et 5: lit le fichier /proc/sys/kernel/hostname
    $ cat /proc/sys/kernel/hostname
    $ sysctl kernel.hostname
    
    # Nouveau nom d'hôte, par exemple "filou"
    # Changer le nom de l'hôte temporairement en informant le noyau
    # d'utiliser un nouveau nom jusqu'à la prochaine requête de changement
    # Requiert les droits root ou sudo 
    $ hostname filou                       # Méthode 1
    $ sysctl kernel.hostname=NEW_HOSTNAME  # Méthode 2
    
    # Changer le nom de l'hôte de façon permanente
    # Chaque distribution a un script executé au démarrage pour configurer le nom de l'hôte
    # La méthode diffère selon la distribution:
    #
    # Systèmes basés sur (Debian, Ubuntu, etc.) 
    # Pour changer le nom de domaine de façon permanente, simplement indiquer le nom d'hôte,
    # et seulement le nom (sans qualifier le domaine) dans /etc/hostname et executer /etc/init.d/hostname.sh.
    # 
    # Slackware 
    # Utiliser /etc/HOSTNAME. Configurer le nom approprier en conséquence et executer hostname -F /etc/HOSTNAME
    
    # Sytèmes basés sur Red Hat cherche un ligne HOSTNAME=gauss dans /etc/sysconfig/network. 
    # Pour changer le nom immédiatement executer "hostname filou" as root or simply reboot.     
         

    11.2.7.10. whois

    La commande whois interroge des bases de données (directory services) de registrar pour retourner des informations sur des adresses IP ou des noms réseaux (domaines, servers, etc...).

    
$ whois google.fr
    %%                                       *    .        *     *
    %% This is the AFNIC Whois server.  *          .   .  /.\      .
    %%                                         .         /.^'\  *
    %% complete date format : DD/MM/YYYY    *        *   /'.'\
    %% short date format    : DD/MM      .       *      /.^'.'\    .
    %% version              : FRNIC-2.5           .  .  /'.^'.\  .
    %%                                       *          ^^|_|^^    *
    %% Rights restricted by copyright.
    %% See http://www.afnic.fr/afnic/web/mentions-legales-whois_en
    %%
    %% Use '-h' option to obtain more information about this service.
    %%
    %% [94.170.73.28 REQUEST] >> -V Md4.7 google.fr
    %%
    %% RL Net [##########] - RL IP [#########.]
    %%
    
    domain:      google.fr
    status:      ACTIVE
    hold:        NO
    holder-c:    GI658-FRNIC
    admin-c:     TT599-FRNIC
    tech-c:      MC239-FRNIC
    zone-c:      NFC1-FRNIC
    nsl-id:      NSL4386-FRNIC
    registrar:   eMARKMONITOR Inc. dba MARKMONITOR
    anniversary: 03/06
    created:     27/07/2000
    last-update: 03/06/2009
    source:      FRNIC
    
    ns-list:     NSL4386-FRNIC
    nserver:     ns1.google.com
    nserver:     ns2.google.com
    nserver:     ns3.google.com
    nserver:     ns4.google.com
    source:      FRNIC
    
    registrar:   eMARKMONITOR Inc. dba MARKMONITOR
    type:        Isp Option 1
    address:     Emerald Tech Center
    address:     391 N. Ancestor Place
    address:     ID 83704 BOISE
    country:     US
    phone:       +1 208 389 5740
    fax-no:      +1 208 389 5771
    e-mail:      ccops@markmonitor.com
    website:     http://www.markmonitor.com
    anonymous:   NO
    registered:  10/01/2002
    source:      FRNIC
    
    nic-hdl:     MC239-FRNIC
    type:        ROLE
    contact:     MARKMONITOR CCOPS
    address:     eMarkmonitor Inc. dba MarkMonitor
    address:     PMB 155
    address:     10400 Overland Road
    address:     83709-1433 Boise, Id
    address:     US
    phone:       +01 2083895740
    e-mail:      ccops@markmonitor.com
    admin-c:     DL534-FRNIC
    tech-c:      DL534-FRNIC
    changed:     10/10/2008 ccops@markmonitor.com
    anonymous:   NO
    obsoleted:   NO
    source:      FRNIC
    
    ...
    
         

    11.2.7.11. ip

    Source(s):

    La commande ip sert, entre autres, à la configuration des interfaces réseaux tout comme ifconfig sauf que, ip peut faire beaucoup d’autres choses trés sophistiquées mais est plus complexe. Elle necessite l'installation du paquet iproute (pas installé par défaut). Elle gère très bien tout ce qu’on peut faire en réseau sous GNU/Linux et notament la configurer de tunnel GRE sur une interface.

    
# Afficher l'aide de la commande :)
    $ ip 
    Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
           ip [ -force ] [-batch filename
    where  OBJECT := { link | addr | addrlabel | route | rule | neigh | ntable |
                       tunnel | maddr | mroute | monitor | xfrm }
           OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
                        -f[amily] { inet | inet6 | ipx | dnet | link } |
                        -o[neline] | -t[imestamp] }
    ## Afficher information sur les interfaces réseaux
    $ ip addr
    $ ip addr list
    1: lo: LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth3: BROADCAST,MULTICAST,UP,LOWER_UP> mtu 300 qdisc pfifo_fast state UNKNOWN qlen 1000
        link/ether 08:00:27:89:1d:4f brd ff:ff:ff:ff:ff:ff
        inet 10.0.1.3/8 brd 10.255.255.255 scope global eth3
    
    ## Autres examples
    $ ip link show
    $ ip link list # Equivalent
    1: lo: <:LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 576 qdisc pfifo_fast state UNKNOWN qlen 1000
        link/ether 08:00:27:89:1d:4f brd ff:ff:ff:ff:ff:ff
    
    ## Règle d'exploitation des tables de routage (rule = ~nom de la table)
    $ ip rule list
    
    ## Afficher la route
    $ ip route
    $ ip route list
    $ ip route list table local
    
    ## Ajouter une route à la table de routage pop3
    $ ip route add default via 192.168.0.3 dev eth0 table pop3
    
    ## ARP
    $ ip neigh list				## Afficher la table ARP
    $ ip neigh flush all  ## Vider la table ARP
    
    La page "man ip" est très claire :))
    Pour le reste on verra à l'usure...
         

    QUESTION : Un tunnel c'est un lien (link) encrypté, correct ? Est-ce quel les tunnels utilisés pour les réseaux VPN sont ceux la même créé avec la commande ip ?

    RÉPONSE : un tunnel est un tunnel. Il peut ou non être chiffré. Il y a différents types de tunnels et différentes manières d'en faire, comme en utilisant le protocole GRE par exemple. Nous ferons des tunnels dans l'avenir (de la formation).

    QUESTION : - A quoi sert l'option "-family link" (à ne pas confondre avec l'objet link), dans quel cas est-elle utlisé ? Quel est la difference entre "-family link" et objet "link" ormis le fait que l'un est une option, l'autre un objet...

    RÉPONSE : Voir man ou help ou l'une des ressources indiquées plus haut. Si ce n'est pas là dedans faut aller voir les sources. Apperemment il est rare de trouver quelque chose d'intéressant sur le net qui puisse aider vraiment sur ip.En ce qui concerne le type de trame, si ce n'est pas de l'ipv4 ni de l'ipv6 tu peux préciser si c'est du decnet, de l'afnet, de l'ipx...

    QUESTION : Qu'est ce que l'objet addrlabel ? Comment ça s'utilise, je veux dire dans quel cas ? Comment un label est choisi et pas un autre au moment de l'utilisation dans la table de routage ?

    RÉPONSE : Pas sûr que j'utilises ça dans les mois qui viennent. C'est pour répondre à une problématique particulière décrite dans la RFC 3484 "Default Address Selection for Internet Protocol version 6 (IPv6)". Problème qui ne concerne d'ailleurs pas qu'IPv6 mais aussi IPv4, à savoir (en résumant hyper vite car c'est moins simple que cela), si tu as 1 interface réseaux qui a plusieurs adresses IP (2 en IPv4 et 1 ou 2 en IPv6) tu fais comment pour indiquer celle qui est prioritaire pour les services (résolution de nom...) et que le processus client ne se casse pas la figure après un timeout. Pour du http ce n'est pas trop grave, sur une conversation ça devient plus gênant et s'il 'agit du pilotage d'un drône armé ça peut devenir cata. Caricatural, mais c'est là qu'intervient addrlabel.


    11.2.7.12. ping

    Permet d'envoyer une requête ICMP 'Echo' d'une machine à une autre machine. Si la machine ne répond pas il se peut que l'on ne puisse pas communiquer avec elle. Cette commande réseau de base permet d'obtenir des informations et en particulier le temps de réponse de la machine à travers le réseau et aussi quel est l'état de la connexion avec cette machine (renvoi code d'erreur correspondant).

    
$ ping localhost
    PING localhost (127.0.0.1) 56(84) bytes of data.
    64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.078 ms
    64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.038 ms
    ...
    --- localhost ping statistics ---
    7 packets transmitted, 7 received, 0% packet loss, time 5994ms
    rtt min/avg/max/mdev = 0.036/0.056/0.134/0.035 ms
    
    $ ping google.fr
    PING google.fr (74.125.77.104) 56(84) bytes of data.
    64 bytes from ew-in-f104.1e100.net (74.125.77.104): icmp_seq=1 ttl=63 time=30.5 ms
    64 bytes from ew-in-f104.1e100.net (74.125.77.104): icmp_seq=2 ttl=63 time=497 ms
    ...
    --- google.fr ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3019ms
    rtt min/avg/max/mdev = 30.512/266.418/501.459/233.148 ms
    
    $ ping ferry.eof.eu.org
    PING ferry.eof.eu.org (195.202.1.13) 56(84) bytes of data.
    64 bytes from eof.hosting.cri74.org (195.202.1.13): icmp_seq=1 ttl=63 time=30.2 ms
    64 bytes from eof.hosting.cri74.org (195.202.1.13): icmp_seq=3 ttl=63 time=35.8 ms
    ...
    --- ferry.eof.eu.org ping statistics ---
    5 packets transmitted, 3 received, 40% packet loss, time 4016ms
    rtt min/avg/max/mdev = 30.259/189.525/502.480/221.304 ms
         

    11.2.7.13. mtr

    La commande mtr est un outil de diagnostic réseau qui combine traceroute et ping...!

    
# Installation
    $ sudo apt-get install mtr  # Installed par défaut sur Ubuntu 
                                # mais pas sur Debian
    # Traceroute
    $ mtr -r -c 30 ferry.eof.eu.org
    HOST: debstafil4                 Loss%   Snt   Last   Avg  Best  Wrst StDev
    1. Base-Station-e1c421.local    13.3%    30    0.0   4.8   0.0   8.0   2.5
    2. 10.175.104.1                 16.7%    30   12.0  13.0   4.0  20.0   4.5
    3. osr01camd-v15.network.virgin 13.3%    30   16.0  14.2   8.0  28.0   4.4
    4. osr01hari-tenge71.network.vi 13.3%    30   16.0  15.4   8.0  48.0   8.4
    5. bre-bb-a-ae1-0.network.virgi  6.7%    30    8.0  15.9   4.0  36.0   8.0
    6. bre-bb-b-ae0-0.network.virgi 16.7%    30   16.0  21.1   4.0  76.0  17.9
    7. telc-ic-1-as0-0.network.virg 16.7%    30   12.0  14.7   8.0  36.0   5.6
    8. 195.66.226.85                16.7%    30   36.0  15.8   8.0  48.0  10.1
    9. ???                          100.0    30    0.0   0.0   0.0   0.0   0.0
    10. 212.161.179.106              10.0%    30   40.0  44.8  28.0 184.1  30.4
    11. 195.141.236.206              13.3%    30   32.0  52.9  24.0 240.1  52.4
    12. e513-e-rci65-3-ne2.cern.ch   10.0%    30   32.0  39.4  28.0 140.1  22.5
    13. 192.65.184.61                 3.3%    30   28.0  35.6  28.0  48.0   5.7
    14. gw1-cri.citic74.net          13.3%    30   28.0  34.2  28.0  52.0   6.0
    15. eof.hosting.cri74.org         3.3%    30   36.0  33.9  24.0  48.0   7.3
         

    11.2.7.14. bing

    un testeur de bande passante. Outil de mesure de bande passante brut (raw) en point à point basé sur ping.

    
# Bing n'est pas installé par défaut
    # Pour installer 
    $ apt-get install bing
    
    # Test
    $ bing -S 400 10.0.1.5 google.fr
    BING	10.0.1.5 (10.0.1.5) and ew-in-f104.1e100.net (74.125.77.104)
    44 and 400 data bytes (5696 bits)
    ew-in-f104.1e100.net:  0.003bps  2147483614.984ms 377016084.091292us/bit
    ew-in-f104.1e100.net:  0.003bps  2147483614.984ms 377016084.091292us/bit
    ew-in-f104.1e100.net:  0.003bps  2147483614.984ms 377016084.091292us/bit
    ew-in-f104.1e100.net:  0.003bps  2147483614.984ms 377016084.091292us/bit
    ^Cew-in-f104.1e100.net:  0.003bps  2147483614.984ms 377016084.091292us/bit
    
    --- 10.0.1.5 statistics ---
    bytes   out    in   dup  loss	rtt (ms): min       avg       max   std dev
    44     5     5          0%	        0.000     0.000     0.000     0.000
    400     5     5          0%	        0.000     0.000     0.000     0.000
    
    --- ew-in-f104.1e100.net statistics ---
    bytes   out    in   dup  loss	rtt (ms): min       avg       max   std dev
    44     5     5          0%	       32.016    37.619    48.024     7.801
    400     4     0        100%	
    
    --- estimated link characteristics ---
    host			          bandwidth       ms
    ew-in-f104.1e100.net: not enough received packets
         

    11.2.7.15. telnet (mieux vaux utiliser ssh [ou cURL pour test HTTP])

     

    telnet est une commande permettant de créer une session Telnet sur une machine distante. Cette commande a d'abord été disponible sur les systèmes Unix, puis elle est apparue sur la plupart des systèmes d'exploitation.

    Telnet (TErminal NETwork ou TELecommunication NETwork, ou encore TELetype NETwork) est un protocole réseau utilisé sur tout réseau supportant le protocole TCP/IP. Il appartient à la couche session du modèle OSI et à la couche application du modèle ARPA. Il est normalisé par l'IETF (RFC 854 et RFC 855). Selon, l'IETF, le but du protocole Telnet est de fournir un moyen de communication très généraliste, bi-directionnel et orienté octet.

     
    -- http://fr.wikipedia.org/wiki/Telnet  
    
### Test de connection hôte 10.0.1.5 sur le port 80
    $ telnet 10.0.1.5 80   
    Trying 10.0.1.5...
    Connected to 10.0.1.5.
    Escape character is '^]'.
    GET index.html
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>400 Bad Request</title>
    </head><body>
    <h1>Bad Request</h1>
    <p>Your browser sent a request that this server could not understand.<br />
    </p>
    <hr>
    <address>Apache/2.2.9 (Debian) Server at debstafil4.ermansion.net Port 80</address>
    </body></html>
    Connection closed by foreign host.
        

    11.2.7.16. cURL/libcurl (Test requête HTTP,FTP,etc... en ligne de commande - automatiser les jobs HTTP)

    Source(s):

    cURL est un outil en ligne de commande (basé sur la bibliothèque logicielle libcurl) pour transferrer/récupérer des données/ressources accessibles sur un réseau informatique via divers protocols. Les protocoles supportés sont : FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, FILE et LDAP.

    La ressource est désignée à l'aide d'une URL. Le logiciel permet de créer ou modifier une ressource (contrairement à wget, l'écriture peut se faire en HTTP en utilisant les commandes POST ou PUT), il peut ainsi être utilisé en tant que client REST.

    La bibliothèque libcurl est accessible aux programmeurs qui veulent disposer des fonctionnalités d'accès au réseau dans leurs programmes. Des interfaces ont été créées dans de nombreux langages (C++, Java, .NET, Perl, PHP, Ruby...).

    Note

    cURL est un bon remplacement de Telnet pour tester des requêtes HTTP et visualiser les en-tête et réponses.

    
# Requête HTTP GET standard sur port 80
    $ curl http://google.fr    
    # Réponse (contenu) 
    <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
    <TITLE>301 Moved</TITLE></HEAD><BODY>
    <H1>301 Moved</H1>
    The document has moved
    <A HREF="http://www.google.fr/">here</A>.
    </BODY></HTML>
    
    # Inclure l'en-tête HTTP
    $ curl http://google.fr -i  # avec le contenu de la réponse 
    $ curl http://google.fr -I  # sans le contenu (affiche uniquement l'en-tête) 
    HTTP/1.1 301 Moved Permanently
    Location: http://www.google.fr/
    Content-Type: text/html; charset=UTF-8
    Date: Sat, 29 May 2010 09:14:29 GMT
    Expires: Mon, 28 Jun 2010 09:14:29 GMT
    Cache-Control: public, max-age=2592000
    Server: gws
    Content-Length: 218
    X-XSS-Protection: 1; mode=block
    (...)  
    
    # Afficher des statistiques (utile pour verifier des transferts de fichier PUT, GET)
    # Requiert de rediriger le resultat de requête (option -o)
    $ curl http://google.fr -o resultat.txt
     % Total   % Received  % Xferd  Average Speed   Time     Time     Time     Current
                                    Dload   Upload  Total    Spent    Left     Speed
    109  218    109  218    0  0    237     0     --:--:-- --:--:-- --:--:--   683
        

    11.2.7.17. nc (netcat) Couteau Suisse TCP/IP de l'armée ! [peu remplacer telnet]

    Source(s):

     

    netcat est un utilitaire permettant d'ouvrir des connexions réseau, que ce soit UDP ou TCP. Il est conçu pour être incorporé aisément dans un large panel d'applications. En raison de sa polyvalence, netcat est aussi appelé le « couteau suisse du TCP/IP ». Il existe sur plusieurs systèmes d'exploitation et s'utilise en ligne de commande.

    Il peut être utilisé pour connaître l'état des ports à la façon d'un scan de ports.

     
    -- http://fr.wikipedia.org/wiki/Netcat  
    
### Test de connection hôte 10.0.1.5 sur le port 80
    $ nc 10.0.1.5 80
    get index.html
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>400 Bad Request</title>
    </head><body>
    <h1>Bad Request</h1>
    <p>Your browser sent a request that this server could not understand.<br />
    </p>
    <hr>
    <address>Apache/2.2.9 (Debian) Server at debstafil4.ermansion.net Port 80</address>
    </body></html>
        

    11.2.7.18. iftop

    Source(s):

    iftop permet de mesurer le trafic sur une interface réseau

    
$ iftop -i eth3
       

    11.2.8. Utilisation de commandes réseau

    Source(s):

    L'objectif dans cet exercise est de découvir les relations entre les routeurs, la topographie d'Internet, au moins en partie, etc... de voir comment nous sommes tous interconnectés et comment certaines passerelles peuvent être incontournable (noeud racine du réseau Internet).

    Figure 11-5. Diagramme - Traceroute

    
######
    ## Voici mes tentatives du jour... toutes ne marchent pas sauf les deux dernières, miracle !
    # 
    
    ## Trace vers ÉOF
    # tracert ferry.eof.eu.org
    # tcptraceroute ferry.eof.eu.org
    # traceroute ferry.eof.eu.org -w 0.5
    # traceroute ferry.eof.eu.org -w 0.5 -N 1
    # traceroute ferry.eof.eu.org -w 0.5 -N 1 -p 80
    # traceroute ferry.eof.eu.org -w 0.5 -N 1 -p 80 -q 1
    # traceroute ferry.eof.eu.org -w 0.5 -N 1 -p 80 -q 1 -F
    # traceroute ferry.eof.eu.org -w 0.5 -N 1 -p 80 -q 1 -F -I
    
    # traceroute ferry.eof.eu.org -N 1 -p 80 -q 1 -F -I	
    # traceroute ferry.eof.eu.org -N 1 -p 443 -I		# Les options minimum à indiquer sont:
                                                            # -N 
    traceroute to ferry.eof.eu.org (195.202.1.13), 30 hops max, 40 byte packets
     1  Base-Station-e1c421.local (10.0.1.1)  12.006 ms
     2  10.175.104.1 (10.175.104.1)  12.006 ms
     3  osr01camd-v15.network.virginmedia.net (62.30.250.97)  16.008 ms
     4  osr01hari-tenge71.network.virginmedia.net (62.30.250.33)  12.006 ms
     5  bre-bb-a-ae1-0.network.virginmedia.net (195.182.178.165)  16.008 ms
     6  bre-bb-b-ae0-0.network.virginmedia.net (213.105.174.226)  16.008 ms
     7  telc-ic-1-as0-0.network.virginmedia.net (62.253.185.74)  12.006 ms
     8  195.66.226.85 (195.66.226.85)  16.008 ms
     9  *
    10  212.161.179.106 (212.161.179.106)  28.014 ms
    11  195.141.236.206 (195.141.236.206)  28.014 ms
    12  e513-e-rci65-3-ne2.cern.ch (192.65.184.78)  32.016 ms
    13  192.65.184.61 (192.65.184.61)  24.012 ms
    14  gw1-cri.citic74.net (195.202.0.132)  36.018 ms
    15  eof.hosting.cri74.org (195.202.1.13)  28.014 ms
    
    ## Trace de moi vers Christiane
    # traceroute 86.67.63.125 -N 1 -p 80 -I 
    traceroute to 86.67.63.125 (86.67.63.125), 30 hops max, 40 byte packets
     1  Base-Station-e1c421.local (10.0.1.1)  4.002 ms  8.004 ms  4.002 ms
     2  10.175.104.1 (10.175.104.1)  8.004 ms  16.008 ms  12.006 ms
     3  osr01camd-v11.network.virginmedia.net (62.30.144.161)  12.006 ms  28.014 ms  20.010 ms
     4  osr01hari-tenge71.network.virginmedia.net (62.30.250.33)  12.006 ms  12.006 ms  12.006 ms
     5  bre-bb-a-ae1-0.network.virginmedia.net (195.182.178.165)  36.018 ms  20.010 ms  12.006 ms
     6  gfd-bb-b-as1-0.network.virginmedia.net (212.43.163.105)  12.006 ms  32.016 ms  24.012 ms
     7  redb-ic-1-as0-0.network.virginmedia.net (62.253.185.78)  8.004 ms  16.008 ms  12.006 ms
     8  linx.n9uf.net (195.66.224.214)  40.020 ms  24.012 ms  24.012 ms
     9  145.178.96-84.rev.gaoland.net (84.96.178.145)  44.022 ms  24.012 ms  40.020 ms
    10  154.243.103-84.rev.gaoland.net (84.103.243.154)  28.014 ms  40.020 ms  28.014 ms
    11  206.237.70-86.rev.gaoland.net (86.70.237.206)  32.016 ms  52.026 ms  28.014 ms
    12  125.63.67-86.rev.gaoland.net (86.67.63.125)  72.036 ms  64.032 ms  64.032 ms
    
    ## Trace de moi vers Pierre-Yves
    $ traceroute 82.67.118.36 -N 1 -p 80 -I 
    traceroute to 82.67.118.36 (82.67.118.36), 30 hops max, 40 byte packets
     1  Base-Station-e1c421.local (10.0.1.1)  8.004 ms  0.000 ms  0.000 ms
     2  10.175.104.1 (10.175.104.1)  12.006 ms  20.010 ms  20.010 ms
     3  osr01camd-v15.network.virginmedia.net (62.30.250.97)  140.070 ms  156.078 ms  204.102 ms
     4  osr02hari-tenge71.network.virginmedia.net (62.30.250.45)  16.008 ms  16.008 ms  12.006 ms
     5  pop-bb-b-ae1-0.network.virginmedia.net (195.182.178.169)  12.006 ms  16.008 ms  8.004 ms
     6  pop-bb-a-ae0-0.network.virginmedia.net (213.105.174.229)  12.006 ms  20.010 ms  16.008 ms
     7  amst-ic-1-as0-0.network.virginmedia.net (213.105.175.6)  16.008 ms  28.014 ms  20.010 ms
     8  amsix-6k-1.routers.proxad.net (195.69.144.251)  24.012 ms  24.012 ms  20.010 ms
     9  londres-6k-1-po100.intf.routers.proxad.net (212.27.56.41)  20.010 ms  32.016 ms  32.016 ms
    10  bzn-crs16-1-be1102.intf.routers.proxad.net (212.27.51.185)  48.024 ms  52.026 ms  36.018 ms
    11  cbv-6k-1-po20.intf.routers.proxad.net (212.27.50.190)  32.016 ms *  36.018 ms
    12  * * rennes-6k-1-v804.intf.routers.proxad.net (212.27.50.142)  48.024 ms
    13  vil35-1.dslg.proxad.net (213.228.11.145)  40.020 ms  44.022 ms  44.022 ms
    14  * * *
    15  vil35-1-82-67-118-36.fbx.proxad.net (82.67.118.36)  68.034 ms  64.032 ms  68.034 ms
    
    ## Trace de Christiane vers moi
    $ sudo traceroute 94.170.73.28 -N 1 -p 80 -q 1 -F -I
    [sudo] password for chr:
    traceroute to 94.170.73.28 (94.170.73.28), 30 hops max, 60 byte packets
     1  neufbox (192.168.1.1)  4.149 ms
     2  *
     3  205.237.70-86.rev.gaoland.net (86.70.237.205)  43.286 ms
     4  153.243.103-84.rev.gaoland.net (84.103.243.153)  44.054 ms
     5  *
     6  195.66.224.23 (195.66.224.23)  58.086 ms
     7  gfd-bb-b-as0-0.network.virginmedia.net (62.253.185.77)  58.785 ms
     8  bre-bb-a-as3-0.network.virginmedia.net (212.43.163.106)  63.355 ms
     9  osr01hari-pc200.network.virginmedia.net (195.182.178.166)  61.672 ms
    10  osr01camd-tenge71.network.virginmedia.net (62.30.250.34)  61.807 ms
    11  camd-cmts-10-ge02.network.virginmedia.net (62.30.144.181)  61.740 ms
    12  cpc3-camd10-0-0-cust283.hari.cable.virginmedia.com (94.170.73.28)  73.569 ms
    

    11.2.9. Init : initialisation du système sous Linux

    Source(s):


    11.2.9.1. Processus de BOOT (5 étapes d'initialisation)

    • BIOS ==> charge bootstrap qui contient chargeur

    • Chargeur de Système (Grub, LILO, autres...) ==> charge noyau

    • Noyau de Linux (micro-système) ==> initialise matériel et périphériques, charge pilote et module, start programme init

    • Init (programme et periphériques) ==> execute d'autres scripts et programmes (/etc/init.d/rcS puis /etc/rcx.d)

    • Extensions et services (daemons)


    11.2.9.2. Les niveaux d'execution (N)

    • S : Initialiser le système au démarrage

    • 0 : Arrêter le système

    • 1 : Mode mono-utilisateur

    • 2 à 5 : Différents modes multi-utilisateurs

    • 6 : Redémarrer le système

    
## Afficher le niveau d’exécution en cours
    $ runlevel 
    N 5 
        

    Note

    Le niveau d'execution est défini dans /etc/inittab (ex: "id:2:initdefault:"). Suivant la distribution, ce niveau par défaut peut être différent : Debian 2, Mandriva 5, etc...

    Question: A quoi serve les differents mode multi-utilisateurs ? Dans quel cas sont-ils utilisés ?

    Réponse: [2 : réseau][3 : multi utilisateur][4 : xdm][5 : X] mais bon, c'est pour les vieux de la vieille, ça n'a plus aucun sens maintenant. man init.

    Question: Pour le niveau 5, est-ce que tous les scrips des niveaux précédent (excpté 0) sont-ils executés ou uniquement ceux du niveau 5 ? Est-ce que le système passe par chacun des niveaux avant d'atteindre celui souhaité ?

    Réponse: les scripts présents dans 2, 3 ou 4 sont-ils présent dans 5 ? Si oui, la réponse est implicite... en fait c'est le cas donc on va directement au niveau souhaité sans passé par les autres...


    11.2.9.3. Changer le niveaux d'execution (/sbin/telinit)

    Le niveau d'execution peut-être changé si un administrateur exécute la commande /sbin/telinit qui envoie les signaux appropriés au processus init pour lui indiquer de changer le niveau d'exécution. Mais d'autres méthode existes...

    Pour changer le niveau d'execution:

    
### Par défaut...  
    # Le mode d'exécution par défaut peut être modifié dans /etc/inittab (action initdefault)
    
    ### Lors du démarrage de Linux...
    # A l’affichage du prompt
    boot: linux single	## Mode mono-utilisateur
    # ou
    boot: linux 1
    
    ### En cours d'exécution...
    $ /sbin/telinit 5  ## (Re-)Initialise le système au niveau d'execution 5
          


    11.2.9.4. /sbin/init & /etc/inittab

    • /sbin/init : Program (ou commande) d'initialisation. Premier processus lancé après démarrage du noyau.

      
## (Re-)Initialise le système au niveau d'execution 5
      $ /sbin/init 5  
      # ou
      $ /sbin/telinit 5  # Préférable de passer par telinit
          	

    • /etc/inittab : Fichier de configuration tu processus d'initialisation. Consulter la page de manuel: man inittab

      
$ cat /etc/inittab
      ...
      # The default runlevel.
      id:2:initdefault:             ## Niveau d'execution par défaut
      ...
      # Boot-time system configuration/initialization script.
      si::sysinit:/etc/init.d/rcS   ## Premier script d'initialisation démarré
      ...
      l0:0:wait:/etc/init.d/rc 0    ## Suite d’instructions: "code:niveau d’action:action:commande"
      l1:1:wait:/etc/init.d/rc 1    ## Pour initialiser au niveau d'execution souhaité	
      l2:2:wait:/etc/init.d/rc 2
      ...
      
      ###
      code:             reference unique de l'enregistrement dans inittab
      
      niveau d’action:  liste des niveaux d'exécution pour lesquels l'action doit être lancée
      
      action:           action à executer: 
                        - respawn (redémarré si terminer), 
                        - wait (init attends la fin d'execution du processus),
                        - once (exécuter processus une fois seulement)
                        - boot (exécuter processus au démarrage)
                        - initdefault (définir niveau d'exécution après démarrage)
                        - sysinit (exécuter processus au démarrage avant "boot") 
      
      commande:         processus à exécuter
      ###
          	

    Note

    Le fichier de configuration d’init, /etc/inittab, spécifie que le premier script à exécuter est /etc/init.d/rcS (rc.sysinit sur d’autres distributions que Debian).

    Note

    Il y a plusieurs versions d’init : BSD, System V. BSD a ses fichiers de configuration dans /etc tandis que System V (prononcer système cinq) a ses fichiers dans un sous-dossier de /etc/rc.d. init System V tend à devenir le standard sous Linux.


    11.2.9.5. dmesg & /var/log

    • dmesg : les messages de la phase de démarrage sont consultables avec cette commande.

      
$ dmesg | more
      [    0.000000] Initializing cgroup subsys cpuset
      [    0.000000] Initializing cgroup subsys cpu
      [    0.000000] Linux version 2.6.26-2-686 (Debian 2.6.26-19lenny2) (dannf@debian
      .org) (gcc version 4.1.3 20080704 (prerelease) (Debian 4.1.2-25)) #1 SMP Wed Nov
       4 20:45:37 UTC 2009
      [    0.000000] BIOS-provided physical RAM map:
      [    0.000000]  BIOS-e820: 0000000000000000 - 000000000009fc00 (usable)
      [    0.000000]  BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved)
      [    0.000000]  BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved)
      [    0.000000]  BIOS-e820: 0000000000100000 - 0000000018ff0000 (usable)
      [    0.000000]  BIOS-e820: 0000000018ff0000 - 0000000019000000 (ACPI data)
      [    0.000000]  BIOS-e820: 00000000fffc0000 - 0000000100000000 (reserved)
      [    0.000000] WARNING: strange, CPU MTRRs all blank?
      [    0.000000] ------------[ cut here ]------------
      [    0.000000] WARNING: at arch/x86/kernel/cpu/mtrr/main.c:696 mtrr_trim_uncache
      d_memory+0x178/0x183()
      [    0.000000] Modules linked in:
      [    0.000000] Pid: 0, comm: swapper Not tainted 2.6.26-2-686 #1
      [    0.000000]  [<c01225f3>] warn_on_slowpath+0x40/0x66
      [    0.000000]  [<c02b9b2b>] _spin_lock_irqsave+0x16/0x2f
      [    0.000000]  [<c02b9bb9>] _spin_unlock_irqrestore+0xd/0x10
      [    0.000000]  [<c0122a94>] release_console_sem+0x173/0x18c
      [    0.000000]  [<c0122f0b>] vprintk+0x2d2/0x2de
      --Plus--
          	

    • /var/log : Fichier de journalisation des messages de la phase de démarrage.


    11.2.9.6. /etc/init.d/rcS & /etc/init.d/rcS.d

    • /etc/init.d/rcS : Script d'initialisation système. Premier script lancé par init. Il lance tous les scripts localisés dans /etc/init.d/rcS.d

    • /etc/init.d/rcS.d : Contient des liens symboliques (ln -s) vers des scripts qui sont dans /etc/init.d, tous ces scripts sont lancés par /etc/init/d/rcS dans leur ordre d'apparition, pour exécuter des initialisations comme la vérification et le montage des systèmes de fichiers, le chargement des modules, le démarrage des services réseau, le réglage de l’horloge et l’exécution d’autres initialisations.


    11.2.9.7. /etc/init.d & /etc/rcN.d (N = chiffre entre 0 et 6)

    Quand le script /etc/init.d/rcS se termine, init va ensuite exécuter tous les scripts associés à un niveau d’exécution (runlevel) souhaité.

    • /etc/init.d/rcN.d : Les répertoires rc0.d à rc6.d correspondent aux programmes qui seront chargés en fonction du niveau d’exécution de Linux. Ces repertoires contiennent des liens symboliques (ln -s) vers des scripts qui sont dans /etc/init.d, tous les scripts localisés dans /etc/init.d/rcN.d sont lancés par /etc/init dans leur ordre d'apparition, pour exécuter des initialisations correspondant au niveau d'execution N. Par exemple, si 2 est le niveau d’exécution souhaité, le système va exécuter les scripts qui sont dans /etc/rc2.d. Si le script commence par K il sera arrêté (killé). S’il commence par S, il sera démarré (start).

    • /etc/init.d : Contient tous les scripts d'initialisation, un script par service lancé au démarrage (nfs, ftp, inet. . .). Tous les scripts dans /etc/init.d/rcX.d (X=[S|0|1|2|3|4|5|6]) sont des liens symboliques pointant vers les scripts qui sont dans /etc/init.d. Ceci afin de ne pas multiplier les scripts sur la machine.


    11.2.9.8. /etc/rc.local, /etc/rc.boot, /etc/rc.d, rc.serial, rc.news...

    • /etc/rc.local : Dans Debian, il n’y a pas non plus de script rc.local par défaut. Il est possible d’en mettre un dans /etc/init.d, mais il faut s’assurer qu’il est exécuté en dernier, avant le chargement de l’interface graphique. Ce script sert souvent, à l’administrateur pour modifier la configuration globale du système une fois celle-ci terminée par le système.

    • /etc/rc.boot : Les scripts de ce dernier dossier sont habituellement réservés à l’administrateur système, et leur utilisation dans des paquets est obsolète.

    • /etc/rc.d : Debian n’utilise pas de répertoire rc.d mais démarre son arborescence directement à partir de /etc. Le répertoire rc.d peut contenir également les fichiers rc.local, rc.serial, rc.news. . .

    • rc.serial, rc.news. : D'autres scripts d'initialisation pouvant exister...


    11.2.9.9. Utilitaire de configuration: update-rc.d & rcconf

    Permettent de configurer le lancement des services. Il crée ou supprime automatiquement les liens symboliques vers les scripts d’initialisation de type System-V. La commande update-rc.d est plus généralement utilisée. L’outil rcconf est un outil pratique sous Debian.

    
# Démarre le daemon /etc/init.d/daemonx dans les niveaux 2,3,4,5 et 
    # le stopper dans les niveaux 0,1,6 
    # pour une priorité (ou ordre de lancement) 20
    
    $ update-rc.d daemonx start 20 2 3 4 5 . stop 20 0 1 6 .
    
    # Pour désactiver le script complètement
    $ update-rc.d -f daemonx remove
       

    11.2.9.10. Démarrer/Arrêter un service

    
$ /etc/init.d/NomDuService stop
    $ /etc/init.d/NomDuService start
    $ /etc/init.d/NomDuService status   # pour certains
    $ /etc/init.d/NomDuService          # vous donne l’usage
        

    Si vous avez besoin de lancer un script il est toujours possible de le créer dans /etc/init.d et de l’initialiser pour qu’il soit exécuté dans les runlevels que vous voulez. Voir ci-avant.

    Pour exécuter une commande à chaque lancement, vous pouvez utiliser le script rc.local (ce script est exécuté en dernier, il permet d’adapter la configuration de votre système.

    Ce script n’existant pas sous Debian, il est possible de le créer:

    
# Mettre rc.local (mon code) dans /etc/init.d.
    $ emacs /etc/init.d/rc.local
    (coder ici)
    
    # Rendre le script executable.
    $ chmod 755 /etc/init.d/rc.local
    
    # Créez les liens symbolique avec update-rc.d de façon 
    # à ce qu’il soit exécuté en dernier dans les niveaux d’exécution souhaité.
    $ update-rc.d rc.local defaults 99  ## À adapter
       


    11.2.9.11. Arrêter le système: shutdown, halt, reboot, poweroff

    Source(s):

    • shutdown : Éteindre le système

      
Syntaxe: /sbin/shutdown [-t sec] [-arkhncfFHP] time [warning-message]
          	

    • halt : Arrêter le système

    • reboot : Redémarrer le système

    Note

    Ne pas utiliser halt ou reboot mais préférer shutdown. Sur les anciens système, halt et reboot ne doivent pas être invoqué directement. Depuis la version 2.74. ces deux commandes invoque shutdown si le système n'est pas en niveau d'exécution 0 ou 6.

    
# Arrêter le système immédiatement 
    $ shutdown -h now  ## -h pour halt
    # ou
    $ halt
    
    # Re-démarrer le système (Arrêter et relancer)
    $ shutdown -r now  ## -r pour reboot
    # ou
    $ reboot
    
    # Arrêter le système et prévenir les utilisateurs par un message
    # Les utilisateurs auront un message sur leur console et auront le temps de quitter leur session.
    $ shutdown -h +10 "les services réseaux vont s’arrêter et reprendre dans 10 minutes"
    
    # le temps peut être indiqué :
    # au délai: +m (m=nombre de minutes)
    # à l'heure: hh:mm (hh=heure d'horloge, mm=minutes)
    
    # Autres options:
    # -c annule la procédure d'arrêt en cours
    # -k n'agit pas, mais envoi le messages aux utilisateurs 
    # -f ne pas contrôler le système de fichier (fsck) au démarrage.
    # -F forcer un contrôle du système de fichier (fsck) au démarrage.
    # -a utilise /etc/shutdown.allow pour vérifier si l'utilisateur est autorisé ou non à éteindre
    # -P arrêter et éteindre le courant
       

    QUESTION: J'ai essayé de créer un fichier /etc/shutdown.allow avec mon nom d'utilisateur mais la commande shutdown refuse de s'executer même avec l'option -a le compte root semble requis..., pourquoi ? Faut-il redémarrer un service pour le changement être effectif ?

    Peut être parce que ta commande shutdown n'appartient qu'à root ? Et pourquoi passer par là au lieu de passer par un su ou sudo ?

    
$ ls -l /sbin/shutdown 
    -rwxr-xr-x 1 root root 18196 aoû 12  2008 /sbin/shutdown
       

    RÉPONSE: Quand un utilisateur est enregistré dans shutdown.allow, cela ne signifie pas qu'il peut invoquer la commande shutdown (ou halt, reboot) mais plutôt que l'utilisateur pourra éteindre la machine via CTRL+ALT+DEL si tant es que cela soit configurer dans /etc/inittab. La commande shutdown ne peut-être utilisé que par root. Pour qu'un utilisateur puisse l'utiliser, il doit passer par la commande sudo si tant est qu'il ait les droits d'accès nécessaire comme definit dans le fichier /etc/sudoers (utilser la commande visudo pour modifier ce fichier). [Source: http://www.spencerstirling.com/computergeek/shutdown.html]


    11.2.9.12. Upstart ou le successeur de init

    Source(s):

    upstart est donné comme le successeur d’init et upstart devrait aussi remplacer à terme, cron, atd, anacron et peut-être même inetd. Développé à l’initiative de Canonical Ltd, la société à l’origine de la distribution ubuntu doit répondre à des nouvelles contraintes qu’amènent les nouveaux noyaux Linux et les nouvelles technologies comme les périphériques hotplug USB.

    upstart fonctionne de manière asynchrone et remplit déjà les tâche d’init. Il gère le lancement des tâches et daemons au démarrage de la machine et s’occupe également de l’arrêt lors du shutdown. Cependant, il assure en plus une supervision pendant le fonctionnement du système.

    upstart utilise les notions de jobs et d’événements.

    • Jobs (placés dans /etc/event.d/) et Evènements : Un job est un script shell qui contient les actions à réaliser en fonction des évènements qui arrivent (par exemple start ou stop).

      Le langage utilisé pour les scripts qui est beaucoup plus riche que ce qui est utilisé avec init. La notion de gestion d’évènements prend toute sa dimension car il est possible de déclencher de traitement avant ou après (pre-start, post-start) le lancement d’un script, avant ou après (pre-stop, post-stop) l’arrêt d’un script.

      
## Lister les jobs
      $ ls /etc/event.d/ | sort
             

      QUESTION: Pourquoi sur ma machine Ubuntu 9.10 il n'y a pas de dossier event.d ormis le fait que upstart n'est peut-être pas installé ?

      RÉPONSE: /etc/event.d no longer used. The version of upstart included in Ubuntu 9.10 no longer uses the configuration files in the /etc/event.d directory, looking to /etc/init instead. No automatic migration of changes to /etc/event.d is possible. If you have modified any settings in this directory, you will need to reapply them to /etc/init in the new configuration format by hand.

    • /etc/event.d/rc-default : Sur les systèmes ubuntu, le fichier /etc/event.d/rc-default indique le niveau d’exécution (runlevel) par défaut (niveau 2 par défaut).

    • initctl : commande de contrôle des daemons prise en charge par upsart. Elle permet d’obtenir la liste des services actifs, en arrêter, en lancer...

      
## Documentation 
      $ man initctl
      $ initctl --help
      $ initctl help
      commandes de Tâche :
        start                       Start job.
        stop                        Stop job.
        restart                     Restart job.
        reload                      Send HUP signal to job.
        status                      Query status of job.
        list                        List known jobs.
      
      commandes de Évènement :
        emit                        Emit an event.
      
      Autres commandes :
        reload-configuration        Reload the configuration of the init daemon.
        version                     Request the version of the init daemon.
        log-priority                Change the minimum priority of log messages from
                                      the init daemon
        help                        display list of commands
              
      
## Exemples
      $ initctl list         # Liste services et leur status (+PID)
      $ initctl status gdm   # Liste status du service gdm
      $ initctl stop gdm     # Arrêter le service gdm
      $ initctl start gdm    # Démarrer le service gdm
              

    Note

    Un exemple concret est passé en revue dans le poly de l'ÉOF.


    11.2.10. Modifier l’étape de boot

    Source(s):

    Il est possible de réaliser des traitements automatiquement lors de l’initialisation du système. Des squelettes de scripts sont fournis avec la distribution.

    Questions à se poser:

    • Avons nous juste quelques commandes à passer (scripts simples) ou souhaitons-nous lancer un service serveur (daemon) ?

    • Y a t-il juste un traitement au lancement du système, uniquement à l’arrêt ou alors aux deux ?

    • Les commandes doivent-elles être lancées avant les autres services ou à la fin ?

    rc.local : Une solution qui permet de faire exécuter un script au boot après le lancement de tous les services, est d'utiliser le script rc.local. Cela revient, à utiliser une solution des niveaux d’init de le mettre en S99z pour être sûr qu’il soit exécuté en dernier, les scripts étant lancés par ordre alphabétiques.

    Deux autres solutions :

    
- Daemon : réaliser simplement un daemon (étudier plus loin dans le journal)
    - Upstart: utiliser upstart pour remplacer rc.local
       


    11.2.11. Exercice - Évaluation

    Source(s):

    
######
    ## SR004-net01-ch07-Exercice1
    #
    
    # – Donnez les commandes qui permettent de configurer les interfaces réseaux et les routes.
    "ifconfig" et "ip" pour les interfaces réseaux
    "route" et "ip" pour la table de routage
    
    # – Dans quel fichier sont stockés les paramètres de configuration des interfaces réseaux ?
    /etc/network/interfaces
    
    # – J’arrive à joindre le serveur de l’entreprise mais je n’arrive pas à joindre de sites sur internet 
    # alors que mon collègue, lui y arrive. Quel types de problèmes peut-il y avoir ?
    Problème de routage. Les deux machines n'ont certainement pas la même passerelle (gateway) par défaut
    
    # – J’arrive à joindre le serveur de l’entreprise avec ping quand je mets l’adresse ip mais ça ne fonctionne pas quand j’utilise son nom d’hôte. Quel types # de problèmes peut-il y avoir ?
    Problème de résolution de noms de domaine. Essayer la commande dig.
    Vérifier les fichier /etc/hosts, /etc/resolv.cong
    Vérifier que le serveur DNS est accessible sur le réseau (ping, statistics, etc...)
    Vérifier que le service DNS sur le réseau est accessible et operationel
    
    # – J’ai changé l’adresse réseau dans le fichier de configuration, mais quand je fais un :
    # $ ip addr 
    # en fait son adresse n’a pas changé. Que peut-il se passer ?
    Tout comme pour hostname, les fichiers de configuration réseau ne sont lu qu'au démarrage de la machine pour ensuite être stocké dans le noyau au niveau de l'interface réseau.
    Tout changement dans le fichier de configuration doit-être suivit d'une commande qui ré-initialise les paramêtre dans le noyau et donc sur l'interface réseau, un redémarrage du service réseau devrait faire l'affaire... à l'aide des commandes ifconfig, ifup/ifdown ou ip...
    
    QUESTION1: Pour mettre à jour les interfaces réseaux suite à un changement de configuration, qu'elle est la meilleure methode ensuite commande (ifdown/ifup ou ip) ou service(deamon) networking à redémarrer pour effictivement mettre à jour ?
    
    Stopper l'interface réseau eth0 :
    ifdown eth0
    
    Démarrer l'interface réseau eth0 :
    ifup eth0
    
    Ceci ne doit pas être confondu avec la commande qui suit, qui relance explicitement tous les services réseaux et pas uniquement les interfaces :
    /etc/init.d/networking restart
    
    Rappel : pour connaître vos différentes interfaces réseau, on peut utilisez la commande :
    /sbin/ifconfig -a
    
    RÉPONSE1: Pour tout mettre à jour, même les routes, il vaut mieux passer par le script de redémarrage que de faire tomber et remonter une interface, puisque ça ne s'occupe que ... de l'interface.
    
    QUESTION2:- Si j'ai bien compris le service redémarre tous ce qui est lié au réseau alors que la commande n'agit que sur les interfaces, correct ?
    
    RÉPONSE2: Lisons le contenu du script..., humm! Il semble que le script utilise les commandes ifup/ifdown mais en plus il log les message, traite les options et vérifie le system de fichier réseau avant de stopper l'interface. Pour ce qui est d'Ubuntu on peut voir qu'il utilise upstart...
        

    11.2.12. Autres questions

    Lorsque Christophe fais des traceroute, il obtiens assez fréquemment des adresses de routeurs traversés en 10.125.x.x

    Par exemple :

    
$ whois 10.125.237.14 
         

    L'IANA délègue la gestion des .fr à l'AFNIC, mais que vient faire cette adresse sur sa route ???

    Il y a deux ou trois possibilités :

    
- il reste chez le même fournisseur et dans ce cas, le traceroute montre les passerelles par défaut en interne
    - il passe par différents fournisseurs et la patte par défaut du routeur pointe vers une adresse privée
    - il n'y a pas de problème à router un réseau non routable si tu restes sur ton réseau interne
         


    11.2.13. Atelier - Fichier Hosts

    Source(s):

    Dans un réseau, on assigne généralement un nom à chaque hôte. Le terme d’hôte est pris dans son sens large, c’est à dire un nœud de réseau. Une imprimante, un routeur, un serveur, un poste de travail sont des nœuds qui peuvent avoir un nom d’hôte, s’ils ont une adresse IP.

    Le nom permet d’adresser le noeud, autrement qu’avec l’adresse IP.

    Le protocole TCP/IP se charge de la résolution des noms d’hôtes, ensuite le protocole ARP, se charge de la résolution des adresses IP en adresses MAC (Ethernet le plus souvent).

    Avec un fichier /etc/hosts contenant :

    
127.0.0.1  localhost   localhost.ermansion.net
    
    10.0.1.5   debstafil4.ermansion.net   debstafil4   fil4
    
    10.0.1.4   macfil.ermansion.net   macfil   hsbuntu
    
    10.0.1.3   debstafil3.ermansion.net   debstafil3
    
    
    195.202.1.13   ferry  ## Raccourci ;-)
       
    Je teste...
    
$ ping -c 1 localhost
    PING localhost (127.0.0.1) 56(84) bytes of data.
    64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.052 ms
    
    $ ping -c 1 localhost.ermansion.net
    PING localhost (127.0.0.1) 56(84) bytes of data.
    64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.059 ms
    
    $ ping -c 1 debstafil4.ermansion.net
    PING debstafil4.ermansion.net (10.0.1.5) 56(84) bytes of data.
    64 bytes from debstafil4.ermansion.net (10.0.1.5): icmp_seq=1 ttl=64 time=0.057 ms
    
    $ ping -c 1 debstafil4
    PING debstafil4.ermansion.net (10.0.1.5) 56(84) bytes of data.
    64 bytes from debstafil4.ermansion.net (10.0.1.5): icmp_seq=1 ttl=64 time=0.051 ms
    
    $ ping -c 1 hsbuntu
    PING macfil.ermansion.net (10.0.1.4) 56(84) bytes of data.
    64 bytes from macfil.ermansion.net (10.0.1.4): icmp_seq=1 ttl=64 time=43.6 ms
    
    $ ping -c 1 ferry
    PING ferry (195.202.1.13) 56(84) bytes of data.
    64 bytes from ferry (195.202.1.13): icmp_seq=1 ttl=52 time=30.2 ms
       
    Et encore...
    
$ telnet fil4 3306       ## Resolution du nom d'hôte OK 
    Trying 10.0.1.5...       ## Connection KO - Normal le serveur n'écoute pas sur cette addresse
    telnet: Unable to connect to remote host: Connection refused
    
    $ telnet localhost 3306  ## Resolution du nom d'hôte OK
    Trying 127.0.0.1...      ## Connection OK
    Connected to localhost.
    ...
    
    $ telnet ferry           ## Resolution du nom d'hôte OK
    Trying 195.202.1.13...
    ^C
    
    $ ftp ferry              ## Resolution du nom d'hôte OK
    ^C
    $ ftp ferr
    ftp: ferr: Unknown host  ## Nom d'hôte inconnu
       

    Note

    Lorsqu'on utilise souvent l’accès ssh ou cvs sur la machine d’adresse x.y.z.t qui a pour nom serveur-principal-du-domaine.domaine-qui-en-dit-long.orgvous pouvez mettre dans votre fichier hosts...

    
x.y.z.t       nc
       
    ... et utiliser ensuite nc en lieu et place de l’autre nom.

    QUESTIONS

    11.2.13.1. Quelle est la commande qui permet d’obtenir le nom d’hôte de la machine locale ?
    11.2.13.2. Quelles sont les informations que donne la commande ifconfig ?
    11.2.13.3. Donnez la commande qui permet de n’envoyer qu’un seul PING à une machine distante (voir man ping) ?
    11.2.13.4. Quelle est la taille par défaut d’un paquet envoyé par la commande ping ?
    11.2.13.5. Quelle est la commande qui permet d’envoyer des paquets de 1500 octets ?
    11.2.13.6. Quelle est la commande ping qui permet d’envoyer des paquets en flot ininterrompu ?
    11.2.13.7. Quel protocole utilise la commande ping ?

    11.2.13.1. Quelle est la commande qui permet d’obtenir le nom d’hôte de la machine locale ?

    hostname ou alternativement cat /etc/hostname ;-)

    11.2.13.2. Quelles sont les informations que donne la commande ifconfig ?

    Information sur les interfaces réseaux connectées à l'hôte et leur status...

    11.2.13.3. Donnez la commande qui permet de n’envoyer qu’un seul PING à une machine distante (voir man ping) ?

    ping -c 1 your_hostname

    11.2.13.4. Quelle est la taille par défaut d’un paquet envoyé par la commande ping ?

    Par défaut c'est 56 octets qui se traduisent en 64 octets de données ICMP lorque combinés avec les 8 bits de l'en-tête ICMP.

     

    Le byte (prononcé /bait/), de symbole B, est la plus petite unité adressable d’un ordinateur. Aujourd’hui, les bytes de 8 bits se sont généralisés en informatique, alors qu’en télécommunications ils peuvent contenir 8 ou 9 bits. En outre, jusque dans les années 1970, il existait des processeurs avec des bytes de 6, 7, 8 ou 9 bits (et il existe même, encore aujourd'hui pour la programmation des automates ou équipements industriels simples des processeurs très robustes utilisant des mémoires adressables par quantité de 4 bits voire 1 bit dans certains cas ou certains modes ou zones d'adressage). En revanche, un octet, comme son nom l’indique, a une taille d'exactement 8 bits.

     
    -- http://fr.wikipedia.org/wiki/Byte  

    11.2.13.5. Quelle est la commande qui permet d’envoyer des paquets de 1500 octets ?

    ping -s 1500 your_hostname

    11.2.13.6. Quelle est la commande ping qui permet d’envoyer des paquets en flot ininterrompu ?

    -c (compteur) et -w (délai) sont les deux options permettant de jouer sur la durée d'exécution du ping. En indiquant un compteur ou un délai élevé on peut rallonger(ou raccourcir) le temps d'exécution de la commande ping. Il n'est pas possible d'envoyer un flot permanant de PING à moins d'utiliser une boucle :)

    11.2.13.7. Quel protocole utilise la commande ping ?

    ICMP protocol.

     

    Internet Control Message Protocol est l'un des protocoles fondamentaux constituant la suite de protocoles Internet. Il est utilisé pour véhiculer des messages de contrôle et d'erreur pour cette suite de protocoles, par exemple lorsqu'un service ou un hôte est inaccessible.

    ICMP se situe au même niveau que le protocole IP bien qu'il ne fournisse pas les primitives de service habituellement associées à un protocole de couche réseau. Son utilisation est habituellement transparente du point de vue des applications et des utilisateurs présents sur le réseau.

    ICMP version 4 accompagne IPv4. Internet Control Message Protocol V6 accompagne IPv6.

     
    -- http://fr.wikipedia.org/wiki/ICMP  


    11.2.14. Approche des services Telnet et FTP

    Source(s):

    Mise en place de deux services serveurs :

    • telnet [telnetd] : protocole [service] d’émulation de terminaux virtuels (VTx)

    • ftp [ftpd] : protocole [service] de transfert de fichier

    Cela doit nous permettre de comprendre le fonctionnement des processus en environnement client/serveur et d’approcher au travers de deux protocoles les premiers aspects de la configuraiton de services serveur sous GNU/-Linux, ainsi que les premiers aspects liés à la sécurité.

    Note

    Le service serveur telnetd est remplacé par ssh (plus sûr)

    Le service serveur ftpd est remplacé par sftpd (plus sûr aussi)


    11.2.14.1. Le daemon inetd (ou xinetd) - Internet services daemon

    Source(s):

    Le daemon inetd (ou xinetd selon la solution utilisée) est comparable à ce qu’on pourrait appeler un super serveur, à l’écoute sur plusieurs ports et qui se charge de recevoir les demandes de connexion de plusieurs clients différents (telnet, ftp,. . .) et de lancer le serveur correspondant à la demande.

    Note

    Dans certaines distributions, inetd a été remplacé par xinetd (une autre solution plus sécurisé). Le principe est très similaire, à la seule différence est que, dans /etc/xinetd.d, chaque service (telnet, ftp, pop3...) dispose de son propre fichier de configuration.

    Note

    Quand ils ne sont pas lancés par inetd (ou xinetd), ces services sont dits fonctionnant en mode “autonome” ou “standalone”.

    À son démarrage il consulte les fichiers :

    • /etc/services : contient la liste générale des services TCP/IP avec leur numéro de port et le protocole de transport associé.

    • /etc/inetd.conf (ou /etc/xinetd.conf) : contient la liste des services activés sur une machine donnée.


    11.2.14.2. Le daemon tcpd (TCP-Wrapper - Enveloppe tcp)

    TCP-Wrapper est un service qui vient s’interfacer entre inetd et le service serveur à lancer. C'est un outil de sécurité réseau qui permet de contrôler les accès, les tentatives de connexions sur une machine donnée. Il permet à tout instant de savoir (par journalisation sysklogd) qui essaie d’accéder sur un ordinateur mais également de filtrer les accès.

    Il permet de mettre en place une stratégie de sécurité. En schématisant :

    
– Un client telnet passe une requête à un serveur telnetd ;
    – Sur le serveur c’est inetd qui reçoit la requête et qui doit charger telnetd en mémoire ;
    – Si tcpwrapper est installé, en fait inetd va lancer tcpwrapper qui va vérifier que 
      le client par exemple est autorisé à utiliser telnetd ;
    – Si le client est autorisé, alors telnetd est activé, sinon la requête est rejetée.
         

    Pour filtrer les accès à sa machine :

    
– /etc/hosts.deny : on indique dans ce fichier les services et 
      les hôtes pour lesquels l’accès est interdit.
    – /etc/hosts.allow : on indique dans ce fichier les services et 
      les hôtes pour lesquels l’accès est autorisé
         

    Note

    Si une règle est applicable dans hosts.allow, alors cette règle est appliquée, sinon, si une règle est applicable dans hosts.deny, alors cette règle est appliquée, sinon, l’accès est autorisé.

    Stratégie de sécurité à adopter :

    
1. hosts.allow : décrire toutes les règles pour les couples (services/clients) autorisés 
    2. hosts.deny : interdire systématiquement tout le reste (ALL:ALL)
         

    Les tentatives d’accès depuis des machines extérieures sont toutes enregistrées dans des fichiers particuliers, les journaux. Ces enregistrements sont effectués par le processus sysklogd qui, à son démarrage, lit le fichier /etc/syslog.conf pour trouver dans quel(s) fichier(s) il doit enregistrer les différentes tentatives d’accès.


    11.2.15. Telnet et FTP mise en œuvre

    Source(s):

    Installer les premiers services serveurs et vérifier ensuite qu’ils fonctionnent :

    
- telnetd sera pris en charge par inetd
    - ftpd sera installé en mode autonome
       


    11.2.17. L’analyse de trame (tcpdump, tshark, wireshark)

    Source(s):


    11.2.17.1. Présentation

    L’analyse de trame peut-être utilisée pour extraire leur contenus (data), il faut avoir en général de bonne raisons pour faire cela (pirates, unités de surveillance, ...) car ça relève de l’espionnage.

    Par défaut, les données transitent en clair sur le réseau, c’est à dire qu’elles ne sont pas chiffrées.

    Les administrateurs utilisent le plus fréquemment l’analyse de trame surtout lors de dysfonctionnements sur un réseau, des tables de routage... afin d’en déterminer les causes et pouvoir corriger.

    Ça peut être utilisé aussi dans le cadre d’une étude statistique pour déterminer des charges, des heures pleines... comme partie d’un projet de supervision de réseau afin de pouvoir prendre de bonnes décisions si certains aspects du réseau présentait des faiblesses (mauvais temps de réponse par exemple).

    L’analyse de trame présente un coût processeur, on ne l’utilise donc que ponctuellement comme un outils mis à la disposition pour déterminer la source d’un problème.


    11.2.17.2. Les analyseurs de trames

    Les distribtutions fournissent de nombreux analyseurs de trames.

    En standard, il existe 3 outils :

    • tcpdump (mode texte) : outil fonctionnant en mode commande, incontournable car c’est le premier qu’on a généralement sous la main.

    • tshark (mode texte) : la backend de wireshark qui fonctionne en mode commande .

    • wireshark (mode graphique) : l’analyseur de trame graphique qui est devenu un standard.

    Note

    Les outils en mode commande sont à privilégier pour la simple raison qu’il n’y a généralement pas d’interface graphique sur les serveurs. Cependant comme il est trés facile d’enregistrer une capture dans un fichier, il est possible de retraiter ce fichier avec un outils graphique.


    11.2.17.3. Mode promiscuous (promisc)

    L’analyse de trame par défaut n’est pas réalisable car une interface rejette tout paquet qui ne lui est pas destiné.

    Il faut donc mettre l'interface en mode promiscuous (mode particulier) pour qu'elle traite tous les paquets qu’elle reçoit.

    Information sur l'interface réseau :

    
$ ifconfig eth2
    eth2      Link encap:Ethernet  HWaddr 00:26:bb:13:31:96  
              inet adr:192.168.1.100  Bcast:192.168.1.255  Masque:255.255.255.0
              adr inet6: fe80::226:bbff:fe13:3196/64 Scope:Lien
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
    ...
        

    Activer le mode promiscuous :

    
## En tant que root
    $ ifconfig eth2 promisc
    
    ## Vérification
    $ ifconfig eth2
    eth2      Link encap:Ethernet  HWaddr 00:26:bb:13:31:96  
              inet adr:192.168.1.100  Bcast:192.168.1.255  Masque:255.255.255.0
              adr inet6: fe80::226:bbff:fe13:3196/64 Scope:Lien
              UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
    ...
        

    Désactiver le mode promiscuous :

    
## En tant que root
    $ ifconfig eth2 -promisc
    
    ## Vérification
    $ ifconfig eth2
    eth2      Link encap:Ethernet  HWaddr 00:26:bb:13:31:96  
              inet adr:192.168.1.100  Bcast:192.168.1.255  Masque:255.255.255.0
              adr inet6: fe80::226:bbff:fe13:3196/64 Scope:Lien
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
    ...
        

    Note

    La commande laisse des traces dans les journaux (kernel.log, syslog, messages)

    Les analyseurs de trame passent, généralement, les interfaces en mode promisc automatiquement (il faut être root)

    Il faut positionner l’analyseur de trame à un bon endroit. En effet, certains probl1emes rencontrés peuvent être lié aux équipements de raccordements des n œuds, qui sont désormais des commutateurs (switchs). Il est possible dans ce cas que vous ne voyiez pas passer grand chose hormis vos propres paquets. Le problème est identique avec les Vlans.


    11.2.17.4. Utilisation générale d’un analyseur de trame

    Le principe est généralement identique, il faut savoir :

    
- sur quelle interface on souhaite lancer la capture
    - sur quel protocole on souhaite filtrer
    - pour quelle ou quelles machines on veut capturer le trafic. 
        

    Note

    Par défaut l’analyseur capture tout et s’il y a beaucoup de trafic, le travail de tri ne s’en trouve pas simplifié par la suite. Après il est possible de réaliser des filtres complexes mais nous n’irons pas jusque là.


    11.2.17.5. tcpdump

    
## tcpdump options de base
    Option         Description
    -i ethx        préciser sur quelle interface se fait la capture
    -X             afficher la capture en hexa et ascii
    -n             numérique, pas de résolution des noms
    -nn            pas de résolution des noms ni des ports
    -s0            capture de tout le paquet
    -cx            capture seulement x paquets
    -v, -vv, -vvv  augmente le mode verbeux
    -w outfile     écrire (write) la capture dans un fichier
        
    
## Activer mode promiscuous
    $ sudo ifconfig eth2 promisc
    
    ## Liste interfaces disponibles pour la capture
    $ tcpdump -D
    1.eth0
    2.eth2
    3.any (Pseudo-device that captures on all interfaces)
    4.lo
    
    ## Analyse de trame sur l’interface eth2
    $ tcpdump -i eth2
    tcpdump: eth2: You don't have permission to capture on that device
    (socket: Operation not permitted)
    
    ##==> Erreur si pas exécuté en tant que root !!!
    
    # tcpdump -i eth2
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth2, link-type EN10MB (Ethernet), capture size 96 bytes
    12:05:58.896889 ARP, Request who-has 192.168.1.200 tell macfil.local, length 28
    12:05:58.897381 IP macfil.local.37681 > resolver2.opendns.com.domain: 
    43785+ PTR? 200.1.168.192.in-addr.arpa. (44)
    12:05:59.139107 ARP, Reply 192.168.1.200 is-at 00:e0:fc:18:21:16 (oui Unknown), length 28
    12:05:59.447904 IP resolver2.opendns.com.domain > macfil.local.37681: 43785 NXDomain 0/0/0 (44)
    12:05:59.548316 IP macfil.local.mdns > 224.0.0.251.mdns: 0 PTR (QM)? 200.1.168.192.in-addr.arpa. (44)
    12:06:00.104884 IP filostene.local.netbios-dgm > 192.168.1.255.netbios-dgm: NBT UDP PACKET(138)
    ...
    6 packets captured
    35 packets received by filter
    0 packets dropped by kernel
    
    ## Sans résolution de nom -n(numérique)
    # tcpdump -i eth2 -n
    ...
    12:07:44.469209 IP 192.168.1.100.5060 > 94.75.247.45.5060: SIP, length: 2
    12:07:54.472717 IP 192.168.1.100.5060 > 94.75.247.45.5060: SIP, length: 2
    12:07:59.469990 ARP, Request who-has 192.168.1.200 tell 192.168.1.100, length 28
    12:07:59.478236 ARP, Reply 192.168.1.200 is-at 00:e0:fc:18:21:16, length 28
    12:08:04.433021 IP 94.75.247.45.5060 > 192.168.1.100.5060: SIP, length: 244
    12:08:04.433712 IP 192.168.1.100.36292 > 208.67.220.220.53: 35811+ A? proxy.localphone.com. (38)
    ...
    
    ## Capturer ce_qui_va_vers_vers/ce_qui_provient_de l’adresse host 94.75.247.45
    # tcpdump -i eth2 -n host 94.75.247.45
    ...
    12:11:35.533713 IP 94.75.247.45.5060 > 192.168.1.100.5060: SIP, length: 244
    12:11:35.838162 IP 192.168.1.100.5060 > 94.75.247.45.5060: SIP, length: 349
    12:11:35.926094 IP 192.168.1.100.5060 > 94.75.247.45.5060: SIP, length: 2
    ...
    
    ## Capturer le traffic entre les machines 10.0.1.4(ici) et 10.0.1.1(labas) 
    # tcpdump -i eth2 -n host 10.0.1.4 and 10.0.1.1
    ...
    16:22:44.768175 IP 10.0.1.4.43907 > 10.0.1.1.53: 26177+ A? books.google.com. (34)
    16:22:44.784117 IP 10.0.1.1.53 > 10.0.1.4.43907: 26177 7/0/0 CNAME[|domain]
    16:22:44.784273 IP 10.0.1.4.43397 > 10.0.1.1.53: 38124+ A? books.google.com. (34)
    16:22:44.784291 IP 10.0.1.4.57027 > 10.0.1.1.53: 50650+ A? he.wikipedia.org. (34)
    16:22:44.784364 IP 10.0.1.4.34618 > 10.0.1.1.53: 25317+ A? standards.ieee.org. (36)
    16:22:44.784465 IP 10.0.1.4.52323 > 10.0.1.1.53: 51064+ A? www.pearsonhighered.com. (41)
    16:22:44.786704 IP 10.0.1.1.53 > 10.0.1.4.43397: 38124 7/0/0 CNAME[|domain]
    
    ## Filtrer en fonction du sens du traffic dst ou src
    # tcpdump -i eth2 -n src 10.0.1.4 and dst 10.0.1.1
    ...
    16:21:50.419211 IP 10.0.1.4.44159 > 10.0.1.1.53: 37337+ A? en.wikipedia.org. (34)
    16:21:50.542666 IP 10.0.1.4.53096 > 10.0.1.1.53: 25537+ A? en.wikipedia.org. (34)
    16:21:55.413664 ARP, Request who-has 10.0.1.1 tell 10.0.1.4, length 28
    16:22:14.292610 IP 10.0.1.4.33792 > 10.0.1.1.53: 11289+ A? upload.wikimedia.org. (38)
    16:22:14.295743 IP 10.0.1.4.33038 > 10.0.1.1.53: 14296+ A? upload.wikimedia.org. (38)
    16:22:14.794670 IP 10.0.1.4.52186 > 10.0.1.1.53: 47530+ A? creativecommons.org. (37)
    16:22:14.794848 IP 10.0.1.4.33388 > 10.0.1.1.53: 21428+ A? meta.wikimedia.org. (36)
    16:22:14.803752 IP 10.0.1.4.38521 > 10.0.1.1.53: 8646+ A? tools.ietf.org. (32)
    
    ## filtrer sur des ports (revient à 
    ## filtrer sur un protocole de niveau application)
    # tcpdump -n -i eth2 port 80
    ...
    16:43:46.171494 IP 91.198.174.2.80 > 10.0.1.4.46740: ...
    16:43:46.188814 IP 91.198.174.3.80 > 10.0.1.4.47905: ...
    16:43:46.206384 IP 10.0.1.4.46740 > 91.198.174.2.80: ...
    16:43:46.223608 IP 10.0.1.4.47905 > 91.198.174.3.80: ...
    16:43:46.519621 IP 91.198.174.2.80 > 10.0.1.4.46740: ...
    16:43:46.519681 IP 10.0.1.4.46740 > 91.198.174.2.80: ...
    16:43:46.520518 IP 91.198.174.3.80 > 10.0.1.4.47905: ...
    ...
    
    ## filtrer sur des protocoles
    # tcpdump -n -i eth2 arp
    ...
    16:51:48.516162 ARP, Request who-has 10.0.1.1 tell 10.0.1.4, length 28
    16:51:48.590694 ARP, Reply 10.0.1.1 is-at 00:17:f2:e1:c4:21, length 28
    16:51:52.094244 ARP, Request who-has 10.0.1.3 (00:00:00:04:0a:00) tell 10.0.1.1, length 28
    ...              
    
    ## sortie sur la console et enregistrement du flux dans un fichier -l (line buffered)
    # tcpdump -n -i eth2 -l -c 10 | tee out.log
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth2, link-type EN10MB (Ethernet), capture size 96 bytes
    16:58:13.403012 IP 10.0.1.4.60965 > 10.0.1.1.53: 58526+ A? en.wikipedia.org.
    16:58:13.412130 IP 10.0.1.1.53 > 10.0.1.4.60965: 58526 3/0/0 CNAME[|domain]
    16:58:13.412689 IP 10.0.1.4.48262 > 10.0.1.1.53: 55668+ A? en.wikipedia.org.
    16:58:13.699918 IP 10.0.1.1.53 > 10.0.1.4.48262: 55668 3/0/0 CNAME[|domain]
    16:58:14.003974 IP 10.0.1.4.57221 > 91.198.174.2.80: Flags [S], ...
    16:58:14.004622 IP 10.0.1.4.57542 > 10.0.1.1.53: 16882+ A? bits.wikimedia.org.
    16:58:14.004744 IP 10.0.1.4.33879 > 10.0.1.1.53: 16914+ A? upload.wikimedia.org.
    16:58:14.325252 IP 10.0.1.1.53 > 10.0.1.4.57542: 16882 3/0/0 CNAME[|domain]
    16:58:14.325793 IP 10.0.1.4.39747 > 10.0.1.1.53: 2164+ A? bits.wikimedia.org.
    10 packets captured
    11 packets received by filter
    0 packets dropped by kernel
    16:58:14.334314 IP 91.198.174.2.80 > 10.0.1.4.57221: Flags [S.], ...
    
    ## Sauvegarder dans un fichier pour traitement ultérieur ou via un autre logiciel 
    ## Format libpcap (par ouvrable dans un éditeur de texte)
      
    # Sauvegarde de la capture dans capture.pcap
    $ tcpdump -n -i eth2 -c 10 -w capture.pcap 
    tcpdump: listening on eth2, link-type EN10MB (Ethernet), capture size 96 bytes
    10 packets captured
    10 packets received by filter
    0 packets dropped by kernel
    
    # Ouverture avec l’option -r de tcpdump
    $ tcpdump -r capture.pcap 
    reading from file capture.pcap, link-type EN10MB (Ethernet)
    17:07:20.933398 IP macfil.local.52260 > 10.0.1.1.domain: ...
    17:07:20.975444 IP 10.0.1.1.domain > macfil.local.52260: ...
    17:07:20.975856 IP macfil.local.41109 > 10.0.1.1.domain: ...
    17:07:20.987053 IP 10.0.1.1.domain > macfil.local.41109: ...
    17:07:21.434083 IP macfil.local.37014 > rr.esams.wikimedi...
    ...
    
    # Ouverture avec wireshark
    $ wireshark capture.pcap
    
    ## Désactiver mode promiscuous
    $ sudo ifconfig eth2 -promisc
        

    11.2.17.6. Dépannage avec tcpdump

    Tester un ping:

    
## On lance un ping dans un console
    $ ping 10.0.1.1 -c 2 
     
    ## et on capture dans une autre.          
    $ tcpdump -n -i eth0 icmp
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth2, link-type EN10MB (Ethernet), capture size 96 bytes
    17:18:36.050403 IP 10.0.1.4 > 10.0.1.1: ICMP echo request,...
    17:18:36.520538 IP 10.0.1.1 > 10.0.1.4: ICMP echo reply,  ...
    17:18:37.051386 IP 10.0.1.4 > 10.0.1.1: ICMP echo request,...
    17:18:37.537458 IP 10.0.1.1 > 10.0.1.4: ICMP echo reply,  ...
         

    Pour un ping normal et un ping anormal, on voit bien les paquets ICMP echo request émis et les paquets ICMP echo reply reçus.

    Dans le cas anormal où le ping semble ne pas répondre, on est ainsi sûr que la machine distante est bien opérationnelle. tcpdump indique que sur l’interface les paquets partent bien et que le retour se fait bien.

    Dans ce cas, la raison pour un ping anorma est que le firewall local détruit les paquets ICMP entrants.

    Analyse de contenu de trame (ftp par example). L'extrait de capture sur un traffic ftp pour montrer que les données circulent bien de façon non chiffrée sur les réseaux :

     
    ## Session tcpdump dans une fenêtre 
    $ tcpdump -ni lo -s0 -A | grep -Ei "USER|PASS"
    .......)USER anonymous
    ........331 Anonymous login ok, (...)
    ...D... PASS foo@bar.org
    ...D...D230-Welcome, archive user anonymous@localhost !
    
    ## Tentative de connexion ftp anonyme dans une autre console 
    $ ftp localhost
         

    Avertissement

    "... les chaînes d’identification et d’authentification apparaissent clairement, et il en est ainsi pour tous les protocoles non chiffrés..."


    11.2.17.7. tshark

    tshark est l’analyseur de wireshark, le principe fondamental reste à peu prés le même que pour tcpdump.

    Pour plus d'info sur son utilisation et le filtre, se référer au poly de l'Éof :

    
## Capture de l'interface eth2
    $ tshark -i eth2
    
    ## Filtre tcp port 80 et enregistrement dans un fichier.
    $ tshark -f "tcp port 80" -i eth0 -w /tmp/capture.cap
    
    ## Extraction filtrée à partir d’un fichier
    ## Tous paquets ne correspondant pas au filtre sont omis
    $ tshark -R "ip.addr == 192.168.1.1" -r /tmp/capture.cap
         


    11.2.17.8. Wireshark (anciennement Ethereal)

    Depuis le mois de juin 2006, Ethereal a changé de nom, il s'appelle désormais Wireshark.

    Produit graphique vraiment accessible.

    Si vous avez besoin d’analyser des trames sur une machine qui n’a pas d’interface graphique, vous pouvez réaliser des captures avec tcpdump ou tshark, enregistrer dans un fichier et les reprendre avec wireshark

    La fenêtre wireshark est composé de trois parties principale :

    
#- Liste des trames capturées (partie du haut)
    #- L’encapsulation des différentes couches (partie centrale)
    #- Le contenu de la trame (partie du bas) 
         

    
# Ouverture avec wireshark d'un fichier de capture
    $ wireshark capture.pcap
         

    Figure 11-6. Wireshark : Ouvrir fichier .pcap (format libpcap)

    Capture simple d'un traffic ARP

    
## Préalable : vider la cache ARP 
    $ arp -d ...
    
    ## Puis lancer wireshark
    $ wireshark
    
    ## Puis choisir une interface (ex: eth2) puis lancer la capture...
         

    Figure 11-7. Wireshark : Capture simple par défaut (ARP, IP, DNS, etc...)


    11.2.17.9. Application

    Les tests effectués ci-avant ont permis de se familiarisez avec les outils, et apprendre à utiliser les filtres sur des opérations simples.

    Avec wireshark, une capture simple qui vous montre un trafic ARP entre ma machine et la passerelle du réseau à été réalisé (voir ci-dessus)

    Capture avec authentification permettant de retrouver dans le fichier les traces de login/mot de passe d'un accès à un site web ou webmail non chiffrés

    
## Connection à http://192.168.56.101/phpldapadmin
    ## (Interface d'adminsitration LDAP sur machine virtuelle)
    $ tcpdump -i vboxnet0 host 192.168.56.1 -l -s0 -A | tee snap.txt
    ...
    19:36:52.710509 IP macfil.local.57819 > debstafil4.local.www: 
    ...
    .1.a..3.cmd=login&server_id=0&dn=cn%3Dmanager%2Cdc
    %3Dermansion%2Cdc%3Dnet&login_pass=secret&submit=Authenticate
    ...
          

    11.2.17.10. Exercise

    Scénario : vous avez votre poste myhost en 192.168.0.1/32, un serveur DNS dnshost en 192.168.0.2/32 et un serveur qui est à la fois serveur HTTP et serveur FTP srvhost en 192.168.0.3/32.

    Quelles seraient les commandes tcpdump pour réaliser les opérations suivantes (passées sur le poste myhost) :

    
# tout ce qui “va vers” ou “provient de” srvhost ;
    $ tcpdump [-n] -i eth0 host srvhost   
    $ tcpdump [-n] -i eth0 host 192.168.0.1  # Alternative
    
    # tout ce qui “va vers” ou “provient de” srvhost ou de dnshost ;
    $ tcpdump [-n] -i eth0 host srvhost or dnshost        
    $ tcpdump [-n] -i eth0 host 192.168.0.1 or 192.168.0.3  # Alternative
    
    # capturer uniquement les requêtes HTTP qui vont vers srvhost ;
    $ tcpdump [-n] -i eth0 dst srvhost and port 80 
    $ tcpdump [-n] -i eth0 dst 192.169.0.1 and port 80  # Alternative
    
    # capturer uniquement le trafic concernant la résolution de nom ;
    $ tcpdump [-n] -i eth0 port 53
    $ tcpdump [-n] -i eth0 host dnshost 
    $ tcpdump [-n] -i eth0 host 192.168.0.2
    
    # tout capturer sauf ce qui concerne la machine srvhost ;
    $ tcpdump [-n] -i eth0 not host srvhost
    $ tcpdump [-n] -i eth0 not host 192.168.0.1 # Alternative
    
    # tout capturer sauf ce qui concerne le trafic HTTP
    $ tcpdump [-n] -i eth0 not port 80
          


    11.2.17.11. Autres utilitaires (ttcp, iptraf, nagios)

    ttcp : utilitaire Unix pour mesurer des débits TCP et UDP entre différentes stations

    iptraf : Iptraf est utile pour la visualisation des connexions tcp, de la translation de port et de la translation d’adresse :

    
iptraf -i all   # moniteur de traffic IP
    iptraf -g       # statistiques générales des interfaces
    iptraf -d eth0  # informations détaillées d’une interface
         

    nagios : (anciennement appelé Netsaint) est une application permettant la surveillance système et réseau. Elle surveille les hôtes et services spécifiés, alertant lorsque les systèmes vont mal et quand ils vont mieux.


    11.2.19. netperf/ethtool : Mesure de performance réseau

    ethtool : est une commande UNIX permettant d'afficher et modifier certains paramètres de la carte réseau, comme sa vitesse.

    netperf : Netperf est un outil de benchmark, qui peut être utilisé pour mesurer différents aspects des performances réseaux. Il reste un outil assez simple. Il sert surtout pour des tests de performances de transfert brut (stream ou stream unidirectionnel), et fonctionne sur un modèle client/server.

    Netperf s'installe généaralement depuis le source sur les deux points d'extrémité du transfert à mesurer. Sur l'une on execute netserver (possible en non-root), sur l'autre on execute netperf en indiquant l'hôte qui execute netserver.

    Voici un petit guide très rapide sur Netperf (non testé) :

     
    Source: http://www-sop.inria.fr/mistral/personnel/Christophe.Retiere/tests.html
    
    $ netperf -l durée -H hôte_serveur -t [TCP/UDP]_STREAM - m taille_paquets 
              -s taille_buf_local -S taille_buf_dist 
    
    Deux exemples de scripts simples: 
    
    Tests pour UDP: 
    #! /bin/sh 
    duree=120 
    for size in 10 100 300 500 700 900 1100 1300 1400 
    do 
    rep=`/usr/local/sys/bin/netperf -P -v -l $duree -H $1 -t UDP_STREAM -- -m 
    $siz 
    e -s 65535 -S 65535` 
    li=`echo $rep | awk '{ pou=(($4-$9) / $4)*100 
    print $2":"$10":"pou }'` 
    echo $li 
    done 
    
    Tests pour TCP: 
    #! /bin/sh 
    duree=120 
    for size in 10 100 300 500 700 900 1100 1300 1400 
    do 
    rep=`/usr/local/sys/bin/netperf -P -v -l $duree -H $1 -t TCP_STREAM -- -m 
    $siz 
    e -s 65535 -S 65535` 
    li=`echo $rep | awk '{ print $3":"$5 }'` 
    echo $li 
    done 
      
    Les résultats obtenus sont semblables a Ttcp, si ce n'est une différence quant aux 
    débits engendrés en UDP (une différence de presque 200Mb/s apparait...A creuser) 
    
    wsopi98a -> wsopi99a (G) (Sophia -> Sophia) : résultats TCP et UDP 
    
    TCP max = 389,28Mb/s 
    UDP max = 699,36Mb/s 
    
    wsopi98a -> wstli96a (G) (Sophia -> Rocquencourt): résultats TCP et UDP 
    
    TCP max = 76,87Mb/s 
    UDP max = 684,12Mb/s
    
    ...
       


    11.2.20. Le protocole ssh (ssh, rssh, sftp, etc...)

    Source(s):

    L’utilisation de ssh, demande au début un minimum d’apprentissage, mais une fois ce travail là réalisé on ne peut plus s’en passer. Plus aucune connexion distante n’est réalisée sans chiffrement, donc en toute sécurité.


    11.2.20.1. Installation & Commandes de base

    ssh est généralement composé de 2 paquets :

    
– le serveur OpenSSH (openssh-server)
    – le client (openssh-clients)
       

    
$ apt-get install openssh-clients openssh-server  # Installation
    
    ## L'accès à une machine distante requiert :
    ## - que la machine distante soit accessible via le réseau
    ## - l'existance d'un compte actif pour y accéder
    $ ssh filostene@192.168.56.101                    # 1ere connection à 
                                                      # la VM Debian (IP 192.168.56.101)
                                                      # un nom de domaine peut-être utilisé 
                                                      # en lieu et place de l'IP
    
    The authenticity of host '192.168.56.101 (192.168.56.101)' can't be established.
    RSA key fingerprint is f2:16:34:af:0b:f6:3b:51:94:b0:f8:6e:11:37:e4:8e.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.56.101' (RSA) to the list of known hosts.
    
    filostene@192.168.56.101's password:              # Entrer mot de passe du compte
                                                      # filostene sur la machine Debian 
    
    Linux debstafil4 2.6.26-2-686 #1 SMP Wed Feb 10 08:59:21 UTC 2010 i686
    
    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.
    
    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.
    You have new mail.
    Last login: Wed Dec 23 01:11:51 2009
    filostene@debstafil4:~$                           # Connection établie :)
    
    
    $ ssh-keygen -t dsa                               # Géneration clefs (publique/privée)
                                                      # de l'utilisateur connecté
    
    ## Copier la clef publique locale (~/.ssh/id_dsa.pub) vers le server distant
    $ scp ~/.ssh/id_dsa.pub filostene@192.168.56.101:.ssh/authorized_keys
    # ou
    $ cat .ssh/id_dsa.pub | ssh filostene@192.168.56.101 \      # alternative
                                "cat - >>.ssh/authorized_keys"  # pour la gestion 
                                                                # de plusieurs clefs
    
      # Attention, sur certaines machines, le fichier se nomme
      # authorized_keys, sur d’autres authorized_keys2
      # Dans l’exemple qui est donné, le répertoire .ssh doit exister.
    
    ## Testons en lançant une simple commande distante
    $ ssh filostene@192.168.56.101 ls                           
    =1000
    bibliotheque.php~
    Desktop
    etcaa
    etcab
    ...
      # La première fois (dans la session en cours) le passphrase de 
      # clef privée est nécessaire pour déverrouiller la clef privée, 
      # les essais successifs ne requiert plus de mot de passe 
      # la fin de session utilisateur :)
    

    Note

    A ce stage, le système distant ne demande plus de mot de passe, par contre il me demande la passphrase si vous en avez mis une. Le mot de passe n’est plus demandé car ssh a détecté la clé privée sur votre machine et la clé publique sur le serveur distant.

    Si cela ne fonctionne pas :

    
## Vérifier la configuration : 
    - vérifiez que la clé publique est bien 
       -sur le serveur
       -au bon endroit
       -dans le bon fichier
    - vérifiez les droits sur les fichiers
    - essayez avec les options -v, -vv, -vvv de ssh 
      pour obtenir plus de traces.
    - regardez dans les logs.
      


    11.2.20.2. Emprunte d'une clef

    
## Obtenir le finger print d’une clé
    $ ssh-keygen -l
      

    11.2.20.3. Utilisation d'un agent (éviter la passephrase)

    L’utilisation d’un agent, évite d’avoir à retaper la passphrase à chaque fois que l’on sollicite l’utilisation dela clé privée. Un agent stocke en mémoire les clés privées.

    ssh-agent : programme qui démarre avant X Windows et démarre X Windows. Toutes les programmes X Windows hérite d'une connection vers le ssh-agent incluant Gnome Terminal, aterm, xterm, etc... ce qui signifie que l'agent va pouvoir passer votre passe phrase à votre place :) La plupart des distributions démarre ssh-agent à l'ouverture de la session utilisateur via le manager de session tel que gdm (graphical login).

    ssh-add : programme pour ajouter votre passe phrase (une seule fois) au shh-agent

    Ceci permet une connection automatique par authentification transparente à base de clefs (publique/privee) sans interaction humaine (tel que entrer un passphrase ou un mot de passe).

    
## Vérifier que ssh-agent est en cours d'execution
    $ ps auxw | grep ssh-agent
    
    ## Activer un agent
    $ ssh-agent
    
    # La commande met sur la sortie standard des variables
    # environnement à déclarer et à exporter. Faites le.
    SSH_AUTH_SOCK=/tmp/ssh-hiotV17831/agent.17831; export SSH_AUTH_SOCK;
    SSH_AGENT_PID=17832; export SSH_AGENT_PID;
    echo Agent pid 17832;
    
    ## Exporter les clés ssh (les mettre dans le cache de l’agent)
    $ ssh-add             # demande pour la passephrase
    Enter passphrase for /home/xyz/.ssh/id_dsa:
    Identity added: /home/xyz/.ssh/id_dsa (/home/xyz/.ssh/id_dsa)
    
    ## Vérifier la connexion
    $ ssh filostene@192.168.56.101 ls     # plus besoin de taper 
      (...)                               # le mot de passe, ni la passphrase.
      

    Toute connection ultérieur à une machine distante se fera sans demande de passephrase...

    Dans le cas contraire, le passephrase est requis pour établir la connection...

    
## Savoir quelles clés sont chargées par l’agent
    ## option -l 
    $ ssh-add -l
    1024 bc:d0:a6:fa:4b:5d:ee:d0:1a:30:68:fe:4f:7b:09:b4 filostene@macfil (DSA)
      
    
## Pour supprimer une clé (ici RSA) de l’agent
    ## option -d
    $ ssh-add -d ~/.ssh/id_rsa
    
    ## Pour supprimer toutes les clés de l’agent 
    ## option -D
    $ ssh-add -D
      

    Note

    Pour rendre l'ajout du passephrase plus facile, ssh-add peut-être ajouter dans la liste de programme démarrer au démarrage de la session utilisateur et il fera ainsi apparaître un prompt (ou appelle gtk2-askpass, x11-askpass, etc...) dans X Windows pour demander le passphrase dès que l'utilisateur est connecté.


    11.2.20.4. Utilisation de ssh et mise en en place de services proxy

    Utilisation un plus avancée de ssh et de la collaboration avec d’autres services.

    ...


    11.2.20.5. rssh

    Source(s):

    rssh est un interpréteur de commandes, dont les fonctionnalités sont réduites à autoriser uniquement des transferts de fichiers (scp, sftp, cvs, svnserve (Subversion), rdist ou rsync). Ce shell restreint est utilisé avec OpenSSH pour faciliter et sécuriser d'avantage l'utilisation de ces commandes. Il peut optionellement chrooter les connexions utilisateurs dans un espace clos (prison) l'empêchant ainsi d'accédér aux repertoires et fichiers système. L'activation de RSSH se fait en le définissant comme interpréteur de commandes pour les utilisateurs concernés.

    Si j'ai un serveur sur lequel je veux uniquement autoriser les utilisateurs à copier des fichiers du serveur via scp sans leur donner un access shell, je peux utiliser rssh.

    Reposant sur ssh et chroot il en possède les même atoût, contraintes, limitation (trous de sécurité potentiels... :)


    11.2.22. VoIP : Le protocole sip

    Source(s):

    Standardisé par l'IETF

    Basé sur les standards du web HTTP, DNS, etc...

    SIP est basé sur les sessions

    Tous les messages SIP transitent sur une architecture point-à-point (peer-to-peer)

    Extensible, il supporte la diffusion de media (audio, vidéo, ...) - SIMPLE extension


    11.2.23. VoIP : Le protocole XMPP (anciennement nommé Jabber)

    Source(s):

    Standardisé par l'IETF

    Basé sur XML et à code ouvert (open source)

    XMMP est basé sur la présence

    Tous les messages XMMP passent par un serveur central... supervision...

    Extensible, il supporte la diffusion de média (audio, video, ...)


    Chapitre 12. SR005 - Administrer un serveur DNS

    Le but de ce module est de fournir les connaissances nécessaires à la mise en place d’un serveur DNS.


    12.1. L'espace de noms - Arborescence DNS

    Figure 12-1. DNS: Arborescence du Domain Name System

    La structuration du système DNS s'appuie sur une structure arborescente dans laquelle sont définis des domaines de niveau supérieurs (appelés TLD, pour Top Level Domains), rattachés à un noeud racine représenté par un point.

    On appelle nom de domaine chaque noeud de l'arbre. Chaque noeud possède une étiquette (en anglais label) d'une longueur maximale de 63 caractères.

    L'ensemble des noms de domaine constitue ainsi un arbre inversé où chaque noeud est séparé du suivant par un point (« . »).

    L'extrémité d'une branche est appelée hôte, et correspond à une machine ou une entité du réseau. Le nom d'hôte qui lui est attribué doit être unique dans le domaine considéré, ou le cas échéant dans le sous-domaine. A titre d'exemple le serveur web d'un domaine porte ainsi généralement le nom www.

    Le mot domaine correspond formellement au suffixe d'un nom de domaine, c'est-à-dire l'ensemble des étiquettes de noeuds d'une arborescence, à l'exception de l'hôte.

    Le nom absolu correspondant à l'ensemble des étiquettes des noeuds d'une arborescence, séparées par des points, et terminé par un point final, est appelé adresse FQDN (Fully Qualified Domain Name, soit Nom de Domaine Totalement Qualifié). La profondeur maximale de l'arborescence est de 127 niveaux et la longueur maximale d'un nom FQDN est de 255 caractères. L'adresse FQDN permet de repérer de façon unique une machine sur le réseau des réseaux. Ainsi www.commentcamarche.net. représente une adresse FQDN.


    12.2. DNS : Domain Name Server (Server de noms)

    Source(s):

    Les machines appelées serveurs de nom de domaine permettent d'établir la correspondance entre le nom de domaine et l'adresse IP des machines d'un réseau.

    Chaque domaine possède un serveur de noms de domaines, appelé « serveur de noms primaire » (primary domain name server), ainsi qu'un serveur de noms secondaire (secondary domaine name server), permettant de prendre le relais du serveur de noms primaire en cas d'indisponibilité.

    Chaque serveur de nom est déclaré dans à un serveur de nom de domaine de niveau immédiatement supérieur, ce qui permet implicitement une délégation d'autorité sur les domaines. Le système de nom est une architecture distribuée, où chaque entité est responsable de la gestion de son nom de domaine. Il n'existe donc pas d'organisme ayant à charge la gestion de l'ensemble des noms de domaines.

    Les serveurs correspondant aux domaines de plus haut niveau (TLD) sont appelés serveurs de noms racine . Il en existe treize, répartis sur la planète, possédant les noms « a.root-servers.net » à « m.root-servers.net ».


    12.2.1. Protocole DNS (port 53, UDP/TCP)

    Un protocole qui va faire la correspondance entre un nom de machine (mémorisable par un humain) et son adresse IP (et vice-versa).

    Ce mécanisme, appelé résolution de noms, est fourni par le protocole Domain Name System (DNS).

    Avertissement

    Ce service est, après le routage IP, la partie la plus critique et importante d'un réseau.

    Le protocole DNS est défini par l’IETF dans une dizaine de RFC, mais les grands principes sont présentés dans les RFC 1034 et 1035.

    La résolution DNS se fait par l’envoi d’une question et la réception d’une réponse depuis le serveur.

    Utilise le port 53 et les protocoles UDP (le plus souvent) et TCP (si question DNS >= 512 octets)


    12.2.2. Résolution de Nom - Mécanisme de délégation

    Le mécanisme consistant à trouver l'adresse IP correspondant au nom d'un hôte est appelé résolution de nom de domaine. L'application permettant de réaliser cette opération (généralement intégrée au système d'exploitation) est appelée résolveur (en anglais « resolver »).

    Lorsqu'une application souhaite se connecter à un hôte connu par son nom de domaine (par exemple « www.commentcamarche.net »), celle-ci va interroger un serveur de noms défini dans sa configuration réseau. Chaque machine connectée au réseau possède en effet dans sa configuration les adresses IP de deux serveurs de noms de son fournisseur d'accès.

    Si une requête DNS porte sur un domaine complètement extérieur, le serveur local ne va pouvoir y répondre directement, il va aller poser la question à un autre serveur DNS responsable du domaine en question.

    Une requête est ainsi envoyée au premier serveur de noms (appelé « serveur de nom primaire »). Si celui-ci possède l'enregistrement dans son cache, il l'envoie à l'application, dans le cas contraire il interroge un serveur racine (dans notre cas un serveur racine correspondant au TLD « .net »). Le serveur de nom racine renvoie une liste de serveurs de noms faisant autorité sur le domaine (dans le cas présent les adresses IP des serveurs de noms primaire et secondaire de commentcamarche.net).

    La délégations à été mis en place car :

    • Il est impossible de stocker les données DNS du monde entier sur une seule machine, le résultat serait énorme en ressources disque (ou de traitement).

    • Ça ne correspond pas à l’esprit originel d’Internet (ou plutôt d’Arpanet) où le réseau doit fonctionner correctement même si des liens étaient tombés ou des services injoignables.

    • Il y aurait en permance des problèmes de synchronisation.

    Chaque serveur ne connaît que la zone qui lui a été déléguée (son réseau local par exemple).

    Note

    Pour éviter ces nombreuses requêtes à chaque question, des caches sont utilisées au niveau des différents serveurs. Ainsi, si on a déjà posé la question, la réponse sera immédiate.


    12.2.3. Terminologie

    • Serveurs autoritaire (ou primaire) : Un serveur DNS en charge des informations d’un domaine, c’est-à-dire qu’il n’a besoin de contacter personne pour répondre à une question au sujet de sa zone.

    • Serveurs secondaire : serveur autoritaires, mais ce sont des simples miroirs : ils n’ont qu’un droit de lecture seule sur les données. A l'opposé des serveurs primaires qui est un serveur autoritaire pour un domaine et est le « maître ».

      Pour un serveur secondaire, il suffit d’indiquer qui est le maître de la zone et la zone va être automatiquement transférée vers lui.

    • Zone : domaine pour lequel un serveur DNS est autoritaire.

    • Serveurs de cache (ou esclaves), "forwarders" : L’opposé des serveurs autoritaires. Serveurs DNS ne possèdant pas d’information propre. Ils ne savent que poser des questions à l’extérieur et les mettre en cache pour accélérer les prochaines questions. Ils ont un rôle de forwarder et sont (généralement) récursifs.

    • Resolver : mécanisme/processus par l’intermédiaire duquel la résolution de nom par le client est faite.


    12.2.4. Messages DNS (Enveloppe)

    La structure d’un message DNS est définie précisement dans la RFC 1035.

    On peut envoyer une ou plusieurs questions dans un même message DNS pour gagner du temps. Ainsi, il est nécessaire d’avoir une « enveloppe DNS » annoncant ce qui arrive (champs QDCOUNT indique le nombre de question). Voir le poly Éof pour plus de détail et la schématique.

    L'enveloppe contient un identifiant(supposé unique), le nombre de questions ou de réponses et diverses options

    À la suite de cette enveloppe, on trouve des ressources records (RR) ou enregistrements qui sont les données utiles (questions, réponses, erreurs, etc.).

    Différents types de requêtes et principaux enregistrements DNS :

    
A       1 Nom vers Addresse IPv4           [résolution d’un nom de domaine en une adresse IP]
    AAAA      Nom vers Addresse IPv6
    
    NS      2 Récupére le nom du serveur autoritaire d’un domaine
    CNAME   5 Alias
    SOA     6 Zone d’Autorité                  [se renseigner sur une zone]
    
    PTR    12 Adresse vers nom                 [requêtes DNS inverses : 
                                                adresse IP vers un ou des nom(s) de domaine]
    
    MX     15 Récupération du serveur de mail  [connaître la machine responsable des mails]
    
    TXT    16 Chaîne de caractères             [peuvent contenir des clefs de chiffrement publiques,
                                                des informations pour lutter contre le spam 
                                                (connaître les serveurs de mail sortant)
                                                se frayer un tunnel pour contourner les firewalls...]
    
    ...
        

    Note

    La requête la plus courante, la résolution de nom, est une requête de type A.

    Une requête inverse est de type PTR.


    12.2.5. Liste des serveurs DNS existant

    Plusieurs implémentations de serveurs DNS existent :

    • bind (autoritaire ou cache) : "Berkeley Internet Name Domain" est l’ancêtre de tous les serveurs, fonctionnalités intéressantes, en retard sur quelques points comme le stockage des zones, le plus respectueux des RFC, le plus compatible avec tous les clients et autres serveurs.

      Développé initialement par l'université de Berkeley en Californie BIND est désormais maintenu par l'ISC (Internet Systems Consortium).

    • PowerDNS (autoritaire seulement !) : le plus avancé en terme de fonctionnalités, possibilité de stocker les zones dans des bases de données ou de faciliter le load balancing. Doute que leur code ait été audité autant que celui de bind. Politique de sécurité.

    • MaraDNS (autoritaire ou cache) : conçu à l’origine pour être un serveur sécurisé.

    • djbDNS (autoritaire ou cache) : réputé pour sa sécurité, pas compatible sur certains points (comme le transfert de zones) avec d’autres serveurs classiques, licence non libre.


    12.2.6. Installation & Maintenance

    12.2.6.1. Matériel

    Le service DNS n’est pas consommateur en ressources, La seule chose importante est d’avoir une carte réseau correcte. Une simple machine bas de gamme (mais fiable!) est suffisante, un surplus de RAM n’est pas de refus ;-)


    12.2.6.2. Choix de version & Installation des paquets nécessaires

    La meilleure solution de serveur DNS, par sa maturité et ses fonctionnalités, est bind (Berkeley Internet Name Domain).

    Pour bénéficier de fonctionnalités évolués (comme les views, les acls,...) il faut utiliser la version stable 9.X.

    Avertissement

    Pour ne pas se tromper lors de la mise en place de votre serveur, toujours choisir la version fournie par votre distribution en utilisant les paquets créés. Vous serez ainsi sûr de toujours avoir une version à jour d’un point de vue sécurité.

    Sous Debian GNU/Linux, le paquets bind9 et bind9-host (pour vous aider dans le debugging) peuvent être installés.

    Note

    bind9-host fournit le programme host intégré avec les sources de BIND 9.X. Cette version est différente de celle livrée dans le paquet host, qui est de NIKHEF, et possède un ensemble similaire (mais différent) de fonctionnalités/options.

    
# Paquets disponible sous Debian
    
    $ apt-cache search '^bind9'
    bind9 - Internet Domain Name Server
    bind9-doc - Documentation for BIND
    bind9-host - Version of 'host' bundled with BIND 9.X
    bind9utils - Utilities for BIND
    libbind9-40 - BIND9 Shared Library used by BIND
       
    
# Installation des paquets nécessaires
    
    $ apt-get install bind9 bind9-doc bind9-host
    Lecture des listes de paquets... Fait
    Construction de l'arbre des dépendances       
    Lecture des informations d'état... Fait
    bind9-host est déjà la plus récente version disponible.
    Les paquets supplémentaires suivants seront installés : 
      bind9utils
    Paquets suggérés :
      resolvconf ufw
    Les NOUVEAUX paquets suivants seront installés :
      bind9 bind9-doc bind9utils
    0 mis à jour, 3 nouvellement installés, 0 à enlever et 15 non mis à jour.
    Il est nécessaire de prendre 601ko dans les archives.
    Après cette opération, 2048ko d'espace disque supplémentaires seront utilisés.
    Souhaitez-vous continuer [O/n] ? O
    Réception de : 1 http://security.debian.org lenny/updates/main bind9utils 1:9.5.1.dfsg.P3-1+lenny1 [93,0kB]
    Réception de : 2 http://security.debian.org lenny/updates/main bind9 1:9.5.1.dfsg.P3-1+lenny1 [243kB]
    Réception de : 3 http://security.debian.org lenny/updates/main bind9-doc 1:9.5.1.dfsg.P3-1+lenny1 [265kB]
    601ko réceptionnés en 1s (530ko/s)
    Préconfiguration des paquets...
    Sélection du paquet bind9utils précédemment désélectionné.
    (Lecture de la base de données... 144884 fichiers et répertoires déjà installés.)
    Dépaquetage de bind9utils (à partir de .../bind9utils_1%3a9.5.1.dfsg.P3-1+lenny1_i386.deb) ...
    Sélection du paquet bind9 précédemment désélectionné.
    Dépaquetage de bind9 (à partir de .../bind9_1%3a9.5.1.dfsg.P3-1+lenny1_i386.deb) ...
    Sélection du paquet bind9-doc précédemment désélectionné.
    Dépaquetage de bind9-doc (à partir de .../bind9-doc_1%3a9.5.1.dfsg.P3-1+lenny1_all.deb) ...
    Traitement des actions différées (« triggers ») pour « man-db »...
    Paramétrage de bind9utils (1:9.5.1.dfsg.P3-1+lenny1) ...
    Paramétrage de bind9 (1:9.5.1.dfsg.P3-1+lenny1) ...
    Ajout du groupe « bind » (identifiant 118)...
    Terminé.
    Ajout de l'utilisateur système « bind » (identifiant : 113)...
    Ajout du nouvel utilisateur « bind » (identifiant : 113) avec le
    groupe « bind »...
    Répertoire personnel « /var/cache/bind » non créé.
    wrote key file "/etc/bind/rndc.key"
    #
    Starting domain name service...: bind9.
    Paramétrage de bind9-doc (1:9.5.1.dfsg.P3-1+lenny1) ... 
       

    12.2.6.3. Maintenance hebdomadaire

    Ajout/Suppression d' entrées dans la zone du réseau

    Administration classique de la machine (lecture des logs, mise a jour, etc.)

    Nécessite uniquement une bonne compréhension des réseaux IP et la lecture les pages de manuel.


    12.2.7. Documentation

    Source(s):

    
# Naviguer en local dans BIND 9 Administrator Reference Manual
    file:///usr/share/doc/bind9-doc/arm/Bv9ARM.html
    
    man named        # Aide sur le serveur DNS
    man named.conf   # Aide sur le fichier de configuration
    
    man host         # Aide sur la commande 'host'
    man dig          # Aide sur la command 'dig'
      

    12.2.8. Configuration

    La configuration de bind n’est basée que sur des fichiers textes

    /etc/bind/named.conf décrit toutes les zones et options du serveur.

    Peaufiner la configuration pour qu’elle corresponde à vos besoins (ajout de serveurs secondaires, transfert de zone, limitation des zones, délégations, etc.).

    Pour brider votre serveur, il va falloir utiliser les directives allow-transfer, allow-query, allow-recursion ou allow-notify...


    12.2.8.1. Options

    Liste des options disponibles : En local En ligne

    
options {
        directory "/var/cache/bind";                  # Repertoire de cache
        allow-query { 10.10.0.0/24; 127.0.0.1;};      # Hôtes autorisés à faire des requêtes DNS
        allow-transfer { none; } ;                    # Hôtes autorisés à recevoir des transferts 
                                                      # de zone depuis ce server
        allow-recursion { 10.0.0.0/24; 127.0.0.1;} ;  # Hôtes autorisés à faire des requêtes 
                                                      # recursives sur ce serveur
    };
       

    12.2.8.2. Zones

    Ensuite, pour chaque zone, indiquer le type de service proposé : autoritaire ou secondaire.


    12.2.8.2.1. Zone de serveur de cache (Forwarders) : Servie par un autre serveur (DNS FAI)

    Si vous n’êtes ni le serveur maître, ni le serveur esclave d’une zone mais que vous savez qui contacter sans passer par l’interrogation des root-servers (exemple des zones internes d’une entreprise divisée en de nombreux départements), vous pouvez donner un ou plusieurs forwarders.

    
// on sait que la zone hq.bar.org est servie
    // par 10.0.0.2 donc posons lui nos questions !
    zone "hq.bar.org" {
            type forward;
            forwarders { 10.0.0.2;};          # DNS du FAI
    };
        

    Note

    Ce type de directive est souvent utilisé lorsque vous êtes un serveur de cache : Vous transmettez toutes vos requêtes au serveur dns de votre fournisseur d’accès qui se chargera d’interroger les root-servers à votre place, ne vous laissant plus qu’à mettre en cache la réponse.


    12.2.8.2.2. Zone de serveur secondaire (Autoritaire non Maître)

    Les serveurs secondaires qui sont autoritaires, sont de simples miroirs : ils n’ont qu’un droit de lecture seule sur les données. Ainsi, pour un serveur secondaire, il suffit d’indiquer qui est le maître de la zone et la zone va être automatiquement transférée vers lui. Pareil, si une modification est faite de la zone sur le serveur autoritaire, le serveur secondaire est notifié du changement et un transfert de zone a de nouveau lieu.

    
// Serveur secondaire pour la zone foo.bar.org
    // en interogeant le maître 10.2.3.4
    zone "foo.bar.org." {                      # Définit la zone
               type slave;                     # Définit comme serveur secondaire pour cette zone 
               masters { 10.2.3.4; };          # Serveurs maîtres
    };
          

    12.2.8.2.3. Zone de serveur primaire (Autoritaire Maître)

    Pour le serveur primaire, le chemin vers le fichier qui contient la zone doit être précisé.

    
zone "testme.fr" {
          notify no;
          type master;                   # Nous sommes le maître (autoritaire) de la zone testme.fr
          file "/etc/bind/db.testme.fr"; # Zone décrite dans le fichier db.testme.fr.
    };
         

    Fichier db.testme.fr

    
;;PREAMBULE
    $TTL 604800             ; "Time to Life" (Hrs) fixé à une semaine (604800/3600/24) par défaut.
    
    @       IN      SOA    ns0.testme.fr. hostmaster.testme.fr. (
                            ; @ est un raccourci pour désigner cette zone.
                            ; IN = Internet
                            ; "Start Of Autority" (SOA), se déclare autoritaire pour  
                            ; la zone nommée dans le fichier de conf. named.conf (testme.fr)
                            ; ns0.testme.fr : serveur primaire responsable de cette zone
                            ; hostmaster.testme.fr : adresse email de l’administrateur du service DNS
                            ; (remplacer premier . par @)
    
    
            2005081100      ; numéro de série (« version de la zone »)
                            ; utilisé lors du transfert de zone
                            ; concaténer l’année (sur quatre chiffres), le mois, 
                            ; le jour et un numéro sur deux chiffres 
                            ; (incrémenté à chaque changement si le même jour).
    
            8H              ; rafraichissement (refresh) : 
                            ; temps de rafraichissement minimal pour la zone.
                            ; Ici 8 heures. La valeur recommandée est de 24 heures.
            2H              ; essai (retry) : 
                            ; temps d’attente avant de réessayer en cas d’échec.
                            ; Ici, 2 heures. La valeur recommandée est de 2 heures.
            1W              ; expiration (expire) : le temps d'expiration, 
                            ; la durée de validité maximale de la zone.
                            ; Ici, 1 semaine. La valeur recommandée est de 1000 heures.
            1D )            ; minimum : valeur TTL minimum 
                            ; Ici, 1 jour. La valeur recommandée est de 2 jours.
    
    ;;DATA
    ;Chaque ligne décomposée en quatre parties :
    
    ;C1: Nom d'enregistrement (on le définit), si partie est vide, elle désigne l’objet courant
    ;C2: Classe d'enregistrement, toujours la classe IN (pour Internet) 
    ;    à moins d'un environement exotique.
    ;C3: Type d’enregistrement, A,NS, MX, CNAME, etc.
    ;C4: La « donnée » en dernière colonne
    
    ;C1     ;C2 ;C3  ;C4
                TXT  "Private Network"    ; Décrit la zone @ (soit testme.fr)
                                          ;
    
                NS   ns0.testme.fr.       ; "Name Serveur" (NS)
                NS   ns1.testme.fr.       ;                                      
    ;;Syntaxe    
    ; mondomaine.fr. IN NS ns1.domaine.fr.; Déclarer ns0.domaine.fr responsable 
                                          ; du domaine mondomaine.fr 
    
                MX   10  mx1              ; Service mail [Mail eXchanger (MX)]
                MX   20  mx.monfai.fr.    ; Pour récupérer l'addresse de la machine en charge des courriels
                                          ; pour envoyer un mail à un nom de domaine
                                          ; Équivaut à testme.fr.  MX 10 mx0
                                          ;            testme.fr.  MX 20 mx1 
                                          
                                          ; Ici 10 et 20 indiquent la priorité 
                                          ; le serveur avec la plus petite priorité 
                                          ; est utilisé en premier
    
    homer    IN A    10.0.0.42            ; Simple nom de machine 'homer' 
                                          ; (appartenant au domaine @ ou testme.fr) 
                                          ; pointe vers adresse IPv4 de classe IN 10.0.0.42
                                          ; Équivaut à homer.testme.fr. IN A 10.0.0.42
    
    homer    IN AAAA 2001:660:305:1::1:2  ; Enregistrement d'addresse IPv6 
                                          ; pour la machine 'homer'
    
    maggie   IN A    10.0.0.33            ; Enregistrement de la machine
                                          ; maggie.testme.fr
    
    marge    IN A    10.0.0.88            ; marge.testme.fr
    
    ns0      IN A    10.0.0.40
    ns1      IN A    10.0.0.41
    
    ;; Pour les addresses IPv4 utiliser record type A
    ;; Pour les addresses IPv6 utiliser record type AAAA
    
    www      IN CNAME homer               ; "Canonical Name" (CNAME) Alias définition 
    cvs      IN CNAME homer               ; www.testme.fr et cvs.testme.fr pointe vers 'homer'
          


    12.2.8.2.4. Resolution DNS Inverse : Adresse vers nom de domaine

    À partir d’une adresse IP, nous pouvons lui faire correspondre un nom de domaine. Similairement à la hiérarchie de résolution classique, nous avons les mêmes mécanismes pour les requêtes inverses.

    Pour résoudre 10.0.0.42, on utilise une zone spéciale, in-addr.arpa comme racine et on descend dans l’arbre

    
// Provide a reverse mapping for the loopback address 127.0.0.1
    zone "0.0.127.in-addr.arpa" {
         type master;
         file "localhost.rev";
         notify no;
    };
        

    12.2.8.2.5. Alias : "Canonical Name" (CNAME)

    Lorsque vous êtes client d’un réseau, il est toujours recommandé d’utiliser des noms de services comme adresse plutôt que les véritables noms de machine. D’une part car il est plus facile et logique de mémoriser cvs.testme.fr plutôt que homer.testme.fr mais surtout car le service CVS pourrait être déplacé sur un autre serveur.

    
www      IN CNAME homer               ; "Canonical Name" (CNAME) Alias définition 
    cvs      IN CNAME homer               ; www.testme.fr et cvs.testme.fr pointe vers 'homer'
        

    Avertissement

    !!!Attention!!! Les "Canonical Name" (CNAME) ne doivent jamais se trouver sur la partie droite d’un enregistrement.


    12.2.8.2.6. Serveur de nom : "Nameserver" (NS)

    Un enregistrement Nameserver (NS) sert à déclarer les serveurs DNS responsables d’un nom de domaine. Ici,on ne fait pas de différenciation entre les serveurs primaires ou secondaires, ils doivent simplement être autoritaires.

    
mondomaine.fr.    IN   NS   ns0.domaine.fr.
         

    Note

    Pour un enregistrement NS le systeme attends un nom d'hôte... et pas une adresse IP... Il faudra toujours mettre un nom d'hôte à la place de 192.3.2.3 par example !

    Voici les passages de la RFC 1035 indiquant qu'une une ressource NS est forçément un nom d'hôte :

    
,----
    | 3.3.11. NS RDATA format
    |
    |     +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |     /                   NSDNAME                     /
    |     /                                               /
    |     +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |
    | where:
    |
    | NSDNAME         A <domain-name> which specifies a host which should be
    |                 authoritative for the specified class and domain.
    `----
    
    Puis :
    
    ,----
    | <domain-name> is a domain name represented as a series of labels, and
    | terminated by a label with zero length.  <character-string> is a single
    | length octet followed by that number of characters.  <character-string>
    | is treated as binary information, and can be up to 256 characters in
    | length (including the length octet).
    `----
       


    12.2.8.3. Transfert de Zone & Numéros de série

    Source(s):

    Transfert de Zone DNS, est souvent connu sous son nom de code menmonique AXFR, c'est un type de transaction DNS.

    
$ dig yourdomain.com AXFR   # Si le domaine questionné permet les transferts DNS, 
                                # il est possible de les obtenir :)
                                # Mais sur Internet, très peu de domaine autorise 
                                # de façon libre et unlimité le transfert de zone.
       

    C'est un des mécanisme disponible à l'adminsitrateur pour procéder à la replication des bases de données contenant les données et enregistrement DNS à travers un groupe de server DNS. Le transfert de Zone peut-être de deux type : complet (opcode AXFR) ou incrémentale (IXFR).

    La partie préambule d'une zone de transfert repose sur le numéro de série, et uniquement le numéro de série,pour déterminer si les données de la zone ont changé et donc que la zone requiert un transfert. Pour certains serveur DNS, le numéro de série des enregistrement de type SOA sont maintenu manuellement par les administrateurs. Chaque edition de changement de donnée requierts deux changement : un sur l'enregistrement à changer et l'autre sur le numéro de série de la zone. Ceci peut-être laborieux et sujet à erreur, l'adminstrateur peut oublier de changer le numéro de série ou le changer de façon incorrect (en le diminuant ou en l'augmentant trop).

    Avertissement

    Lorsqu'un serveur DNS reçoit une mise à jour directement (soit à partir de l'administrateur, ou via les mises à jour dynamiques) son numéro de série doit toujours être augmenté.

    Lorsqu'un serveur DNS reçoit une mise à jour via un transfert de zone :

    • Si le numéro de série spécifié dans le début de l'autorité d'enregistrement SOA de la copie répliquée de la zone est supérieur au numéro de série est spécifié dans l'enregistrement SOA la copie locale de la zone, la zone sera répliqué (transfert de zone).

    • Si le numéro de série de la zone répliquée est identique ou inférieur au numéro de série de la zone local, la zone local reste inchangée.


    12.2.9. Configuration d'un serveur DNS sur le net

    Cette configuration est possible , si vous possédez une IP fixe ainsi qu'un nom de domaine.

    Dans ce cas, il faut renseigner au registrar l'IP du serveur DNS.

    Pour un réseau d'entreprise qui possède parfois plusieurs IP publiques , avoir son propre serveur DNS peut s'avérer tres utile. En effet puisque l'on gère de façon autonome son domaine, on peut définir les noms et alias pour chaque IP publique. Il suffira de créer une zone de notre domaine.

    La zone inverse étant gérée par le registrar , que vous pouvez bien souvent modifier via l'interface web d'administration sur le site du registrar.

    Pour l'exemple, notre domaine aura pour nom mydomain.com :

    
$ORIGIN .
    $ttl 38400
    mydomain.com.    IN      SOA     mydomain.com.  root.mydomain.com. (
                            2004110129
                            5400
                            3600
                            604800
                            38400 )
                            NS      ns.mydomain.com.
                            NS      ns.anotherdomain.com.
                            MX      10      mail.mydomain.com.
                            MX      20      mail.anotherdomain.com.
                            A       123.45.67.89
    $ORIGIN                 mydomain.com.
    mail                    A       123.45.67.89
    www	                A       123.45.67.90
    webmail                 CNAME   mail
    www                     CNAME   www
    ftp                     CNAME   www
    

    Comme on peut le remarquer le fichier de zone est à peu près similaire au fichier de zone vu précedement.

    On remarque qu'il y a deux champs NS et MX. Il s'agit tout simplement des serveurs DNS (NS) et de courrier (MX) primaires et secondaires, toujours utile en entreprise. Dans l'exemple , nous possédons deux adresses IP publiques 123.45.67.89 et 123.45.67.90. Un serveur mail sera hébergé sur mail.mydomain.com

    (123.45.67.89) et un serveur web www.mydomain.com (123.45.67.90). On indique donc, le nom et l'adresse IP du serveur correspondant par un champ A.

    On peut par la suite indiquer des alias grâce aux champs CNAME.


    12.2.10. Piège à éviter

    Source(s):

    Il existe des dizaines de pièges mais vous les cultiverez avec le temps et l’expérience, la RFC1912 documente les principales erreurs.

    Lors de la configuration, attention au caractère . (le point). L’oubli ou l’ajout du point dans les noms de domaines est l'erreur la plus fréquente. Il est d’une importance primordiale et vous vous ferez piegez à coup sûr. Règle d'or : si un nom ne se termine pas par un point, alors cela ajoute à la fin le domaine courant, autrement, on désigne le nom pleinement qualifié "Fully Qualified Domain Name" (FQDN). Lorsqu' un nom (homer, marge, etc) est définit, il n'est donc pas nécessaire d’ajouter à la fin de chaque nom de machine le domaine courant.

    Un autre oubli est de ne pas incrémenter le numéro de série de la zone lorsque vous la modifiez, ce qui a pour conséquence de ne pas mettre à jour les serveurs secondaires si vous en avez. Un bon schéma à suivre pour écrire ce serial est de concaténer l’année (sur quatre chiffres), le mois, le jour et un numéro sur deux chiffres. Par exemple, pour le 18 août 2005 : 2005081800. Cette numérotation permet d’être assuré que les numéros de séries se suivent de facon cohérente et qu’il n’y a pas d’erreur. Si dans une journée, vous faîtes plus d’une modification, incrémentez simplement les deux derniers chiffres. Et si c’est une autre journée, réécrivez intégralement le numéro de série : le 20 août 2005 (2005082000) est forcément supérieur à celui du 18 août car 2005082000 > 2005081800.

    Ne pas oublier qu’un alias (CNAME) ne doit pas être dans la partie droite d’un enregistrement. Ainsi, pas de MX pointant sur un CNAME (erreur la plus fréquente).


    12.2.11. Outils de diagnostique et de vérification de la configuration

    L’erreur est humaine et c’est bien pour cela qu’il faut s'habituer à l’utilisation d'outils de diagnostique et de logiciels de vérification de zone


    12.2.11.1. Outils de ligne de commande

    Pour effectuer des requêtes manuelles sur des serveurs DNS :

    
### dig 
    # Le "Domain Information Groper" (dig) est la plus complète et flexible des commandes de diagnostique
    
    Syntaxe : dig [@server] domain [query-type] [query-class] [+query-option] [-dig-option] [%comment]
              # The usual simple use of dig will take the form
              dig @server domain query-type query-class  
    
    man dig  # Pour plus d'info ;-)
        
    
### host 
    # L'utilitaire host (simple et facile) convertit des nom d'hôte en addresse IP
    
    Syntaxe : host [-aCdlrTwv] [-c class] [-N ndots] [-t type] [-W timeout] [-R retries] hostname [server]
    
    man host # Pour plus d'info ;-)
        
    
### nslookup [Il est recommendé d'utiliser dig au lieu de nslookup] 
    # Permet de questionner des serveurs DNS pour obtenir des informations sur des hôtes et domaines.
    
    Syntaxe : nslookup [-option...] [[host-to-find] | [- [server]]]
        


    12.2.11.2. Logiciel de vérification de zone

    ZoneCheck : est l'un des meilleurs logiciels de vérification de zone.

    Le programme ZoneCheck effectue plusieurs tests sur la zone (domaine) afin de s'assurer que celle-ci est correctement configurée et peut être déléguée sans risque, fournissant un certain degré de qualité à votre domaine.


    12.2.11.3. Outils d'adminsitration

    
### named-checkconf
    # Programme de vérification de la syntaxe du fichier named.conf
    $ named-checkconf [-jvz] [-t directory] [filename]
         
    
### named-checkzone
    # Programme de vérification de la syntaxe et cohérence du fichier de l'autorité maître
    $ named-checkzone [-djqvD] [-c class] [-o output] [-t directory] [-w directory] 
                      [-k (ignore|warn|fail)] [-n (ignore|warn|fail)] zone [filename]
         
    
### rndc
    # Le "Remote Name Daemon Control" (rndc) programme permet à l'adminsitrateur 
    # système de controller les opérations du serveur de nom.
    $ rndc [-c config] [-s server] [-p port] [-y key] command [command...]
       

    12.2.12. Commandes utiles

    12.2.12.1. Vérifier les fichiers de configuration et Zone

    
# Vérifier configuation du serveur
    $ named-checkconf /etc/bind/named.conf      
    
    # Vérifier configuation d'une zone
    $ named-checkzone blabla.mondomaine.lan /etc/blind/db.blabla.mondomaine.lan
       

    12.2.12.2. Start, Restart, Stop

    
$ /etc/init.d/bind9 start    # restart | stop
    $ /etc/init.d/bind start     # Alternative
       

    12.2.12.3. Flush DNS cache

    
$ rndc flush                # Efface la cache d'un serveur DNS
                                # Bind9
    $ ndc flush                 # Bind8
    
    $ /etc/init.d/nscd restart  # Flush DNS
    $ service nscd restart      # Alternative parfois
    
    $ rndc restart   # Avec un veille version 
    $ rndc exec      # Alternative
       

    Dans une machine virtuelle Netkit, il semble qu'aucune des ces commande ne soite disponisble. Le seul moyen que j'ai trouvé c'est de redémarrer tout le lab pour faire un flush DNS sur le machine virtuelle... ce qui est un peu trop barbare ... comment le faire hote par hote ?

    
# Dans une Machin Virtuelle Netkit...
    # Trouver le fichier named_dump.db et le supprimer 
    # C'est une autre solution barbare mais qui peut fonctionner
    # hôte par hôte... :)
       


    12.2.12.4. Reload configuration sans re-démarrer

    
$ rndc reload domain-name-of-zone      # Bind9
    $ ndc reload domain-name-of-zone       # Bind8
    $ rndc reload foo.example bar.example  # Recharger plusieurs zones
    
    $ /etc/init.d/bind9 reload
       

    12.2.13. Verification du bon fonctionnement du serveur

    Avant de lancer le serveur , il faut modifier le fichier /etc/resolv.conf sur toutes les machines clientes.

    Il faut indiquer le nom du domaine et l'adresse IP du serveur DNS :

    
#/etc/resol.conf
    search maison.local
    nameserver 192.168.0.1
       

    Pour vérifier que notre serveur résout bien les noms du réseau , il faut utiliser l'utilitaire dig :

    
## Requête sur le champ A de machine1.maison.lan
    $ dig @192.168.0.1 machine1.maison.lan A
    
    # Dig va retourner une série d'informations, 
    # celle qui nous intéresse est "ANSWER SECTION"
    # Si elle est absente ou erronée, 
    # c'est que vous vous êtes trompés quelques part (sûrement un point
    # oublié à la fin des noms de domaines)
       
    
## Requète inverse sur l'IP 192.168.0.3
    $ dig @192.168.0.1 -x 192.168.0.3
      


    12.2.14. Slow DNS lookup issues with bind9

    
Source:http://wiki.kartbuilding.net/index.php/DNS_-_Bind9#Slow_DNS_lookup_issues_with_bind9
    
    If ping or netstat etc. takes a long time to return an ip - there is a problem. Carry out the following test:
    
    dig www.burkesys.com
    
    Identify the time taken. Try the same test on a different computer (your local one etc.). If it takes 2000+ msec (milliseconds) this is poor. After looking at problems found here: http://www.unixadmintalk.com/f59/bind-9-2-4-1-very-slow-resolving-uncached-querres-129112/index2.html and http://v6fix.net/db/bind9-ipv6-transport.html I realised bind9 was doing a lookup via ipv6. Although ipv6 is enabled in my default debian install, there is no ipv6 network. Bind9 however does a lookup over ipv6 first, then times out and tries ipv4.
    
    Solutions: Disable ipv6 on Debian Sarge, or Disable ipv6 bind lookup, or use a different dns server for lookups.
    It is difficult to cleanly disable ipv6 on Sarge, requiring reboot and trial and error.
    In order to Disable ipv6 lookup on bind9 with Debian Sarge - a recompile is required. If you are using debian packages (like me) this is not ideal.
    The default bind9 that ships with Debian Etch (9.3.2-P1.0-1) can easily be configured to use ipv4 by:
    
    
vi /etc/default/bind9
    OPTIONS="-4 -u bind"
    //-4 = to use ipv4 only.
    
    
    As I was using Debian Sarge, and wanted a quick solution to my DNS lookup times, I decided to use my ISP dns server *only* for lookups. This entry is in /etc/resolv.conf and I put the following syntax:
    
    search domainname.com
    nameserver 43.111.98.12
    nameserver 43.111.21.45
    
    Bind will still serve out all domain names when requested. The above simply uses the ISP's dns server for lookups on the server. 
      

    12.2.15. Architecture de Service DNS

    L'architecture du service DNS sera différente suivant si c'est un serveur autoritaire, primaire, secondaire ou simplement de cache.

    Le point essentiel lors du déploiement des machines est le principe du moindre privilège, dans l’absolu, il faudrait une machine par service. Ce réseau de serveurs devrait lui-même être contenu dans un réseau à part entière (différent du réseau des machines clientes) (DMZ, ou zone démilitarisée).

    Il en est de même pour le DNS, si possible, il faut un serveur pour traiter les « requêtes autoritaires », un autre pour les clients internes de votre réseau (pour leur servir de cache) et, dans le meilleur des mondes, un serveur de cache uniquement pour servir votre DMZ.

    bind (depuis la version 9) a la capacité de faire tourner différentes vues, on peut voir une vue comme une instance de bind indépendante des autres permettant de simuler l'accès à plusieurs machines disponibles.

    Dans un réseau avec une architecture simple, on peut faire tourner un bind avec deux vues :

    
### une pour les clients
    
    // On est autoritaire et on sert de serveur cache pour
    // les clients du réseau interne.
    // De plus, on propose la zone complète testme.fr pour
    // ces clients
    view "internal" {
              match-clients { 10.0.0.0/8; };
              recursion yes;
              zone "testme.fr" {
                      type master;
                      file "db.full.testme.fr";
             };
    };
       
    
### une autre pour servir le monde entier 
    # (si nous sommes autoritaires pour un quelconque domaine).
    
    // Une vue externe pour les requêtes provenant d’Internet
    // On offre une vue limitée de la zone testme.fr (juste
    // ce qu’il faut) et on interdit la récursion (on ne
    // veut pas servir de serveur de cache)
    view "external" {
             match-clients { any; };
             recursion no;
             zone "testme.fr" {
                    type master;
                    file "db.limited.testme.fr.conf";
             };
    };
      


    12.3. DNS : Travaux pratiques 1

    Source(s):


    12.3.1. dig : Mise en application

    Source(s):

    Note

    Voir aussi la section SR004 Interconnecter un réseau TCP/IP > command dig pour un description de la commande dig

    Les logiciels les plus courants sont : host, nslookup et dig. Chacun a ses avantages (host affiche les informations plus simplement, nslookup a une « interface interactive » et dig est très détaillé)

    dig affiche plusieurs sections lorsqu’on l’utilise :

    
– Un résumé en deux lignes de l’échange DNS
    – La question qui a été posée
    – La réponse, s’il y en a
    – L’autorité qui nous a répondue
    – Le champs additionnel (optionnel)
    – Diverses données comme le temps total de la requête, le serveurs dns utilisé ou la taille des messages.
    
    Les lignes commencant par un ; (point-virgule) sont des commentaires. 
      
    
$ dig www.isc.org       
    ## Ligne de commande invoquant dig
    
    ; <<>> DiG 9.2.3 <<>> www.isc.org
    ;; global options:  printcmd
    ## La section d'ouverture indiquant 
    ## - la version (version 9.2.3)
    ## - les paramètres de commande
    ## - les options globales
    ## Peut-être enlevé via l'option +nocmd
    ## (à placer en premier argument de la commande)
    
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43071
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3
    ## Detail technique de la réponse reçu du serveur DNS.
    ## Peut-être ajouter/enlevé via l'option +[no]comments.
    
    ;; QUESTION SECTION:
    ;www.isc.org.                   IN      A
    ## Dans la section QUESTION, dig rappel la requête en cours. 
    ## Requête de tip (A) adresse  Internet par défaut.
    ## Peut-être ajouter/enlevé via l'option +[no]question
    
    ;; ANSWER SECTION:
    www.isc.org.            600     IN      A       204.152.184.88
    
    ## Voici la REPONSE tant attendu ! L'adresse IP de www.isc.org est 204.152.184.88.
    ## Peut-être ajouter/enlevé via l'option +[no]answer
    
    ;; AUTHORITY SECTION:
    isc.org.                2351    IN      NS      ns-int.isc.org.
    isc.org.                2351    IN      NS      ns1.gnac.com.
    isc.org.                2351    IN      NS      ns-ext.isc.org.
    
    ## La SECTION D'AUTORITÉ quels serveurs DNS peuvent 
    ## fournir une réponse autoritaire à la question.
    ## Ici isc.org a trois serveur de nom.
    ## Peut-être ajouter/enlevé via l'option +[no]authority
    
    ;; ADDITIONAL SECTION:
    ns1.gnac.com.           171551  IN      A       209.182.216.75
    ns-int.isc.org.         2351    IN      A       204.152.184.65
    ns-int.isc.org.         2351    IN      AAAA    2001:4f8:0:2::15
    
    ## La SECTION ADDITIONNELLE affiche la liste des adresses IP 
    ## des serveurs DNS listé dans la section d'autorité.
    ## Peut-être ajouter/enlevé via l'option +[no]additional
    
    ;; Query time: 2046 msec
    ;; SERVER: 127.0.0.1#53(127.0.0.1)
    ;; WHEN: Fri Aug 27 08:22:26 2004
    ;; MSG SIZE  rcvd: 173
    
    ## La section FINAL de l'affichage par défaut 
    ## contient les statistiques sur la requête
    ## Peut-être ajouter/enlevé via l'option +[no]stats
      


    12.3.2. dig : Resolution DNS Simple

    Par défaut, dig ne fait qu’une résolution de type A, vous pouvez néanmoins préciser le type de requête : MX, NS,PTR, AXFR, etc.

    
$ dig eof.eu.org
    
    ; <<>> DiG 9.3.1 <<>>  eof.eu.org
    ;; global options:         printcmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62239
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0
    ;; QUESTION SECTION:
    ;eof.eu.org.                                 IN         A
    ;; ANSWER SECTION:
    eof.eu.org.                      259200      IN         A         195.115.89.182
    ;; AUTHORITY SECTION:
    eof.eu.org.                      259200      IN         NS        ns.eof.eu.org.
    eof.eu.org.                      259200      IN         NS        ns2.eof.eu.org.
    ;; Query time: 26 msec
    ;; SERVER: 172.16.0.42#53(172.16.0.42)
    ;; WHEN: Mon Aug 22 10:02:51 2005
    ;; MSG SIZE r
      
    12.3.2.1. Interprétez ce résultat. Qui est en charge de servir la zone eof.eu.org ?
    12.3.2.2. Mettez-vous à la place d’un serveur DNS et indiquez toutes les requêtes DNS effectuées pour résoudre eof.eu.org en utilisant dig.
    12.3.2.3. Parmi les serveurs dns trouvés précédemment, est-ce qu’il y en a qui supporte le protocole IPv6 ?

    12.3.2.1. Interprétez ce résultat. Qui est en charge de servir la zone eof.eu.org ?

    L'hôte eof sur le domaine eu.org se trouve à l'addresse IPv4 195.115.89.182.

    Les serveurs DNS ns.eof.eu.org et ns2.eof.eu.org sont en charge de la zone.

    12.3.2.2. Mettez-vous à la place d’un serveur DNS et indiquez toutes les requêtes DNS effectuées pour résoudre eof.eu.org en utilisant dig.

    QUERY : 1 ==> Une seule requête traité.

    dig contact le serveur DNS de ma machine (c'est à dire le server DNS de mon FAI).

    Le DNS du FAI n'a pas l'autorité sur la zone donc il cherche dans sa cache si l'enregistrement existe, auquel cas il réponds directement sinon il réfère à un root node (. puis ...).

    Le server DNS root node fait de même jusqu'a ce que l'un des serveur DNS en charge de la zone eof.eu.org soit identifié.

    L'un de ses derniers reçoit donc la question et y réponde en indiquant l'addresse IP de l'hôte eof sur eu.org et les références de serveur de nom qui peuvent être mis en cache pour obtenir des réponse plus rapide à des requêtes sur le même domaine.

    Ce qu'il se passe peut se résumer ainsi :

    
$ dig NS .
     f.root-servers.net.
    $ dig @f.root-servers.net. NS org.
     199.19.56.1
    $ dig  @199.19.56.1 NS eu.org.
     ns1.pasteur.fr.
    $ dig @ns1.pasteur.fr eof.eu.org.
     86.64.63.108
         

    12.3.2.3. Parmi les serveurs dns trouvés précédemment, est-ce qu’il y en a qui supporte le protocole IPv6 ?

    Aucun des deux server DNS ne semble supporter le protocole IPv6 :

    
$ dig ns2.eof.eu.org aaaa
    
    ; <<>> DiG 9.6.1-P2 <<>> ns2.eof.eu.org aaaa
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54613
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;ns2.eof.eu.org.			IN	AAAA
    
    ;; Query time: 64 msec
    ;; SERVER: 10.0.1.1#53(10.0.1.1)
    ;; WHEN: Fri Jan 22 23:06:37 2010
    ;; MSG SIZE  rcvd: 32
          
    
$ dig ns.eof.eu.org aaaa
    
    ; <<>> DiG 9.6.1-P2 <<>> ns.eof.eu.org aaaa
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55315
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;ns.eof.eu.org.			IN	AAAA
    
    ;; Query time: 56 msec
    ;; SERVER: 10.0.1.1#53(10.0.1.1)
    ;; WHEN: Fri Jan 22 23:06:48 2010
    ;; MSG SIZE  rcvd: 31
         

    Mais ceux en charge d'eu.org le sont :

    
% dig ns eu.org
    
    ; <<>> DiG 9.6.1-P2 <<>> ns eu.org
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12890
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; QUESTION SECTION:
    ;eu.org.                                IN      NS
    
    ;; ANSWER SECTION:
    eu.org.                 259200  IN      NS      DNS3.GANDI.NET.
    eu.org.                 259200  IN      NS      NS-SLAVE.FREE.org.
    eu.org.                 259200  IN      NS      NS0.PASTEUR.FR.
    eu.org.                 259200  IN      NS      NS-V6.eu.org.
    eu.org.                 259200  IN      NS      NS1.PASTEUR.FR.
    eu.org.                 259200  IN      NS      AUTH1.DNS.ELM.NET.
    
    ;; ADDITIONAL SECTION:
    NS-V6.eu.org.           259200  IN      AAAA    2a01:e35:8b50:2c40::4
    
    ;; Query time: 21 msec
    ;; SERVER: 212.27.40.240#53(212.27.40.240)
    ;; WHEN: Sun Jan 24 19:02:31 2010
    ;; MSG SIZE  rcvd: 202
        

    Cela ne veut pas dire que eof.eu.org peut être atteint via IPv6 non ? Est-ce suffisant d'avoir le domaine supérieur "question-able" via IPv6 ?

    Non en effet, cela signifie uniquement qu'on peut connaître les NS d'eof.eu.org en IPv6 :(

    Est-ce cela signifie que si eu.org reçoit la requête via IPv6 il peut la faire suivre en IPv4 vers eof.eu.org et ainsi répondre ?

    Non, à moins qu'il soit configuré comme forwarder. Si c'était le cas, effectivement, il pourrait faire "bridge v4-v6".

    D'autres example de résolution DNS simple avec la commande dig :

    
$ dig free.fr
    $ dig a free.fr    # synonyme du précédent
    
    ; <<>> DiG 9.6.1-P2 <<>> free.fr
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65478
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;free.fr.			IN	A
    
    ;; ANSWER SECTION:
    free.fr.		41487	IN	A	212.27.48.10
    
    ;; Query time: 7 msec
    ;; SERVER: 10.0.1.1#53(10.0.1.1)
    ;; WHEN: Fri Jan 22 21:32:55 2010
    ;; MSG SIZE  rcvd: 41
      
    
$ dig mx free.fr    # Connaître les serveurs de courriel de FREE
    
    ; <<>> DiG 9.6.1-P2 <<>> mx free.fr
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25682
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;free.fr.			IN	MX
    
    ;; ANSWER SECTION:
    free.fr.		32845	IN	MX	10 mx1.free.fr.
    free.fr.		32845	IN	MX	20 mx2.free.fr.
    
    ;; Query time: 7 msec
    ;; SERVER: 10.0.1.1#53(10.0.1.1)
    ;; WHEN: Fri Jan 22 21:52:36 2010
    ;; MSG SIZE  rcvd: 65
       
    
$ dig ptr free.fr                       # Incorrect !!! PTR sert à faire des resolutions inverses
    $ dig 10.48.27.212.in-addr.arpa ptr in  # Correct !!!
    
    ; <<>> DiG 9.5.1-P3 <<>> 10.48.27.212.in-addr.arpa ptr in
    ;; global options:  printcmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49397
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;10.48.27.212.in-addr.arpa.	IN	PTR
    
    ;; ANSWER SECTION:
    10.48.27.212.in-addr.arpa. 86400 IN	PTR	www.free.fr.
    
    ;; Query time: 56 msec
    ;; SERVER: 10.0.1.1#53(10.0.1.1)
    ;; WHEN: Sat Jan 23 19:12:45 2010
    ;; MSG SIZE  rcvd: 68
      
    
$ dig ns free.fr   # Connaître les serveurs DNS de FREE :)
    
    ; <<>> DiG 9.6.1-P2 <<>> ns free.fr
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56045
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;free.fr.			IN	NS
    
    ;; ANSWER SECTION:
    free.fr.		70500	IN	NS	freens2-g20.free.fr.
    free.fr.		70500	IN	NS	freens1-g20.free.fr.
    
    ;; Query time: 19 msec
    ;; SERVER: 10.0.1.1#53(10.0.1.1)
    ;; WHEN: Fri Jan 22 21:56:09 2010
    ;; MSG SIZE  rcvd: 77
      
    
$ dig 
    $ dig ns .  # Équivalent
    
    ; <<>> DiG 9.6.1-P2 <<>>
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59510
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;.				IN	NS
    
    ;; ANSWER SECTION:
    .			49319	IN	NS	I.ROOT-SERVERS.NET.
    .			49319	IN	NS	C.ROOT-SERVERS.NET.
    .			49319	IN	NS	A.ROOT-SERVERS.NET.
    .			49319	IN	NS	K.ROOT-SERVERS.NET.
    .			49319	IN	NS	E.ROOT-SERVERS.NET.
    .			49319	IN	NS	G.ROOT-SERVERS.NET.
    .			49319	IN	NS	D.ROOT-SERVERS.NET.
    .			49319	IN	NS	M.ROOT-SERVERS.NET.
    .			49319	IN	NS	B.ROOT-SERVERS.NET.
    .			49319	IN	NS	F.ROOT-SERVERS.NET.
    .			49319	IN	NS	L.ROOT-SERVERS.NET.
    .			49319	IN	NS	H.ROOT-SERVERS.NET.
    .			49319	IN	NS	J.ROOT-SERVERS.NET.
    
    ;; Query time: 29 msec
    ;; SERVER: 10.0.1.1#53(10.0.1.1)
    ;; WHEN: Fri Jan 22 22:00:54 2010
    ;; MSG SIZE  rcvd: 228
      


    12.3.3. dig : Resolution inverse

    Examinons les requêtes suivantes :

    
$ dig -x 195.115.89.182
    ; <<>> DiG 9.3.1 <<>> -x 195.115.89.182
    ;; global options:      printcmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20866
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
    ;; QUESTION SECTION:
    ;182.89.115.195.in-addr.arpa.           IN   PTR
    ;; ANSWER SECTION:
    182.89.115.195.in-addr.arpa. 86390 IN        PTR pegase.aelif.org.
    ;; AUTHORITY SECTION:
    89.115.195.in-addr.arpa. 86390          IN   NS  ns1.irisnet.fr.
    ;; ADDITIONAL SECTION:
    ns1.irisnet.fr.                86390      IN          A           195.115.88.35
    ;; Query time: 10 msec
    ;; SERVER: 172.16.0.42#53(172.16.0.42)
    ;; WHEN: Mon Aug 22 10:36:13 2005
    ;; MSG SIZE     rcvd: 119
        
    
$ dig ptr 195.115.89.182
    ; <<>> DiG 9.3.1 <<>> ptr 195.115.89.182
    ;; global options:       printcmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 29005
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
    ;; QUESTION SECTION:
    ;195.115.89.182.                                      IN          PTR
    ;; AUTHORITY SECTION:
    .                     10787      IN          SOA         A.ROOT-SERVERS.NET. \
             NSTLD.VERISIGN-GRS.COM. 2005082801 1800 900 604800 86400
    ;; Query time: 13 msec
    ;; SERVER: 172.16.0.42#53(172.16.0.42)
    ;; WHEN: Mon Aug 22 10:36:11 2005
    ;; MSG SIZE     rcvd: 107
        

    12.3.3.1. Pourquoi est-ce que les résultats sont différents ?
    12.3.3.2. Comment corriger la deuxième requête ?

    12.3.3.1. Pourquoi est-ce que les résultats sont différents ?

    Dans le 1er cas, dig execute la recherche automatiquement à partir d'un nom comme 182.89.115.195.in-addr.arpa et affecte à requête le type PTR et la classe IN.

    Dans le 2ème cas, dig lance une requête de type PTR à partir de 195.115.89.182, ce qui est incorrect :)

    12.3.3.2. Comment corriger la deuxième requête ?

    Dans le deuxième cas, pour obtenir le même resultat que le 1er cas, il faudrait remplacer par :

    
       $ dig 182.89.115.195.in-addr.arpa ptr in
           

    Autres examples :

    
$ dig -x 212.27.48.10
    $ dig -x 212.27.48.10 ptr in     # Équivalent
    
    ; <<>> -x 212.27.48.10 ptr
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26199
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;10.48.27.212.in-addr.arpa.	IN	PTR
    
    ;; ANSWER SECTION:
    10.48.27.212.in-addr.arpa. 86400 IN	PTR	www.free.fr.
    
    ;; Query time: 67 msec
    ;; SERVER: 10.0.1.1#53(10.0.1.1)
    ;; WHEN: Fri Jan 22 22:08:19 2010
    ;; MSG SIZE  rcvd: 68
      


    12.3.4. Manipulation des flags

    Expliquons le résultat suivant :

    
# 172.16.0.42 n'est pas accessible donc j'utilise en lieu et place le server DNS de Google :)
    $ dig @8.8.8.8 +norecurse +short gluck.debian.org    # Ligne 1
    $ dig @8.8.8.8 +short gluck.debian.org               # Ligne 2
    150.203.164.38
    $ dig @8.8.8.8 +norecurse +short gluck.debian.org    # Ligne 3
    150.203.164.38
       

    Ligne 1 : Recherche auprès du serveur DNS 8.8.8.8 (Google ici) les information de type A sur le domaine gluck.debian.org sans recursion et affiche le resultat selon le format court. ==> Aucun resultat

    Ligne 2 : Fait de même mais la recursion est active par défaut ==> Resulat OK

    Ligne 3 : Idem à Ligne 1 ==> Resultat OK !!!

    L'option '+norecurse' de la requête dig permet d'éviter que le serveur DNS 8.8.8.8 (Google ici) de lancer une requête recursive vers un autre serveur DNS pour l'addresse gluck.debian.org au cas ou il ne pourrait répondre directement à la question. C'est pourquoi à la ligne 1 on obtient aucune réponse car le serveur DNS n'est pas directement responsable de ce domaine.

    En autorisant la recursivité à la ligne 2, le serveur DNS 8.8.8.8 transfert la requête à un autre serveur DNS qui lui renvoie la réponse qu'il met en cache avant de retourner lui même le résultat de la requête.

    En ligne 3, le resulat retourné provient de la cache du serveur DNS 8.8.8.8 car il n'est pas autorisé à transférer recursivemet la requête à un autre serveur. Lorsque le TTL de mise en cache pour cet enregistrement sera atteint, il disparaîtra de la cache et on obtiendra de nouveau aucun resultat avec la ligne 3.

    Lors de l'execution de la ligne 1, les informations sur le domaine n'était pas encore dans la cache du serveur DNS 8.8.8.8.

    Autres examples...

    
### Option +trace
    $ dig @8.8.8.8 gluck.debian.org +trace
    
    ; <<>> DiG 9.5.1-P3 <<>> @8.8.8.8 gluck.debian.org +trace
    ; (1 server found)
    ;; global options:  printcmd
    .			70655	IN	NS	E.ROOT-SERVERS.NET.
    .			70655	IN	NS	H.ROOT-SERVERS.NET.
    .			70655	IN	NS	K.ROOT-SERVERS.NET.
    .			70655	IN	NS	B.ROOT-SERVERS.NET.
    .			70655	IN	NS	C.ROOT-SERVERS.NET.
    .			70655	IN	NS	J.ROOT-SERVERS.NET.
    .			70655	IN	NS	F.ROOT-SERVERS.NET.
    .			70655	IN	NS	D.ROOT-SERVERS.NET.
    .			70655	IN	NS	A.ROOT-SERVERS.NET.
    .			70655	IN	NS	L.ROOT-SERVERS.NET.
    .			70655	IN	NS	M.ROOT-SERVERS.NET.
    .			70655	IN	NS	I.ROOT-SERVERS.NET.
    .			70655	IN	NS	G.ROOT-SERVERS.NET.
    ;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 33 ms
    
    org.			172800	IN	NS	D0.ORG.AFILIAS-NST.org.
    org.			172800	IN	NS	B2.ORG.AFILIAS-NST.org.
    org.			172800	IN	NS	B0.ORG.AFILIAS-NST.org.
    org.			172800	IN	NS	A2.ORG.AFILIAS-NST.INFO.
    org.			172800	IN	NS	C0.ORG.AFILIAS-NST.INFO.
    org.			172800	IN	NS	A0.ORG.AFILIAS-NST.INFO.
    ;; Received 436 bytes from 192.203.230.10#53(E.ROOT-SERVERS.NET) in 209 ms
    
    debian.org.		86400	IN	NS	ns1.debian.org.
    debian.org.		86400	IN	NS	ns2.debian.org.
    debian.org.		86400	IN	NS	ns3.debian.org.
    ;; Received 136 bytes from 199.249.120.1#53(B2.ORG.AFILIAS-NST.org) in 42 ms
    
    gluck.debian.org.	1800	IN	A	150.203.164.38
    debian.org.		28800	IN	NS	ns3.debian.org.
    debian.org.		28800	IN	NS	ns4.debian.com.
    debian.org.		28800	IN	NS	ns1.debian.org.
    debian.org.		28800	IN	NS	ns2.debian.org.
    ;; Received 252 bytes from 140.211.166.43#53(ns2.debian.org) in 213 ms
    
    ## Depuis ma machine, sans préciser le DNS de Google la commande 
    ## ci-dessous ne fonctionne pas alors que pour les autres étudiants 
    ## ça fonctionne :)
    $ dig @8.8.8.8 eof.eu.org +trace
    
    ; <<>> DiG 9.6.1-P2 <<>> @8.8.8.8 eof.eu.org +trace
    ; (1 server found)
    ;; global options: +cmd
    .			10759	IN	NS	E.ROOT-SERVERS.NET.
    .			10759	IN	NS	H.ROOT-SERVERS.NET.
    .			10759	IN	NS	K.ROOT-SERVERS.NET.
    .			10759	IN	NS	B.ROOT-SERVERS.NET.
    .			10759	IN	NS	C.ROOT-SERVERS.NET.
    .			10759	IN	NS	J.ROOT-SERVERS.NET.
    .			10759	IN	NS	F.ROOT-SERVERS.NET.
    .			10759	IN	NS	D.ROOT-SERVERS.NET.
    .			10759	IN	NS	A.ROOT-SERVERS.NET.
    .			10759	IN	NS	L.ROOT-SERVERS.NET.
    .			10759	IN	NS	M.ROOT-SERVERS.NET.
    .			10759	IN	NS	I.ROOT-SERVERS.NET.
    .			10759	IN	NS	G.ROOT-SERVERS.NET.
    ;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 45 ms
    
    org.			172800	IN	NS	B0.ORG.AFILIAS-NST.org.
    org.			172800	IN	NS	A0.ORG.AFILIAS-NST.INFO.
    org.			172800	IN	NS	B2.ORG.AFILIAS-NST.org.
    org.			172800	IN	NS	C0.ORG.AFILIAS-NST.INFO.
    org.			172800	IN	NS	D0.ORG.AFILIAS-NST.org.
    org.			172800	IN	NS	A2.ORG.AFILIAS-NST.INFO.
    ;; Received 430 bytes from 198.41.0.4#53(A.ROOT-SERVERS.NET) in 102 ms
    
    eu.org.			86400	IN	NS	dns3.gandi.net.
    eu.org.			86400	IN	NS	ns1.pasteur.fr.
    eu.org.			86400	IN	NS	ns-v6.eu.org.
    eu.org.			86400	IN	NS	auth1.dns.elm.net.
    eu.org.			86400	IN	NS	ns-slave.free.org.
    eu.org.			86400	IN	NS	ns0.pasteur.fr.
    ;; Received 250 bytes from 199.19.53.1#53(C0.ORG.AFILIAS-NST.INFO) in 21 ms
    
    eof.eu.org.		259200	IN	NS	NS.eof.eu.org.
    eof.eu.org.		259200	IN	NS	NS2.eof.eu.org.
    ;; Received 95 bytes from 88.191.249.137#53(ns-slave.free.org) in 35 ms
    
    eof.eu.org.		86400	IN	A	86.64.63.108
    eof.eu.org.		86400	IN	NS	ns2.eof.eu.org.
    eof.eu.org.		86400	IN	NS	ns.eof.eu.org.
    ;; Received 111 bytes from 86.64.63.109#53(NS2.eof.eu.org) in 180 ms
       
    
### +noall +answer
    ~$ dig yahoo.com NS +noall +answer       # Réponse courte - Methode 1
    
    ; <<>> DiG 9.5.1-P3 <<>> yahoo.com NS +noall +answer
    ;; global options:  printcmd
    yahoo.com.		146045	IN	NS	ns4.yahoo.com.
    yahoo.com.		146045	IN	NS	ns1.yahoo.com.
    yahoo.com.		146045	IN	NS	ns3.yahoo.com.
    yahoo.com.		146045	IN	NS	ns6.yahoo.com.
    yahoo.com.		146045	IN	NS	ns5.yahoo.com.
    yahoo.com.		146045	IN	NS	ns2.yahoo.com.
    yahoo.com.		146045	IN	NS	ns8.yahoo.com.
       
    
### +short 
    $ dig www.isc.org AAAA +short             # Réponse courte - Methode 2
    2001:4f8:0:2::d                           # Adresse IPv6
    
    $ dig -x 204.152.184.167 +short
    mx-1.isc.org.
       
    
### +nocmd +multiline
    $ dig +nocmd eof.eu.org any +multiline +noall +answer
    
    ; <<>> DiG 9.5.1-P3 <<>> eof.eu.org any +nocmd +multiline +noall +answer
    ;; global options:  printcmd
    eof.eu.org.		86400 IN SOA ns.eof.eu.org. olivier.ricou.eu.org. (
    				2009051801 ; serial
    				21600      ; refresh (6 hours)
    				3600       ; retry (1 hour)
    				3600000    ; expire (5 weeks 6 days 16 hours)
    				86400      ; minimum (1 day)
    				)
    eof.eu.org.		86400 IN NS ns.eof.eu.org.
    eof.eu.org.		86400 IN NS ns2.eof.eu.org.
    eof.eu.org.		86400 IN A 86.64.63.108
    eof.eu.org.		86400 IN MX 5 mail.eof.eu.org.
       


    12.3.5. Section additionnelle

    
$ dig mx eof.eu.org
    ; <<>> DiG 9.3.1 <<>> mx eof.eu.org
    ;; global options:   printcmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25048
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1
    ;; QUESTION SECTION:
    ;eof.eu.org.                               IN          MX
    ;; ANSWER SECTION:
    eof.eu.org.                     259200     IN          MX       5 mail.eof.eu.org.
    ;; AUTHORITY SECTION:
    eof.eu.org.                     255046     IN          NS       ns.eof.eu.org.
    eof.eu.org.                     255046     IN          NS       ns2.eof.eu.org.
    ;; ADDITIONAL SECTION:
    mail.eof.eu.org.                259200     IN          A        195.115.88.38
    ;; Query time: 27 msec
    ;; SERVER: 172.16.0.42#53(172.16.0.42)
    ;; WHEN: Mon Aug 22 11:12:05 2005
    ;; MSG SIZE     rcvd: 100
       
    12.3.5.1. Expliquer le but de cette section additionnelle.

    12.3.5.1. Expliquer le but de cette section additionnelle.

    La section additionnelle affiche la liste des adresses IP des serveurs DNS listé dans la section d'autorité. Elle peut-être ajouter/enlevé via l'option +[no]additional.


    12.4. DNS : Travaux pratiques 2

    Source(s):

    Vous êtes l’administrateur principal d’une très grosse entreprise internationale, chaque succursale possède un administrateur expérimenté en charge de toutes les machines clientes et des divers services de chaque agence(serveur Web, etc.).

    Toutefois, le traitement des courriels entrants doit obligatoirement passer par la maison-mère


    12.4.1. Plan de délégation du réseau

    Imaginons que le nom de domaine de la maison mère soit entreprise.int et que l'ensemble du réseau d'entreprise se trouve sur le réseau 150.150.0.0/255.255.0.0 .

    Le traitement des courriels passerait par la maison mère donc par mail.entreprise.int.

    Chaque succursale sera donc responsable d'un sous-domaine qui leur serait associé à l'intérieur du domaine de l'entreprise : agence1.entreprise.int, agence2.entreprise.int, etc...

    Chaque service (web, ftp, etc...) serait accessible via web.agenceX.entreprise.int, ftp.agenceX.entreprise.int, etc... où X est le numéro identifiant l'agence :)

    Pour simplifier, je considérais que tous les hôtes de l'entreprises sont sur le même réseau (masque 255.255.0.0), qu'il n'y a pas de sous-réseaux ni de DMZ.

    En considérant que l'on aurait pas plus de 254 sucursales et pas plus de 254 hôtes pour chacune d'entre elles, l'adresse IP 150.150.25.20 correspondrait donc à l'hôte 20 sur le réseau de la 25eme agence (150.150.25.0).

    Le serveur DNS de l'entreprise ns0.entreprise.int serait autoritaire sur les sous-domaines d'agence mais délèguerait aux serveurs DNS de chacune des agences ns0.agenceX.entreprise.int l'autorité sur leur propre domaine correspondant à l'agence en question et donc aux hôtes et services associés.

    Les hôtes et services de chacune des agences seraient enregistré et maintenu par les administrateurs d'agence sur leur domaine local, tandis que chaque domaine d'agence (sous-domaine de l'entreprise) serait enregistré et maintenu par la maison mère sur le serveur DNS principal.

    Figure 12-2. DNS-TP2: Architecture de l'entreprise


    12.4.2. Procédure et déroulement pour arriver au résultat

    Testons l'infrastructure DNS en utilisant le laboratoire Netkit créée lors de l'étude de cas vu dans la section réseaux TCP/IP.

    Considérons Mercure comme le serveur DNS de la maison mère :

    
## Ajoutons sur Mercure dans /etc/bind/named.conf.local
    
    zone "entreprise.int" {
        type master;
        file "/etc/bind/db.entreprise.int;
    }
       
    
## Ajoutons sur Mercure dans /etc/bind/db.entreprise.int
    
    $TTL 3h
    @    IN    SOA    ns0.entreprise.int. hostmaster.entreprise.int. (
        2010012500
        8H
        2H
        1W
        1D )
    
             NS ns0.entreprise.int.
    ;agence1  NS ns0.entreprise.int.  ; Nécéssaire ultérieurement pour que 
                                      ; la Délégation fonctionne
    ;agence1 NS 150.150.1.3           ; !!! Incorrect !!! Pas d'addresse IP dans un 
                                      ; enregistrement de type NS
    
            MX 10 mail.entreprise.int.
    
    ns0    IN A 150.150.0.3
    mail   IN A 150.150.0.2
    
    hote1  IN A 150.150.0.30
    hote2  IN A 150.150.0.31
       
    
## Testons la configuration
    $ named-checkconf /etc/bind/named.conf
    /etc/bind/named.conf.local:15: unexpected end of input
    
    ## ==> Il manque une " (double quote) à la fin 
    ## de la ligne 'file' dans ce fichier
    
    ## Après correction, on teste à nouveau
    /etc/bind/named.conf:41: missing ';' before end of file
    
    ## ==> ';' est manquant à la fin du fichier /etc/bind/named.conf.local
       
    
## On teste la zone
    $ named-checkzone entreprise.int /etc/bind/db.entreprise.int
    
    ## OK on peut démarrer le service bind de la maison mère
    $ /etc/init.d/bind9 start
       
    
## OK on peut tester maintenant...
    nslookup
    > server 127.0.0.1
    Default server: 127.0.0.1
    Address: 127.0.0.1#53
    
    ## Puis on l'interroge :
    
    > mail.entreprise.int
    Server:         127.0.0.1
    Address:        127.0.0.1#53
    
    Name:   mail.entreprise.int
    Address: 150.150.0.2
    
    > hote1.entreprise.int
    Server:         127.0.0.1
    Address:        127.0.0.1#53
    
    Name:   mail.entreprise.int
    Address: 150.150.0.2
    
    > exit
    
    $ dig hote1.entreprise.int
    
    ; <<>> DiG 9.5.0-P2 <<>> hote1.entreprise.int
    ;; global options:  printcmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21063
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
    
    ;; QUESTION SECTION:
    ;hote1.entreprise.int.		IN	A
    
    ;; ANSWER SECTION:
    hote1.entreprise.int.	10800	IN	A	150.150.0.30
    
    ;; AUTHORITY SECTION:
    entreprise.int.		10800	IN	NS	ns0.entreprise.int.
    
    ;; ADDITIONAL SECTION:
    ns0.entreprise.int.	10800	IN	A	150.150.0.3
    ...
    
    ## Depuis Uranus (une autre machine sur le même réseau) j'obtiens le même resultat.
    ## En effet, sur Uranus, dans le fichier /etc/resolv.conf, le champs nameserver pointe vers 
    ## Mercure (serveur DNS)
       

    Considérons maintenant le serveur DNS de notre 1ere succursale agence1.entreprise.int comme étant Uranus (sur le même réseau que Mercure) dans mon lab Netkit :

    
## Ajoutons sur Uranus (Agence1) dans /etc/bind/named.conf.local
    
    zone "agence1.entreprise.int" {                # Zone autoritaire gérér par l'administrateur
       type master;                                # de la succursale
       file "/etc/bind/db.agence1.entreprise.int";
    };
    
    zone "entreprise.int" {                        # Zone autoritaire gérér par l'administrateur
       type forward;                               # de la maison mère
       forwarders {150.150.0.3; 192.3.2.4;};       # Transfert de requête vers la maison mère pour la 
    };                                             # resolution de requête sur d'autres zone de l'entreprise
                                                   ## La deuxieme addresse IP existe uniquement
                                                   ## pour rendre le test fonctionnel dans mon lab Netkit :)
    
    ## Dans la réalité, la dernière zone ci-dessus est optionel dans la mesure où 
    ## le serveur DNS de la maison mère va être configuré en tant que forwarders
    ## dans les options du serveur DNS de l'agence (voir ci-après)
       
    
## Ajoutons sur Uranus (Agence 1) dans /etc/bind/db.entreprise.int
    
    $TTL 3h
    @   IN    SOA    ns0.agence1.entreprise.int. hostmaster.agence1.entreprise.int. (
        2010012500
        8H
        2H
        1W
        1D )
    
        NS ns0.agence1.entreprise.int.
    
    ns0    IN A 150.150.1.3
    
    srvweb IN A 150.150.1.4
    srvftp IN A 150.150.1.5
    
    hote1 IN A 150.150.1.40
    hote2 IN A 150.150.1.41
    
    www   CNAME srvweb               // set www.agence1.entreprise.int
    ftp   CNAME srvftp               // set ftp.agence1.entreprise.int
    mail  CNAME mail.entreprise.int. // set mail.agence1.entreprise.int 
                                     // comme alias du serveur principal
       
    
## Testons la configuration
    $ named-checkconf /etc/bind/named.conf
    $ named-checkzone agence1.entreprise.int /etc/bind/db.agence1.entreprise.int
    
    ## OK on peut démarrer le service bind de l'agence1
    $ /etc/init.d/bind9 start
       

    Après quelques testes sur le serveur DNS de l'agence1, on voit qu'il fonctionne correctement

    Maintenant assurons nous que lorsque le serveur de la maison mère sera interrogé il sera capable de résoudre les questions sur les sous-domaines de l'entreprise (délégué à chacun des serveurs DNS des sous-domaines) :

    
## Indiquons dans le serveur DNS de la maison mère (Mercure)
    ## que le serveur DNS Uranus (Agence1) est en charge du sous domaine agence1.entreprise.int
    
    ## Ajoutons dans /etc/bind/db.entreprise.int
    agence1   IN   NS   ns0.entreprise.int.  ; Serveur DNS en charge de la zone
                                             ; de la 1ere succursale (agence1)
                                             ; Récursion sur lui-même
       

    Note

    Dans la zone entreprise.int je suis obligé d'avoir l'enregistrement agence1 NS ns0.entreprise.int pour que la Délégation fonctionne. Cet enregistrement doit exister en plus de la zone forward agence1.entreprise.int car la zone entreprise.int est parcouru en premier puis avec l'enregistrement on redirige vers la zone déléguée agence1.entreprise.int

    
## !!!Attention!!! ceci ne permet pas au serveur de la maison mère
    ## de resoudre les requêtes sur le sous-domaine d'agence
    ## Il faut donc aussi ajouter une zone forward
    ## dans /etc/bind/named.conf.local
    
    zone "agence1.entreprise.int" {
        type forward;
        forwarders {150.150.1.3;192.3.2.3;};  ## IP du serveur DNS de ma succursale 1 
                                              ## La deuxieme addresse IP existe uniquement
                                              ## pour rendre le test fonctionnel dans mon lab Netkit :)
    }; 
        
    
## On fera de même pour chacune des succursales (agenceX)
    ## On prendra soin de remplacer X par le numéro de l'agence correspondant !
    
    zone "agenceX.entreprise.int" {
        type forward;
        forwarders {150.150.X.3;};  ## IP du serveur DNS de ma succursale X 
    }; 
    
    ## Chaque agence étant ensuite configurée de la même manière que l'agence1 dans la réalité :)
       
    
## Testons le changement de configuration
    $ named-checkconf /etc/bind/named.conf
    $ named-checkzone agence1.entreprise.int /etc/bind/db.agenceX.entreprise.int
    
    ## OK on recharge la configuration pour le service bind 
    ## pour qu'il prenne en compte les changements
    $ /etc/init.d/bind9 reload
       

    Après quelques tests, on voit que cela fonctionne mais ni le serveur de la maison mère ni le serveur DNS de la succursale ne peuvent résoudre des domaines en dehors de celui de l'entreprise !

    C'est normal car dans l'état actuel, aucun des deux serveurs n'ont été configuré de façon à pouvoir transférer vers un autres serveur les requêtes sur des domaines dont ils n'auraient pas autorité.

    Pour cela, nous allons paramétrer les forwarders dans les options de chacun des serveurs DNS :

    
## Sur DNS de la succursale Agence1 (Uranus)
    ## dans le fichier /etc/bind/named.conf.options
    ## on ajoute :
    
    options {
      ...
      forwarders {
          150.150.0.3; 193.3.2.4;     ## IP du serveur DNS de la maison mère
      };                              ## La deuxieme addresse IP existe uniquement
      ...                             ## pour rendre le test fonctionnel dans mon lab Netkit :)
    };
       
    
## Sur DNS de la maison mère (Mercure)
    ## dans le fichier /etc/bind/named.conf.options
    ## on ajoute :
    
    options {
      ...
      forwarders {
          8.8.8.8; 193.3.2.254;       ## IP des serveurs DNS du FAI de l'entreprise
      };                              ## La deuxieme addresse IP existe uniquement
      ...                             ## pour rendre le test fonctionnel dans mon lab Netkit :)
    };
       
    
## Puis sur chacun des serveurs
    $ named-checkconf /etc/bind/named.conf  # Test nouvelle configuration
    $ /etc/init.d/bind9 reload              # Applique les changements si OK
       

    Note

    Sur chacun des serveurs DNS, je me suis assuré que le fichier /etc/resolve.conf est vide

    Avertissement

    Pour rendre le test totalement fonctionnel dans mon lab Netkit, le routeur rGW (IP 193.3.2.254) est considéré comme un DNS du FAI. En effet, à cause de infrastructure TAP (adresse) de Netkit qui implique une translation NAT, il semble que seul le routeur ait directement la possiblité de faire des ping sur des adresses externe ou de recevoir les réponses aux requêtes DNS émises.

    Pour que cela fonctionnne, il faut donc activer le service DNS sur le routeur est configurer des forwarders :

    
## Sur routeur rGW
    ## dans le fichier /etc/bind/named.conf.options
    ## on ajoute :
    
    options {
      ...
      forwarders {
          8.8.8.8; 8.8.8.4;           ## IP des serveurs DNS de Google
                                      ## à qui toutes les requête reçu seront transmises
      };                              
      ...                             
    };
        
    
## Puis toujours sur le routeur rGW
    $ named-checkconf /etc/bind/named.conf  # Test nouvelle configuration
    $ /etc/init.d/bind9 start               # Démarre le service si OK
        

    Note

    Sur le routeur rGW, je me suis assuré que le fichier /etc/resolve.conf est vide

    Même en ajoutant servername 8.8.8.8 dans ce fichier, la résolution de noms de fonctionne pas sans que le service bind soit convenablement configuré sur le routeur et démarré.

    Note

    Optionellement on pourrait aussi indiquer que le DNS de la maison mère (Mercure) est en charge de la zone entreprise.int sur le routeur :

    
## Sur le routeur rGW dans /etc/bind/named.conf.local
    
    zone "entreprise.int" {                        # Zone autoritaire gérér par l'administrateur
       type forward;                               # de la maison mère
       forwarders {150.150.0.3; 192.3.2.4;};       # Transfert de requête vers la maison mère pour la 
    };                                             # resolution de requête sur d'autres zone de l'entreprise
                                                   # La deuxieme addresse IP existe uniquement
                                                   # pour rendre le test fonctionnel dans mon lab Netkit :)
       
    Ceci ne peut pas être testé et ne sert pas vraiment à grand chose, dans le cadre de mes test... c'est juste pour la théorie... et pour m'adapter à la structure de mon lab Netkit ;-)

    Une fois que cela fonctionne, de la même manière, on peut modifier la configuration sur les deux serveurs pour rajouter une zone de resolution inverse :

    
0.150.150.in-addr.arpa (# pour la maison mère) 
    X.150.150.in-addr.arpa (# pour les succursales) 
    1.150.150.in-addr.arpa (# soit pour l'agence 1) 
       


    12.4.3. Fichiers de configuration (named, options, db, etc) et log de tests

    Script utilisé pour les tests de dernière colonne : test.sh

    Tableau 12-1. Fichiers de configuration et résultat de tests

    Entreprise (IP)Zone d'AutoritéNom d'hôteNetkit VM (IP)Conf. OptionsConf. LocalConf. DBLogs Test
    DNS Maison Mère (150.150.0.3)entreprise.intns0Mercure (192.3.2.4)named.conf.optionsnamed.conf.localdb.entreprise.int db.reverse.150.150.0 db.reverse.192.3.2mercure-dns-test.txt
    DNS Succursale X (150.150.X.3)agenceX.entreprise.intns0-named.conf.optionsnamed.conf.localdb.agenceX.entreprise.int db.reverse.150.150.X-
    DNS Succursale 1 (150.150.1.3)agence1.entreprise.intns0Uranus (192.3.2.4)named.conf.optionsnamed.conf.localdb.agence1.entreprise.int db.reverse.150.150.1uranus-dns-test.txt
    Hote Succursale 1 (150.150.1.40)hote1.agence1.entreprise.int-----platine-dns-test.txt
    ---rGWnamed.conf.optionsnamed.conf.local-rGW-dns-test.txt

    12.4.4. Server Secondaire

    Dans mon lab Netkit, je configure rGW en tant que server DNS secondaire de Mercure (maison mère), uniquement pour la zone entreprise.int et 150.150.0 :

    
# Ajouter sur rGW dans /etc/bind/named.conf.local
    $ mcedit /etc/bind/named.conf.local
    
    zone "entreprise.int" {
        type slave;
        file "/var/cache/bind/db.entreprise.int";
        masters { 150.150.0.3; 192.3.2.4; };
    };
    
    zone "0.150.150.in-addr.arpa" {
        type slave;
        file "/var/cache/bind/db.150.150.0";
        masters { 150.150.0.3; 192.3.2.4; };
    };
       

    Note

    En faisant cela, il est inutile d'indiquer les fichiers zones (fichier db.) sur le serveur DNS secondaire. Les fichiers proviendront d'une synchronisation avec le DNS primaire.

    Avertissement

    L'utilisateur faisant fonctionner le serveur DNS doit avoir les droits d'écriture sur les fichiers zones renseignés dans la configuration ci-dessus.

    Si AppArmor est installé, il empêche de toute manière bind d'écrire dans le dossier /etc/bind en configuration type slave. Dans ce cas il faut utiliser le répertoire /var/cache/bind :

    
...
        file "/var/cache/bind/db.entreprise.int";
    ...
        file "/var/cache/bind/db.150.150.0";
    ...
    

    
# Tester configuration
    $ named-checkconf /etc/bind/named.conf.local
    
    # OK - Chargeons le changement de configuration
    $ rndc reload   
       
    
# Test de resolution sur rGW
    $ dig @127.0.0.1 mail.entreprise.int +short
    150.150.0.2
    
    $ dig @127.0.0.1 -x 150.150.0.40 +short
    hote1.entreprise.int
    
    # OK :)
       

    12.5. Sécuriser un serveur DNS

    Source(s):

    Secure BIND Template : patrons de fichiers de configuration d'un service DNS.


    12.5.1. Tout interdire par défaut ?

    Prenons le parti d'être parano et interdisons tout par défaut :

    
...
    options {
      also-notify { none; };
      allow-transfer { none; };
      allow-query { none; };
    };
    ...
     

    also-notifydoit contenir les DNS secondaires non officiels, cela permet de les prévenir immédiatement si une mise à jour d'une zone est effectuée.

    allow-transfer indique quelles sont les machines autorisées à effectuer un transfert de zone, c'est à dire à récupérer toutes les informations d'une zone, les seuls DNS secondaires devraient être autorisés.

    allow-query indique qui peut interroger le serveur pour une zone donnée.


    12.5.2. Access Control Lists (ACL)

    Les Access Control Lists (ACL) permettent de définir des ensembles de machines et/ou de réseaux.

    Quatre ACL sont pré-définies : any (tout le monde), none (personne), localhost (le serveur seulement) et localnets (ensemble de réseaux définis par des addresses IP et masques réseau des machines).

    Une ACL se définit de la façon suivante :

    
...
    acl name {
      address_match_list
    };
    ...
    
    # Par exemple, je peux définir l'acl mon_parc_info 
    # contenant les IPs des machines de mon réseau.
    
    acl dns_sec_non_officiel {
      192.3.4.30;
      192.3.4.31;
    }
     

    Utilisation des ACL :

    
# Pour obtenir la liste des DNS primaires, il suffit d'exécuter la commande 
    $ dig @ns.internic.net . ns > named.ca 
    
    # La zone pour les requêtes par défaut 
    # est la zone "." définie ci-dessous :
    
    zone "." {
      type hint;
      file "named.ca";
      allow-query { mon_parc_info; };
    };
     
    
# Dans certains cas d'architecture réseau ou pour des raisons de sécurité, 
    # on peut vouloir forcer un DNS interne à utiliser un 
    # serveur DNS bien spécifique pour répondre aux requêtes DNS. 
    # Dans ce cas-là, on va lui définir cette contrainte dans les options :
    
    options {
            ....
    	forward only;
    	forwarders { mes_dns_en_sortie; };
    };
    
    
    # Une zone de résolution inverse, 
    # adresse IP vers nom de machine, 
    # pour l'adresse de loopback se définit ainsi
    
    zone "0.0.127.in-addr.arpa" {
      type master;
      allow-query { mon_parc_info; };
      file "named.local";
      };
    
    # Un serveur primaire doit être interroger par tous 
    # mais n'autoriser que les dns secondaires à effectuer des transferts de zone.
    # Le transfert de zone est comme son nom l'indique 
    # le moyen par lequel un DNS récupère la totalité des paramètres d'une zone.
    
    zone "domaine1.org" {
      type master;
      file "domain1/domaine1.org";
      also_notify { dns_sec_non_officiel; };
      allow-transfer { dns_sec_officiel; dns_sec_non_officiel; };
      allow-query { any; };
    }
    
    # Les DNS indiqués dans le paramètre also_notify 
    # sont avertis dès qu'une modification est intervenue dans une zone.
    # C'est utilisé concrètement pour avertir les DNS secondaires 
    # non officiels, c'est à dire ceux qui ne sont pas explicitement 
    # déclaré comme NS dans le fichier de définissant la zone.
    
    # Certains services proposés par les ISP ne sont accessibles 
    # que par l'utilisation de leur DNS. Ainsi, pour accéder 
    # aux news ou lire son mail par l'interface webmail de Wanadoo, 
    # il faut utiliser le DNS spécifié sur la feuille indiquant
    #  le login/password ou donné par le serveur DHCP.
    
    zone "wanadoo.fr"
    {
      type forward;
      forwarders  { 193.252.19.3; };
    };
    
    NB: Wanadoo filtre les IP accédant aux DNS, serveurs web,... réservés aux abonnés.
     


    12.5.3. Transfert sécurisé - Architecture utilisant les signatures de transfert de zones (TSIG)

    12.5.3.1. Description

    Transaction SIGnature (TSIG) est un protocole réseau définit dans la RFC 2845.

    TSIG est un mécanisme utilisé pour sécuriser les messages DNS et pour fournir une communication sécurisé serveur-à-serveur, habituellement entre un primaire (master) et secondaire (slave) mais cela peut être étendu au mise à jour dynamique.

    TSIG utilise les "secrets" partagés et une fonction hash à sens-unique pour authentifier les messages DNS en founissant un moyen sécurisé par cryptographie d'indentifier chaque extrémité d'une connection comme étant autorisé à faire ou à répondre à des mise à jour DNS...

    TSIG est très léger pour les "resolveur" et le service DNS.

    TSIG peut protéger les transactions suivantes entre deux serveurs DNS :

    
* Transfert de Zone
    * Notification
    * Mise à jour Dynamique
    * Message de requête récursive
      

    TSIG est disponible dans BIND v8.2 et supérieur.


    12.5.3.2. Comment TSIG fonctionne ?

    1. Chaque serveur de nom ajoute un enregistrement TSIG dans la section de données d'une requête ou d'un message DNS lors d'une communication serveur-à-serveur.

    2. L'enregistrement TSIG signe le message DNS, prouvant que l’émetteur du message a un clef cryptographique partagée avec le destinataire et que le message n'a pas été modifié après son départ de l'émetteur.

    3. TSIG utilise un fonction hash à sens-unique pour prouver l'authentification et l'intégrité du message.


    12.5.3.3. Configuration TSIG

    Source(s):

    Rappel sur mon environment :

    
* Serveur DNS Primaire : 
    ns0.entreprise.int - 150.150.0.3 
    (mercure/192.3.2.4 dans mon lab Netkit)
    
    * Serveur DNS Secondaire :
    ns1.entreprise.int - 150.150.0.10
    (rGW/192.3.2.254 dans mon lab Netkit)
      

    dnssec-keygen permet de générer des clefs pour DNSSEC (Secure DNS) comme définit dans la RFC 2535 et RFC 4034. Cet commande peut également servir à générer des clef utile à une transaction signé (TSIG) comme définit dans la RFC 2845.

    
# Options
    -a Spécifie l'algorithme d'encryption 
         (RSASHA1, DSA, DH, HMAC-MD5).
    -b Spécifie la taille de la clefs 
         (nombre de bit).
    -n Specify le type de propriétaire de la clef (a ZONE, a HOST, ENTITY, or USER)
    -k Pour générer une clef simple au lieu d'une clef DNS (DNSKEY) 
    
    $man dnssec-keygen  # Pour plus d'info...
    

    Création des clefs partagées :

    
# Sur le serveur DNS Primaire execute
    $ cd /etc/bind/
    $ dnssec-keygen -a DSA -b 1024 -n HOST -k tsig-key 
    
    # Sans l'option -k j'obtiens 
    # une erreur "invalid DNSKEY nametype HOST" 
    
    # Comme cela prend trop de temps pour générer la clef dans Netkit, 
    # Je vais réduire mes prententions en terme de sécurité et créer 
    # une clef plus simple
    $ dnssec-keygen -a HMAC-MD5 -b 128 -n HOST tsig-key
    Ktsig-key.+157+31040
    
    #==> Crée deux fichiers contenant la clef générée.
    $ ls -l
    ...
    Ktsig-key.+157+31040.key
    Ktsig-key.+157+31040.private
    ...
    

    Note

    dnssec-keygen a créée dexu fichiers .key and .private. Les deux sont générés pour un algorithme d'encryption symétrique (HMAC-MD5), les clef public et privée sont équivalentes.

    
# Visualiser la clef
    $cat Ktsig-key.+157+31040.key        # Clef publique
    tsig-key. IN KEY 512 3 157 8f+/EU8cHBJlKrYrap3Rbw==  
    
    $cat Ktsig-key.+157+31040.private    # Clef privée
    Private-key-format: v1.2             # Champs spécifiques d'algorithme
    Algorithm: 157 (HMAC_MD5)
    
    Key: 8f+/EU8cHBJlKrYrap3Rbw==        # Clef DNS à insérer dans une Zone
    Bits: AAA=
    

    Configuration du serveur primaire :

    
# Ouvrir le fichier de configuration
    $ mcedit /etc/bind/named.conf.local
    
    # Puis y ajouter
    include "/etc/bind/tsig.key";   
    
    # Enregistrer puis fermer le fichier.
    # Ensuite, créer/ouvrir le nouveau fichier
    $ mcedit /etc/bind/tsig.key  
    
    # Puis éditer comme suit :
    key clef_tsig {                      # Définition d'une clef TSIG nommée 'clef_tsig'  
      algorithm hmac-md5;                # dans la configuration DNS
      secret "8f+/EU8cHBJlKrYrap3Rbw==";
    };
    
    # IP Serveur DNS Secondaire
    server 192.3.2.254 {
      keys { clef_tsig; };               # Référence à la clef TSIG à utiliser
    };                                   # par le serveur DNS primare pour signer les requêtes 
                                         # et transfert de zone vers le serveur distant (secondaire) 
                                         # Par cette déclaration, le serveur distant (secondaire) est prié 
                                         # de faire de même lorsqu'il contactera le serveur primaire
    
    # Enregistrer puis fermer le fichier
    
    $ named-checkconf /etc/bind/named.conf  # Vérifier la nouvelle configuration 
    $ rndc reload                           # Si OK, charger la nouvelle configuration
    

    Configuration du serveur secondaire :

    
# Ouvrir le fichier de configuration
    $ mcedit /etc/bind/named.conf.local
    
    # Puis y ajouter
    include "/etc/bind/tsig.key";   
    
    # Enregistrer puis fermer le fichier.
    # Ensuite, créer/ouvrir le nouveau fichier
    $ mcedit /etc/bind/tsig.key  
    
    # Puis éditer comme suit :
    key clef_tsig {                      # Définition d'une clef TSIG nommée 'clef_tsig'  
      algorithm hmac-md5;                # dans la configuration DNS
      secret "8f+/EU8cHBJlKrYrap3Rbw==";
    };
    
    # IP Serveur DNS Primaire
    server 192.3.2.4 {
      keys { clef_tsig; };               # Référence à la clef TSIG à utiliser
    };                                   # par le serveur DNS secondaire pour signer les requêtes 
                                         # et transfert de zone vers le serveur primaire 
                                         # Par cette déclaration, le serveur primaire est prié 
                                         # de faire de même lorsqu'il contactera le serveur secondaire
    
    # Enregistrer puis fermer le fichier
    
    $ named-checkconf /etc/bind/named.conf  # Vérifier la nouvelle configuration 
    $ rndc reload                           # Si OK, charger la nouvelle configuration
    

    Avertissement

    Pour fonctionner, les horloges systèmes des deux serveurs doivent être synchronisées. Au besoin, on peut les synchroniser par xntp.

    La confidentialité des clés est liée à la sécurité du serveur le plus vulnérable.

    Restreindre le transfert de zone uniquement à celle(s) signée(s) avec une clef spécifique :

    
# On autorise les mises à jour des enregistrements, en rajoutant la directive
    # suivante dans la configuration des zones du DNS :
    
    Syntaxe: 
    
    allow-<type> { key <nom de clé> ;};
    
    # Où l'on remplacera <type> par 
    # query, transfert et/ou update.    
       
    
# Sur le DNS primaire, modifier la configuration comme suit:
    $ mcedit /etc/bind/named.conf.local
    
    # Pour restreindre le transfert de la zone entreprise.int 
    # à celle signée avec la clef "tsig_cleg"
    zone "entreprise.int" {
            type master;
            file "/etc/bind/db.entreprise.int";
            allow-transfer {  key tsig_clef; };
    };
    
    # Verifier la nouvelle configuration puis recharger 
    $ named-checkconf /etc/bind/named.conf
    $ rndc reload
    

    Vérification du fonctionnement :

    
# Vérifier le log du serveur DNS primaire ou les log système :
    $ tail -f /var/log/messages
    # OR
    $ tail -f /var/log/syslog
    # OR
    $ grep 'entreprise.int/IN' /var/log/syslog
    
    ....
    Jan 26 13:43:11 ... named[9170]: client 192.3.2.254#52204: 
    transfer of 'entreprise.int/IN': AXFR-style IXFR started: TSIG transfer
    ....
    Jan 26 13:43:11 ... named[9170]: client 192.3.2.254#52204: 
    transfer of 'theos.in/IN': AXFR-style IXFR ended
    ....
    
    # Vérifier les messages similaire dans les log du server DNS secondaire 
    ...
    Jan 26 19:18:33 ... named[17899]: client 192.3.2.254#32806: 
    received notify for zone 'theos.in': TSIG 'transfer'
    Jan 26 19:18:33 ... named[17899]: zone entreprise.int/IN: Transfer started.
    Jan 26 19:18:33 ... named[17899]: transfer of 'theos.in/IN' 
    from 192.3.2.254#53: connected using 192.3.2.254#45942
    Jan 26 19:18:34 ... named[17899]: zone zone entreprise.int/IN: transferred 
    serial 2008071011: TSIG 'transfer'
    Jan 26 19:18:34 ... named[17899]: transfer of 'zone entreprise.int/IN' 
    from 192.3.2.254#53: end of transfer
     


    12.5.4. Signature de requête et réponses DNS avec dig

    ta
    ### Pour signer les requête DNS et leur réponses en utlisant les transactions de signature (TSIG) :
    -k : specifier le fichier contenant la clef TSIG 
    -y : specifier la clef TSIG directement sur la ligne de commande
         hmac est le type de TSIG, HMAC-MD5 par défaut,
         name est le nom de la clef TSIG, et la clef est la clef elle-même :) 
         La clef est une chaîne de caractère de base-64
    
    dnssec-keygen : permet de générer la clef
        
    
### Lorsqu'on utilise une authentification TSIG avec dig, le serveur DNS 
        qui est questionnéthe name server a besoin de savoir la clef TSIG et 
        l'algorithm qui est utilisé. 
        Dans BIND il faut indiquer la clef et le serveur approprié dans named.conf
      

    12.5.5. Diffuser une zone signée avec DNSSEC (2010)

    Source(s):

    "... les gérants de L.root-servers.net confirment la date où le premier serveur racine va commencer à diffuser une zone signée avec DNSSEC : 27/01/2010 ...

    En juillet 2010, tous les serveurs de noms de la racine diffuseront des réponses cinq à dix fois plus grandes qu'aujourd'hui. Dans certains cas, cela pourra entraîner une coupure quasi-complète de l'accès à l'internet...

    La racine du DNS sera signée avec la technologie DNSSEC ... des signatures cryptographiques, ... de taille bien plus importante que les réponses DNS classiques.

    Elles dépasseront l'ancienne limite de 512 octets du DNS et même la limite des 1500 octets de la MTU Ethernet (la plus répandue sur l'Internet).

    ...un certain nombre de pare-feux ou d'autres équipements réseau qui, mal conçus ou bien mal configurés, refusent les réponses DNS de plus de 512 octets. Parmi ceux qui les acceptent, certains ne gèrent pas correctement la fragmentation des paquets IP (par exemple parce qu'ils bloquent tous les paquets ICMP) et ne peuvent donc pas recevoir des paquets DNS de taille supérieure à la MTU, en général 1500 octets.

    Les réseaux qui rejettent les paquets DNS de plus de 512 octets, ou ... ceux de plus de 1500 octets, ne pourront plus parler à la racine du DNS après juillet 2010 ... et n'auront donc quasiment plus d'accès Internet ...

    ...tester votre réseau... Le moyen le plus simple est...

    
$ dig +short rs.dns-oarc.net txt
    "203.0.113.1 DNS reply size limit is at least 4023 bytes"
    
    # voir si la réponse indique plus de 1500 octets
    

    Avertissement

    Si le test indique que les paquets de plus de 1500 octets ne peuvent pas passer, vous devez analyser l'ensemble de votre réseau et tous les équipements intermédiaires (notamment les pare-feux) pour s'assurer qu'ils sont configurés correctement.

    Essayez aussi avec une requête DNS directe :

    
$ dig +dnssec @192.134.0.49 DNSKEY ripe.net
    
    # La réponse fait plus de 1500 octets. 
      
    
# Ou encore
    $ dig +short rs.dns-oarc.net txt
    rst.x4001.rs.dns-oarc.net.
    rst.x3985.x4001.rs.dns-oarc.net.
    rst.x4023.x3985.x4001.rs.dns-oarc.net.
    "192.168.1.1 sent EDNS buffer size 4096"
    "192.168.1.1 DNS reply size limit is at least 4023 bytes"
    
    #==> Ici, on voit que les réponses DNS de 4023 octets peuvent arriver.
    
    # Avec des résolveurs DNS mal configurés ou mal connectés (ici, ceux d'Alice, via une AliceBox) :
    $ dig +short rs.dns-oarc.net txt
    rst.x486.rs.dns-oarc.net.
    rst.x454.x486.rs.dns-oarc.net.
    rst.x384.x454.x486.rs.dns-oarc.net.
    "213.228.63.58 lacks EDNS, defaults to 512"
    "213.228.63.58 DNS reply size limit is at least 486 bytes"
    
    #==> 486 octets arrivent à passer, ce qui est insuffisant dans de nombreux cas. 
      

    Important

    Si vous arrivez à la recevoir, c'est que le test précédent avait un problème. Si vous n'y arrivez pas, c'est qu'il reste bien un filtrage maladroit quelque part.


    12.6. Évaluation pour le module sr005

    Source(s):


    12.6.1. Questions de cours

    Les questions suivantes font appel à peu de réflexion et sont donc parfois évidentes. Malgré tout, la pertinence et la précision de vos réponses seront prises en compte :

    
– Quels sont les différents types de requêtes DNS qui sont utilisés quotidiennement ? À quoi servent-ils ?
    
    A     Address record : associe un nom d'hôte à adresse IPv4
    AAAA  Address record : associe un nom d'hôte à adresse IPv6
    PTR   Pointer record : associe une adresse IP à un enregistrement de nom de domaine
          « reverse » = exactement le contraire du A record  
    
    MX    Mail Exchange Record qui définit les serveurs de courriel pour le domaine 
    NS    Name Server Record qui définit les serveurs de noms pour le domaine
    
    SOA   Start Of Authority record qui donne les informations générales de la zone : 
          serveur principal, courriel de contact, différentes durées dont celle d'expiration, numéro de série de la zone ;
    
    TXT   record permet à un administrateur d'insérer 
          un texte quelconque dans un enregistrement DNS 
    
    Donner un exemple d’utilisation pour chacun:
    
    $ dig free.fr A +short
    212.27.48.10
    
    $ dig free.fr NS +short
    freens2-g20.free.fr.
    freens1-g20.free.fr.
    
    $ dig free.fr MX +short
    20 mx2.free.fr.
    10 mx1.free.fr.
    
    $ dig -x 212.27.48.10 +short  # PTR
    www.free.fr.
    
    – Quels sont les échanges entre un serveur maître et un serveur esclave ?
    Echange de zone (echange de configuration), requête récursive (if forward-only),...
    
    – Comment fixer le TTL (définir et expliquer ce terme) d’une zone ?
    "Time To Live" = Durée de vie d'un enregistrement RR (Ressource Record)
    C'est le temps par défaut durant lequel les enregistrements (records) de la zone seront conservés en cache avant d'être réactualisé à moins qu'une requête d'actualisation (notification) ou un flush DNS ne vienne rafraichir la cache avant le terme du TTL.
    
    En complément...
    Source: Julien Aulagnier :)
    
    "... Par défaut le TTL est exprimé en secondes mais il est possible de l'écrire de cette manière : 2h25m. Les valeurs du TTL se lisent dans les fichiers de zone. Il est positionné à trois endroits :
    
        * En tête du fichier de configuration grâce à la directive $TTL qui spécifie la valeur du TTL par défaut de tous les RR;
        
        * Le TTL spécifié dans l'enregistrement SOA et correspond au "TTL negatif". Il s'agit des réponses négatives, par exemple lorsqu'un host n'existe pas, qui sont mises en cache. La doc bind conseille un maximum de trois heures mais le template de fichier de zone (db.empty) à un TTL néagtif à 86400 secs;
        
        * Le TTL spécifié à chaque RR (entre le nom du RR et le TYPE) écrase la valeur de $TTL pour cet enregistrement.
    
    Le serveur ayant en cache ces enregistrements les considéra obsolètes une fois le délai correspondant au TTL atteint. Les enregistrements seront renouvelés en interrogeant le serveur dns responsable de la zone auquel appartient l'enregistrement en question..."
    
    – Comment le choisir ? Quels sont les avantages et inconvénients d’une valeur haute ou basse ?
    
    Si les modifications de RR sont fréquents dans une zone il conviendra de positionner un TTL avec une valeur basse, dans le cas contraire un TTL plus élevé fera l'affaire. Un TTL bas risque de générer un fort trafic réseau si les enregistrements de zone sont nombreux, un TTL élevé peut provoquer des réponses fausses.
    
    Une valeur haute conserve les données longtemps en cache. L'avantage est que cela rend les réponses aux requête DNS très rapide et ne demande pas bcp de ressource au serveur. L'inconvénient c'est que si les enregistrements changent souvent ce n'est pas bien pratique car les données en cache peuvent ne plus être à jour... or c'est le cache qui sera consulter en priorité ce qui peut amener à des réponses au requêtes DNS éronnées :)
    Une valeur faible assure que les données en cache soient souvent mise à jour et donc limite le risque d'erreur... par contre l'inconvénient c'est que la fréquence des recherches en réponse aux requetes DNS augmente ce qui demande plus de ressource et de temps au serveur pour le traitement.
    
    – Quelles sont les principales menaces qui planent sur votre service DNS ? Expliquer les !
    
    La principale menance sur un service DNS c'est qu'un personne mal intentionner puisse effectuer des changements d'enregistrement dans une ou plusieurs zone ce qui pourrait rediriger les clients vers une addresse IP eronnée (ou disons malveillante) sans s'en rendre directement compte.
    
    Une deuxieme menaces, est le deni de service, c'est à dire que si le server DNS est surchargé de requête il peut ne pas être capable de répondre à l'ensemble d'entre elles et donc prévenir certain client de pouvoir obtenir une addresse IP qu'il attende pour accéder à une ressource.
     

    12.6.2. Architecture d’une agence

    Imaginez l’architecture dns (nombre de serveurs, placement sur le réseau, fonctionnalités, limitations (acl) des requêtes, etc.) au niveau d’une des agences avec les besoins suivants :

    
     – Une agence propose divers services et possède donc des serveurs accessibles d’Internet,
         – Les machines du personnel émettent des requêtes (pour aller sur le Web par exemple),
         – Une agence est autoritaire pour la zone monagence.magrosseboite.fr et peut recevoir des re-
           quêtes du monde entier,
         – Pour plus de sécurité, les serveurs situés dans la DMZ doivent avoir un serveur DNS différent (physi-
           quement ou logiquement, au choix) du reste des serveurs dns. Cette contrainte est optionnelle.
      

    Une représentation graphique, en plus du texte d’explication, est vivement conseillée.

    Pour la réponse se référer à ce site


    12.6.3. Configuration Bind

    Écrire la configuration (named.conf minimale et au moins une zone) pour le serveur répondant aux requêtes provenant d’Internet.

    Pour l'exemple, notre domaine aura pour nom monagence.magrosseboite.fr. :

    
$ORIGIN .
    $ttl 38400
    @    IN      SOA     monagence.magrosseboite.fr.  admin.monagence.magrosseboite.fr. (
                            2004110129
                            5400
                            3600
                            604800
                            38400 )
     
                            NS      ns.monagence.magrosseboite.fr.
                            NS      ns.anotherdomain.com.
                            MX      10      mail.monagence.magrosseboite.fr.
                            MX      20      mail.anotherdomain.com.
                            A       123.45.67.89
    $ORIGIN                 monagence.magrosseboite.fr.
    mail                    A       123.45.67.89
    www	                A       123.45.67.90
    webmail                 CNAME   mail
    www                     CNAME   www
    ftp                     CNAME   www
    


    Chapitre 13. SR006 - Administrer un serveur de messagerie (SMTP)

    Le but de ce module est de fournir les connaissances nécessaires à la mise en place d’un serveur de messagerie.


    13.1. La messagerie électronique

    Source(s):


    13.1.1. Présentation & Terminologie

    La messagerie éléctronique est devenue le système critique d’une entreprise puisque c’est le cœur de toutes communications entre employés.

    Le fonctionnement de ce service impactera directement sur l’activité de votre compagnie et dès lors, vous devrez rééllement penser et préparer toute manipulation sur vos serveurs.

    Si un service doit être favorisé (système de sauvegarde, sécurité, qualité de service, etc.), c’est celui- ci.

    Une messagerie est décomposée en au moins deux étapes significatives et indépendantes : l’envoi et la réception. Techniquement on parle plutôt de dialogues entre serveurs ou d’un échange client vers serveur.

    Mail User Agent (MUA) : client de messagerie (logiciel Mozilla Thunderbird, Outlook, etc...)

    Mail Transfert Agent (MTA) : serveur de messagerie dont le rôle est de relayer les courriels ou de les accepter s’ils sont destinés au domaine courant.

    Simple Mail Transfert Protocol (SMTP) : Protocole Internet standard (RFC 821 et RFC 5321) utilisé par les MUAs et MTAs pour envoyer/recevoir (ou relayer) des messages courriels.

    Note

    Voir aussi Extended SMTP (Wikipedia): definition d'extension au protocole SMTP.

    Internet Message Access Protocol (IMAP) ou Post Office Protocol (POP3) : Protocole par lequel l’utilisateur se connecter à sa boîte aux lettres pour récupérer ses courriels


    13.1.2. Serveur de messagerie (Exim4, Postfix, etc...)

    Postfix : développé par le célèbre spécialiste en sécurité Wietse Venema et a tout axé sur l’écriture d’un remplaçant performant et sécurisé de Sendmail. Objectif réussi puisque Postfix est devenu l’une des références grâce à la qualité du programme et son architecture modulaire. Enfin il dipose de nombreuses fonctionnalités et également d’une syntaxe « humaine »...

    Exim4 : bien que plus discret face à ses concurrents, est très présent sur Internet, en particulier chez divers fournisseurs d’accès mais aussi dans de grandes universités. La chose la plus appréciable dans Exim4 est sa modularité de configuration, il est ainsi possible de faire tout ce que l’on veut dès lors que l’on est prêt à retrousser ses manches. Même si la sécurité n’est pas aussi forte que sous Posftix, son auteur Philip Hazel s’est attaché à ne pas reproduire le passé de Sendmail. Dernier point et non des moindres, Exim est le seul mta a être sous licence GPL, contrairement à qmail

    D'autres existent : Sendmail (ancêtre remplacé par Postfix), Qmail (par recommendé), MS Exchange (no comment !), ...


    13.1.3. Choisir un serveur de messagerie, fonctionalités nécessaires

    Le choix de vos serveurs doit faire intervenir à la fois votre préférence mais aussi vos besoins, certaines configurations sont plus facilement réalisables sur un mta plutôt qu’un autre. En plus du choix du mta, vous devez également tenir compte du serveur pop ou imap que vous allez utiliser donc ne négligez pas votre choix : tous les composants de votre service de messagerie devront pouvoir s’interfacer entre eux.

    
## Exemple de besoin :
    – Domaines virtuels
    – Utilisateurs virtuels
    – Quotas
    – Authentification via fichiers plats, base de données, annuaire, etc.
    – « Besoin d’ouverture » : le format de stockage des messages doit être standard (Maildir, mbox, etc.)
    – Filtrage du mail (Anti-virus, anti-spam, etc.)
    – Classement des mails (Sieve, Exim filters, procmail, etc
    

    À l’heure actuelle, la solution la plus simple pour gérer des domaines et utilisateurs virtuels est l’utilisation de vpopmail...

    Important de poser tous ses besoins sur une feuille et d’examiner chaque logiciel pour voir s’il est capable de les remplir...


    13.1.4. Exim4 Documentation

    
$ man exim4                ## Deamon options
    $ man update-exim4.conf    ## Documentation on Debian based configuration
    
    ## Documentation page
    http://www.exim.org/docs.html
    
    ## User Manuel - Exim4 Spécification
    http://www.exim.org/exim-html-current/doc/html/index.html 
    
    ## README.Debian localisé à
    /usr/share/doc/exim4-base/README.Debian.gz
    
    ## Voir aussi (si existe)
    /usr/share/doc/exim4-base/spec.txt.gz
       

    13.1.5. Exim4 configuration

    Exim4 se configure à l’aide d’un fichier texte (/etc/exim4/exim4.conf) décomposé en six parties :

    
déclaration de variables générales ## première partie implicite  
    begin acl                          ## contrôle d'accès
    begin routers                      ## routage
    begin transports                   ## transport  
    begin retry                        ## 
    begin rewrite
    begin authenticators
       

    Si vous utilisez les paquets Debian et que vous avez activé l’option (dc_use_split_config dans /etc/exim4/update-exim4.conf.conf), vous pouvez éclater votre fichier de configuration en de multiples fichiers de configuration et répertoires. Cette division est faîte pour bien dissocier les sections, routeurs, transports, ou ACL

    Note

    Le script update-exim4.conf génère le fichier de configuration principal d'Exim4 /var/lib/exim4/config.autogenerated en fusionnant les données contenues dans le fichier modèle /etc/exim4/exim4.conf.template ou dans /etc/exim4/conf.d (arbre de repertoire) et dans /etc/exim4/update-exim4.conf.conf vers le fichier de sortie /var/lib/exim4/config.autogenerated.

    Il est possible de créer son propre fichier de configuration centralisé /etc/exim4/exim4.conf. Si ce fichier existe, Exim va l'utliser et ignoré celui généré automatiquement. Dans ce cas, il est préférable de mettre dc_eximconfig_configtype=none dans /etc/exim4/update-exim4.conf.conf pour prevenir debconf de poser trop de question sur exim4.

    
## Debconf configuration
    $ dpkg-reconfigure exim4-config
       
    
$ tree /etc/exim4
    /etc/exim4
    |-- conf.d
    |   |-- acl
    |   |   |-- 00_exim4-config_header
    |   |   |-- 20_exim4-config_local_deny_exceptions
    |   |   |-- 30_exim4-config_check_mail
    |   |   |-- 30_exim4-config_check_rcpt
    |   |   `-- 40_exim4-config_check_data
    |   |-- auth
    |   |   |-- 00_exim4-config_header
    |   |   `-- 30_exim4-config_examples
    |   |-- main
    |   |   |-- 01_exim4-config_listmacrosdefs
    |   |   |-- 02_exim4-config_options
    |   |   |-- 03_exim4-config_tlsoptions
    |   |   `-- 90_exim4-config_log_selector
    |   |-- retry
    |   |   |-- 00_exim4-config_header
    |   |   `-- 30_exim4-config
    |   |-- rewrite
    |   |   |-- 00_exim4-config_header
    |   |   `-- 31_exim4-config_rewriting
    |   |-- router
    |   |   |-- 00_exim4-config_header
    |   |   |-- 100_exim4-config_domain_literal
    |   |   |-- 150_exim4-config_hubbed_hosts
    |   |   |-- 200_exim4-config_primary
    |   |   |-- 300_exim4-config_real_local
    |   |   |-- 400_exim4-config_system_aliases
    |   |   |-- 500_exim4-config_hubuser
    |   |   |-- 600_exim4-config_userforward
    |   |   |-- 700_exim4-config_procmail
    |   |   |-- 800_exim4-config_maildrop
    |   |   |-- 850_exim4-config_lowuid
    |   |   |-- 900_exim4-config_local_user
    |   |   `-- mmm_mail4root
    |   `-- transport
    |       |-- 00_exim4-config_header
    |       |-- 10_exim4-config_transport-macros
    |       |-- 30_exim4-config_address_file
    |       |-- 30_exim4-config_address_pipe
    |       |-- 30_exim4-config_address_reply
    |       |-- 30_exim4-config_mail_spool
    |       |-- 30_exim4-config_maildir_home
    |       |-- 30_exim4-config_maildrop_pipe
    |       |-- 30_exim4-config_procmail_pipe
    |       |-- 30_exim4-config_remote_smtp
    |       |-- 30_exim4-config_remote_smtp_smarthost
    |       `-- 35_exim4-config_address_directory
    |-- exim4.conf.template
    |-- passwd.client
    `-- update-exim4.conf.conf
       

    Vérifier la version et le fichier de configuration :

    
$ exim4 -bV
    Exim version 4.69 #1 built 30-Sep-2008 18:26:35
    Copyright (c) University of Cambridge 2006
    Berkeley DB: Berkeley DB 4.6.21: (September 27, 2007)
    Support for: crypteq iconv() IPv6 GnuTLS move_frozen_messages
    Lookups: lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmnz dnsdb dsearch nis nis0 passwd
    Authenticators: cram_md5 plaintext
    Routers: accept dnslookup ipliteral manualroute queryprogram redirect
    Transports: appendfile/maildir/mailstore autoreply lmtp pipe smtp
    Fixed never_users: 0
    Size of off_t: 8
    Configuration file is /var/lib/exim4/config.autogenerated
       


    13.2. Travaux pratiques 1

    Source(s):


    13.2.1. Général

    ### À l’aide d’un sniffer (tcpdump, ethereal) ou des RFCs, décrivez l’échange de message entre deux serveurs SMTP dans le cas le plus simple possible.

    
## Avec tcpdump (pour un traffic non encrypté)
    $ tcpdump -vvv -x -X -s 1500 -n -i eth2 port 587 or port 25 -l | tee smtp-com.txt
    
    # 587 est le port utilisé par google pour le serveur SMTP
    
    ##==> Malheureusement, la connection étant encrypté automatiquement, il n'est pas 
    possible de voir l'ensemble de la transaction SMTP en clair.
       
    
## Depuis les RFCs
    Lors d'un échange, on distingue :
    - le serveur SMTP expéditeur (celui qui envoi le message) 
    - du serveur SMTP destinataire (qui le recoit).
    
    Un canal bi-directionel de communication est établit entre les deux serveur 
    (EHLO = HELLO précédement) puis l'expéditeur envoi des commandes SMTP 
    auxquelles le déstinataire réponds.
    
    1. L'expéditeur envoi la commande MAIL 
       (indiquant l'addresse courriel de l'auteur du message)
    2. Le destinataire répond par un OK 
       (s'il accepte les courriels)
    3. L'expéditeur envoi la command RCPT 
       (indiquant l'addresse courriel du destinataire du message)
    4. Le destinataire répond par un OK (s'il accepte message pour ce destinataire) 
       ou rejete simplemen le destinataire  mais la la transaction SMTP en court...
    5. L'expéditeur peut négocier pour plusieur addresse courriel destinataire
    6. Suite au OK du destinataire, l'expéditeur envoi les données DATA du message 
       en terminant avec une séquence spécial.
    7. Si le serveur destinataire traite correctement les données 
       du message DATA, il réponds par un OK.
    
                   +----------+                +----------+
       +------+    |          |                |          |
       | User |<-->|          |      SMTP      |          |
       +------+    |  Sender- |Commands/Replies| Receiver-|
       +------+    |   SMTP   |<-------------->|    SMTP  |    +------+
       | File |<-->|          |    and Mail    |          |<-->| File |
       |System|    |          |                |          |    |System|
       +------+    +----------+                +----------+    +------+
    
                    Sender-SMTP                Receiver-SMTP
    
                               Model for SMTP Use
       
    
## Trace réseau via Claw mail
    
    * Connexion au serveur SMTP : smtp.gmail.com...
    [22:05:22] SMTP< 220 mx.google.com ESMTP q9sm20523082gve.19
    [22:05:22] ESMTP> EHLO macfil.ermansion.net      
    [22:05:23] ESMTP< 250-mx.google.com at your service, [92.40.114.158]
    [22:05:23] ESMTP< 250-SIZE 35651584
    [22:05:23] ESMTP< 250-8BITMIME
    [22:05:23] ESMTP< 250-STARTTLS   
    [22:05:23] ESMTP< 250-ENHANCEDSTATUSCODES
    [22:05:23] ESMTP< 250 PIPELINING
    ** SMTP AUTH non disponible
    [22:05:23] ESMTP> STARTTLS   ## Sécurise la communication
    [22:05:24] ESMTP< 220 2.0.0 Ready to start TLS
    [22:05:28] ESMTP> EHLO macfil.ermansion.net
    [22:05:29] ESMTP< 250-mx.google.com at your service, [92.40.114.158]
    [22:05:29] ESMTP< 250-SIZE 35651584
    [22:05:29] ESMTP< 250-8BITMIME
    [22:05:29] ESMTP< 250-AUTH LOGIN PLAIN
    [22:05:29] ESMTP< 250-ENHANCEDSTATUSCODES
    [22:05:29] ESMTP< 250 PIPELINING
    [22:05:29] ESMTP> AUTH LOGIN
    [22:05:30] ESMTP< 334 VXNlcm5hbWU6
    [22:05:30] ESMTP> [USERID]
    [22:05:31] ESMTP< 334 UGFzc3dvcmQ6
    [22:05:31] ESMTP> [PASSWORD]
    [22:05:32] ESMTP< 235 2.7.0 Accepted
    [22:05:32] ESMTP> MAIL FROM:<filostene@gmail.com> SIZE=345
    [22:05:33] SMTP< 250 2.1.0 OK q9sm20523082gve.19
    [22:05:33] SMTP> RCPT TO:<filostene@gmail.com>
    [22:05:34] SMTP< 250 2.1.5 OK q9sm20523082gve.19
    [22:05:34] SMTP> DATA
    [22:05:35] SMTP< 354  Go ahead q9sm20523082gve.19
    [22:05:35] SMTP> . (EOM)
    [22:05:39] SMTP< 250 2.0.0 OK 1266962737 q9sm20523082gve.19
    * Message envoyé avec succès.
    [22:05:39] SMTP> QUIT
    [22:05:40] SMTP< 221 2.0.0 closing connection q9sm20523082gve.19
       

    Note

    STARTTLS (Transport layer security) est une extension au protocoles de communication en text brut. Elle offre un moyen d'encrypter (TLS or SSL) une connection text brut au lieu d'utiliser un autre port pour les communications encryptées.

    STARTTLS pour IMAP et POP3 est définit dans la RFC 2595, pour SMTP dans la RFC 3207, et pour NNTP dans la RFC 4642.

    ### Quelles sont les méthodes d’authentification SMTP disponibles ? Utiliser les RFCs pour en découvrir d’autres que PLAIN ou LOGIN. Pour chaque méthode, indiquer les avantages et inconvénients.

    Les méthodes d'authentification (SMTP-AUTH — Authenticated SMTP) sont définis dans la RFC 4954. Elles se présentent sous forme d'extension au protocole SMTP. Toutes les méthodes ne sont pas listés dans la RFC, il en existe de nombreuse dont l'implémetnation varie grandement d'un serveur de messagerie à l'autre.

    Parmi elle on rescence :

    
PLAIN         # 1 message - Non encrypté -"authid\0userid\0passwd" 
                    envoyé en clair 
                    AVANTAGE: disponible sur tous les serveurs de messagerie
                    INCONVENIENT: sécurité quasi null
    
    LOGIN         # Challenge/Response mechanism - 
                    Encodage BASE64 -  
                    AVANTAGE: disponible sur bcp de serveurs de messagerie
                              meilleur que PLAIN
                    INCONVENIENT: sécurité faibles 
    
    NTLM (or SPA) # Encodage BASE64 - (sécurité faible)
                    (MS Outlook Spécific)
                    AVANTAGE: LOGIN equivalent
                    INCONVENIENT: Microsoft oriented pas disponible sur tous
                                  les serveurs.
    
    CRAM-MD5      # Encodage HMAC-MD5 MAC algorithm
                    AVANTAGE: Sécurité forte 
                              Standard RFC 2195
                    INCONVENIENT: quoique plus difficile, ce mode d'authentification peut-être déjoué.
                                  mot de passe soit stocké en clair
    
    DIGEST-MD5    # Encodage HMAC-MD5 MAC algorithm
                    AVANTAGE: Sécurité plus forte 
                              Standard RFC 2831
                              Disponible dans de nombreux serveurs de messagerie
    
                    INCONVENIENT: Quoique plus difficile, ce mode d'authentification peut-être déjoué.
                                  mot de passe stocké en clair
        

    Note

    La méthode d'authentification DIGEST-MD5 est plus sécurisée que CRAM-MD5 parce qu'il prévient des d'attaque de mot de passe en text brut. Pendant une authentification DIGEST-MD5 lors de l'échange entre le client et le serveur, il y a des information additionnelles passées qui sont utiliser pour construire un algorithme de hash plus robuste lorsque comparé à la méthode CRAM-MD5, rendant plus difficile à déchiffrer.

    ### Décrivez le chemin qu’emprunte un message lorsqu’Exim reçoit une connexion SMTP depuis un serveur sur Internet à destination d’un domaine local. Vous pouvez vous aider d’un schéma. Pensez aux ACL, transports, routeurs, méthodes d’authentification, etc.

    Figure 13-1. Exim4 : Chemin emprunté par un message SMTP reçu

    Note
     

    a bounce message, or (failed) Delivery Status Notification (DSN) message, aka Non-Delivery Report/Receipt (NDR), Non-Delivery Notification (NDN), or simply a bounce is an automated electronic mail message from a mail system informing the sender of another message about a delivery problem. The original message is said to have bounced.

     
    -- http://en.wikipedia.org/wiki/Bounce_message  

    13.2.2. Expansion de variables

    La syntaxe d’Exim est parfois déroutante et est souvent la cause de sévères dépressions chez les administrateurs à cause de ses trop nombreuses accolades ouvrantes et fermantes. C’est le prix à payer pour prendre en main ce langage qui sera en mesure de réaliser toutes vos envies.

    La notion la plus importante est l’expansion de variable, lorsque vous attribuez des valeurs à vos options dans vos routeurs ou transports, vous pouvez donner des constantes ou des chaînes dynamiques, celle-ci sont « évaluées » lorsqu’Exim lit sa valeur. Vous les repérez par la notation ${monexpression}.

    Tout un langage de programmation (Turing complet !) a été écrit à cet effet : vous disposez ainsi de toutes les fonctions de manipulation de chaînes de caractères, de lecture de fichier, d’écoute de socket réseau, calculs mathématiques, etc.

    Exim permet de faire des recherches dans des fichiers à l’aide de la directive lookup (lookup et lsearch directive).

    Les fonctions peuvent être combinées entre elles pour faire des manipulations plus complexes :

    
$ cat /etc/aliases 
    ...
    root: filostene
    ...
    
    $ exim4 -be                               # option « Expansion testing mode »
    >${lookup{root}lsearch{/etc/aliases}}
    filostene                                 # récupérer l’utilisateur 
                                              # en charge de l’adresse de root
    >${lookup{root}lsearch{/etc/passwd}}
    x:0:0:root:/root:/bin/bash
    
    >${extract{5}{:}{${lookup{root}lsearch{/etc/passwd}}}}
    /root                                     # Récupération du répertoire personnel 
                                              # de l’utilisateur root
                                              # à partir du fichier /etc/passwd
    >...
        


    13.2.3. Configurations possibles (Local, Smarthost, Satellite...)

    Les paquets Debian ont popularisé une certaine terminologie réprésentant les mode de configuration d’un serveur SMTP :

    Local           # Tout est fait en local, 
                      # il n’y a pas d’échange via le réseau.
    
    – Smarthost       # Le serveur peut recevoir des mails directement, 
                      # mais tout le courrier sortant passe par un
                      # autre serveur (centralisation).
    
    – Satellite       # Le serveur ne recoit pas de mail directement 
                      # et ne peut qu’envoyer des mails via un serveur.
    
    – Internet site   # Le serveur envoie et reçoit des mails directement.
        

    Questions :

    – Quelle est l’utilité du mode local ? Quels sont les programmes/services qui en dépendent ?

    Les programmes et services systèmes pour par example informer l'adminsitrateur root de dysfonctionnement, de l'execution de tache de maintenance (cron) ou de tentatives d'accès non autorisées (login)...

    – Pourquoi utiliser le mode smarthost ? Quels sont les motifs les plus fréquents de cet usage ?

    Pour pouvoir gérer les e-mails appartenant à un domaine local. C'est l'option la plus courante pour un hôte qui a une connectivité restreinte à Internet, par example une connection residentiel ou un smarthost SMTP est généralement utilisé. Les FAIs bloquent toutes connection SMTP sortantes pour combattre les problèmes de SPAM ce qui requiert d'utiliser leur Smarthost pour l'envoi d'e-mail. Généralement c'est aussi une bonne idée de l'utiliser lorsque la connection est à basé sur une addresse IP dynamique puisque très peu de site accepte directement la livraison d'e-mail via des rangés d'adresse.

    – Écrire la configuration d’Exim minimale pour servir de smarthost.

    
## Re-configuration minimum via Debconf
    $ dpkg-reconfigure exim4-config
       

    Utilisation du serveur SMTP Goolge comme relay:

    
## /etc/exim4/update-exim4.conf.conf
    ...
    dc_eximconfig_configtype='satellite'
    dc_other_hostnames=''
    dc_local_interfaces='127.0.0.1'
    dc_readhost='ermansion.net'
    dc_relay_domains=''
    dc_minimaldns='false'
    dc_relay_nets=''
    dc_smarthost='smtp.gmail.com::587'
    CFILEMODE='644'
    dc_use_split_config='true'
    dc_hide_mailname='true'
    dc_mailname_in_oh='true'
    dc_localdelivery='mail_spool'
    ...
        


    13.3. Évaluation pour le module sr006

    Source(s):

    – Quelles sont les différences entre les protocoles IMAP et POP ?

    Les deux sont de protocoles standard Internet permettant de récupérer les messages courriels de sa boîte au lettre electronique. Le libre accès à ces standard permet un libre choix de serveurs (et de FAI) ainsi que de client de courriels puisqu'ils sont supportés par la majorité d'entre eux.

    Les deux protocoles sont supportés par les logiciels de courriels mais pas forcément par tous le FAI dans le cas d'IMAP (plus complexe à configurer que POP).

    Dans le cas d'IMAP, les logiciels clients télécharge une copie du message lors d'une requête dev l'utilistateur et le conserve dans une cache local (au cas par cas). POP télécharge systématiquement en local avec la possibilité de conserver une copie sur le serveur (configuration générale du compte POP)

    IMAP supporte en-ligne et hors-ligne operations. Les logiciels de courriels laisse généralement les messages sur le serveur jusqu'a ce qu'il soit explicitement effacé par l'utilisateur.

    IMAP permet a de multiple client de gérer la même boîte au lettre. This and other characteristics of IMAP operation allow multiple clients to manage the same mailbox.

    Temps de réponse plus rapide avec SMTP.

    IMAP version 4 permet de recupérer des partie individuel MIME (pièce jointe) ou des portions individuelles d'un messages. Ainsi un utilisteur peur recupérer uniquement la partie text d'un message sans les pièces jointes ou de démarrer immédiatement un contenu en streaming.

    IMAP version 4 permet de conserver l'etat du message (drapeau) sur le serveur (lu, non lu, répondu, etc...) donc si un client se connecte à un autre moment ou d'une autre localisation l'information peut-être lu en temps reel.

    IMAP version 4 permet de créer, renomer ou effacer des boîtes aux lettres (dossier sur le serveur)et de déplacer des messages entre les boîtes aux lettres. Ceci permet notemment un meilleur partage possible de dossiers.

    Avec IMAP il est possible de demander au serveur de procéder lui même à une recherche selon divers critères évitant ainsi au client de télécharger tous les messages pour effectuer une telle recherche. Toutefois ceci peut augmenter l'utilisation de ressources sur le serveur dans le cas de multiple recherche massives.

    IMAP est un protocole extensible via un mecanisme d'extension.

    Avec IMAP4 une connection TCP/IP a besoin d'être maintenu à toute instant pour être notifié de l'arrivée de nouveaux messages.

    IMAP4 ne permet d'envoyer et recevoir en une seule opération

    – Quel est le protocole de récupération de mail le plus adapté pour une personne qui ne lit ses mails que depuis sa machine personnelle ?

    L'un ou l'autre fera bien l'affaire dans un tel cas pour peu que le FAI fournisse un accès POP et/ou IMAP à la boîte de messagerie.

    – Un mail échangé entre deux entreprises distinctes transite par au moins combien de serveurs ? Précisez lesquels.

    Pour deux entreprises disctinctes appartenant au même domaine, un serveur

    Si elle appartiennent à deux domaines différents, deux serveurs: SMTP sortant de l'entreprise A, SMTP entrant de l'entreprise B.


    Chapitre 14. SR007 Administrer un serveur Web (HTTP)

    14.1. Serveur Web Apache


    14.1.2. Travaux pratiques 1: Base et Protocole

    Source(s):


    14.1.2.1. Installation de base

    – Créez un utilisateur et un groupe

    Sur Debian le compte www-data existe déjà, j'utilise celui-ci. Quoiqu'il puisse être bien d'en créer un autre par souci de sécurité en désactivant le compte utilisé par défaut :)

    – Créez la hiérarchie de répertoires pour accueillir votre site, en la justifiant.

    
## Je verrais bien quelque chose du genre:
    /var/ermansion.net/www
    /var/ermansion.net/www/htdocs   # Page Web
    /var/ermansion.net/www/logs     # Logs d'accès et d'erreur
    /var/ermansion.net/www/cgi-bin  # Scripts
    
    ## Avec en plus tout autre repertoire pouvant être vraiment utile au cas par cas...
    ## Mais pour un cas simple cela suffit emplement :)
    /var/ermansion.net/www/stats    ## Statistiques du site :)
        

    Quel est l’intérêt d’une telle séparation ?

    Sécurité et Contrôle (Monitoring, Debuggage, Performance, etc...). Possibilité de déléguer l'adminsitration du site (si Apache activé pour plusieurs comptes)

    – Modifiez le fichier de configuration fourni dans la distribution d’Apache pour l’adapter à votre installation

    – Créez quelques fichiers et répertoires à la racine de votre site et essayez d’y accéder depuis votre navigateur Web.

    Un exercise similaire est décrit au chapitre Serveur Web - Apache - Installation et configuration dans la partie SR009

    – Quelles doivent être les permissions de vos fichiers pour qu’Apache puisse y accéder ?

    
740 pour tous les repertoires et fichier 
    (et éventuellement 760 pour un dossier dans lequel 
    le serveur pourrait avoir besoin d'écrire [transfert de fichier])
    
    Lecture/Ecriture pour le propriétaire
    Lecture pour le compte executant Apache
    Aucun accès pour tous les autres :)
        

    14.1.2.2. Analyse du protocole

    Pour mieux comprendre le protocole HTTP, vous allez consulter les pages de votre site à l’aide de netcat.

    
## Supposons que le site Web soit sur la machine locale :
    $ nc localhost 80
        

    –À l’aide de la RFC 2616, construisons une requête HTTP valide :

    
## Une requête HTTP est d'au moins une ligne
    GET http://localhost/phpldapadmin/index.php HTTP/1.1  # Methode (Commande) 
                                                          # + URI 
                                                          # + Protocole version
        

    – Quels sont les champs obligatoires avec HTTP/1.1 ?

    Commande (Method) + Espace (SP) + URI + Espace (SP) + Protocole Version (HTTP-Version) + fin de la ligne (CRLF)

    Note

    Lors de mon test, sans indiquer la version du protocole cela fonctionne très bien aussi :) S'il n'est pas indiqué, c'est celui de la communication établit qui est utilisé (de ce que j'ai compris via la RFC).


    14.1.2.3. Publication de pages des utilisateurs

    Apache permet aux utilisateurs de posséder leur propre espace Web. Ainsi, si vous accédez à http: //www.testme.fr/~julien/, vous accédez à la page Web créée par l’utilisateur local.

    – Mettez en place un système identique à l’aide de mod_userdir

    TO DO !!!


    14.1.3. Travaux pratiques 2: SSL, Php et Virtual Host

    Source(s):


    14.1.3.1. SSL

    Le cours SR016 documentera la création de certificats SSL mais si vous êtes impatient, vous pouvez utiliser les certificats installés par défaut pour faire des tests ou bien générer vous-même vos propres certificats avec le HOWTO adéquat 1.

    Si la ligne de commande vous fait peur, vous pouvez utiliser TinyCA2 qui est une interface graphique.

    Maintenant, mettez en place le SSL pour votre site :

    TO DO...

    Note

    Il n'est pas possible d'avoir deux certificats SSL différents sur une même adresse IP, bien qu'il y ait des travaux sur la question.

    Redirection HTTP vers HTTPS


    14.1.3.2. PHP

    Autorisez l’exécution de scripts PHP et écrire un script affichant le PID lorsqu’il est exécuté (utilisez la fonction posix_getpid()3. Que remarquez-vous ? Quelle aurait été la différence si c’était un script CGI ?

    Je n'ai pas testé mais en toute vraisemblance dans le premier cas, le PID du script serait le même que le PID d'Apache (processus identique), dans le second cas il serait complètement différent...(un processus par CGI)


    14.1.3.3. Virtual Host

    Mettre en place deux sites virtuels de type name based avec l’un disposant des CGI.

    Un exercise similaire est décrit au chapitre Serveur Web - Apache - Installation et configuration dans la partie SR009

    Pour la mise en place de CGI il faudrait modifier la configuration du VirtualHost :

    
<VirtualHost ermansion.net www.ermansion.net>
            ServerName ermansion.net
            DirectoryIndex index.html
            DocumentRoot /var/ermansion.net/www/htdocs
            ScriptAlias /cgi-bin/ /var/ermansion.net/www/cgi-bin
              <Directory /var/ermansion.net/www/cgi-bin>
                AllowOverride None
                Options ExecCGI
                Order allow,deny
                Allow from all
              </Directory>
            ErrorLog /var/ermansion.net/www/logs/error_log
            CustomLog /var/ermansion.net/www/logs/access_log combined
    </VirtualHost>
        

    Avertissement

    !!!Attention!!! La configuration ci-dessus n'a pas été testé en environement réel...elle est purement thérorique et peut-être incorrect à ce stade ! À revoir ultérieurement...

    Est-il possible de mettre en place du SSL pour ces sites ? Pourquoi ? Comment pourrait-t’on faire ?

    SSL VirtualHost

    Redirection et VirtualHost SSL


    14.1.4. Contrôle

    Source(s):

    Il semble que le document de l'Éof soit vide !!!


    Chapitre 15. SR010 Les enjeux de la sécurité

    Bienvenus dans le domaine de JP !

    Comme il le dit si bien :

    "... Durant trois semaines, nous allons tenter de vous faire réfléchir. Nous allons franchir le pas de l'administration système pour rentrer dans celui de la sécurisation. Nous n'allons plus penser à ce que les choses fonctionnent, mais à ce qu'elles soient sécurisées, ce qui sous-entend forcément qu'elles fonctionnent...

    ... Fini donc les exclamations "ça marche", il faudra aller un pas plus loin. Si vous faîtes une action et que celle-ci entraîne votre perte, ce n'est pas une bonne action. Comme vous le verrez, il y a deux types d'administrateurs : ceux qui se sont fait pirater et ceux qui vont se faire pirater...

    ... Ne vous fiez pas au programme horaire affiché, il parait que vous pouvez le multiplier par 12 pour les heures à passer pour sr010. C'est l'expérience que nous en avons, en tous cas...

    ...Plus vous irez loin, plus je vous accompagnerais...

    ... Vous allez revoir des notions d'ores et déjà parcourues et normalement assimilées. Ce sera un très bon moyen de s'en assurer...

    ... Vous entrez dans le monde merveilleux de la sécurité par le petit bout : il y a tout un univers à découvrir. Nous ne sommes que votre porte d'entrée..."


    15.1. Les enjeux (Password, Sauvegardes, etc...)

    15.1.1. Introduction

    Source(s):

    On ne le répètera jamais assez : "...Il y a deux types d’administrateurs : ceux qui se sont fait pirater et ceux qui vont se faire pirater..."

    "...il ne faut faire confiance à personne, même pas à vous-même. La paranoïa est et restera votre meilleure amie..."

    "...la sécurité informatique peut se mesurer à la résistance la plus forte de son maillon le plus faible..."


    15.1.2. Choisir son mot de passe... mais un bon mot de passe, c'est quoi ?

    Source(s):

    Tout le monde n'a pas le même niveau en arrivant dans ce module. Certaines personnes n'ont jamais même réfléchi à la notion de mot de passe et à la complexité d'entre trouver un valable.

    Pourtant, votre mot de passe est la clef de voûte de votre sécurité, il est extrêmement important de le choisir correctement... mais aussi de le mémoriser facilement.


    15.1.2.1. Qu'est-ce qu'un mauvais mot de passe ?

    Pour commencer, un mauvais mot de passe est un mot de passe pour lequel vous pouvez répondre "oui" à l'une des 7 questions suivantes:

    
- Avez vous écrit sur un bout de papier votre mot de passe ?
    - Votre mot de passe est-il un mot commun que l'on peut 
      trouver dans le dictionnaire ?
    - Votre mot de passe est-il un mot commun suivi de 2 chiffres ?
    - Votre mot de passe est-il un nom de personne, de lieu ou d'animal ?
    - Quelqu'un d'autre connait-il votre mot de passe ?
    - Utilisez vous le meme mot de passe pour plusieurs 
      comptes et pour une longue période ?
    - Utilisez vous le mot de passe par défaut du 
      constructeur ou de l'éditeur ?
       


    15.1.2.2. Un bon mot de passe...

    "...Un bon mot de passe est un mot de passe que l’on ne peut pas trouver en usant d’un dictionnaire, même si ce dernier se voit doté d’astuces basiques de substitution..."

    Un mot de passe doit être suffisement long et complexe (different type de caractère dont ceux non-alphanumérique). Minimum 8 caractères mais attention au delà de 14 caractère certains système pourrait ne pas être capable de le gérer...

    Note

    Y a t il des caractères à ne pas utiliser (/,\,<,>,& par example) ?

    Ca dépend de chaque implémentation dans chaque application au monde qui vérifie une entrée de mot de passe ;)Le plus simple est d'aller lire le code source où est implémenté la commande de vérification de mot de passe (passwd par example) c'est dedans que l'on peut s'assurer des caractères autorisés.

    Note

    Pour ma part j'aurais tendance à penser qu'une harmonisation à ce niveau au sein des applications d'une même entité peut faciliter la gestion de mot de passe pour les utilisateurs finaux mais c'est pas toujours évident dû à la diversification des sytèmes de vérification existant.

    En gros, à partir de quel moment, quand on teste son mot de passe, on peut estimer qu'il est sûr ?

    Une suite de caractère non séquentielle, n'ayant aucun sens commun, utilisant l'échelle des ~80 possibilités disponible tel que [A-Za-z0-9,?.;:/!§*µù%$£¨^=+)°àç_è-('"é&{[|`\^@\]}]

    Voir aussi: Cassage et durcissement des mots de passe [PDF Version]

    Avertissement

    Attention, au disposition clavier (anglais, lituanien, etc), certains caractères apparaîtront/disparaîtront ;)

    Exemple de caractère disponible sur un clavier en lituanien : ąčęėįšųū„“


    15.1.2.3. Examples de mot de passe

    Il est essentiel de choisir convenablement son mot de passe :

    
## Je propose
    
    #Phrase Code
    Up2hmlnfj2mal! > Un peu d'humour même lourd ne fait jamais de mal au lit !
    c33cq02u* > C'est en chantant qu'on devient une star !
    ==> le deuxième né est peut-être pas assez long...
    
    #Phrase/Name/Dates
    Richard2010Eleonore2011$
    IsItDifficultEnough?
    ==> Ça c'est BOF!!!
    
    #Combinaison au clavier
    QaZxCvW9182!!!
    Mnbvcxz546732891
    
    #Cypher
    MBUfufBUPup999? > La tete a toto 1000-1 ?
    C3D1f1C1l32r? > c'est difficile docteur ?
       
    
## Proposé par Christophe
    # Avec l'outil crypt
    perl -e 'print crypt("christophe","07")."\n"'
    07dkT4ubk8sqw
    perl -e 'print crypt("christophe","\$1")."\n"'
    $10LK8S0DffXM
    perl -e 'print crypt("christophe","\$1\$06\$")."\n"'
    $1$06$st6IX7Uo6mxkYEp2Q9Ua00
    
    # Manuellement
    Voulez vous coucher avec moi, ce soir ? ---> Vvcam,cs?
    A l'envers ---> ?sc,macvV
    
    Un mot de passe mnémo-technique ---> t'esoufouquoi?
    ==> devrait facilement être trouvé par un dictionnaire à mon avis.
    
    Le même à l'envers ---> ?iouquofuse't
    En utilisant la disposition des touches du clavier: 
    wcb,:qdgjl5 (une touche sur deux plus le chiffre 5 que j'aime bien)
    ==> Sera trouvé facilement par un ripper
    
    Adresse postale: 
    28ruejeanmarypavy35340LaBouexiere
    --> passphrase mais trop long.
       
    
## Proposé par Alix
    Pour ne pas avoir à retenir la chaîne dérivée à partir du mnémo,
    on peut utiliser un algo de crypto, il n'y a plus que la chaîne à retenir.
    Sample, avec seccure-key : 
    http://point-at-infinity.org/seccure/
    
    sudo seccure-key
    Enter private key:Voulez vous coucher avec moi, ce soir ?
    The public key is: 0pRiE[YRE6oAQ$j0/@:UVH1de
    sudo seccure-key -c secp521r1
    Enter private key:Voulez vous coucher avec moi, ce soir ?
    The public key is: !<k@DMuWp:O.5-!A%:KSKg2h=.<yK8.[;L$9%P@5[^m9(...)
       
    
## Proposé par PYT
    Bien manger est le frère de bien boire
    B1mElF2bB! (15/20)   
    
    Ne veut absolument rien dire
    QzX[Ty|Up (13/20), manque des chiffres   
    
    1 tien vaut mieux que 2 tu l'auras
    1TvMQ2tL'a (15/20)   
    
    Horizon pas net, reste à la buvette
    HpN,RaLb! (13/20), manque des chiffres
    
    Il est plus décent d'avoir un grand nez que deux petits.
    Ie+Dd'A1gNq2P! (18/20)
    
    Quand les mouettes ont pied, il est temps de virer
    QlMoP,iEt2v! (16/20)
    
    Qui trop écoute la météo, passe sa vie au bistrot
    QtElM,pSvOb! (14/20), utiliser des chiffres 
    
    Tempête pour y aller, t'en chie pour revenir!
    TpYa,T'eCpR! (15/20)
       
    
## Proposé par Christelle
    1er mot de passe: ArSvBMr
    "Agriculture Salon République Téléphonie Syndicalisme Pâtisserie Vaches SFR Bavardages Révolution Monde Saut à ski Roulette"
    2ème mot de passe: Led8nPr6
    "Le débat n'est pas récent. En 1986..."
    3ème mot de passe: SueCPuen
    "Suc musculaire de boeuf concentré phosphoglycérate sodique sulfate de strychine"
    4ème mot de passe: RijG1TY4
    (premières syllabes des 8 premiers paragraphes d'un article en utilisant un code très simple).
    5ème mot de passe: cltEdFcea
    "Car l'agriculture tue, et de façon cruelle, elle aussi..."
    6ème mot de passe: 94u4hOp1
    "Illustration de une de l'hebdomadaire l'Oeil de la police...,1910" (combiné à un autre code)
    7ème mot de passe: uenyUrR
    "culard désigne une hypertrophie musculaire de l'arrière-train..."
    8ème mot de passe: oqHOxEz
    "Le jour se lève ça vous apprendra" (+ un code)
       


    15.1.2.4. Commentaires...

    Avertissement

    Un truc créé par crypt ou une quelconque fonction de courbe elliptique ne sera jamais retenu car bien trop complexe :). Dans ce cas, utiliser un coffre-fort électronique de type xkeepass (également portable sur système privatif) peut aider. Toutefois cela serait à reserver à des mots de passe dont l'utilité n'est pas journalière, sinon, "... tu peux commencer à accrocher le rj45 à la poutre..." (comme dirait JP)

    Les mots de passe cyclique par exemple basé sur le calendrier genre on rajoute à la fin des mots de passe le numéro de la semaine sur deux chiffres (semaine 1 --> 01, semaine 12 --> 12) sont à éviter aussi...

    C'est une mauvaise idée, car c'est prédictible. 53 choix au plus. Sur un mot de passe de dix caractères, tu tombes à 8, avec un choix restreint à 52 caractères (alphabétique). Un peu plus si on rajoute les accents. Ca ne fait que 8^52 + 53 propositions, que l'on peut réduire aux 12 dernières semaines, on passe donc de 53 à 12.

    Ca peut paraître énorme quand on le dit comme cela, mais pour un calculateur, ce n'est plus grand chose :) Un processeur (à accélérateur optique) à 8 000 milliards d'opérations par seconde, soit la vitesse de la lumière !

    Secouer un peu le tout pour obtenir un truc plus aléatoire et moins prédictible.

    Avertissement

    Ceci est loin d'avoir fait le tour mais on a pas le temps de s'attarder. On aurait voir la notion d'aléa, entre autre problème généré chez debian il y a deux ans pour le paquet SSl.

    Un petit aperçu de la difficulté de construire un générateur de mot de passe.


    15.1.3. Périodicité (3 mois ou moins)

    Un mot de passe, ne se conserve pas à vie !!!

    Dans un environnement non sensible --> durée de vie normale = trois mois

    En environnement très sensible --> quinze jours ou moins

    Il est très difficile de faire comprendre à l’utilisateur lambda la nécessité de ce changement.

    Avertissement

    Attention à ne pas tout mettre en zone sensible. S'il y a une politique trop restrictive, elle ne sera pas suivie par les utilisateurs. Pire, elle sera outrepassée.

    Un mot de passe qui change souvent, c’est aussi l’assurance de ne plus s’en souvenir à un moment ou un autre. Il est bien entendu hors de question de l’inscrire sur un post-it accroché à l’intérieur d’une armoire ou de le planquer sous le clavier. Cela reste un comportement dangereux et inacceptable.

    N'est-il pas plus sûr, dans ce cas d'allonger la durée de vie du mot de passe ?

    Tu prends un truc solide que tu ne changes qu'en cas de doute de compromisssion ou de risque.

    Il est aussi possible d'utiliser un portefeuille de mot de passe qui chiffrera tout ce que vous lui donnez et qui vous demandera lui aussi un mot de passe avant de vous laisser accéder au saint des saints.

    Ce portefeuille sera, of course, protégé par un mot de passe. Dans ce cas, la problématique du mot de passe est juste déplacée.

    Il est plus facile de sécuriser un point que d'en sécuriser 30. Le gestionnaire de mot de passe ne fonctionnera pas avec un mot de passe, mais une passphrase, qui est plus longue et plus robuste. De plus, s'il est bien fait, tu coupleras ton authentification avec une clé publique. Sans l'un des deux, tu ne fais rien et là, ça commence à devenir chaud. Gaffe quand même à ne pas perdre l'un des deux, car tous tes mots de passe seront perdus :p

    Avertissement

    Question importante : il est où physiquement ce portefeuille ? dans votre tête, ailleurs ? chiffré comment ? le paquet chiffré il est où ? et en combien d'exemplaire ? vous avez mis quoi dedans ? la clé d'accès à votre frigo, votre compte bancaire, votre compte root, votre passe sur le forum ubuntu.org ?


    15.1.4. Résumé (Règle/Politique de sécurité)

    
## Mot de passe
    - Taille:         min 10 - max 14 caractères
    - Renouvellement: Tous les 3 mois ou moins
    - Contenu:        Combinaison aléatoir sans sens commun de caractère de type suivant:
                      --> Au moins un de chaque type
                      - Majuscules [A-Z]
                      - Minuscules [a-z]
                      - Chiffres   [0-9]
                      - Signes     [,?.;:/!§*µù%$£¨^=+)°àç_è-('"é&{][|`\^@\}]
      
    
- Penser (passe)phrase plutôt que de mot (de passe)
    - Ne pas l'écrire ou le socker 
      (sauf cas exceptionel dans un portefeuil chiffré de mot de passe)
    - Ne pas réutiliser les mots de passe expirés
    - Créer son propre système mémotechnique/cypher...
      

    15.1.5. Technique pour générer son mot de passe (Example simple)

    Si vous vous trouvez dans la situation de générer un nouveau mot de passe, voici une technique simple mais qui a fait ses preuves:

    
- Choisissez un mot ou une phrase qui a un sens pour vous 
      (mais qui reste obscur aux yeux des autres). 
      Par exemple votre personnage préféré dans une pièce, 
      l'animal que vous aviez pendant votre enfance, etc... 
      Notre exemple pour la suite sera "mot de passe"
    
    - Enlevez les espaces et remplacer caractères non ASCII 
      (difficile de trouver l'accent sur un clavier QWERTY-us 
      si vous êtes en déplacement). 
      Par exemple: "motdepasse"
    
    - Substituez les lettres qui s'y prêtent par des nombres. 
      Par exemple: "m0tdep4ss3"
    
    - Mettez en majuscule certaines lettres. 
      Par exemple: "m0TDep4SS3"
    
    - Ajoutez des nombres en fin du mot de passe. 
      Par exemple: "m0TDep4SS301"
    
    - Ajoutez un ou plusieurs caractères qui ne sont ni des lettres, 
      ni des nombres. Par exemple: "m0T'De'p4SS3#01"
       

    Et voilà, vous avez un beau mot de passe difficilement reconaissable mais mémorisable.


    15.1.6. Tester son mot de passe

    Source(s):

    Un mot de passe peut être faillible. Comment s’en assurer ? En effectuant exactement les mêmes attaquesvque celles auxquelles vous pouvez être soumises.

    Utilisez un logiciel tel que John the ripper (alias john). Vous pouvez insérer le dictionnaire que vous voulez ou laisser celui par défaut.

    Note

    Cette méthode de test, doit être appliqué en premier lieu.

    Par la suite en accord avec votre direction, il est nécessaire que les mots de passe de la globalité du SI soient vérifiés, entre autre par attaque par dictionnaire, et ce de manière régulière.

    
$ sudo apt-cache search john
    ... 
    john - active password cracking tool
    john-data - active password cracking tool - character sets
    ...
    
    $ sudo apt-cache show john
    Package: john
    ...
    Description: active password cracking tool
     john, mostly known as John the Ripper, is a tool designed to help systems
     administrators to find weak (easy to guess or crack through brute force)
     passwords, and even automatically mail users warning them about it, if it
     is desired.
     .
     It can also be used with different cyphertext formats, including Unix's
     DES and MD5, Kerberos AFS passwords, Windows' LM hashes, BSDI's extended DES,
     and OpenBSD's Blowfish.
    
    Homepage: http://www.openwall.com/john/
    ...
       
    
## Insatllation via le paquet disponible dans la distribution
    $ apt-get install john
    
    #OU
    
    ## Installation Manuelle de la dernière version stable 
    $ wget 'http://www.openwall.com/john/g/john-1.7.3.4.tar.gz'
    $ tar xzf john-1.7.3.4.tar.gz
    $ cd john-1.7.3.4/src
    $ make
    ...
    linux-x86-any            Linux, x86
    ...
    $ make clean linux-x86-any
    (ou $ make clean generic alternativement)
    ...
    $ cd ../run
    $ ./john --test
       
    
## Vérifier tous les mots de passe
    $ unshadow /etc/passwd /etc/shadow > passwordlist.txt
    $ john passwordlist.txt 
    Loaded 8 password hashes with 8 different salts (FreeBSD MD5 [32/32])
    eeeee            (eeeee)
    ddddd            (ddddd)
    bbbbb            (bbbbb)
    aaaaa            (aaaaa)
    ccccc            (ccccc)
    toto             (toto)
    guesses: 6  time: 0:00:00:26 48% (2)  c/s: 4942  trying: Sulp
    Session aborted
    
    #==> 26 secondes pour trouver les mots de passe de dummy !!!
    
    ## Vérifier un utilisateur
    $ passwd aaaaa    # fruit
    $ rm .john	  # supprimer l'historique pour revérifier aaaaa
    $ unshadow /etc/passwd /etc/shadow > passwordlist.txt   # Mise à jour du fichier de mdp
    $ john -users:aaaaa passwordlist.txt
    Loaded 1 password hash (FreeBSD MD5 [32/32])
    fruit            (aaaaa)
    guesses: 1  time: 0:00:33:59 (3)  c/s: 5228  trying: fruit
    
    #==> 33 minutes 59 secondes pour un simple mot du dictionnaire !!!
    
    ## pour casser le mdp de root ;-)
    $ john --users=0  
    
    ## Afficher la liste des mots de passe craqué
    $ john -show passwordlist.txt 
    bbbbb:bbbbb:1002:1002:BBB,222,222,222,222:/home/bbbbb:/bin/bash
    ...
    toto:toto:1006:1010::/home/toto:/bin/sh
    
    5 password hashes cracked, 3 left
       

    Note

    En ce qui concerne le temps d'éxecution de John The Ripper...

    John se base sur un dictionnaire pour effectuer les tests. Si celui-ci comporte l'encyclopédie médicale du 18è siècle, il y a de grandes chances que tu ne trouves jamais "fruit" par example. Maintenant, en changeant le dictionnaire par un comportant les types d'aliments comestibles, il est possible qu'il hack le mot de passe "fruit" instantanément.

    Voir aussi : Cassage et durcissement des mots de passe [PDF Version]

    Il est possible aussi d'utiliser des sites sur internet qui testent la force du mot de passe en leur affectant une note. Cela donne une première idée, par contre, ce n'est pas très sécurisé de faire cela !!!

    En effet, il pourrait commencer par tester sur les comptes qu'il connaît de nous (il ne faut pas oublier qu'un tel site a notre addresse IP). De plus, la notation est utilisée selon un algorithme qu'ils définissent eux-même, ça ne veut donc pas dire grand chose.

    Existe-t-il une application, autre que John The Ripper, qui permet de tester la force du mot de passe, et de lui donner une note ?

    Sûrement, mais ça n'a pas de sens. Ce serait une note par rapport aux critères pré-programmés. Si ces critères ne sont pas satisfaisant, que reste-t-il ? Par exemple, si un logiciel est écrit pour donner une note qui dit : si il y a une lettre et un chiffre, j'attribue 10/20. S'il y a deux lettres, 11, deux lettres et deux chiffres, 12. Un caractère spécial : 14. Deux ? 16. C'est la fête, mais ça ne veut rien dire, surtout si c'est ab12++.


    15.1.7. Clef publique/privée

    Finalement les systèmes de clef publique/clef privée est-ce plus simple et plus sûr ?

    Oui. Si l'algorithme est correctement implémenté, c'est plus sûr car plus difficile à casser.

    Et se posera la question du maillon faible qu'est la clé privée, tout au moins l'utilisateur qui détient sa clé privée et ce qu'il en fait.

    Un bon mdp, ou un couple privKey/pubKey, mais ça vous le verrez petit à petit, ne fait pas tout, car son utilisation s'inscrit dans des chaînes assez complexes d'utilisation verticales (protocoles) et horizontales (applications) et certaines astuces sont réellement très très fortes pour détourner l'attention d'une personne afin qu'elle donne l'information qu'on souhaite.

    Plus d'info dans la section Le Chiffrement : Signature & Encryption (GnuPG) ci-après


    15.1.8. Les sauvegardes

    Voir section SR001 Commandes GNU/Linux > SYS01: Sauvegarde et archivage (Backup)


    15.1.10. Un espace hermétique

    Voir la section dédiée Un Espace Hermétique ci-après


    15.2. Le Chiffrement : Signature Numérique & Encryption (GnuPG)

    Source(s):


    15.2.1. Chiffrement symétrique (une clef) / asymétrique (paire de clefs)

    « Cryptographie n.f. Procédé (signes conventionnels, modification de l’ordre, de la disposition dessignes, remplacement des signes...) permettant de rendre un message inintelligible, de protéger des données. »

    Deux grandes familles complémentaires : le symétrique (clef unique connue de tous) et l’asymétrique (couple clef publique connu de tous et clef secrète connu du propriétaire seulement).

    
- Une clef publique sert à chiffrer ou à vérifier une signature
    - Une clef privée sert à déchiffrer et à signer des données
       

    Une clé publique consiste en la portion publique de la clé principale de signature, la portion publique des clés secondaires de chiffrement et de signature et les identifiants utilisés pour associer la clé publique à une personne réelle. Chaque partie de la clé possède des informations sur elle même : ses identifiant d'utilisateurs, sa date de création, sa date d'expiration, etc. Pour un identifiant, ces données incluent le nom de la personne réelle qu'elle identifie, un commentaire optionnel et une adresse email.

    Une clé privée consiste en une structure similaire, excepté qu'elle ne contient que les portions privées des clés, et qu'il n'y a pas d'informations concernant les identifiants d'utilisateur.

    
## un exemple simple de chiffrement par rotation des lettres
    $ echo "je vais bien et toi ?" | tr a-z n-za-m
    wr invf ovra rg gbv ?
    $ echo "wr invf ovra rg gbv ?" | tr n-za-m a-z
    je vais bien et toi ?
       

    15.2.2. Installation et configuration de GnuPG

    
## Installation
    $ apt-get install gnupg kgpg
    
    # gnupg (suite de commande GnuPG)
    # kgpg  (interface graphique GnuPG)
       
    
## Configuration
    ~/.gnupg/gpg.conf   # Un fichier de configuration par utilisateur
       

    15.2.3. Lister les clefs de son trousseau

    
## Lister les clefs
    $ gpg --list-keys                      # Aucune n'existe par défaut sur Debian :)
    /home/filostene/.gnupg/pubring.gpg     # Par contre sur Ubuntu...
    ----------------------------------
    pub   1024D/88C7C1F7 1999-01-30
    uid                  Steve McIntyre <steve@einval.com>
    uid                  Steve McIntyre <93sam@debian.org>
    uid                  Steve McIntyre <stevem@chiark.greenend.org.uk>
    uid                  Debian CD signing key <debian-cd@lists.debian.org>
    sub   1024g/9315EA5D 1999-01-30
    
    # En tant que root ?
    $ gpg --list-keys
    gpg: répertoire `/root/.gnupg' créé
    gpg:  nouveau fichier de configuration `/root/.gnupg/gpg.conf' créé
    gpg: AVERTISSEMENT: les options de `/root/.gnupg/gpg.conf' ne sont pas encore actives cette fois
    gpg: le porte-clés `/root/.gnupg/pubring.gpg` a été créé
    gpg: /root/.gnupg/trustdb.gpg: base de confiance créée
    
    #==> On voit ainsi les fichiers minimum utilisé par GnuPG
       

    15.2.4. Générer un nouvelle paire de clefs

    
## Générer une nouvelle paires de clefs --gen-key
    $ gpg --gen-key
    gpg (GnuPG) 1.4.9; Copyright (C) 2008 Free Software Foundation, Inc.
    ...
    Sélectionnez le type de clé désiré:
       (1) DSA et Elgamal (par défaut)                      
       (2) DSA (signature seule)
       (5) RSA (signature seule)
    Votre choix ? 1                                       # Je choisis le type 
                                                          # de clef par défaut
                                                          # DSA et Elgamal
    La paire de clés DSA fera 1024 bits.
    les clés ELG-E peuvent faire entre 1024 et 4096 bits de longueur.
    Quelle taille de clé désirez-vous ? (2048) 
    La taille demandée est 2048 bits                      # Je garde la taille 
                                                          # par défaut
    
    Spécifiez combien de temps cette clé devrait être valide.
             0 = la clé n'expire pas
          <n>  = la clé expire dans n jours
          <n>w = la clé expire dans n semaines
          <n>m = la clé expire dans n mois
          <n>y = la clé expire dans n années
    La clé est valide pour ? (0) 0
    La clé n'expire pas du tout                            
    Est-ce correct ? (o/N) o                              # Je choisi le temps
                                                          # de validité par défaut
    
    Vous avez besoin d'un nom d'utilisateur pour identifier votre clé; 
    ...
    Vous avez sélectionné ce nom d'utilisateur:
    "Richard Léger (noComment) <richard.leger.AT.gmail.com>"  # Mon nom d'utilsateur
    
    Vous avez besoin d'une phrase de passe 
    pour protéger votre clé secrète.                      # Je choisis un passephrase
    
    gpg: gpg-agent n'est pas disponible dans cette session
    Un grand nombre d'octets aléatoires doit être généré. Vous devriez faire
    autre-chose (taper au clavier, déplacer la souris, utiliser les disques)
    pendant la génération de nombres premiers; cela donne au générateur de
    nombres aléatoires une meilleure chance d'avoir assez d'entropie.
    ...
    Il n'y a pas assez d'octets aléatoires disponibles. Faites autre chose
    pour que l'OS puisse amasser plus d'entropie ! (il faut 284 octets de plus)
    
    gpg: clé 78A9AF9E marquée comme ayant une confiance ultime.
    les clés publique et secrète ont été créées et signées.
    
    gpg: vérifier la base de confiance
    gpg: 3 marginale(s) nécessaires, 1 complète(s) nécessaires, modèle
    de confiance PGP
    gpg: profondeur: 0  valide:   1  signé:   0
    confiance: 0-. 0g. 0n. 0m. 0f. 1u
    
    pub   1024D/78A9AF9E 2010-03-04
          Empreinte de la clé = C49D 278A 3641 01AF B216  867F 8C7F 1AC9 78A9 AF9E
    uid                  Richard Léger (noComment) <richard.leger.AT.gmail.com>
    sub   2048g/97F7FF28 2010-03-04
       

    Avertissement

    Si lors de la génération de la clef, le processus a besoin de plus d'entropie, il suffit d'augmenter l'activité sur la machine (taper au clavier, ecouter de la musique, voir un video en streaming, etc...) jusqu'à ce que la clef soit générée.

    
## Je vérifie...
    $ gpg --list-keys
    /home/filostene/.gnupg/pubring.gpg
    ----------------------------------
    ...
    pub   1024D/78A9AF9E 2010-03-04
    uid                  Richard Léger (NoComment) <richard.leger.AT.gmail.com>
    sub   2048g/97F7FF27 2010-03-04
       

    15.2.5. Générer un certificat de révocation

    
## Générer un certificat de révocation --gen-revoke
    ## Syntaxe: $ gpg --output revoke.asc --gen-revoke mykey
    $ gpg --output revoke.asc --gen-revoke richard.leger.AT.@gmail.com 
    $ gpg --output revoke.asc --gen-revoke 78A9AF9E                 # Alternative 
    
    sec  1024D/78A9AF9E 2010-03-04 Richard Léger 
    (noComment) <richard.leger.AT.gmail.com>
    
    Générer un certificat de révocation pour cette clé ? (o/N) o   # Je confirme
    ...
    Cause de révocation: Aucune raison spécifiée
    A utiliser en cas de clef compromise...
    Est-ce d'accord ? (o/N) o                                      # J'indique une raison
    
    Vous avez besoin d'une phrase de passe 
    pour déverrouiller la clef...
    ...                                                            # Je rentre mon passephrase 
    
    Certificat de révocation créé.            # Ok
    
    Déplacez-le dans un support que vous pouvez cacher ; 
    si Mallory a accès à ce certificat il peut l'utiliser pour 
    rendre votre clé inutilisable.
    Une bonne idée consiste à imprimer ce certificat puis à le stocker
    ailleurs, au cas où le support devient illisible. Mais attention :
    le système d'impression de votre machine pourrait stocker ces
    données et les rendre accessibles à d'autres personnes !
    
    $ cat revoke.asc 
    -----BEGIN PGP PUBLIC KEY BLOCK-----
    Version: GnuPG v1.4.9 (GNU/Linux)
    Comment: A revocation certificate should follow
    
    iG8EIBECADA (...) XV+JFnkdrGT4=
    =k0jp
       

    Note

    Il est conseillé, d'immédiatement créer un certificat de révocation pour la clé principale. Si vous oubliez votre mot de passe, ou si votre clé privée est compromise ou perdue, ce certificat de révocation peut être publié pour notifier aux autres que votre clé publique ne doit plus être utilisée. On peut toujours se servir d'une clé publique révoquée pour vérifier des signatures que vous avez faites par le passé, mais on ne peut s'en servir pour chiffrer de nouveaux messages à votre attention. Cela n'affecte pas non plus votre capacité à déchiffrer les messages qui vous ont été adressés précédemment, si vous avez toujours accès à votre clé privée.


    15.2.6. Export de clefs

    
## Exporter une clé publique --export
    ## Pour envoyer à un correspondant. 
    ## Syntaxe : gpg --export mykey
    
    # Export au format binaire
    $ gpg --output richardbin.gpg --export richard.leger.AT.gmail.com
    $ gpg --output richardbin.gpg --export 78A9AF9E                 # Alternative
    
    $ cat richardbin.gpg 
    01100111000110100 (...)
    
    # Export au format ASCII-armored (blindage ASCII)
    # Pour envoyée par email ou publiée sur une page web
    $ gpg --armor --output richardascii.gpg --export richard.leger.AT.gmail.com
    $ gpg --armor --output richardascii.gpg --export 78A9AF9E       # Alternative
    
    $ cat richardascii.gpg 
    -----BEGIN PGP PUBLIC KEY BLOCK-----
    Version: GnuPG v1.4.9 (GNU/Linux)
    
    mQGiBEuPqfwRBACmyPhwyJKuBgXV1BtTgtoskpmSNZypTsu+tdNVSZQzvDKHXezC
    (...)
    ly4Zory5OLACpSMm9AvYcwRw2A==
    =P8fQ
    -----END PGP PUBLIC KEY BLOCK-----
       
    
## Exporter la clé privée
    ## Syntaxe: gpg --export-secret-key keyid > seckey.pgp
    $ gpg --output richardbinsec.gpg --export-secret-key 78A9AF9E
    $ gpg --armor --output richardasciisec.gpg --export-secret-key 78A9AF9E
       

    15.2.7. Import de clefs

    
## Importer une clé publique --import
    ## Ajoutée à votre trousseau de clés publiques
    $ gpg --import vincent.gpg      # Peut être binaire ou ascii
       

    Voir aussi ci-après comment importer une clef publique depuis un serveur de clefs


    15.2.8. Emprunte et signature de clef publique

    Note

    L'empreinte d'une clé est vérifiée avec le propriétaire de la clé. Ce peut être fait en personne (le plus sûr pour véfifier l'identité), au téléphone, ou par tout autre moyen, du moment que vous pouvez garantir que vous communiquez bien avec le vrai propriétaire de la clé. Si l'empreinte que vous obtenez est la même que celle que le propriétaire de la clé obtient, alors vous pouvez être sûr que vous avez une copie correcte de la clé.

    Avertissement

    Une clef publique ne doit pas être signée tant que l'on a pas rencontré physiquement son propriétaire et que l'on s'est assuré de son identité.

    Avertissement

    Étant donné que la vérification des clés est un point faible du chiffrement à clé publique, vous devez être extrêmement prudent et toujours vérifier l'empreinte d'une clé avant de la signer.

    Vous pouvez signer la clé pour la valider une fois que les conditions ci-dessus sont remplies.

    
## Editer la clef
    $ gpg --edit-key vincent@sondomaine.org
    
    ## Valider la clef importée
    ## en vérifiant son empreinte.
    Command> fpr                    # Equivalent de --fingerprint option
    
    ## En la signant, vous certifiez que c'est une clé valide. 
    ## Après avoir vérifié l'empreinte
    Command> sign
    
    ## Vérfifier
    Command> check
       

    15.2.9. Chiffrer/Déchiffrer un document

    
## Chiffrer des documents (via clé publique) --encrypt
    $ gpg --output doc-encrypted.gpg --encrypt --recipient vincent@sondomaine.org 
          --recipient alice@sondomaine.org  doc-original
       

    Note

    L'option --recipient est utilisée une fois pour chaque destinataire du message, et prend un argument supplémentaire spécifiant la clé publique pour laquelle le document doit être chiffré.

    Avertissement

    Le document chiffré peut seulement être déchiffré par quelqu'un possédant une clé privée qui correspond à une des clés publiques des destinataires. En particulier, vous ne pouvez pas déchiffrer un document chiffré par vous, à moins que vous ayez inclus votre clé publique dans la liste des destinataires.

    
## Déchiffrer des documents (via clef privée) --decrypt
    $ gpg --output doc-orgininal --decrypt doc-encrypted.gpg
       

    Note

    Vous avez besoin de la clé privée (et du passephrase correspondant) pour laquelle le message a été chiffré.

    
## Chiffrer des documents sans recourrir à la clé publique --symmetric 
    ## Chiffrement symétrique : clé dérivée du mot de passe fourni
    $ gpg --output doc-encrypted.gpg --symmetric doc-original
    Enter passphrase: 
    
    $ gpg --output doc-orgininal --decrypt doc-encrypted.gpg
    Enter passphrase: 
       

    Avertissement

    Le mot de passe ne doit pas être le même que celui que vous utilisez pour protéger votre clé publique. Le chiffrement symétrique est utile quand le mot de passe n'a pas besoin d'être communiqué aux autres.


    15.2.10. Signature Numérique (ou Electronique) d'un document

    
## Générer une signature numérique --sign
    $ gpg --output doc-signe.sig --sign doc-original
    Enter passphrase:
    
    ## Documents signés en clair (pas de compression)
    alice% gpg --clearsign doc 
       

    Note

    Le document est compressé avant d'être signé, et la sortie est au format binaire

    Un usage commun des signatures numériques est de signer les messages email. Dans une telle situation, il est inopportun de compresser le document quand on le signe. L'option --clearsign entraîne que le document est suivi par une signature ASCII-armored, mais le document n'est pas modifié outre mesure.


    15.2.11. Vérifier la signature d'un document

    
## Vérifier la signature uniquement --verify
    $gpg --verify doc-signe.sig
    
    ## Vérifier la signature et récupérer le document original --decrypt
    $ gpg --output doc-original --decrypt doc-signe.sig
       

    Note

    Une signature numérique certifie et date un document. Si le document est modifié d'une quelconque manière, une vérification de la signature échouera. Un signature numérique peut servir les mêmes besoins qu'une signature manuscrite, en outre elle ne peut pas être contrefaite.

    La création et la vérification des signatures utilisent les paires de clés privée/publique pour une opération différente du chiffrement et du déchiffrement.

    Une signature est créée en utilisant la clé privée du signataire. La signature est vérifiée en utilisant la clé publique correspondante.


    15.2.12. Gestion du trousseau de clefs (publique/privée, sous-clés, etc...)

    
## Gérer votre paire de clés (publique/privée)
    ## option de ligne de commandes --edit-key 
    $ gpg --edit-key vincent@sondomaine.org
    Secret key is available.                                     # un drapeau indiquant si la 
                                                                 # clé privée est disponible
                                                                 # suivit des informations sur 
                                                                 # chaque composant de la clé
     
    pub  1024D/26B6AAE1  created: 1999-06-15 expires: never      # clé publique principale de signature
                                                                 # identifié par le type 'pub'
    sub  2048g/0CF8CB7A  created: 1999-06-15 expires: never      # clé publique secondaire
                                                                 # identifié par le type 'sub'
    sub  1792G/08224617  created: 1999-06-15 expires: 2002-06-14
    sub   960D/B1F423E7  created: 1999-06-15 expires: 2002-06-14
    (1)  Vincent (Jester) <vincent@sondomaine.org>               # Liste des identifiants d'utilisateur
    (2)  Vincent (Plebian) <vincent@tel.net>
    Command>                                                     # Ligne de commande
    
    # Colonne deux indique 
    - la longueur de la clé en bits
    - son type D-DSA, g-ElGamal(Chiffrement seul), G-ElGamal(Chiffrement&Signature)
    - son identifiant. 
    
    # Colonne trois et quatre indiquens
    - dates de création 
    - dates d'expiration 
       
    
## Basculer (toggle) entre la composante privée et la composante publique  
    ## de la paire de clés (si elles sont effectivement disponibles).
    Command> toggle
    
    sec  1024D/26B6AAE1  created: 1999-06-15 expires: never      # clé privée principale de signature
                                                                 # identifié par le type 'pub'
    sbb  2048g/0CF8CB7A  created: 1999-06-15 expires: never      # 'sbb' identifie les clés privées 
                                                                 # secondaires
    bb  1792G/08224617  created: 1999-06-15 expires: 2002-06-14
    sbb   960D/B1F423E7  created: 1999-06-15 expires: 2002-06-14
    (1)  Chloé (Jester) <vincent@sondomaine.org>
    (2)  Vincent (Plebian) <vincent@tel.net>
    
    ## Les informations fournies sont similaires à celles affichées pour la clé publique.
       
    
## Vérification avec ma paire de clefs !
    $ gpg --edit-key richard.leger@gmail.com
    gpg (GnuPG) 1.4.9; Copyright (C) 2008 Free Software Foundation, Inc.
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    
    La clé secrète est disponible.
    
    pub  1024D/78A9AF9E  créé: 2010-03-04  expire: jamais       utilisation: SC  
                         confiance: ultime        validité: ultime
    sub  2048g/97F7FF27  créé: 2010-03-04  expire: jamais       utilisation: E   
    [  ultime ] (1). Richard Léger (fr74) <richard.leger@gmail.com>
    
    Commande> toggle
    
    sec  1024D/78A9AF9E  créé: 2010-03-04  expire: jamais     
    ssb  2048g/97F7FF27  créé: 2010-03-04  expire: jamais     
    (1)  Richard Léger (fr74) <richard.leger@gmail.com>
       
    
## Vérifier l'intégrité de clefs
    $ gpg --edit-key mykey_tocheck
    Commande> check
       

    D'autres commandes existent :

    
## Ajouter et supprimer des composantes à une clé
    
    # Ajouter des identifiants d'utilisateur
    Commande> adduid    # nom, email, commentaire 
    
    # Ajouter une sous-clé 
    Commande> addkey    # Requière passphrase de la clef principale    
    
    # Supprimer un identifiant d'utilisateur
    Commande> uid 1     # selectionne/deselectionne le premier identifiant 
    Commande> deluid    # efface l'identifiant selectionné
     
    # Ajouter une sous-clé 
    Commande> key 2     # selectionne/deselectionne la 2ème sous clef
    Commande> delkey    # efface la sous clef selectionnée    
    
    ## Révoquer les composants d'une clé
    Commande> revkey    # révoque la sous-clé sélectionnée
    
    ## Mettre à jour la date d'expiration d'une clé
    Commande> expire    # Si aucune clé est sélectionnée, c'est la date d'expiration 
                        # de la clé principale qui est mise à jour.
    
    ## Afficher Finger print de clef
    Command> fpr        # Equivalent de --fingerprint option
    
    ## Définir le niveau de confiance que 
    ## vous avez dans le propriétaire d'une clé
    Commande> trust
    
    ## Quitter l'édition de clefs
    Commande> quit
       

    Note

    Des identifiants d'utilisateur supplémentaires sont utiles quand vous avez besoin de multiples identités. Par exemple, vous pouvez avoir besoin d'une identité pour votre emploi et une pour votre engagement politique.

    Les sous-clés supplémentaires sont aussi nécessaires. Les identifiants d'utilisateur associés à votre clé publique principale sont validés par les utilisateurs avec qui vous communiquez, et changer la clé principale nécessite de refaire les certifications. Ce peut être difficile et prendre beaucoup de temps si vous communiquez avec de nombreuses personnes. D'un autre côté, il est recommandé de changer périodiquement les clés de chiffrement. Si la clé est cassée, toutes les données qui sont chiffrées avec elle sont vulnérables. Par contre, en changeant les clés, seules les données chiffrées avec celle qui est cassée seront révélées.

    Infos complémentaires sur la notion de sous-clefs:

    GnuPG Handbook - Ajouter et supprimer des composantes à une clé

    Définition des dates d'expiration et utilisation des clés secondaires

    Using multiple subkeys in GPG

    Using various subkeys

    Using subkey signatures

    HOW TO MIGRATE A (SUB)KEY INTO A NEW KEY

    HOW TO CREATE A GPG KEY WITH MORE THAN ONE PASS-PHRASE


    15.2.13. Distribution de clés (Serveur de clés)

    Voir aussi Import/Export de clefs ci-avant...

    
## Distribution de clés
    
    ## Serveur de clef utilisé par défaut
    $ cat ~/.gnupg/gpg.conf
    ...
    keyserver hkp://keys.gnupg.net
    #keyserver mailto:pgp-public-keys@keys.nl.pgp.net
    #keyserver ldap://keyserver.pgp.com
    ...
    
    ## Récupérez la clef publique 0xFFAD5F7C de JP 
    $ gpg --keyserver keys.gnupg.net --recv-key 0xFFAD5F7C
    $ gpg --keyserver keys.gnupg.net --recv-key jp@free.fr # Alternative si je 
                                                           # connais l'identité utilisateur
    $ gpg --recv-key 0xFFAD5F7C  # Autre alternative équivalente
                                 # puisque le serveur est utilisé 
                                 # par défaut (indiqué dans la configuration)
    
    gpg: requête de la clé FFAD5F7C du serveur hkp keys.gnupg.net
    gpg: clé FFAD5F7C: clé publique « Jean-Philippe Gaulier <jp.AT.free.fr> » importée
    gpg: 3 marginale(s) nécessaires, 1 complète(s) nécessaires, modèle de confiance PGP
    gpg: profondeur: 0  valide:   1  signé:   0 confiance: 0-. 0g. 0n. 0m. 0f. 1u
    gpg: Quantité totale traitée: 1
    gpg:               importée: 1
    
    ## Export de ma paire de clef
    $ gpg --keyserver keys.gnupg.net --send-key richard.leger.AT.cyb.org
    $ gpg --keyserver keys.gnupg.net --send-key 0x78A9AF9E   # Alternative
    $ gpg --send-key 0x78A9AF9E  # Autre alternative équivalente
                                 # puisque le serveur est utilisé 
                                 # par défaut (indiqué dans la configuration)
    
    --keyserver : serveur de clés (du)auquel les clés sont envoyées/reçues 
    
    --send-keys : une ou plusieurs clés envoyées à un serveur de clés 
    
    --recv-keys : récupérer les clés depuis un serveur de clés
                  requiert l'utilisation d'un ID de clé pour spécifier la clé
       

    Avertissement

    --keyserver doit apparaître avant --send-key ou --recv-key (C'est dû à un bug apparement...)

    Pour mettre à jour votre clé, il vaut mieux révoquer les composants plutôt que de les effacer.Si vous envoyez votre clé à un serveur de clés, la fusion a lieu quoi qu'il arrive, et toute personne qui téléchargera la clé depuis le serveur ne verra pas la clé avec les composants effacés.

    De manière idéale, vous devez distribuer vos clés en les donnant personnellement à vos correspondants. En pratique, les clés sont souvent distribuées par email, diffusion sur page Web, etc...

    Il existe aussi des serveurs de clés publiques qui sont utilisés pour collecter et distribuer les clés publiques. Une clé publique reçue par le serveur est soit ajoutée à la base de données du serveur soit fusionnée avec la clé existante si elle est déjà présente. Quand une requête de clé arrive au serveur, ce dernier consulte sa base de données et renvoie la clé publique s'il la trouve.

    L'utilisation d'un serveur de clés est aussi intéressante quand de nombreuses personnes signent fréquemment les clés d'autres personnes. L'utilisation d'un serveur de clés rend le procédé plus facile.

    De nombreux serveurs de clés populaires sont en service à travers le monde. Les serveurs de clés les plus importants se synchronisent entre eux ; il est donc suffisant de sélectionner un serveur de clés proche de vous sur l'Internet et de l'utiliser régulièrement pour envoyer et recevoir des clés.

    
## Vérification de l'import de clef
    $ gpg --list-keys
    ~/.gnupg/pubring.gpg
    ...
    pub   1024D/FFAD5F7C 2003-02-14
    uid                  Jean-Philippe Gaulier <jp.AT.free.fr>
    uid                  Jean-Philippe Gaulier ...
    ...
    sub   4096g/08C5502C 2003-02-14
       

    15.2.14. Chiffrement de messages courriels

    
## Envoyez à JP un message signé 
    $ gpg --output msgsigned.pgp --sign msg.txt
    #==> Puis envoi par courriel du fichier msgcruypted.pgp
    
    ## Envoyer à JP un message chiffré
    $ gpg --output msgcrypted.pgp --encrypt --reciptient FFAD5F7C msg.txt 
    #==> Puis envoi par courriel du fichier msgcruypted.pgp
       

    Cette méthode quoi que fonctionnelle n'a pas le mérite d'être efficace car elle oblige à deux actions: créer le fichier, puis l'envoyer...

    Heureusement un certains nombre de logiciels peuvent travailler directement avec GnuPG notemment les logiciels courrier tel que Evolution, Thunderbird (requiert add-on Enigmail), Claws Mail(requiert module PGPCore PGPMIME), etc... nativement (module pré-chargé) ou via des extensions à installer pour permettre une signature ou le chiffrement de message à la volé :)

    Info sur Thunderbird+Enigmail peuvent être trouvé à : Welcome to the Enigmail Quick Start Guide

    
## Evolution - Configuration du chiffrement GPG
    1.Choisissez Édition > Préférences, 
      puis sélectionnez Comptes de messagerie.
    2.Sélectionnez le compte pour lequel vous voulez 
      ajouter la sécurité, puis cliquez sur Édition.
    3.Cliquez sur l'onglet Sécurité.
    4.Indiquez votre identifiant de clé dans 
      le champ « ID de la clé PGP/GPG ».
    5.Cliquez sur « Créer ».
    6.Cliquez sur Fermer.
               
    ## Evolution - Chiffrement des messages
    Pour chiffrer un message unique :
    1.Ouvrez la fenêtre d'édition d'un message.
    2.Choisissez Sécurité > Chiffrer avec PGP.
    3.Écrivez votre message.
      Cliquez sur Envoyer.
       

    Avertissement

    Le sujet du message ne sera pas chiffré et ne devrait pas contenir d'information sensible.

    
## Configurer Evolution pour qu'il signe tous vos courriels :
    1.Choisissez Édition > Préférences, puis sélectionnez Comptes de messagerie.
    2.Sélectionnez le compte pour lequel vous voulez ajouter la sécurité, puis cliquez sur Édition.
    3.Cliquez sur l'onglet Sécurité.
    4.Cochez l'option Toujours signer les messages sortants lors de l'utilisation de ce compte.
    5.Cliquez sur « Créer ».
    6.Cliquez sur Fermer.
               
    ## Evolution - Déchiffrement d'un message reçu
    1.Si vous recevez un message chiffré, 
      vous devez le déchiffrer avant de pouvoir le lire. 
    2.Rappelez-vous que l'expéditeur doit disposer de votre 
      clé publique avant de pouvoir vous envoyer un message chiffré.
    3.Lorsque vous affichez le message, Evolution vous demande votre mot de passe PGP. 
      Saisissez-le et le message déchiffré apparaîtra.
       
    
## Claws Mail - Configuration
    1.Choisissez Configuration > Modules
    2.Cliquez sur Charger
    3.Dans /usr/lib/claws-mail/plugins selectionner 
      (press CTRL pour multi-selection) :
      pgpcore.so
      pgpinline.so
      pgpmime.so
    4.Valider
    5.Fermer
    6.Choisissez Configuration > Configuration du compte courant
    7.Selectionner section GPG
    8.Selectionner "Spécifier la clé manuellement"
      puis rentrer le numéro de clé (Ex: GTAD5F7C)
    9.Valider
    
    Claws Mail - Chiffrement des messages
    Pour chiffrer un message unique :
    1.Ouvrez la fenêtre d'édition d'un message.
    2.Choisissez Options > Système de confidentialité > PGP MIME
    3.Choisissez Options > Signer (et/ou Chiffrer)
    4.Écrivez votre message.
      Cliquez sur Envoyer.
       

    15.2.15. PGP/inline, PGP/MIME, S/MIME (PKI)

    Note

    PGP/MIME et PGP/inline sont des méthodes qui décrivent comment PGP and GnuPG sont utilisés à l'intérieur d'un client e-mail. PGP/MIME a été developper pour pallier aux problème que peut causer PGP/inline. PGP/MIME est définit dans les RFC 2015 (1996) et RFC 3156 (2001)

    
Avantage de PGP/MIME sur PGP/inline :
    - Pièce jointe sont chiffrées et signé (ex: text, spreadsheet, PDF documents, etc...)
    - "umlauts" et carctères non-ASCII peuvent être utilisé
    - la signature PGP est séparé du corps de l'email (en pièce jointes) rendant l'email plus lisible (la signature n'apparait pas dans le corp du text), plus besoin d'effacer la signature lorsqu'on répond, plus fiable puisque le text de l'email n'est pas modifié
       

    Liste des clients e-mails qui supporte PGP/MIME

    S/MIME versus PGP/MIME : Ce sont deux solutions de signature/chiffrement antinomiques.

    Avec S/MIME il n'existe pas de notion de chaine de confiance mais on vient à la notion d'autorité de certification et à la confiance qu'on lui accorde.

    Le chiffrement S/MIME utilise également une approche basée sur les clés, pour certains semble présenter certains avantages en terme de confort et de sécurité. S/MIME utilise des certificats numérique qui sont comparables aux clés. La partie publique de chaque certificat est conservée par l'expéditeur d'un message et par l'une des autorités de certification qui sont payées pour garantir l'identité d'un expéditeur et la sécurité des messages. Evolution reconnaît déjà un grand nombre d'autorités de certification. Ainsi, lorsque vous recevez un message doté d'un certificat S/MIME, votre système reçoit automatiquement la partie publique du certificat et déchiffre ou vérifie le message.

    S/MIME est intéressant pour de nombreux échanges (le plus souvent, S/MIME est utilisé dans un enviro