Testen des Remote-TCP-Ports mithilfe von Telnet durch Ausführen eines einzeiligen Befehls


12

Ich habe zahlreiche Linux-Boxen mit einem sehr begrenzten Satz von Befehlen und Speicherplatz. Aber es hat den telnetBefehl drauf.

Ich verbinde mich (programmgesteuert) per Fernzugriff mit jedem dieser Tests und gebe einen einzeiligen Linux-Befehl über SSH aus.

Ich muss einen einzelnen Befehl ausführen, um über Telnet eine Verbindung zu einem bestimmten Computer herzustellen, und dann sofort die Verbindung trennen .

Ich kann das alles, aber die Trennung sofort Teil. Telnet öffnet eine Art Konsole oder Terminal, und ich kann keinen einzeiligen Befehl finden, um den Telnet-Befehl auszuführen und dann sofort die Verbindung zu trennen.

Wenn ich das mache, kann ich die Textausgabe leicht auf Fehlermeldungen analysieren, weil ich am angegebenen Port keine Verbindung zum Computer herstellen kann, und genau das suche ich.

Wie kann ich also einen einzeiligen Befehl ausführen, um über Telnet eine Verbindung zu einem Computer herzustellen und anschließend die Verbindung zu trennen?


Wie ich verstehe, unterstützt Ihr Telnet-Client das direkte Senden nicht?
IBr

@IBr, was meinst du?
Muhammad Gelbana

Beachten Sie, dass sich Telent-Clients im Exit-Code unterscheiden, der gemeldet wird, nachdem der clientseitige Exit-Befehl zum Beenden verwendet wurde. Der Null-Exit-Code sollte daher nicht als Signal für das Öffnen des Ports betrachtet werden. Funktioniert zumindest nicht für RHEL Telent RPM.
Oliver Gondža

Antworten:


28

Sie sollten in der Lage sein, den exitBefehl in STDIN in zu leiten telnet. Versuchen:

echo 'exit' | telnet {site} {port}

und sehen, ob das funktioniert. (Es scheint auf meinem Webserver zu funktionieren, aber YMMV).


könnte funktionieren, scheint aber dumm zu sein - Telnet sollte eine Option zum Beenden haben oder etwas beim ersten Kontakt
Alexander Mills

10

Die einfachste und einfachste Methode ist unten angegeben.

 sleep <n> | telnet <server> <port>

n - Die Wartezeit in Sekunden vor dem automatischen Beenden. Es könnte ein Bruchteil von 0,5 sein. Beachten Sie, dass einige erforderliche Ausgaben möglicherweise nicht in der angegebenen Wartezeit zurückgegeben werden. Daher müssen wir möglicherweise entsprechend erhöhen.

Server - Die Zielserver-IP oder der Hostname.

Hafen - Zieldienst-Portnummer.

Sie können die Ausgabe auch wie folgt in eine Datei umleiten:

sleep 1 | telnet <server> <port> > output.log

Das funktioniert perfekt! Während die Ausgabe tatsächlich umgeleitet wird, habe ich festgestellt, dass die Verbindung "von einem fremden Host geschlossen" immer noch angezeigt wird. Ausgabe in meiner Konsole nach dem Ruhezustand und nicht in der Datei output.log. Wie kann man das verhindern?
dnLL

5

In meinem Fall funktioniert das. (CentOs7):

while read host port; do
r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi
done

:) Grüße


1
Hey, das ist großartig. Ich bin ein Benutzer auf allen Linux-Systemen in meinem Job, aber nicht der Administrator (und habe keine Administratorrechte). Ich habe es satt, sie ständig zu bitten, Telnet zu installieren, damit ich die Netzwerkkonnektivität testen kann (ich bin ein Netzwerktechniker). Dies ist eine hervorragende Problemumgehung. Ich habe es ein wenig geändert, um mehr wie Telnet zu funktionieren. Ich habe hier meine eigene Antwort mit den Änderungen gegeben.
Theglossy1

3

Ich denke, ein besseres Werkzeug, um Befehle direkt zu senden und nur eine Ausgabe zu erhalten, wäre netcat. Es ist nur ein einfaches, aber leistungsstarkes Tool zum Übertragen von Befehlen über Ports. Sie können ein Verwendungsbeispiel in dieser Superuser-Frage sehen: /superuser/261900/how-can-i-pipe-commands-to-a-netcat-that-will-stay-alive - asker gibt ein funktionierendes Beispiel in welcher Verbindung nach wenigen Sekunden geschlossen wird.

Und wenn Sie nur die Konnektivität testen möchten, verwenden Sie diese: http://terminalinflection.com/use-netcat-not-telnet-to-test-network-connectivity/


Ich versuche gerade, netcat zu installieren, kann dies jedoch nicht. Ich habe eine kompilierte PowerPC-Version heruntergeladen, aber die Glibc-Bibliothek fehlte. Ich habe eine kompilierte PowerPC-Version heruntergeladen, aber das Gerät hatte nicht genügend Speicherplatz, um die Bibliotheksdateien zu kopieren! Ist es möglich, dass die glibc-Bibliothek bereits vorhanden ist, Netcat sie jedoch nicht finden kann?
Muhammad Gelbana

Netcat wird nur auf der Clientseite benötigt: Auf dem Server (Probe) kann es sich um dasselbe einfache alte Telnet handeln.
IBr

Auch Glibc sollte schon existieren, es wird auf vielen Sachen im üblichen System verwendet.
IBr

Sie könnten versuchen, Telnet-Skripten hinzuzufügen, um festzustellen, && exitob die Verbindung getrennt wird (zumindest in ssh ist dies ausreichend).
IBr

&& exithat nicht funktioniert. Wenn glibc existieren sollte und ich glaube es tut. Warum sollte man nc.traditionalsich darüber beschweren, als ob es fehlt?
Muhammad Gelbana

1

Dies ist eine andere Version der obigen Antwort , die es ein wenig mehr wie "normale" Telnet-Syntax verhalten lässt. Wenn Ihnen meine Antwort gefällt, geben Sie bitte eine Gegenstimme nicht dazu, sondern zum Original.

#!/bin/bash
if [ "$2" == "" ]; then
 echo "Syntax: $0 <host> <port>"
 exit;
fi

host=$1
port=$2

r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi

1

Hier ist eine Lösung, die ich im Internet gefunden habe:

( echo open 127.0.0.1 23
sleep 5
echo your_login
sleep 5
echo your_password
sleep 5
echo hostname
sleep 5
echo exit ) | telnet

Es funktioniert für mich unter SunOS & HP-UX


0

Versuchen

echo -e '\x1dclose\x0d' | telnet {HOSTNAME} {PORT}

Das Beste daran ist, dass Sie auch den Exit-Status erhalten. Wenn Telnet erfolgreich ist, ist der Exit-Code 0 oder 1

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.