Testen Sie, ob ein Port auf einem Remote-System erreichbar ist (ohne Telnet)

Früher haben wir telnet verwendet, um zu sehen, ob ein Port auf einem Remote-Host geöffnet war: telnet hostname port würde versuchen, eine Verbindung zu einem beliebigen Port auf einem beliebigen Host herzustellen und Ihnen Zugriff auf den rohen TCP-Stream zu gewähren.

Heutzutage ist auf den Systemen, auf denen ich arbeite, Telnet nicht installiert (aus Sicherheitsgründen), und alle ausgehenden Verbindungen zu allen Hosts sind standardmäßig blockiert. Mit der Zeit verliert man leicht den Überblick, welche Ports für welche Hosts offen sind.

Gibt es eine andere Möglichkeit zu testen, ob ein Port auf einer Fernbedienung system offen ist – mit einem Linux-system mit einer begrenzten Anzahl von Paketen installiert, und telnet nicht verfügbar ist?

Author: Steve HHH, 2013-07-19

14 answers

Bash konnte eine Weile auf die Ports TCP und UDP zugreifen. Von der Manpage:

/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.

Also könntest du so etwas benutzen:

xenon-lornix:~> cat < /dev/tcp/127.0.0.1/22
SSH-2.0-OpenSSH_6.2p2 Debian-6
^C pressed here

Taa Daa!

 332
Author: lornix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2015-07-31 22:04:45

Schön und ausführlich! Von den Manpages.
Single-port:

nc -zv 127.0.0.1 80

Mehrere Ports:

nc -zv 127.0.0.1 22 80 8080

Bereich der Ports:

nc -zv 127.0.0.1 20-30
 462
Author: Subhranath Chunder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-12-03 21:34:41

Netcat ist ein nützliches Werkzeug:

nc 127.0.0.1 123 &> /dev/null; echo $?

Gibt 0 aus, wenn Port 123 geöffnet ist, und 1, wenn er geschlossen ist.

 108
Author: thnee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2015-10-20 18:28:03

Die einfachste Methode, ohne ein anderes Werkzeug wie socat zu verwenden, ist wie in @lornix ' Antwort oben beschrieben. Dies dient nur dazu, ein aktuelles Beispiel dafür hinzuzufügen, wie man das psuedo-device /dev/tcp/... in Bash verwenden würde, wenn Sie beispielsweise testen möchten, ob auf einem anderen Server über die Befehlszeile auf einen bestimmten Port zugegriffen werden kann.

Beispiele

Angenommen, ich habe einen Host in meinem Netzwerk mit dem Namen skinner.

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

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

Der Grund, warum Sie echo > /dev/... in Klammern wie folgt einschließen möchten, (echo > /dev/...) ist denn wenn Sie dies nicht tun, werden bei Tests von Verbindungen, die ausgefallen sind, diese Arten von Nachrichten angezeigt.

$ (echo > /dev/tcp/skinner/223) && echo hi
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused

Diese können nicht einfach zu /dev/null umgeleitet werden, da sie aus dem Versuch stammen, Daten auf das Gerät zu schreiben /dev/tcp. Also erfassen wir alle diese Ausgaben in einem Unterbefehl, dh (...cmds...) und leiten die Ausgabe des Unterbefehls um.

 68
Author: slm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2015-07-31 22:09:05

Ich habe festgestellt, dass curl die Arbeit auf ähnliche Weise wie telnet erledigen kann und curl Ihnen sogar mitteilt, welches Protokoll der Listener erwartet.

Erstellen Sie einen HTTP-URI aus dem Hostnamen und Port als erstes Argument für curl. Wenn curl eine Verbindung herstellen kann, wird eine Protokollübereinstimmung gemeldet und beendet (wenn der Listener kein Webdienst ist). Wenn curl keine Verbindung herstellen kann, wird eine Zeitüberschreitung angezeigt.

Beispielsweise wird Port 5672 auf Host 10.0.0.99 entweder geschlossen oder durch eine firewall:

$ curl http://10.0.0.99:5672
curl: (7) couldn't connect to host

Von einem anderen System aus kann Port 5672 auf Host 10.0.0.99 jedoch erreicht werden und scheint einen AMQP-Listener auszuführen.

$ curl http://10.0.0.99:5672
curl: (56) Failure when receiving data from the peer
AMQP

Es ist wichtig, zwischen den verschiedenen Nachrichten zu unterscheiden: Der erste Fehler war, dass curl keine Verbindung zum Port herstellen konnte. Der zweite Fehler ist ein Erfolgstest, obwohl curl einen HTTP-Listener anstelle eines AMQP-Listeners erwartet.

 50
Author: Steve HHH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-07-19 17:41:51
[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.193.173 6443
nc: connect to 192.168.193.173 port 6443 (tcp) failed: Connection refused

[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.194.4 6443
Connection to 192.168.194.4 6443 port [tcp/sun-sr-https] succeeded!

Hoffe es löst dein problem :)

 14
Author: Mohammad Shahid Siddiqui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2015-06-02 06:27:59

Hier ist Einzeiler:

</dev/tcp/localhost/11211 && echo Port is open || echo Port is closed

Mit Bash-Syntax erklärt in @lornix Antwort.

Weitere Informationen finden Sie unter: Advanced Bash-Scripting Guide: Kapitel 29. /dev und /proc.

 12
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-07-30 10:37:21

Ich kämpfte einen ganzen Tag lang, weil keine dieser Antworten für mich zu funktionieren schien. Das Problem ist, dass die neueste Version von nc nicht mehr das Flag -z, während der direkte Zugriff über TCP (gemäß @lornix und @slm) fehlschlägt, wenn der Host nicht erreichbar ist. Ich fand schließlich diese Seite, wo ich schließlich nicht eine, sondern zwei Arbeitsbeispiele fand:

  1. nc -w1 127.0.0.1 22 </dev/null

    (das Flag -w kümmert sich um das Timeout und das </dev/null ersetzt das Flag -z)

  2. timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'

    (der Befehl timeout kümmert sich um das Timeout und der Rest stammt von @slm)

Verwenden Sie dann einfach && und/oder || (oder sogar $?), um das Ergebnis zu extrahieren. Hoffentlich wird jemand diese Informationen nützlich finden.

 9
Author: Azukikuru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-06-12 13:48:39

Wenn Sie die Antworten von @kenorb und @Azukikuru kombinieren, können Sie Port open/closed/firewalled testen.

timeout 1 bash -c '</dev/tcp/127.0.0.1/22 && echo Port is open || echo Port is closed' || echo Connection timeout

Ein anderer Ansatz mit Curl zum Erreichen eines beliebigen Ports

curl telnet://127.0.0.1:22
 9
Author: Miguel Ferreira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-08-12 16:54:08

Hier ist eine Funktion, die eine der Methoden auswählt, je nachdem, was auf Ihrem System installiert ist:

# Check_port <address> <port> 
check_port() {
if [ "$(which nc)" != "" ]; then 
    tool=nc
elif [ "$(which curl)" != "" ]; then
     tool=curl
elif [ "$(which telnet)" != "" ]; then
     tool=telnet
elif [ -e /dev/tcp ]; then
      if [ "$(which gtimeout)" != "" ]; then  
       tool=gtimeout
      elif [ "$(which timeout)" != "" ]; then  
       tool=timeout
      else
       tool=devtcp
      fi
fi
echo "Using $tool to test access to $1:$2"
case $tool in
nc) nc -v -G 5 -z -w2 $1 $2 ;;
curl) curl --connect-timeout 10 http://$1:$2 ;;
telnet) telnet $1 $2 ;;
gtimeout)  gtimeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
timeout)  timeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
devtcp)  </dev/tcp/${1}/${2} && echo Port is open || echo Port is closed ;;
*) echo "no tools available to test $1 port $2";;
esac

}
export check_port
 4
Author: Robert Boyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-02-12 20:21:11

Es sollte nicht auf Ihrer Box verfügbar sein, aber versuchen Sie es mit nmap.

 3
Author: peperunas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2015-07-21 11:28:05

Als Referenz erweitern Sie @peperunas ' Antwort:

Die Art, nmap zum Testen zu verwenden, ist:

nmap -p 22 127.0.0.1

(Beispiel oben verwendet localhost zu Demonstrationszwecken)

 1
Author: user138278,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-08-07 23:17:13

Wenn Sie curl installiert haben:

curl -v telnet://$host:$port/$path
 1
Author: groo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-10-14 11:18:14

Wenn Sie mehr als auf dem System testen müssen, können Sie unser Testtool dda-serverspec (https://github.com/DomainDrivenArchitecture/dda-serverspec-crate) für solche Aufgaben. Sie können Ihre Erwartung definieren

{:netcat [{:host "mywebserver.com" :port "443"}
          {:host "telnet mywebserver.com" :port "80"}
          {:host "telnet mywebserver.com" :port "8443"}]}

Und testen Sie diese Erwartungen entweder gegen localhost oder gegen Remote-Hosts (Verbindung über ssh). Für Remote-Tests müssen Sie ein Ziel definieren:

{:existing [{:node-name "test-vm1"
             :node-ip "35.157.19.218"}
            {:node-name "test-vm2"
             :node-ip "18.194.113.138"}]
 :provisioning-user {:login "ubuntu"}}

Sie können den Test mit java -jar dda-serverspec.jar --targets targets.edn serverspec.edn

Unter der Haube verwenden wir netcat wie oben beschrieben...

 0
Author: jerger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-10-26 13:49:54