Frage

Ich versuche, ein Skript zu schreiben, mir zu erlauben, 48 Ports an einen Konsolenserver anmelden, damit ich schnell feststellen können, welche Geräte an jede serielle Leitung verbunden sind.

Im Grunde möchte ich in der Lage sein, ein Skript zu haben, die eine Liste von Hosts / Ports gegeben, telnets an das erste Gerät in der Liste, und mich im interaktiven Modus verlässt, so dass ich mich einloggen kann und das Gerät bestätigen, dann, wenn ich schließe die Telnet-Sitzung, eine Verbindung zu der nächsten Sitzung in der Liste.

Das Problem, das ich mit Blick auf bin, ist, dass, wenn ich eine Telnet-Sitzung innerhalb eines ausführbaren Bash-Skript starten, beendet die Sitzung sofort, anstatt auf einer Eingabe wartet.

Zum Beispiel mit dem folgenden Code:

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

while read line
do
        telnet $line
done
$

Wenn ich den Befehl ‚echo‚Hostnamen‘| testscript.sh‘Ich erhalte die folgende Ausgabe:

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

Kennt jemand eine Möglichkeit, um die Telnet-Sitzung wird geschlossen automatisch zu stoppen?

War es hilfreich?

Lösung

Sie müssen den Terminal-Eingang an den telnet Prozess umzuleiten. Dies sollte /dev/tty. Also Ihr Skript so etwas wie aussehen:

#!/bin/bash

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

Andere Tipps

Ich glaube, Sie auf erwarten Programm aussehen sollte. It`s in allen modernen Linux-Distributionen. Hier einige exmaple Skript:

#!/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 Befehl Remote-Login-Programm starten (Telnet, SSH, netcat etc)

expext Befehl verwendet, um ... hm .. etwas von Remote-Sitzung erwarten

Senden - Senden von Befehlen

send_user - Kommentare zu stdout drucken

Danke Dave - es war die TTY-Umleitung, die ich fehlte

.

Die komplette Lösung, die ich verwenden, für diejenigen, die interessiert sind:

#!/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-Server unter Verwendung von Shell Script Beispiel:

Test3.sh Datei:

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

Das Call_Telenet.sh Skript ist wie folgt:

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

Führen Sie die obige Datei wie folgt:

$> ./test3.sh 

Vielleicht könnten Sie bash -i versuchen, die Sitzung zu zwingen, im interaktiven Modus zu sein.

Das Problem in Ihrem Beispiel ist, dass Sie die Eingabe der Skripts verknüpfen (und indirekt von telnet) mit dem Ausgang der echo. So nach echo getan wird und telnet gestartet wird, gibt es nicht mehr Eingang zu lesen. Eine einfache Lösung könnte sein, echo "testhost" durch { echo "testhost"; cat; } zu ersetzen.

Edit: telnet scheint nicht eingegeben wie aus einem Rohr nehmen. Allerdings netcat tut und ist wahrscheinlich nur geeignet in diesem Fall.

@muz Ich habe eine Einstellung mit ssh, ohne Telnet, also kann ich nicht testen, ob Ihr Problem Telnet verwendet ist, aber das folgende Skript ausgeführt werden protokolliert mich nacheinander auf die verschiedenen Maschinen nach einem Passwort gefragt.

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

Wenn Ihre Umgebung ist X11-basiert, die Möglichkeit besteht, ein xterm mit Telnet zu öffnen:

xterm -e telnet $host $port

Operationen in xterm sind interaktiv und Shell-Skript, bis xterm Beendigung gestoppt.

diese Links Versuchen.

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

http://www.unix.com/ Unix-Attrappen-Fragen-Antworten / 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

Sie arbeiten für mich: D

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top