Vérifier l'état d'un port sur l'hôte distant [fermé]

158

J'ai besoin d'une ligne de commande qui peut vérifier l'état du port sur un hôte distant. J'ai essayé ping xxx.xxx.xxx.xxx:161mais il ne reconnaît pas "l'hôte". J'ai pensé que c'était une "bonne" réponse jusqu'à ce que j'aie fait la même commande contre un hôte que je connais a ce port ouvert. Il s'agit d'un fichier de commandes sous Windows qui vérifiera l'état du port distant, puis exécutera une commande qui utilise ce port distant pour plus d'informations, puis la commande de vérification du port distant à nouveau, puis la commande qui utilise ce port sur le serveur suivant pour plus d'informations , etc. J'ai regardé partout et j'ai pensé que le ping pourrait le faire, mais il doit y avoir différentes versions de ping, je suppose que le serveur sur lequel je fais cela ne montre pas cette option.

Juste pour rire, j'ai essayé un vérificateur de port distant basé sur le Web à partir d'un site Web - et les résultats étaient corrects à la fois pour le serveur "problématique" et pour le serveur correct. Cependant, je ne peux pas l'utiliser dans une exécution par lots avec plus de 500 adresses IP de serveur.

Puis-je faire quelque chose de simple? Mes compétences Perl sont extrêmement rouillées (utilisez-le ou perdez-le), je ne connais aucun autre langage basé sur Windows à l'exception du batch. Unix est ma compétence, mais cela doit être exécuté à partir de Widows Server 2003.

Ross Ridge
la source
5
Vous voudrez peut-être essayer de demander ceci à serverfault.com
John Rasch
1
Quelqu'un a déjà fait cela: serverfault.com/questions/309357/ping-a-specific-port
Vadzim
1
Comme cette question est fermée, j'ai répondu ici
npocmaka
windows ps> tnc xxx.xxx.xxx.xxx -port 161
Moslem Shahsavan

Réponses:

151

Vous semblez rechercher un scanner de port tel que nmap ou netcat , tous deux disponibles pour Windows, Linux et Mac OS X.

Par exemple, recherchez telnet sur une adresse IP connue:

nmap -A 192.168.0.5/32 -p 23

Par exemple, recherchez les ports ouverts de 20 à 30 sur host.example.com:

nc -z host.example.com 20-30
Glenn
la source
Les deux sont disponibles pour Windows.
Glenn
1
votre commande nmap devrait réel "-p23" sans l'espace. nmap traite chaque unité qui n'est pas immédiatement précédée d'un drapeau comme une destination de numérisation distincte
Brandon Lebedev
14
devrait être nc -zv host.example.com 20-30. sinon il n'y a pas de sortie
Aryeh Beitz
1
L'option -zpour ncn'est pas disponible sous Linux.
valentin_nasta
1
@valentin_nasta oui, cela dépend peut-être de la version de netcat que vous utilisez (gnu ou openbsd). Voici la ligne pertinente de la page de manuel de nc (version openbsd) sur mon système Arch Linux: -z Spécifie que nc doit simplement rechercher les démons à l'écoute, sans leur envoyer de données. C'est une erreur d'utiliser cette option en conjonction avec l'option -l
pgoetz
126

Dans l'invite de commande, vous pouvez utiliser la commande telnet. Par exemple, pour vous connecter à l'IP 192.168.10.1 avec le port 80,

telnet 192.168.10.1 80

Pour activer telnet dans Windows 7 et supérieur, cliquez sur . À partir de l'article lié, activez telnet via le panneau de configuration -> programmes et fonctionnalités -> fonctionnalités Windows -> client telnet, ou exécutez simplement ceci dans une invite d'administration:

dism /online /Enable-Feature /FeatureName:TelnetClient
Naveen Yedugani
la source
3
C'est la méthode la plus simple si telnet est installé sur le périphérique Windows
utilisateur shonky linux
30
... et cela prend 2 secondes pour l'ajouter à Windows (8.1 dans mon cas)> Panneau de configuration> Ajouter des programmes> Activer les fonctionnalités de Windows
Chris Moutray
14
Juste pour info: si le port n'est pas ouvert: Connexion à ##### ... Impossible d'ouvrir la connexion à l'hôte, sur le port ####: Échec de la connexion; Et si le port est ouvert, vous vous retrouverez dans telnet (CTRL +] puis «quitter»)
blackstrype
27

À des fins de script, j'ai trouvé que la curlcommande peut le faire, par exemple:

$ curl -s localhost:80 >/dev/null && echo Connected. || echo Fail.
Connected.
$ curl -s localhost:123 >/dev/null && echo Connected. || echo Fail.
Fail.

Il est possible que cela ne fonctionne pas pour tous les services, car cela curlpeut renvoyer différents codes d'erreur dans certains cas (selon le commentaire), donc l'ajout de la condition suivante pourrait fonctionner de manière fiable:

[ "$(curl -sm5 localhost:8080 >/dev/null; echo $?)" != 7 ] && echo OK || echo FAIL

Remarque: ajouté -m5 pour définir le délai de connexion maximal de 5 secondes.

Si vous souhaitez vérifier également si l'hôte est valide, vous devez également vérifier le 6code de sortie:

$ curl -m5 foo:123; [ $? != 6 -a $? != 7 ] && echo OK || echo FAIL
curl: (6) Could not resolve host: foo
FAIL

Pour dépanner le code d'erreur renvoyé, exécutez simplement:, curl host:portpar exemple:

$ curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused

Voir: man curlpour la liste complète des codes de sortie.

Kenorb
la source
Malheureusement, cela ne fonctionne pas pour moi (du moins sur bash sous OS X).
Mike Atlas
1
Un service personnalisé. FWIW ça marche en quelque sorte: curl $IP:$PORTdonne: curl: (52) Empty reply from server(contre curl: (7) Failed to connect) mais un peu comme nc, je ne peux pas | grep Emptypour ces déclarations de sortie comme on pourrait s'y attendre (quelque chose à propos de nouvelles lignes ou de manque de sortie immédiate?). Je suppose que votre ligne est un conditionnel basé sur le code de sortie, non? Je suis sur El Cap; peut-être que dans d'autres versions ou systèmes d'exploitation, l'état d'échec se termine -1plutôt que 52?
Mike Atlas
Ouais ça ferait ça. curl -s $IP:$PORT >/dev/null; if [ $? -eq 52 ]; then echo "Connected."; else echo "Fail."; fi
Mike Atlas
La question portait sur Windows, qui n'a évidemment pas par exemple / dev / null
Arthur Tacca
@ArthurTacca Vous pouvez toujours utiliser le sous-système Windows pour Linux (WSL).
kenorb le
23

Appuyez sur Windows+ Rtapez cmdetEnter

Dans le type d'invite de commande

telnet "machine name/ip" "port number"

Si le port n'est pas ouvert, ce message s'affiche:

"Connecting To "machine name"...Could not open connection to the host, on port "port number":

Sinon, vous serez emmené dans le port ouvert (un écran vide s'affichera)

Leo
la source
7
Notez que telnet n'est pas installé par défaut sur les systèmes Windows modernes. Vous devrez l'installer à partir du panneau de configuration Ajout / Suppression de fonctionnalités Windows.
Greg
1
@Greg ou en utilisant un outil en ligne telnet-online.net
oz
2
@oz true, sauf si vous vérifiez l'état d'un serveur interne
Greg
fonctionne sur Windows10
gaurav
19

Utilisez la commande nc,

nc -zv <hostname/ip> <port/port range>

For example,
nc -zv localhost 27017-27019
or
nc -zv localhost 27017

Vous pouvez également utiliser la commande telnet

telnet <ip/host> port
minhas23
la source
4

nc ou 'netcat' a également un mode de scan qui peut être utile.

caskey
la source
3
Sur Mac "nc -zv server port-range"
Vijay Kumar
2

Je pense que vous recherchez Hping ( http://www.hping.org/ ), qui a une version Windows.

"L'interface est inspirée de la commande unix ping (8), mais hping n'est pas seulement capable d'envoyer des requêtes d'écho ICMP. Il prend en charge TCP, UDP, ICMP ..."

C'est également très utile si vous voulez voir où le long d'une route où un port TCP est bloqué (comme par un pare-feu), là où ICMP peut ne pas être.

Vrai sang
la source
2

Dans Bash, vous pouvez utiliser des fichiers pseudo-périphériques qui peuvent ouvrir une connexion TCP vers le socket associé. La syntaxe est /dev/$tcp_udp/$host_ip/$port.

Voici un exemple simple pour tester si Memcached est en cours d'exécution:

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

Voici un autre test pour voir si un site Web spécifique est accessible:

$ echo "HEAD / HTTP/1.0" > /dev/tcp/example.com/80 && echo Connection successful.
Connection successful.

Pour plus d'informations, consultez: Advanced Bash-Scripting Guide: Chapter 29. /devet/proc .

Connexes: testez si un port sur un système distant est accessible (sans telnet) chez SuperUser.

Pour plus d'exemples, consultez: Comment ouvrir un socket TCP / UDP dans un shell bash (article).

Kenorb
la source
1
Wow, c'est du génie! Je ne sais pas que c'est possible avec juste bash. Tellement pratique pour les gens comme moi qui n'ont installé que git bash sur Windows et ne veulent pas installer un autre service.
dotslashlu