Laichen eine interaktive Telnet-Sitzung von einem Shell-Skript
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?
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