La deposizione delle uova interattiva sessione telnet da uno script di shell

StackOverflow https://stackoverflow.com/questions/100829

  •  01-07-2019
  •  | 
  •  

Domanda

Sto cercando di scrivere uno script che mi permetta di accedere a un server console 48 porte, in modo che io possa determinare rapidamente quali dispositivi sono connessi a ciascuna linea seriale.

Essenzialmente vorrei essere in grado di avere un programma che, dato un elenco di host/porte, telnets il primo dispositivo nell'elenco e mi lascia in modalità interattiva, in modo che io possa accedere e confermare il dispositivo, poi quando chiudo la sessione telnet, si connette alla sessione successiva nell'elenco.

Il problema che sto affrontando è che se avvio una sessione telnet dall'interno di un file eseguibile bash script, la sessione termina immediatamente, piuttosto che in attesa di input.

Per esempio, dato il seguente codice:

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

while read line
do
        telnet $line
done
$

Quando eseguo il comando 'echo "nome host" | testscript.sh' ho visualizzato il seguente output:

$ echo "testhost" | ./telnetTest.sh
Trying 192.168.1.1...
Connected to testhost (192.168.1.1).
Escape character is '^]'.
Connection closed by foreign host.
$

Qualcuno conosce un modo per interrompere la sessione di telnet viene chiuso automaticamente?

È stato utile?

Soluzione

È necessario reindirizzare il Terminale di ingresso per la telnet processo.Questo dovrebbe essere /dev/tty.Quindi il tuo script sarà simile a:

#!/bin/bash

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

Altri suggerimenti

Penso che si dovrebbe guardare aspettiamo programma.È presente in tutte le moderne distribuzioni linux.Ecco qualche esempio di script:

#!/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 comando start programma di accesso remoto (telnet, ssh, netcat, ecc)

expext comando utilizzato per...hm..si aspettano qualcosa da sessione remota

inviare - invio di comandi

send_user - per stampare i commenti su stdout

Grazie Dave, era la TTY reindirizzamento che mi mancava.

La soluzione completa che ho usato, per coloro che sono interessati:

#!/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 Server utilizzando l'Esempio di Script di Shell:

Test3.sh File:

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

Il Call_Telenet.sh lo script è il seguente:

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

Eseguire il file di cui sopra come segue:

$> ./test3.sh 

Forse si potrebbe provare con bash -ho per forza la sessione in modalità interattiva.

Il problema nel tuo esempio è che si collega l'ingresso del tuo script (e, indirettamente, di telnet) per l'uscita del echo.Così, dopo echo è fatto e telnet è iniziato, non c'è più input per leggere.Una soluzione semplice potrebbe essere quella di sostituire echo "testhost" da { echo "testhost"; cat; }.

Edit: telnet non sembra come prendere input da un tubo.Tuttavia, netcat non e, probabilmente, è adatto in questo caso.

@muz Ho un impostazione con ssh, telnet non, quindi non posso testare se il tuo problema è telnet, ma, eseguire lo script seguente registri me successivamente per le diverse macchine chiede una password.

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

Se l'ambiente è X11-base, una possibilità è aprire un terminale in esecuzione telnet:

xterm -e telnet $host $port

Le operazioni di xterm sono interattivi e script di shell è fermato fino a un xterm di terminazione.

Prova questi link.

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

Hanno lavorato per me :D

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top