Script connexion SSH un peu complexe

Fermé
JM - 25 mai 2012 à 18:11
jivef Messages postés 927 Date d'inscription mercredi 11 août 2004 Statut Membre Dernière intervention 12 novembre 2020 - 18 juin 2012 à 05:34
Bonjour tout le monde,

Je cherche à écrire un script qui me permette de faire deux choses :
- premièrement me connecter en SSH sur un linux distant et exécuter des commandes
- sauvegarder sur ma machine locale une partie des logs de cette connexion (je m'explique plus bas).

La première partie : pas de soucis, voici mon code :
#!/usr/bin/expect -f

set force_conservative 1;

spawn ssh 192.168.0.1

set timeout 2

expect "login:\r"
send -- "admin\r"

expect "password :\r"
send -- "admin\r"

expect "prompt:\r"
send -- "set ip\r"

interact


Donc dans ce code, je me connecte bien sur mon équipement et je rentre bien - avec succès - la commande "set ip". Cool.

Maintenant, j'aimerais qu'en fonction du texte contenu dans le retour de cette commande, je le stock ou non dans un fichier texte sur mon unix.
Et je n'y arrive pas du tout. Auriez vous une idée pour moi ? Merci,

A voir également:

6 réponses

dubcek Messages postés 18724 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 15 mai 2024 5 615
30 mai 2012 à 11:04
hello
essayer
ssh host  <<EOF >log 2>&1
$(seq -f "tuto%g" 1 50)
EOF
2
jivef Messages postés 927 Date d'inscription mercredi 11 août 2004 Statut Membre Dernière intervention 12 novembre 2020 306
Modifié par jivef le 18/06/2012 à 05:39
Belle solution,
Peu courante mais très élégante.

Bravo. Je "plusse" ta réponse.

Je ne me souviens pas qu'on m'ait déjà parlé du double redirecteur en entrée.
Bien vu, j'ai encore appris un truc...
Merci dubcek.
0
jivef Messages postés 927 Date d'inscription mercredi 11 août 2004 Statut Membre Dernière intervention 12 novembre 2020 306
26 mai 2012 à 05:41
Bonjour,

- Première chose, tu utilises pour te connecter un mot de passe en clair...
Ce n'est pas propre.
Si tu le peux, privilégie une clé RSA...

- Tu veux une réaction précise en fonction du code retour de la commande précédente.
Et bien tu dois utiliser la commande "test" qui peut s'écrire "[ " en syntaxe simplifiée.
Le code retour de la commande précédente est toujours dans la variable $?

Par exemple :
$ls
000.sql 037.sql 074.sql 111.sql 148.sql 185.sql 222.sql
001.sql 038.sql 075.sql 112.sql 149.sql 186.sql 223.sql
002.sql 039.sql 076.sql 113.sql 150.sql 187.sql 224.sql
003.sql 040.sql 077.sql 114.sql 151.sql 188.sql 225.sql

$echo $?
0

Le code retour est ici 0.
Si je cherche un fichier inexistant voici ce que j'aurai :
$ ls toto
ls: impossible d'accéder à toto: No such file or directory

$ echo $?
2

Le code 0 signifie que la commande s'est bien passée, les autres indiquent une erreur quelle qu'elle soit.
A toi de voir quel code retourne ta commande.
Si c'est un script tu peux jouer sur les codes retour avec la commande exit suivi d'un numéro.

Ensuite, tu intégres le code retour dans un test conditionnel avec if.

if [ "$?" -eq "0" ]
then
echo "La commande a marche"
else
echo "la commande a grossierement foire"
fi

A bientôt.
Jonas.


0
Merci Jonas pour ton retour.

Je vais aller tester tout ça.

Est ce que tu connais une variable qui contient la chaine de caractère renvoyer par le serveur. C'est à dire dans ton exemple :

$ ls toto
ls: impossible d'accéder à toto: No such file or directory

avoir une variable qui contient "ls: impossible d'accéder à toto: No such file or directory"

Merci pour vos réponses !!
0
jivef Messages postés 927 Date d'inscription mercredi 11 août 2004 Statut Membre Dernière intervention 12 novembre 2020 306
26 mai 2012 à 21:55
Bonjour,
Tu ne m'as pas compris...
Tu n'as pas besoin de ça, tu as seulement besoin du code retour...

Un programme peut avoir différents codes retour alors que d'une version à l'autre le message d'erreur sera différent, les codes retours seront toujours les mêmes.
Celui qui indique la réussite complète est toujours 0, ensuite il y a des niveaux d'erreur.

Dans un script tu peux aussi jouer sur les niveaux d'erreur.
Ainsi, dans le cas de l'échec d'une fonction tu peux faire exit suvi d'un numéro entre 0 et 9.

Ensuite, tu récupère le code erreur de ton script.

Pour avoir les codes retour d'une commande, utilise le manuel.

Les codes retours sont détaillés.

A plus.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour,

Mais mon problème dans l'histoire c'est qu'une fois que mon script est lancé sur le serveur SSH distant, toutes les commandes que je vais rentrer sont exécutés sur le serveur distant.

Hors j'aimerais pouvoir lancer certaines commandes sur mon mac et d'autres sur le serveur distant et rapatrié ces réponses sur mon mac dans un fichier.

Exemple :
j'ai les commandes suivantes à éxécuter :
tutu1
tutu2
tutu3
...
tutu50

Au lieu de les taper une à une, j'aimerais avoir une boucle avec une variable allant de 1 à 50 qui permet de lancer successivement les différentes commandes. Et ce qui sera retourner par le serveur distant suite à la saisie de ces commandes doit pouvoir être enregistré sur mon mac (mon mac étant la machine depuis laquelle le script est lancé) dans un fichier texte.

Merci pour votre aide,

Bonne journée
0
jivef Messages postés 927 Date d'inscription mercredi 11 août 2004 Statut Membre Dernière intervention 12 novembre 2020 306
30 mai 2012 à 10:41
Bonjour,
Pour générer un suite de 1 à 50, utilise "seq"
$ seq 1 5
1
2
3
4
5
$

Imagine le résultat si tu utilises de 1 à 50.
Soit une commande tutu ayant 50 déclinaisons de tutu1 à tutu50 :
$for i in $(seq 1 50)
do
tutu$i
done

Si jamais tu as besoins de faire de tutu01 à tutu50, il suffit de rajouter l'option -w à la commande seq.
$ seq -w 1 10
01
02
03
04
05
06
07
08
09
10

Pour ce qui est de récupérer les fichiers sur ta machine, il faut qu'à la fin de ton script tu lances une commande scp qui va récupérer toutes les logs.
Je ne vois pas où est le problème.
0