Testen Sie, ob der Telnet-Port in einem Shell-Skript aktiv ist


10

Ich versuche ein Skript zu erstellen, um zu testen, ob es möglich ist, sich über Telnet anzumelden. Ich möchte mich nicht wirklich einloggen. Erwarten ist daher nicht erforderlich. Ich möchte nur sehen, ob ich eine Anmeldeaufforderung erhalten kann. Dies wird von einem Linux-System aus durchgeführt, daher habe ich versucht, Folgendes zu verwenden nc:

nc 192.168.10.5 23 -w 1 | grep -q login 
if [ $? -eq 1 ]
then
    echo "console is down"
fi

Das Problem ist, dass meine Konsole dadurch abstürzt. Es scheint -w, als würde die Verbindung nicht wirklich unterbrochen.

Ich habe auch versucht, Telnet zu verwenden, aber ich kann die Verbindung innerhalb des Skripts nicht trennen. Ich versuche es

\echo "\035" | telnet 192.168.10.5

pausiert, bevor ich eine Anmeldeaufforderung erhalte.


Antworten:


14

Bash bietet Pseudogeräte, mit denen Sie wahrscheinlich vertraut sind, wie z /dev/null. Es gibt jedoch auch andere Geräte wie /dev/tcpund /dev/udpzum Testen von Netzwerkverbindungen, die Sie auch in Bash-Skripten verwenden können.

Auszug aus Bashs Manpage

Bash behandelt mehrere Dateinamen speziell, wenn sie in Umleitungen verwendet werden, wie in der folgenden Tabelle beschrieben:

          /dev/fd/fd
                 If fd is a valid integer, file descriptor fd is duplicated.
          /dev/stdin
                 File descriptor 0 is duplicated.
          /dev/stdout
                 File descriptor 1 is duplicated.
          /dev/stderr
                 File descriptor 2 is duplicated.
          /dev/tcp/host/port
                If  host  is a valid hostname or Internet address, and port 
                is an integer port number or service name, bash attempts to 
                open a TCP connection to the corresponding socket.
          /dev/udp/host/port
                If host is a valid hostname or Internet address, and port 
                is an integer port number or service name, bash attempts to 
                open a  UDP  connection to the corresponding socket.

Beispiel

Hier teste ich die Verbindung zu einem Host in meiner Domain namens skinner und prüfe, ob ich eine Verbindung zu dessen Port 22 herstellen kann.

HINWEIS: Port 22 ist für SSH, für Telnet verwenden Sie Port 23.

$ echo > /dev/tcp/skinner/22 && echo "it's up" || echo "it's down"
it's up

Großartig, also versuchen wir es mit einem Nicht-Port:

$ echo > /dev/tcp/skinner/223 && echo "it's up" || echo "it's down"
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused
it's down

Nun, das funktioniert, aber es ist eine schrecklich hässliche Ausgabe. Keine Sorgen machen. Sie können das echo > /dev/tcp/...in einer Subshell ausführen und die gesamte Ausgabe umleiten, /dev/nullum es ein wenig zu bereinigen. Hier ist das Muster, das Sie in Ihren Shell-Skripten verwenden können:

$ (echo > /dev/tcp/skinner/22) > /dev/null 2>&1 \
    && echo "it's up" || echo "it's down"
it's up

$ (echo > /dev/tcp/skinner/223) > /dev/null 2>&1 \
    && echo "it's up" || echo "it's down"
it's down

Wenn Sie speziell testen möchten telnet, dann läuft das standardmäßig auf Port 23, also wo slm 22 und 223 verwendet hat, verwenden Sie 23.
Warwick

@ Warwick - danke, das habe ich als Hinweis im Beispielabschnitt hinzugefügt.
slm

@sim danke für den Kommentar. Ich habe das schon einmal gesehen, aber ich konnte es nicht dazu bringen, damit zu arbeiten. Mein Problem ist, dass ich in der Lage sein muss, nach einer Anmeldeaufforderung zu suchen oder diese zu testen. In diesem Fall ist die Konsole gesperrt und es erfolgt keine Anmeldeaufforderung. # telnet 192.168.10.5 Trying 192.168.10.5... Connected to 192.168.10.5 (192.168.10.5). Escape character is '^]'. Connection closed by foreign host.
Rleon

# cat < /dev/tcp/192.168.10.12/23 gibt mir eine Login-Eingabeaufforderung, aber ich kann nicht ausbrechen.
Rleon

1
wow .. viel Umleitung dort. # cat afile ^] Nach dem Laufen wird nur die Pause wiederholt afile. Ich spiele immer noch damit, aber ich fühle mich fast da.
Rleon

7

Sie sind auf dem richtigen Weg nc, aber wenn Sie wirklich nur testen möchten, ob Sie die Verbindung herstellen können, verwenden Sie den -zSchalter von nc :

#!/bin/bash
REMOTEHOST=10.11.12.13
REMOTEPORT=1234
TIMEOUT=1

if nc -w $TIMEOUT -z $REMOTEHOST $REMOTEPORT; then
    echo "I was able to connect to ${REMOTEHOST}:${REMOTEPORT}"
else
    echo "Connection to ${REMOTEHOST}:${REMOTEPORT} failed. Exit code from Netcat was ($?)."
fi

Dies funktioniert nicht auf allen Systemen, mein NC hat nicht das -z Flag
Shapeshifter

Interessant. Welche Version von ncist das?
DopeGhoti

Ich bin auf CentOS 7 und nc wurde durch nmap-ncat ersetzt, das diese Option nicht hat :(
Shapeshifter

Wenn ich mich richtig erinnere, ist das Paket, das Sie in CentOS wollen, einfach nc.
DopeGhoti

nc ist nmap-ncat in Centos 7
Shapeshifter

1

Führen Sie nc -z 192.168.10.5 23die Eingabeaufforderung aus oder erstellen Sie ein Bash-Skript, um diesen Befehl auszuführen.

Es gibt die folgende Anweisung zurück, wenn die Verbindung erfolgreich ist.

Verbindung zu 192.168.10.5 23 Port [tcp / *] erfolgreich!


0

Ich weiß, dass die Antwort etwas spät ist, aber ich habe nach Möglichkeiten gesucht, und die Verwendung von nc war aus Sicherheitsgründen keine Option. Hier ist es also, wenn es jemandem helfen kann.

Was in Ihrem anfänglichen Echo fehlte, war der Schalter -e:

   -e     enable interpretation of backslash escapes
   -E     disable interpretation of backslash escapes (default)

Und ein Zeilenumbruch + der Befehl quit, um Telnet nach dem Trennen der Verbindung zu beenden. So wie:

echo -e '\035\nquit' | telnet 10.0.0.1 23 && echo "success" || echo "failed"

Offensichtlich funktioniert das gleiche, wenn Sie einen Blockstil verwenden, wenn Anweisung und $ auswerten? wie du es anfangs getan hast:

echo -e '\035\nquit' | telnet 10.0.0.1 23
if [ $? -eq 1 ]
then
  echo "Console is down."
fi

Während wir dabei sind, hängt es, was nc betrifft, davon ab, welchen Geschmack von nc Sie haben (gnu ncat vs nmap-ncat). Gnu wird den Schalter -z haben:

  -z                         Zero-I/O mode, report connection status only
nc -z 10.0.0.1 23
# (evaluate $? here)

während der andere nicht und du musst eine leere Leitung zu deinem nc leiten, um nicht hängen zu bleiben:

echo | nc 10.0.0.1 23
# (evaluate $? here)
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.