bash - not - Engendrando una sesión interactiva de telnet desde un script de shell
telnet linux ejemplo (9)
@muz Tengo una configuración con ssh, no telnet, por lo que no puedo probar si su problema está relacionado con telnet, pero al ejecutar el siguiente script me conecto sucesivamente a las diferentes máquinas que piden una contraseña.
for i in adele betty
do
ssh all@$i
done
Intento escribir una secuencia de comandos que me permita iniciar sesión en los puertos de los servidores de la consola 48 para que pueda determinar rápidamente qué dispositivos están conectados a cada línea serie.
Básicamente, quiero poder tener una secuencia de comandos que, dada una lista de hosts / puertos, telnet para el primer dispositivo en la lista y me deje en modo interactivo para que pueda iniciar sesión y confirmar el dispositivo, luego cuando cierro el sesión de telnet, se conecta a la próxima sesión en la lista.
El problema al que me enfrento es que si comienzo una sesión de telnet desde un script bash ejecutable, la sesión finaliza inmediatamente, en lugar de esperar la entrada.
Por ejemplo, dado el siguiente código:
$ cat ./telnetTest.sh
#!/bin/bash
while read line
do
telnet $line
done
$
Cuando ejecuto el comando ''echo'' nombre de host "| testscript.sh ''Recibo el siguiente resultado:
$ echo "testhost" | ./telnetTest.sh
Trying 192.168.1.1...
Connected to testhost (192.168.1.1).
Escape character is ''^]''.
Connection closed by foreign host.
$
¿Alguien sabe de una forma de detener la sesión de telnet que se cierra automáticamente?
Creo que deberías mirar el programa esperado . Está presente en todas las distribuciones modernas de Linux. Aquí hay algunos guiones exmaple:
#!/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"
el comando spawn inicia el programa de inicio de sesión remoto (telnet, ssh, netcat, etc.)
comando expext usado para ... hm ... esperar algo de la sesión remota
enviar - enviar comandos
send_user - para imprimir comentarios a stdout
El problema en su ejemplo es que vincula la entrada de su script (e indirectamente de telnet
) a la salida del echo
. Entonces, después de que echo
y telnet
se inicia, ya no hay más entradas para leer. Una solución simple podría ser reemplazar echo "testhost"
por { echo "testhost"; cat; }
{ echo "testhost"; cat; }
{ echo "testhost"; cat; }
.
Editar: a telnet
no parece gustarle tomar entrada de una tubería. Sin embargo, netcat
hace y probablemente solo sea adecuado en este caso.
Gracias Dave: era la redirección de TTY que me estaba perdiendo.
La solución completa que utilicé, para aquellos que estén interesados:
#!/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
Necesita redirigir la entrada del terminal al proceso telnet
. Esto debería ser /dev/tty
. Entonces su script se verá algo así como:
#!/bin/bash
for HOST in `cat`
do
echo Connecting to $HOST...
telnet $HOST </dev/tty
done
Tal vez podrías probar bash -i para forzar a la sesión a estar en modo interactivo.
Si su entorno está basado en X11, una posibilidad es abrir un xterm que ejecute telnet:
xterm -e telnet $host $port
Las operaciones en xterm son interactivas y el script de shell se detiene hasta la terminación de xterm.
Telnet al servidor utilizando el ejemplo de script de shell:
Archivo Test3.sh
:
#!/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
El script Call_Telenet.sh
es el siguiente:
#!/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
Ejecute el archivo anterior de la siguiente manera:
$> ./test3.sh
Pruebe estos enlaces.
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
Ellos trabajaron para mí: D