Ce fil serait mieux dans “programmation”, je l’y déplace.
Bonjour,
Tes variables reste en local, ta variable name initialisé par for par exemple n’est plus disponible lors du echo.
Pour recuperer la liste des server present dans le fichier ntp.conf, tu peux fire ceci :
for i in $(ssh root@IP "grep "^server" /etc/ntp.conf" | awk '{print $2}' )
do
echo $i
done
Oups, pardon.
Je n’avais pas du tout réalisé qu’il y avait un fil “programmation”, en fait. Au temps pour moi, du coup. Et merci.
Ok, je crois que je comprends. Je vais regarder ça de très près, le temps de revoir ma façon de raisonner. Le ssh à distance, c’est un peu spécial, en fait.
Merci pour ton retour!
Si tu as du mal à mettre ton script au point,
fait ce que tu as à faire dans un script (par exemple script.sh) qui marche en local
et donne le à manger tel quel à la machine distante :
Sinon tu peux aussi utiliser faire un set -x,
c’est toujours utile pour voir ce qui se passe dans un script.
Hello,
En effet, ça fonctionne bien :
echo "-> Resolution des serveurs NTP configures dans le fichier /etc/ntp.conf : " ; echo “” ; for i in $(ssh login@IP “grep “^server” /etc/ntp.conf” | awk ‘{print $2}’ ); do dig $i +short ; done ; echo “”
Je vais garder le même principe pour le reste.
J’ai donc raisonné à l’envers…
Merci
Hi, BBT1,
C’est précisémment le but du jeu.
L’idée est d’écrire un script qui va me permettre de checker des configurations distantes et de pratiquer quelques tests basiques pour avoir rapidement une idées des problèmes si pb il y a. Ou alors autre utilité : de récupérer des configurations à la volée, pour gagner du temps. Bosser sur une machine ou deux ca va, mais quand tu commences à devoir récupérer des extracts sur 30 machines, ça devient passablement chiant. Surtout quand il y a d’autres requêtes à traiter par ailleurs.
Il n'y aurait pas un problème de guillemets ici ?
Il n’y aurait pas un problème de guillemets ici ?
Nope.
Ce que tu vois plus haut est un script et non une commande lancé directement dans le shell.
Autrement dit, si tu vérifies dans les lignes qui suivent, tu verras un guillemet “fermant” qq part.
En fait, ici, juste après le premier “done” :
sudo for i in $(/etc/ntp.conf) ; do ls “$i” ; done"
done | tee -a Time_Machine
Par contre, c’est clair qu’on l’oublierait facilement.
[quote=“sonador”]
Nope.
Ce que tu vois plus haut est un script et non une commande lancé directement dans le shell.
Autrement dit, si tu vérifies dans les lignes qui suivent, tu verras un guillemet “fermant” qq part.
En fait, ici, juste après le premier “done” :
sudo for i in $(/etc/ntp.conf) ; do ls “$i” ; done"
done | tee -a Time_Machine
Par contre, c’est clair qu’on l’oublierait facilement. [/quote]
Le shell ne différencie pas les guillemets “fermants” des “ouvrants”. Il ne peut pas le faire. Il se contente de voir une première paire de guillemets et cherche la suivante pour les fermer. J’aurai presque envie de dire que ta solution marche par chance, simplement parce "chaine a "-"chaine b"
est équivalent à “chaine a - chaine b” et que si jamais tu remplaces “-” par " - ",
tu auras trois arguments au lieu d’un seul.
Si c’est vraiment ce que tu voulais faire (ce dont je doûte),
je suis persuadé qu’il y a des manière plus élégantes de l’écrire.
[quote=“BBT1”][quote=“sonador”]
Nope.
Ce que tu vois plus haut est un script et non une commande lancé directement dans le shell.
Autrement dit, si tu vérifies dans les lignes qui suivent, tu verras un guillemet “fermant” qq part.
En fait, ici, juste après le premier “done” :
sudo for i in $(/etc/ntp.conf) ; do ls “$i” ; done"
done | tee -a Time_Machine
Par contre, c’est clair qu’on l’oublierait facilement. [/quote]
Le shell ne différencie pas les guillemets “fermants” des “ouvrants”. Il ne peut pas le faire. Il se contente de voir une première paire de guillemets et cherche la suivante pour les fermer. J’aurai presque envie de dire que ta solution marche par chance, simplement parce "chaine a "-"chaine b"
est équivalent à “chaine a - chaine b” et que si jamais tu remplaces “-” par " - ",
tu auras trois arguments au lieu d’un seul.
Si c’est vraiment ce que tu voulais faire (ce dont je doûte),
je suis persuadé qu’il y a des manière plus élégantes de l’écrire.[/quote]
Oui mais en même temps je teste différentes choses, pour l’instant. Je simplifierai et j’en ferai qq chose de plus propre, t’inquiète pas. Note que je ne suis pas programmeur à la base, même si j’aime ça, alors je tatonne un peu. Habituellement je ne “shell” pas à distance, so…
Du reste, ce que je voulais dire, surtout, à la base, c’est que justement il y a une fermante à un moment donné. Ce que j’avais compris de ta remarque, c’était qu’il y en manquait une justement.
Mais oui, tu as certainement raison.
Hello,
Dans le même état d’esprit, j’aimerais intégrer la commande suivante :
cat /etc/ntp.conf|grep server| grep ntp|awk ‘{print $2}’|xargs -l dig +short
Dans un script comme suit :
#/bin/bash!
read -p "-> Choisissez l’IP de la machine a verifier : " IP
read -p "-> Choisissez le login : " LOG
echo - Liste des IP incluses dans le ntp.conf :
ssh -l $LOG $IP “touch file ; chmod 777 file
echo cat /etc/ntp.conf|grep server| grep ntp|awk ‘{print $2}’|xargs -l dig +short>file
bash -e file” | tee -a file2
Tel quel ça fonctionne si je ne mets que “cat /etc/ntp.conf”, mais dès qu’on ajouter le pipe et ce qui suit, ça merde et ça n’écrit plus dans le script.
Pour précision, il s’agit là d’un script de “test”, simplement, que je lance en localhost pour comprendre comment les choses fonctionnent, mais à terme, ce que je voudrais faire c’est d’utiliser la méthode pour créer un fichier temporaire sur mes serveurs, et forcer l’éxecution de commandes complexes à partir des machines et non pas à partir de chez moi, et d’en récupérer les résultats.
Il y a une solution pour réussir ça, non ?
:s
Tu devrais protéger l’expansion de LOG et IP avec des guillemets en cas de chaîne vide ou d’espaces.
Je trouve le “echo cat” super suspect…
Ouaip ça pue, je sais.
Dans ce cas, c’est le ssh à distance qui pue, malheureusement.
Normalement, je procède autrement, mais pour l’instant seul un echo cmd suivi d’une redirection me permet d’écrire dans le fichier. Et si je met des guillemets ou quoi que ce soit d’autres, ça marche encore moins.
:s
Comment faire compliqué quand on peut faire simple… En principe ssh, c’est vraiment bien, mais là, pour le coup, c’est un peu la misère.
Le fautif n’est pas ssh mais le mécanisme de substitution et de découpage des arguments de bash
qui demande un peu d’attention
Pourquoi tu n’utilises pas la méthode que je t’ai donné plus haut ?
echo 'cat /etc/ntp.conf | grep server | grep ntp | awk '\''{print $2}'\'' | xargs -l dig +short' |
ssh -l "$USER" "$HOST" bash
Bon, j’avoue il y a quand même une subtilité,
on ne peut pas échapper un ’ dans des ’ ', même avec '.
Par contre, si ce n’est pas entre des ’ ', ’ fonctionne normalement.
Donc la commande est construite comme ça :
‘phrase 1’’‘phrase 2’
Tout le monde a suivi ?
Yeap, ça marche!
Bien vu, le fait d’injecter la commande de cette façon. C’est plus économique que de passer par la création d’un fichier que l’on “exécuterait” localement.
Je n’y avais pas pensé.
Merci!
Par contre, je n’ai pas du tout compris ton explication :
on ne peut pas échapper un ’ dans des ’ ', même avec '.
Par contre, si ce n’est pas entre des ’ ‘, ’ fonctionne normalement.
Donc la commande est construite comme ça :
‘phrase 1’’‘phrase 2’
Tu aurais moyen de reformuler ? (stp )
Merci pour le coup de main!
Toute la subtilité réside en quelques règles simples
qui s’appliquent aux quotes (guillemets simples) :
- une portion de ligne de commande entre quotes sera préservée
- une quote ne peut être placée entre des quotes, même précédée par un backslash ref.
Donc si je veux que le résultat soit abc’def,
je ne peux pas faire ‘abc’def’ (qui donnera une première chaine abc suivie de def et d’une erreur car la dernière quote est ouvrante et n’a pas de fermante correspondant)
ni ‘abc’def’ (même problème qui donne abc\def + erreur)
Donc pour faire apparaître la quote dans le résultat, il faut la mettre hors quote
et lui mettre un caractère d’échappement :
abc’def -> abc’def
et maintenant si on veut protéger abc et def (par exemple parce qu’il y a des { ou des substitions de variables )
’$TOTO’’’{machin}’ -> $TOTO’{machin}
C’est ce résultat qui sera vu pas ssh et qui sera passé tel quel à l’interpréteur de la machine distante.
Okaaaaay…
Merci pour l’’'explication. Je crois avoir compris le truc
hello,
tu as deja pensé à essayer de rediriger les logs de tes machines vers un serveur central dans une base de données et ensuite d’y accéder par un portail web ? (ou script bien entendu)
phpsyslog-ng fait cela:
http://doc.ubuntu-fr.org/syslog-ng
c’est aussi possible pour les serveurs sous win d’intégrer les logs sur le serveur de log…
Pet etre que ça peut te servir…
Aaaah non… Connaissais pas.
'Vais voir pour en savoir +.
Merci pour le tuyau