El desove interactiva sesión de telnet desde un script de shell
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?
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