Ssh - cmd complexe à distance

hi, je suis en train de me casser les dents là dessus depuis plusieurs jours.
Ca commence à devenir agacant… lol

J’essaie de contruire un script, via vim, qui permettrait à ma machine d’aller checker des informations sur une autre machine, distante sans avoir à s’y loguer, l’idée étant à terme de gagner du temps (pour l’instant c’est loupé muarf).

Typiquement, j’essaie ici de lister le contenu du fichier ntp (à terme, l’idée à terme, c’est d’isoler les lignes ayant pour mention “Server”, et de checker d’une traite la résolution des nom de domaine de ces machines. Pour ça, la commande devra donc “isoler” les adresses de machines ntp et faire un dig machine +short dessus) :

#!/bin/bash

line=#-----------------------------------------#;

while :
do
read -p "-> Choisissez l’IP de la machine : " IP
read -p "-> Choisissez le login : " LOG

echo ""
echo $line
echo “”

ssh -l $LOG $IP "hostname |xargs -l echo "-"
date |xargs -l echo “-” ; echo -Test ntpstat:
ntpstat
echo -Test ntpdate
ntpdate -q ntp0.eu.XXXX.net
echo - Check contenu du file /etc/ntp/ntpservers : ; cat /etc/ntp/ntpservers
echo ""
echo - Check contenu du fichier /etc/ntp.conf : ; cat /etc/ntp.conf | grep ^server
echo ""
echo - Check resolution Domain Name du serveur indiqué dans le ntp.conf

#for i in $PWD ; do ls “$i” ; done" => ça, ça marche.
#Note en exemple : ssh root@192.168.203.33 ‘bash -c “for name in /home/*; do ls “$name”; done;”’ => Ca, c’est censé marcher.

Note :

$ => Désigne le prompt de la machine distante.

“$@” is equivalent to “$1” “$2”

sudo for i in $(/etc/ntp.conf) ; do ls “$i” ; done"
done | tee -a Time_Machine

Au finale, tel quel j’obtiens ça :

  • Check resolution Domain Name du serveur indiqué dans le ntp.conf
    bash: -c: line 10: syntax error near unexpected token do' bash: -c: line 10:sudo for i in $(/etc/ntp.conf) ; do ; done’

Note : si je ne mets pas de Sudo, le retour de la commande m’indique que je n’ai pas les droits pour l’exécuter. comme suit :

bash: line 10: /etc/ntp.conf: Permission denied

Si je mets un sudo devant ls, je n’ai simplement rien.

Y aurait pas un codeur dans le coin, par hasard ? (mais alors vraiment par hasard, hein… :p). Car tout fonctionne dans le script, sauf dès que j’aborde des cmd un peu pls complexes.

Rgs,
Christian

Lol pas de réponse ? :slightly_smiling:

Remplace

par

non ?

[quote=“superlemming”]Remplace

par

non ?[/quote]

Hi, merci pour ton retour.
Il me semble avoir déjà essayé ça. Mais attends je vais retenter - peut-être que je me trompe après tout. Je te dis ça dès que j’ai 3 secondes. :slightly_smiling:

Rgs,
Christian

Bonjour,

Ce que tu cherche à faire dans ta boucle for n’est pas clair.

Que cherche tu as faire exemple dans cette boucle ?

He beh non. J’obtiens seulement ceci :

  • Check resolution Domain Name du serveur indiqué dans le ntp.conf

-> Choisissez le login :

Bref, j’ai rien. :s

Ok, initialement, je voulais lister les lignes “server”, isoler les serveurs ntp et checker la résolution de ces machines, l’idée étant de lancer un script qui à terme fait un ensemble de test afin de gagner du temps (celui là n’étant qu’un test parmi d’autres).

la ligne “for i in cat /etc/ntp.conf ; do ls “$i” ; done” je l’ai écrite pour essayer d’isoler la raison du problème qui est : pourquoi la ligne ne fonctionne pas. Du coup, j’ai écrit une ligne simple qui, en fait, devrait être celle-ci :

for i in cat /etc/ntp.conf ; do echo “$i” ; done

(echo à la place de ls, c’est mieux, quoi qu’il en soit)

Une ligne qui fonctionne dans le bash, sur la machine, mais qui, à distance, semble poser des problèmes que je ne parviens pas à clairement situer.

Au final, l’idée serait d’avoir un truc dans ce genre là :

for i in cat /etc/ntp.conf ; do echo “$i” | grep ntp- ; done à l’intérieur d’un autre code qui lancera un dig sur le résultat listé. En soit, directement sur la machine, c’est relativement simple, et je me débrouillerais bien mais à distance… c’est un peu plus complexe, apparemment.

(j’espère être clair)

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 :slightly_smiling:

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. :slightly_smiling:

Il n'y aurait pas un problème de guillemets ici ?

Il n’y aurait pas un problème de guillemets ici ?

:slightly_smiling:
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. :slightly_smiling:

[quote=“sonador”]:slight_smile:
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. :slightly_smiling:[/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”]:slight_smile:
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. :slightly_smiling:[/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…