1 sur 7 06/09/2012 09:32 Réseau TP1 - Connaissances de base, SSH Contenu de la Page 1. Commandes réseaux, découverte environnement 2. Ecriture d'un petit Shell script 3. Organisation de son Arborescence personnelle 4. Utilisation de la commande ssh 5. Authentification prise en compte par agent - Procédure unique: 1-Génération de clé publique et privée de type 'dsa' 2-Donner la clé publique au compte-serveur ( en ajout) 6. Exécution distribuée sur le réseau (Remote-Shell) - 1. Introduction - 2. Scripts 1 - ou-est, ou-sont - 3. Scripts 2 - charge-min 1. Commandes réseaux, découverte environnement retour haut de page On traitera les rubriques suivantes en interpretant les résultats : * la machine locale o hostname o uname -a * les adresses o physiques ( ETHERNET ) + netstat -i ( + activité du réseau ) + /usr/sbin/arp -a ( table ARP ) o logique ( IP ) + fichier /etc/hosts + /sbin/ifconfig -a ( la carte réseaux ) + /usr/sbin/arp o symbolique ( Noms de Domaines ) + fichier /etc/resolv.conf (identification du résolveur ) + /usr/bin/nslookup adresse (interrogation du résolveur ) * le cheminement o netstat -r ( table de routage ) o ping adresse ( test de réponse d'une carte réseau d'une station distante ) + tester une station du réseau locale o ping -c1 -R adresse ( -R: option de traçage ~ traceroute )
2 sur 7 06/09/2012 09:32 + ping -c1 -R ftp.univ-lehavre.fr * l'accès à des sites http d'information sur nos réseaux o //di/stats/mrtg/intra ( pour le réseau du département informatique ) o www.crihan ( pour le réseau de hate-normandie ) o www.renater ( pour le réseau national ) * le service de transfert de fichier ( File Transfert Protocol FTP ) o sur le réseau du département informatique + Ce service n'est plus disponible ( Sécurité oblige! : mot de passe du login transmis non encrypté ) o en mode anonyme ( uniquement téléchargement ) + nom d'utilisateur : anonymous + mot de passe : votre-login@iut.univ-lehavre.fr # par exemple: ftp ftp.univ-lehavre.fr # utiliser help pour prendre rapidement connaissance des commandes ftp. * le service SSH ( service de communication sécurisé ) o toutes les données transmises sont encryptées o Il remplace les anciens services + RLOGIN ou TELNET (connexion distantes) + FTP ( transfert de fichiers ) + R... ( exécutions à distance "remote-exec" ) o on pourra l'utiliser avec les 3 syntaxes: + ssh adresse + ssh remoteuser@adresse + ssh [remoteuser@]adresse commande # la commande est exécutée sur la machine distante: * ex: ssh givry who 2. Ecriture d'un petit Shell script retour haut de page Ecrire un script shell: * testtx salletp Cette commande a pour paramètre le nom d'une salle TP de terminaux X Elle affiche sur la sortie standard pour chacun des TX envisagés : * son nom suivi d'un des messages: o En Service o Hors Service o Inexistant Indication : Tester le code de retour de la commande * ping -c1 $nomtx > /dev/null 2>/dev/null avec nomtx=di-$salle-$ident pour ident= 01 02 03... 55? 3. Organisation de son Arborescence personnelle retour haut de page
3 sur 7 06/09/2012 09:32 Quelque soit la machine hôte de connexion l'arborescence vue est unique grace au mécanisme de montage 'NFS' de partition. Cela présente pour l'utilisateur une souplesse d'utilisation, mais peut engendrer une certaine confusion, en particulier au cours des TP Réseau. * copier un fichier avec une commande 'reseau' est équivalent à le copier avec une commande locale ( ex. cp ) * les fichiers exécutables issus d'une compilation sur processeur SPARC doivent etre distinguer des compilation sur processeur Intel Pour cela on se propose de créer autant de sous Arborescences que de machines hotes: * $HOME/A-nom_machine_hote et de positionner à la connexion le répertoire de travail à $HOME/A-nom_machine_hote Bien sur, le répertoire personnel n'est pas modifié par l'opération Indications: Le fichier $HOME/.profile ne doit pas etre modifié mais comme il a été prévu par CAIRE, les mises à jour seront placées dans le fichier $HOME/.shrc_priv, lui-meme exécuté par.profile if [! -d $HOME/A-$(hostname) ] then mkdir $HOME/A-$(hostname) fi cd $HOME/A-$(hostname) Attention, vérifier l'execution du fichier.shrc_priv : à la fin du fichier.bashrc, doit se trouver la ligne suivante: ## configuration personnelle if [ -f $HOME/.shrc_priv ]; then. $HOME/.shrc_priv ; fi Vérifier le fonctionnement par : * connexion direte * connexion par ssh 4. Utilisation de la commande ssh retour haut de page L'application SSH est un service complet qui permet le transport des informations sur un réseau IP par chiffrement. Le protocole SSH2 est opérationnel sur les serveurs du réseau du département, dans son implémentation libre openssh La commande 'ssh' engendre le processus client en communication avec le processus serveur 'sshd' sur la machine distante. L'execution de la commande 'cmde' sur la machine distante 'remotehost' est telle que la commande a pour entrée/sortie-standard l'entrée/sortie-standard de l'utilisateur local. On pourra faire les tests avec les 'cmde' suivantes: ls - hostname - uname - pwd - who - date...
4 sur 7 06/09/2012 09:32 ssh remotehost cmde ssh remoteuser@remotehost cmde # remoteuser est un utilisateur ayant un autre nom que l'utilisateur de la machine locale ssh -l remoteuser remotehost cmde # forme équivalente à la précedente (syntaxe issue de l'ancien 'rlogin') ssh remoteuser@remotehost 'cmde1 ; cmde2 ;... ' Ex : ssh remotehost ' test fich ; echo $? ' ssh -v remotehost La redirection: ssh remotehost cmde > fich # sur compte local ssh remotehost cmde '>' fich # sur compte distant Le pipe-line: ssh remotehost cmde1 cmde2 # cmde2 local ssh remotehost 'cmde1 cmde2' # cmde1 et cmde2 distants v=$(ssh remotehost 'cmde1 cmde2' ) Ex: cmde1 : who cmde2 : wc -l cmde0 ssh remotehost cmde1 # cmde1 a pour entrée standard la sortie standard de cmde0 Ex: cat fich1 ssh remotehost cat '>' fich2 Recopie de fichiers: (Le caracrère : doit etre collé au nom machine ) scp f1 remotehost: # recopie de f1 sur compte distant avec le meme nom de fichier scp f1 remoteuser@remotehost: # recopie de f1 sur compte distant remoteuser avec le meme nom de fichier scp f1 remotehost:f2 # recopie de f1 sur compte distant avec un autre nom de fichier scp remotehost:f1 f2 # le fichier source est sur le compte distant scp -r...... # recopie arborescent. Meme syntaxe mais indiquer des répertoires pour la source et la destination Aplication de transfert de fichiers: sftp remotehost ( à ne pas confondre avec gftp qui est une interface graphique de commandes ) 5. Authentification prise en compte par agent retour haut de page La nécessité de fournir le mot de passe du compte distant présente des inconvénients: 1. contrainte pour l'utilisateur. 2. obligation de travailler dans un contexte interactif 3. le mot de passe, bien que 'encrypté' est transmis au serveur Une autre solution, pour éviter ces inconvénients, consiste à effectuer une authentification par clés: la clé privée : pour encrypter (clé secrète connu uniquement du compte local) la clé publique : pour décrypter (clé fournie au compte sur la machine distante (serveur) Ces clés sont utilisées pour l'authentification réciproque du compte-client et du compte-serveur; Remarque: Ce ne sont pas celles utiliser pour encrypter/décrypter le flux emis/reçu sur le reseau. Pour cela la procédure à effectuer est la suivante. ATTENTION! cette procédure d'initialisation est unique:
5 sur 7 06/09/2012 09:32 Elle ne doit pas etre erronnée: Une 'pass phrase' est demandée (de 10 à 30 caractères) elle peut comporter des espaces. Elle sera nécessaire pour valider le mécanisme d'authentification, par exemple au login. Si elle est oubliée, personne ne pourra vous la retrouver, ni la changer. Procédure unique: retour haut de page 1-Génération de clé publique et privée de type 'dsa' retour haut de page ssh-keygen -t dsa # les clés sont par defaut placées dans les fichiers: Vérifier les protections ( ls -l $HOME/.ssh ) clé privée => $HOME/.ssh/id_dsa clé publique => $HOME/.ssh/id_dsa.pub 2-Donner la clé publique au compte-serveur ( en ajout) retour haut de page cat $HOME/.ssh/id_dsa.pub >> $HOME/.ssh/authorized_keys # Ici la simplification vient du fait que le répertoire $HOME/.ssh est le meme pour tous vos compte sur les differents les serveurs. Procedure à executer après chaque login: Maintenant la 'pass-phrase' est demandée à la place du mot de passe de login, à chaque appel de ssh, car il faut décrypter la clé privée pour l'utiliser. Tester ainsi quelques commandes ssh. Pour éviter cette nouvelle contrainte l'utilisateur va demander à s'identifier auprès de l'agent-ssh, c'est à dire transmettre sa clé privée ( sous forme décrypée ) au processus 'agent-ssh': Il faut encore entrer sa 'pass phrase'! mais cette fois-ci, cela sera la dernière fois! Tout au moins jusqu à votre prochain 'logging'. ssh-add On pourra vérifier que l'identification a été effectuée: ssh-add -l Si on veut au cours de la session verouiller l'agent-ssh ssh-add -x On pourra le déverrouller ssh-add -X 6. Exécution distribuée sur le réseau (Remote- Shell) retour haut de page 1. Introduction retour haut de page Nous allons coir qu'il est possible d'écrire des application réparties sur le réseau local très
6 sur 7 06/09/2012 09:32 simplement en shell: Le script-shell contenant des lignes du type ssh hote commande, et sachant que les E/S standards sont redirigés localement, il obtient des informations en provenance de machines éloignées. ssh hote commande # commande exécutée sur la machine hote var=$(ssh hote commande) ssh hote commande > fich_local ssh hote commande commande_locale var=$(ssh hote commande commande_locale) L'environnement avec authentification par clés avec passphrase doit etre opérationnel Il peut etre amélioré avec demande systematique de la passphrase par le WindowManager: Ajouter en première ligne dans le fichier /.xsession (o : o ssh-add < /dev/null Se déloguer et reloguer pour vérifier le bon fonctionnement. Les fichiers script-shell seront placés sous le répertoire: o /TP/reseau/shell Mettre à jour la variable PATH afin que ces scripts soient accessibles directement. Mise à jour à placer dans le fichier ~/.shrc_priv 2. Scripts 1 - ou-est, ou-sont retour haut de page Ecrire la commande ou-est nom_utilisateur qui liste le nom des machines ou l'utilisateur est connecté, parmi une liste prédefinie de machines hotes. (gamay, tavel ou etoile) Remarque: On controlera si le nom de l'utilisateur est valide ( enregistrement dans le fichier /etc/passwd ) avant de commencer la recherche Certains utilisateurs peuvent être connectés à plusieurs machines. Utiliser la commande 'users' pour avoir la liste des utilisateurs logués. liste_hote="gamay tavel etoile" for hote in $liste_hote do for util_log in $(ssh $hote users) do... done done Modifier la commande 'ou-est' pour avoir la commande 'ou-sont' : ou-sont nom_utilisateur1 nom_utilisateur2... remarque: ce script peut appeler le précedent (ou-est)
7 sur 7 06/09/2012 09:32 3. Scripts 2 - charge-min retour haut de page Ce script recherche parmi les 3 serveurs 'etoile gamay tavel' celui qui est le moins chargé, et propose, dans le cas ou c'est une autre machine que sa machine locale, d'établir la connection sur cette machine la moins chargée. INDICATIONS: La commande "uptime" affiche les 3 charges moyennes: (voir manuel) Tester la commande en local et à distance. Pour résoudre le problème, Il faut donc: 1. récupérer ces 3 charges pour chacun des serveurs. 2. y associer le nom correspondant du serveur 3. trier par ordre croissant 4. prendre la première donnée Recuperer les 3 charges dans une variable, On pourra effectuer les tests suivant en interactif sur la machine locale: 1. retirer tous les caractères ','et'.' sur la ligne 'load' => uptime grep load tr -d '.,' 2. réduire une suite d'espaces à un seul espace => uptime grep load tr -d '.,' tr -s ' ' 3. placer le résultat dans une variable => lcharge=$(uptime grep load tr -d '.,' tr -s ' ' ) 4. Eliminer tout le texte à gauche jusqu'à "load average: " inclu, et afficher le résultat à l'écran => echo ${lgcharge#*load average: } Début du programme: list_serv='gamay tavel etoile' for serv in $list_serv do lcharge=$(ssh $serv "uptime grep load tr -d '.,' tr -s ' ' " ) echo ${lcharge#*load average: }:$serv # ajouter le nom du serveur done sort tee charge$$ head -1 > charge-min$$ # creation du fichier charge$$ et charge-min$$ pour la phase de test cat charge$$ # afficher le fichier en phase de test cat charge-min$$ # afficher le fichier en phase de test serv_min=$( cut -d: -f2 charge-min$$ ) rm charge$$ charge-min$$ echo "le serveur le moins chargé est : $serv_min" suite: propose, dans le cas ou c'est une autre machine que sa machine locale, d'établir la connection sur cette machine la moins chargée. établir la connection