Génération d'une session Telnet interactive à partir d'un script shell

StackOverflow https://stackoverflow.com/questions/100829

  •  01-07-2019
  •  | 
  •  

Question

J'essaie d'écrire un script pour me permettre de me connecter à une console de serveurs sur 48 ports afin de pouvoir déterminer rapidement les périphériques connectés à chaque ligne série.

Je souhaite essentiellement pouvoir disposer d'un script qui, avec une liste d'hôtes / ports, connecte le premier réseau de la connexion au premier périphérique de la liste et me laisse en mode interactif pour pouvoir me connecter et confirmer le périphérique, puis Je ferme la session telnet et me connecte à la prochaine session de la liste.

Le problème auquel je suis confronté est que si je démarre une session telnet à partir d'un script bash exécutable, la session se termine immédiatement, plutôt que d'attendre une entrée.

Par exemple, à l'aide du code suivant:

$ cat ./telnetTest.sh
#!/bin/bash

while read line
do
        telnet $line
done
$

Lorsque j'exécute la commande 'echo " nomhôte " | testscript.sh 'Je reçois le résultat suivant:

$ echo "testhost" | ./telnetTest.sh
Trying 192.168.1.1...
Connected to testhost (192.168.1.1).
Escape character is '^]'.
Connection closed by foreign host.
$

Quelqu'un sait-il qu'il existe un moyen d'empêcher la fermeture automatique de la session telnet?

Était-ce utile?

La solution

Vous devez rediriger l'entrée Terminal vers le processus telnet . Ce devrait être / dev / tty . Donc, votre script ressemblera à quelque chose comme:

#!/bin/bash

for HOST in `cat`
do
  echo Connecting to $HOST...
  telnet $HOST </dev/tty
done

Autres conseils

Je pense que vous devriez regarder le programme expect . Il est présent dans toutes les distributions linux modernes. Voici un exemple de script:

#!/usr/bin/expect -f
spawn telnet $host_name
expect {
   "T0>"                {}
   -re "Connection refused|No route to host|Invalid argument|lookup failure"
                        {send_user "\r******* connection error, bye.\n";exit}
   default              {send_user "\r******* connection error (telnet timeout),
 bye.\n";exit}
}
send "command\n"
expect -timeout 1 "something"
La commande

spawn démarre le programme de connexion à distance (telnet, ssh, netcat, etc.)

La commande

expext était utilisée pour ... hm .. attendre quelque chose de la session distante

envoyer : envoi de commandes

send_user : pour imprimer des commentaires sur la sortie standard

Merci Dave - c’était la redirection du téléscripteur qui me manquait.

La solution complète que j'ai utilisée, pour ceux qui sont intéressés:

#!/bin/bash

TTY=`tty` # Find out what tty we have been invoked from.
for i in `cat hostnames.csv` # List of hosts/ports
do
        # Separate port/host into separate variables
        host=`echo $i | awk -F, '{ print $1 }'`
        port=`echo $i | awk -F, '{ print $2 }'`
        telnet $host $port < $TTY # Connect to the current device
done

Telnet sur serveur à l'aide d'un exemple de script shell:

Test3.sh Fichier:

#!/bin/sh

#SSG_details is file from which script will read ip adress and uname/password
#to telnet.

SSG_detail=/opt/Telnet/SSG_detail.txt

cat $SSG_detail | while read ssg_det ; do

   ssg_ip=`echo $ssg_det|awk '{print $1}'`
   ssg_user=`echo $ssg_det|awk '{print $2}'`
   ssg_pwd=`echo $ssg_det|awk '{print $3}'`


   echo " IP to telnet:" $ssg_ip
   echo " ssg_user:" $ssg_user
   echo " ssg_pwd:" $ssg_pwd

   sh /opt/Telnet/Call_Telenet.sh $ssg_ip $ssg_user $ssg_pwd 

done


exit 0

Le script Call_Telenet.sh est le suivant:

#!/bin/sh

DELAY=1 
COMM1='config t'                 #/* 1st commands to be run*/
COMM2='show run'
COMM3=''
COMM4=''
COMM5='exit'
COMM6='wr'
COMM7='ssg service-cache refresh all'
COMM8='exit'                     #/* 8th command to be run */


telnet $1 >> $logfile 2>> $logfile |&
sleep $DELAY
echo -p $2 >> $logfile 2>> $logfile
sleep $DELAY
echo -p $3 >> $logfile 2>> $logfile
sleep $DELAY
echo -p $4 >> $logfile 2>> $logfile
sleep $DELAY
echo -p $5 >> $logfile 2>> $logfile
sleep $DELAY

sleep $DELAY
sleep $DELAY
sleep $DELAY
echo -p $COMM7 >> $logfile 2>> $logfile
sleep $DELAY
echo -p $COMM8 >> $logfile 2>> $logfile
sleep $DELAY

exit 0

Exécutez le fichier ci-dessus comme suit:

<*>gt; ./test3.sh 

Peut-être pourriez-vous essayer bash -i pour forcer la session à être en mode interactif.

Le problème dans votre exemple est que vous liez l'entrée de votre script (et indirectement de telnet ) à la sortie du echo . Ainsi, une fois que echo est terminé et que telnet est démarré, il n'y a plus d'entrée à lire. Une solution simple pourrait consister à remplacer echo "testhost" par {echo "testhost" ;; chat; } .

Édition: telnet ne semble pas aimer recevoir des données d'un canal. Cependant, netcat convient parfaitement dans ce cas.

@muz J'ai un paramètre avec ssh, pas de telnet, donc je ne peux pas vérifier si votre problème est lié à telnet, mais l'exécution du script suivant me connecte successivement aux différentes machines demandant un mot de passe.

for i in adele betty
do
ssh all@$i
done

Si votre environnement est basé sur X11, vous pouvez éventuellement ouvrir un xterm sous telnet:

xterm -e telnet $host $port

Les opérations dans xterm sont interactives et le script shell est arrêté jusqu'à la fin de xterm.

Essayez ces liens.

http://planetozh.com/blog/2004/02/telnet-script /

http://www.unix.com/ unix-dummies-questions-answers / 193-telnet-script.html

#!/bin/sh
( echo open hostname
sleep 5
echo username
sleep 1
echo password
sleep 1
echo some more output, etc. ) | telnet

Ils ont travaillé pour moi: D

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top