Quelles sont les alternatives pour vérifier les ports ouverts, en plus de Telnet?

24

Nous pouvons utiliser ce qui suit afin de tester le port telnet VIA; dans l'exemple suivant, nous testons le port 6667:

[root@kafka03 ~]# telnet kafka02 6667
Trying 103.64.35.86...
Connected to kafka02.
Escape character is '^]'.
^CConnection closed by foreign host

Étant donné que sur certaines machines, nous ne pouvons pas utiliser telnet (pour des raisons internes), quelles sont les alternatives pour vérifier les ports, comme telnet?

Yael
la source
Perl est-il une option?
Jeff Schaller
5
Ces «raisons internes» peuvent vous empêcher d'utiliser d'autres logiciels de numérisation de port. Je connaissais un gars qui travaillait dans une banque et a vu son contrat résilié parce qu'il avait une copie de nmap sur son PC. Il l'utilisait à des fins professionnelles, mais il figurait sur la liste des interdictions, il a donc été escorté hors du bâtiment.
Roger Lipscombe
2
Perl est-il une option? - OUI
yael
2
Notez que telnet est un protocole sophistiqué. L' telnetutilitaire désactive le comportement du protocole si un port est donné en ligne de commande. Ensuite, il se comporte un peu comme netcat, juste avec la détection de fin de ligne.
rexkogitans
Une question plus indépendante du système d'exploitation, qui ne fait même pas allusion à l'analyse des ports, est unix.stackexchange.com/questions/499694 .
JdeBP

Réponses:

23

Si vous utilisez Bash Shell, vous pouvez utiliser sa fonction pour vérifier si un port est ouvert ou fermé:

(timeout 1 bash -c '</dev/tcp/127.0.0.1/17500 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/null
PORT OPEN

(timeout 1 bash -c '</dev/tcp/127.0.0.1/7500 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/null
PORT CLOSED

Notez que si le serveur ne répond pas après 1 seconde, le délai est atteint, les commandes entre sont 'interrompues, et donc rien n'est imprimé.

in2nix4life
la source
5
Vous devriez peut-être utiliser le nom d'hôte de la question (kafka02) à la place de 127.0.0.1, ce qui donne l'impression qu'il ne fonctionne qu'avec le bouclage.
Dmitry Grigoryev
1
(timeout 1 bash -c '</dev/tcp/www.google.com/444 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/nulln'imprime rien pour moi. (timeout 1 bash -c '</dev/tcp/www.google.com/444' && echo PORT OPEN || echo PORT CLOSED) 2>/dev/nulla fonctionné comme prévu (imprime PORT FERMÉ). Notez l'emplacement du '.
carpe du
ce que vous obtenez sur bash -c '</ dev / tcp / kafka01 / 6667'
yael
alors écho $? (si 0 alors le port est ouvert,)
Yael
IIRC cette fonctionnalité bash était désactivée dans Debian il y a quelque temps. C'est une astuce intéressante mais ne fonctionne pas toujours.
AnonymousLurker
32

netcat est une option.

nc -zv kafka02 6667
  • -z = définit nc pour rechercher simplement les démons à l'écoute, sans leur envoyer de données
  • -v = active le mode verbeux
Steve
la source
est-il possible d'obtenir une sortie standard du nc? parce que je veux écrire dans mon script bash
yael
2
Lisez la documentation! Sans options ncse comporte un peu comme telnet.
Henrik - arrêtez de blesser Monica
oui j'ai lu la documentation mais le drapeau -w ne fonctionne pas comme timeout
yael
exemple - c -v -w 1 kafka01 6667 (nous n'obtenons pas de délai d'expiration)
yael
nc -v -w 3 kafka01 6667 Ncat: version 6.40 ( nmap.org/ncat ) Ncat: connecté à 10.164.235.85:6667. (ça continue)
Yael
23

L'étalon-or est sans aucun doute nmap( nmap.org ), mais il nécessite généralement une racine pour les «meilleurs résultats». Cependant, des fichiers binaires autonomes sont disponibles et il est possible de l'exécuter en tant qu'utilisateur non privilégié, uniquement avec des capacités dégradées. Par exemple, au lieu d'un synscan furtif ( -sS), il revient à un scan de connexion TCP standard ( -sT). Ceci est fonctionnellement équivalent à netcat, mais avec les belles capacités multi-hôtes accélérées dont il dispose.

Un exemple:

not-root$ nmap -sT google.com
Starting Nmap 7.70 ( https://nmap.org ) at 2018-11-04 21:01 GMT
Nmap scan report for google.com (172.217.23.14)
Host is up (0.12s latency).
rDNS record for 172.217.23.14: lhr35s01-in-f14.1e100.net
Not shown: 998 filtered ports
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https
Landak
la source
1
dans la plupart des organisations, nmap est considéré comme un outil d'analyse et on ne peut pas utiliser nmap sans autorisation appropriée. De plus, s'il s'agit d'une instance EC2, une autorisation est également requise d'AWS.
al mamun
4

Si Perl est une option, vous pouvez utiliser son IO::Socketmodule pour tester une connexion à un hôte et un port particuliers; le script ci-dessous code dur TCP comme protocole (ce que Telnet utiliserait):

#!/usr/bin/perl -w

# tries to connect to the given IP and port (tcp)

use strict;
use IO::Socket;

my $desthost = shift or die "Usage: $0 host port\n";
my $destport = shift or die "Usage: $0 host port\n";

gethostbyname($desthost) || die "Invalid host given\n";

my $handle = IO::Socket::INET->new(
        PeerAddr => $desthost,
        PeerPort => $destport,
        Proto    => 'tcp')
    or die "can't connect to $desthost:$destport: $!\n";
close $handle;
print "Success!\n"

Exemple de sortie à partir d'un port fermé:

$ ./above-script kafka02 6667
can't connect to kafka02:6667: Connection refused

Exemple de sortie à partir d'un port ouvert:

$ ./above-script kafka02 4200
Success!
Jeff Schaller
la source
2

Les fichiers de périphérique / dev / tcp et / dev / udp peuvent être utilisés à la place de telnet. Exemple: echo 0> /dev/tcp/103.64.35.86/6667. Vérifiez ensuite l'état de sortie à l'aide de #echo $? . Si l'état de sortie est 0, le port est ouvert. Si l'état de sortie est différent de zéro, le port est fermé. Pour vérifier les paquets udp, utilisez echo 0> /dev/udp/103.64.35.86/6667.

al mamun
la source
dans mon redhat 7 sous / dev /, nous n'avons pas de tcp
yael
ls / dev / tcp / ls: impossible d'accéder à / dev / tcp /: Aucun fichier ou répertoire de ce type
yael
sur quel OS vous le testez?
yael
@yael, vous n'obtiendrez pas / dev / tcp ou / dev / udp pendant ls. essayez exactement la même commande sur votre shell et vous obtiendrez le résultat. au fait, je l'utilise fréquemment sur RHEL6,7
al mamun
0
ss -lt 

c'est une autre commande que vous pouvez utiliser.

Dileep Jayasundara
la source
Cela ne fonctionne que pour la machine locale, je crois que la question concerne la vérification des ports ouverts d'un hôte distant.
Alex Baranowski