Pregunta

Estoy tratando de escribir un script que me permita ingresar a los servidores de consola de 48 puertos para que yo pueda determinar rápidamente qué dispositivos están conectados a cada línea serie.

Básicamente quiero ser capaz de tener una secuencia de comandos que, dada una lista de hosts/puertos, telnets el primer dispositivo en la lista y me deja en modo interactivo para que yo pueda ingresar y confirmar el dispositivo, a continuación, cuando cierro la sesión de telnet, se conecta a la próxima sesión en la lista.

El problema que estoy enfrentando es que si puedo iniciar una sesión de telnet desde dentro de un ejecutable de un script de bash, la sesión termina inmediatamente, en lugar de esperar a 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' he recibido 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 se cierra automáticamente?

¿Fue útil?

Solución

Debe redirigir a la Terminal de entrada a la telnet proceso.Esto debe ser /dev/tty.Así que el script se verá algo como:

#!/bin/bash

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

Otros consejos

Creo que usted debe buscar en esperar programa.Está presente en todas las distribuciones de linux.He aquí algunos ejemplo de secuencia de comandos:

#!/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"

spawn de comandos de inicio de sesión remotos programa (telnet, ssh, netcat, etc)

expext comando utilizado para...hm..esperar algo de sesión remota

enviar - el envío de comandos

send_user - para imprimir los comentarios a stdout

Gracias Dave - fue el TTY redirección de que me estaba perdiendo.

La solución completa que he usado, 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

Telnet al Servidor utilizando el Shell Script de Ejemplo:

Test3.sh Archivo:

#!/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 Call_Telenet.sh secuencia de comandos es la 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 de la siguiente manera:

$> ./test3.sh 

Tal vez usted podría tratar de bash -puedo forzar que la sesión sea en modo interactivo.

El problema en tu ejemplo es que el enlace de la entrada de tu script (e, indirectamente, de telnet) a la salida de la echo.Así que después de echo se hace y telnet se inicia, no hay más entrada para leer.Una solución simple, podría ser la sustitución de echo "testhost" por { echo "testhost"; cat; }.

Editar: telnet no parece como la toma de entrada de una tubería.Sin embargo, netcat ¿y es, probablemente, sólo es adecuado en este caso.

@muz Tengo un ajuste con ssh, telnet no, así que no puedo probar si el problema es de telnet relacionados, pero la ejecución de la siguiente secuencia de comandos de los registros de mí, sucesivamente, a las diferentes máquinas pide una contraseña.

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

Si su entorno está basada en X11, una posibilidad es abrir un xterm ejecutar telnet:

xterm -e telnet $host $port

Las operaciones en xterm son interactivos y shell script se detiene hasta xterm terminación.

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

Trabajaron para mí :D

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top