2008-09-19 12 views
11

Estoy intentando escribir un script para permitirme iniciar sesión en los puertos de un servidor de consola de modo que pueda determinar rápidamente qué dispositivos están conectados a cada línea serie.Reproducción de una sesión interactiva de telnet desde un script de shell

Esencialmente, quiero poder tener un script 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 la sesión de telnet, me conecto a la siguiente sesión de la lista.

El problema al que me enfrento es que si inicio 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 "hostname" | 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?

Respuesta

7

Necesita redireccionar la entrada del terminal al proceso telnet. Esto debería ser /dev/tty. Así que la secuencia de comandos se verá algo como:

#!/bin/bash 

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

Quizás podría probar bash -i para forzar la sesión a estar en modo interactivo.

5

Creo que deberías mirar esperar el programa. Está presente en todas las distribuciones modernas de Linux. Aquí es una secuencia de comandos 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" 

desove inicia comando de programa remoto de inicio de sesión (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 comentarios en stdout

0

El problema en su ejemplo es que vincula la entrada de su script (e indirectamente de telnet) a la salida del echo. Por lo tanto, después de que se haya iniciado echo y se haya iniciado telnet, no hay más entradas para leer. Una solución simple podría ser reemplazar echo "testhost" por { echo "testhost"; cat; }.

Editar: telnet Parece que no le gusta tomar la entrada de un tubo. Sin embargo, netcat hace y probablemente solo sea adecuado en este caso.

0

@muz tengo un entorno con ssh, telnet no, así que no se puede probar si su problema está relacionado telnet, pero ejecutando el siguiente guión me registra sucesivamente a las diferentes máquinas pidiendo una contraseña.

for i in adele betty 
do 
ssh [email protected]$i 
done 
1

Gracias Dave - era la redirección de TTY que me faltaba.

La solución completa que usé, 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 
1

Telnet al servidor usando shell script de ejemplo:

Test3.sh del 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 guión Call_Telenet.sh es tan sigue:

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

Si se basa X11-su entorno, una posibilidad es abrir un telnet funcionando xterm:

xterm -e telnet $host $port 

Operaciones en xterm son interactivos y shell script se detiene hasta la terminación xterm.

Cuestiones relacionadas