Connexion à 1 liste de routeurs via ssh (kornshell)

rubiks08 Messages postés 1 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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