|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : septembre 2011 Messages : 54 ![]() |
Bonsoir,
J'ai un un fichier contenant une liste de hostnames de plusieurs OS et versions majeures : RedHat "4", RedHat "5", Solaris "8", Solaris "10", Fedora "12", Fedora "13" (je mets entre guillement la version majeure, car elle est très importante !). Pour chacun de ces hostnames, je veux déterminer le nom de l'OS et sa version majeure. Et en fonction de cela, copier des fichiers dans un répertoire sur la machine en question en écrasant ceux qui étaient là (je fais tout de même une sauvegarde de secours avant, on ne sait jamais !). Quelqu'un aurait-il la gentilesse de m'aider pour mettre en place ce script ? Il se peut que ce soit ridiculement facile à faire, mais je suis toujours un grand débutant, merci de ne pas m'en vouloir.... En vous remerciant d'avance. |
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() Inscription : février 2008 Messages : 2 071 ![]() |
Bonjour,
Pour les distributions linux, lsb-release devrait t'aider. |
|
|
10
|
|
|
#3 |
|
Membre du Club
![]() Inscription : septembre 2011 Messages : 54 ![]() |
Sur RedHat, il ne connait pas!! Sinon, je vois à peu près comment trouver le nom de l'OS (ça marche pour tous les OS) :
et sa release (par ex. pour redhat) Code :
cat /etc/redhat-release | awk '{print $7}' Tiens, j'ai pensé à construire mon scipt autour d'un "case", mais comment mettre les chose en musique ? C'est encore un de mes problèmes et ça m'énerve... |
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() Inscription : février 2008 Messages : 2 071 ![]() |
oui, case est une bonne option.
NB: awk '{print $7}' /etc/redhat-release ¡attention aux uuoc! |
|
|
00
|
|
|
#5 | |||
|
Membre du Club
![]() Inscription : septembre 2011 Messages : 54 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#6 |
|
Expert Confirmé Sénior
![]() Inscription : février 2008 Messages : 2 071 ![]() |
en y regardant de plus près, je me dis qu'à un moment il va falloir que tu te connectes aux machines décrites dans maListeServeurs.txt...
et je me rends compte que ta description n'est pas assez précise; il faudrait, avant d'attaquer le script, que tu aies dressé le plan détaillé des actions à effectuer (quoi faire, sur quelle machine, ...), et ensuite transcrire cela en langage de programmation. NB: indente scrupuleusement tes scripts (les commandes qui ouvrent, et qui ferment une commande composée doivent être sur la même colonne), dans le cas de conditions/case nombreu(x/se) la relecture, et la correction seront plus aisées. |
|
|
00
|
|
|
#7 | |||
|
Membre du Club
![]() Inscription : septembre 2011 Messages : 54 ![]() |
Citation:
Après connexion sur la machine ZZZ du fichier ListeServeurs.txt, commence par vérifier le type d'OS et sa version : 1° si OS = RedHat et version = 4, alors : a) Renome le fichier redhat-4.bin qui se trouve dans le repertoire Y en redhat-4.bin.old b) remplace le fichier redhat-4.bin du repertoire Y par celui qui se trouve dans le répertoire X . c) écrit les erreurs éventuelles dans le fichier erreurs.txt 2° si OS = RedHat et version = 5, alors : - repète les actions a), b) et c) pour le fichier redhat-5.bin. 3° si OS = Solaris et version = 8, alors : - repète les actions a), b) et c) pour le fichier Solaris-8.bin. 4° si OS = Solaris et version = 10, alors : - repète les actions a), b) et c) pour le fichier Solaris-10.bin. etc., .... FIN si FIN pour la machine ZZZ Je ne m'occupe donc pas de comment se connecter sur une machine de la liste (ce qui facilite grandement les choses !), j'ai juste à scripter les actions à effectuer une fois sur la machine en question. Certes, qu'on aurait aussi regrouper le 1° et 2° ensemble et ne tester que par rapport à la version (tout comme le 3° et 4° d'ailleurs) car l'OS est le même à chaque fois. Mais mon souci ici est de clarifier mon problème et non pas l'optimisation du code J'espère que les chose sont maintenant un peu plus claires pour vous. En appliquant ce qui précède, j'ai fait cette nuit le script suivant. Pouvez-vous SVP me dire si cela peut marcher, s'il n'y a pas d'erreurs de logique ou d'écritre? Code :
|
|||
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() Inscription : février 2008 Messages : 2 071 ![]() |
ah ! oui, c'est mieux comme ça !
quelques remarques : case $(uname -s ) in, puisque apparemment tu ne te ressers pas de VAR je ferais une fonction des mv/cp (quand tu vois, comme ici, du code se répéter, cela permet de ne modifier qu'à un seul endroit (dans la définition de la fonction) le code; ça évite les erreurs, les oublis...), à laquelle je passerais le nom du répertoire, et "l'extension" (rh4, sol10) du fichier à considérer. |
|
|
10
|
|
|
#9 | |
|
Membre du Club
![]() Inscription : septembre 2011 Messages : 54 ![]() |
Citation:
En revanche, ce serait très gentil de ta part si tu peux m'aider à introduire la gestion des erreurs. Je souhaite par exemple que les erreurs affichées sur l'écran soient écrites dans un fichier (par exemple : lorsque le fichier n'existe pas, ou le cp/mv ne marcheraient pas pour X rasions). |
|
|
|
00
|
|
|
#10 | ||
|
Expert Confirmé Sénior
![]() Inscription : février 2008 Messages : 2 071 ![]() |
la sortie normale des commandes est envoyée vers STDOUT (/dev/fd/1)
les messages d'erreurs sont envoyés sur STDERR (/dev/fd/2) pour envoyer la sortie d'erreur vers un fichier, il faut rediriger 2 (STDERR) vers le fichier souhaité : Code :
Cependant, il est facile de tester qu'une fichier, ou un répertoire, existe ou non, afin d'éviter d'exécuter des commandes qui sortiraient des erreurs... |
||
|
|
00
|
|
|
#11 | |||
|
Membre du Club
![]() Inscription : septembre 2011 Messages : 54 ![]() |
Citation:
Code :
./copybin.sh: syntax error at line 3: `(' unexpected Il faut que je teste maintenant si le script marche toujours sur les Linux... |
|||
|
|
00
|
|
|
#12 | |
|
Membre du Club
![]() Inscription : septembre 2011 Messages : 54 ![]() |
Citation:
La même modification marche aussi sous Linux. Sinon, comment faites-vous pour éviter dès le départ ce genre de surprises lorsqu'un script devrait s'exécuter sur plusieurs OS ? Pouvez-vous me donner des docs ou des liens qui expliquent comment scripter sous la contrainte de portabilité ? Merci |
|
|
|
00
|
|
|
#14 | |
|
Membre du Club
![]() Inscription : septembre 2011 Messages : 54 ![]() |
Citation:
|
|
|
|
00
|
|
|
#15 |
|
Expert Confirmé Sénior
![]() Inscription : février 2008 Messages : 2 071 ![]() |
ah, ah, ah ! mdr ! et /usr/bin/sh ? y pointe vers quoi ?
|
|
|
00
|
|
|
#16 | |||
|
Membre du Club
![]() Inscription : septembre 2011 Messages : 54 ![]() |
Citation:
Mais j'ai ça : Code :
|
|||
|
|
00
|
|
|
#17 |
|
Expert Confirmé Sénior
![]() Inscription : février 2008 Messages : 2 071 ![]() |
poisse !
avec un peu de pas_d'chance /sbin/sh est aussi un lien, non ? c'est quand même bizarre qu'il ne veuille pas de $( )
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com