Pergunta

Eu estou tentando escrever um script para permitir que eu faça o login para um servidores de console 48 portas para que eu possa determinar rapidamente quais dispositivos estão conectados a cada linha serial.

Basicamente eu quero ser capaz de ter um script que, dada uma lista de hosts / portas, telnets para o primeiro dispositivo na lista e me deixa em modo interativo para que eu possa entrar e confirmar o dispositivo, em seguida, quando eu fechar a sessão telnet, conecta-se a próxima sessão na lista.

O problema que estou enfrentando é que, se eu iniciar uma sessão de telnet de dentro de um script bash executável, a sessão termine imediatamente, ao invés de esperar para entrada.

Por exemplo, dado o seguinte código:

$ cat ./telnetTest.sh
#!/bin/bash

while read line
do
        telnet $line
done
$

Quando eu executo o comando 'echo "hostname" | testscript.sh' eu recebo o seguinte 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.
$

Alguém sabe de uma maneira de parar a sessão de telnet sendo encerrada automaticamente?

Foi útil?

Solução

Você precisa redirecionar a entrada Terminal para o processo telnet. Este deve ser /dev/tty. Então, seu script será algo parecido com:

#!/bin/bash

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

Outras dicas

Eu acho que você deve olhar para esperar programa. It`s presente em todas as distribuições Linux modernas. Aqui está algum script 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"

desovar comando iniciar programa remoto login (telnet, ssh, netcat etc)

expext comando usado para ... hm .. esperar algo de sessão remota

Enviar - envio de comandos

send_user - para imprimir comentários na saída padrão

Graças Dave - era o redirecionamento TTY que eu estava faltando

.

A solução completa que eu usei, para aqueles que estão interessados:

#!/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 ao servidor utilizando Shell Script Exemplo:

Test3.sh arquivo:

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

O script Call_Telenet.sh é o seguinte:

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

Execute o arquivo acima da seguinte forma:

$> ./test3.sh 

Talvez você poderia tentar o bash -i para forçar a sessão para estar no modo interativo.

O problema no seu exemplo é que você ligar a entrada do seu script (e, indiretamente, da telnet) para a saída do echo. Então, depois de echo é feito e telnet é iniciado, não há mais entrada para ler. A simples correção poderia ser substituir echo "testhost" por { echo "testhost"; cat; }.

Edit: telnet não parece como a tomada de entrada de um pipe. No entanto, netcat faz e é provavelmente apenas adequado neste caso.

@muz Eu tenho uma definição com ssh, telnet não, então eu não posso testar se o seu problema é telnet relacionados, mas executando os seguintes registros de script me sucessivamente para as diferentes máquinas pedindo uma senha.

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

Se o seu ambiente se baseia-X11, uma possibilidade é abrir uma telnet xterm executando:

xterm -e telnet $host $port

Operações em xterm são script interativo e shell é interrompida até o término xterm.

Tente estas ligações.

http://planetozh.com/blog/2004/02/telnet-script /

http://www.unix.com/ unix-manequins-perguntas-respostas / 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

Eles trabalharam para mim: D

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top