Connexion à 1 liste de routeurs via ssh (kornshell)

Fermé
rubiks08 Messages postés 1 Date d'inscription mercredi 14 octobre 2020 Statut Membre Dernière intervention 14 octobre 2020 - Modifié le 14 oct. 2020 à 19:52
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 14 oct. 2020 à 20:00
Bonjour,

N'étant pas un aficionados de script, je sollicite votre aide. J'ai régulièrement besoin pour mon travail de me connecter à une liste de routeurs, différente selon les jours, et de leur envoyer des commandes de vérification suite à des Travaux programmés par Orange.

J'ai récupéré un script déjà existant, mais qui fonctionnait en demandant l'IP du routeur à l'utilisateur du script, puis en lisait le résultat.

J'aimerais faire la même chose sans avoir à fournir l'IP du routeur à chaque fois, c'est-à-dire en utilisant une liste d'IPs listées dans un fichier texte, si possible sans retaper mon nom et mon mot de passe plusieurs fois. Il faut prendre en compte que je ne serais pas le seul utilisateur à utiliser ce script, et que les comptes et mot de passe sont différents selon les utilisateurs.

Pouvez-vous prendre un peu de votre temps pour m'aider s'il vous plaît?

Voici le script existant :

#!/bin/ksh

echo quel est votre login
read nom
echo "Bonjour $nom"
if [ "$nom" = "" ]
then
        echo "Precisez un nom d'utilisateur valide  !"
exit
fi
echo "preciser mot de passe"
read pass
if [ "$pass" = "" ]
#!/bin/ksh

echo quel est votre login
read nom
echo "Bonjour $nom"
if [ "$nom" = "" ]
then
        echo "Precisez un nom d'utilisateur valide  !"
exit
fi
echo "preciser mot de passe"
read pass
if [ "$pass" = "" ]
then
        echo "password non valide  !"
exit
fi         
 
echo "quel est l'IP du routeur X"
read X
echo "$X"
if [ "$X" = "" ]
then
        echo "Precisez une IP valide !" 
exit
fi
echo "quel est l'IP du routeur Y" 
read Y
if [ "$Y" = "" ]
then
        echo "Precisez une IP valide !"
exit
fi

echo "debut du script, merci de patienter..."

VAR=$(expect -c "
send_user \"=========================== debut routeur X =========================== \"
spawn ssh -l $nom@site.com -p 3007 $X
expect \"yes\" { 
        send \"yes \n\" }
        expect \"Password: \" {
                send \"$pass\r\"}
                expect \"#\"    
                send \"term len 0\n\"
                expect \"#\"
                send \"sh ip int brief\n\"
                expect \"#\"
                send \"sh ip bgp summary\n\"
                expect \"#\"
                send \"sh vrrp brief\n\"
                expect \"#\"
                send \"sh track\n\"
                expect \"#\"
                send \"sh policy-map interface brief\n\"
                expect \"#\"
                send \"exit\n\"
                expect \"#\"


send_user \"=========================== debut routeur Y =========================== \"
spawn ssh -l $nom@site.com -p 3007 $Y
expect \"yes\" { 
        send \"yes \n\" }
                expect \"Password: \" {
                send \"$pass\r\"}
                expect \"#\"    
                send \"term len 0\n\"
                expect \"#\"
                send \"show ip route static\n\"
                expect \"#\"
                send \"sh ip int brief\n\"
                expect \"#\"
                send \"sh ip bgp summary\n\"
                expect \"#\"
                send \"sh vrrp brief\n\"
                expect \"#\"
                send \"sh track\n\"
                expect \"#\"
                send \"sh policy-map interface brief\n\"
                expect \"#\"
                send \"exit\n\"
                expect \"#\"
                
                
")
echo "$VAR"
echo "$VAR" > result_rt
echo "pour revoir les resultats, faire more result_rt"


J'ai essayé de le modifier comme ci dessous mais j'ai cette erreur qui apparait :

line 2: syntax error at line 30: `(' unexpected


#!/bin/ksh
files="/script/MER/routeurs/liste-routeurs"
for $f in $files; do
echo quel est votre login
read nom
echo "Bonjour $nom"
if [ "$nom" = "" ]
then
        echo "Precisez un nom d'utilisateur valide  !"
exit
fi
echo "preciser mot de passe"
read pass
if [ "$pass" = "" ]
then
        echo "password non valide  !"
exit
fi

echo "$f"
read "$f"
if [ "$f" = "" ]
then
        echo "Precisez une IP valide !"
exit
fi

echo "debut du script, merci de patienter..."

VAR=$f(expect -c "
send_user \"=========================== debut routeur $f =========================== \"
spawn ssh -l $nom@site.com -p 3007 $x
expect \"yes\" { 
        send \"yes \n\" }
        expect \"Password: \" {
                send \"$pass\r\"}
                expect \"#\"    
                send \"term len 0\n\"
                send \"sh vrrp brief\n\"
                expect \"#\"
                send \"exit\n\"
                expect \"#\"

")
echo "$VAR"
echo "$VAR" > result_rt
echo "pour revoir les resultats, faire more result_rt"

2 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
14 oct. 2020 à 11:23
Salut,

Un peu d'aide dans la FAQ de CCM : Comment lire un fichier ligne par ligne

0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
14 oct. 2020 à 20:00
Bonjour,

L'idéal serait d'utiliser :
  • parallel-ssh
    pour exécuter une commande arbitraire sur un ensemble de machine (selon un fichier qui liste les login@machine vers lesquels se connecter)
  • une clé ssh (une clé par utilisateur) pour t'affranchir des problématiques d'authentification (il faut que chaque utilisateur crée sa propre clé ssh avec
    ssh-keygen
    , l'upload sur les machines distances avec
    ssh-copy-id
    ; ceci fait, il suffira que l'utilisateur lance
    ssh-add
    pour activer une authentification ssh transparente


Concernant les commandes à lancer sur le script : l'idéal serait de mettre sur chaque machine script qui va lancer le diagnostic (e.g. les commandes
sh ip route static
) e.g. dans
/usr/local/bin/diagnostic.sh
qu'il suffira ensuite d'invoquer via
parallel-ssh
.

Si tu ne peux pas stocker de fichier sur la machine distante, tu devras rester sur le genre de script que tu as.

Bonne chance
0