via script not found ejemplo and bash telnet

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