Génération d'une session Telnet interactive à partir d'un script shell
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?
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 commandeexpext é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