Réponses:
Vous ne pouvez pas cingler les ports, car Ping utilise ICMP qui n'a pas le concept de ports. Les ports appartiennent aux protocoles de la couche de transport tels que TCP et UDP. Cependant, vous pouvez utiliser nmap pour voir si les ports sont ouverts ou non.
nmap -p 80 example.com
Edit: Comme le dit flokra, nmap est plus qu’un ping-pour-ports-thingy. C'est le meilleur ami des auditeurs de sécurité et des pirates informatiques et il propose une multitude d'options intéressantes. Vérifiez la doc pour tous les drapeaux possibles.
-PN
pour ignorer la découverte d'hôte que nmap fait généralement avant de tester le port donné.
nmap windows
), MAIS cela ne fonctionne pas sur les VPN. PaPing n'a pas semblé être capable de scanner une plage d'adresses. J'ai posté un script Python ci-dessous qui fonctionnera sur un réseau privé virtuel (VPN) pour analyser une plage de ports sur une plage d'adresses.
brew install nmap
ou MacPorts.
Ouvrez une session telnet sur le port spécifique, par exemple:
# telnet google.com 80
Trying 74.125.226.48...
Connected to google.com.
Escape character is '^]'.
Pour fermer votre session, appuyez sur Ctrl+ ].
netcat
fonctionne aussi très bien et est moins prolixe.
netcat
MacOS HighSierra est maintenant intégré, dans lequel telnet peut être installé à partir de HomeBrewbrew install telnet
$ nc -vz google.com 80
Connection to google.com 80 port [tcp/http] succeeded!
time
comme dans time nc -vz www.example.com 80
et vous aurez aussi une sorte de RTT.
Si vous êtes sur une installation Windows avec powershell v4 ou plus récent, vous pouvez utiliser le module test-netconnection powershell:
Test-NetConnection <host> -port <port>
Exemple: Test-NetConnection example.com -port 80
Cette cmdlet a également l'alias tnc
. Par exempletnc example.com -port 80
Vous pouvez utiliser PaPing:
http://code.google.com/p/paping
C:\>paping.exe www.google.com -p 80 -c 4
paping v1.5.1 - Copyright (c) 2010 Mike Lovell
Connecting to www.l.google.com [209.85.225.147] on TCP 80:
Connected to 209.85.225.147: time=24.00ms protocol=TCP port=80
Connected to 209.85.225.147: time=25.00ms protocol=TCP port=80
Connected to 209.85.225.147: time=24.00ms protocol=TCP port=80
Connected to 209.85.225.147: time=24.00ms protocol=TCP port=80
Connection statistics:
Attempted = 4, Connected = 4, Failed = 0 (0.00%)
Approximate connection times:
Minimum = 24.00ms, Maximum = 25.00ms, Average = 24.25ms
-c *
pour le taping constant (?).
Non, vous ne pouvez pas, car ping
utilise le protocole ICMP , qui n'a même pas de concept de ports.
Essayez la curl
commande, comme:
$ curl host:port
Par exemple:
$ curl -s localhost:80 >/dev/null && echo Success. || echo Fail.
Success.
La commande ci-dessus renvoie Fail sur un code d'état de sortie différent de zéro. Dans certains cas particuliers, tels que des réponses vides ou mal formées (voir man curl
), vous voudrez peut-être traiter des codes de sortie spécifiques comme ayant abouti. Veuillez consulter cet article pour obtenir des explications plus détaillées.
curl
est présent par défaut sur CentOS, je n'ai donc rien à installer.
IP="<ip>" ; PORT="<port>" ; curl -s "$IP:$PORT" > /dev/null && echo "Success connecting to $IP on port $PORT." || echo "Failed to connect to $IP on port $PORT."
J'ai trouvé une solution plus simple en utilisant PsPing:
psping 192.168.2.2:5000
Cela fait partie de Windows Sysinternals .
PsPing implémente la fonctionnalité Ping, le ping TCP, la latence et la mesure de la bande passante.
Sous Linux, vous pouvez utiliser hping mais il utilise TCP plutôt que ICMP.
hping example.com -S -V -p 80
flags=SA
(c'est-à-dire SYN ACK) et s'il est fermé, vous obtenez flags=SR
(c'est-à-dire SYN RST). Notez que vous n'avez probablement pas besoin du -V
drapeau ici, mais que vous avez besoin de sudo / root pour exécuter hping.
ping
et des pings jusqu’à l’arrêt.
Ping est très spécifique, mais si vous voulez vérifier si un port est ouvert et que vous utilisez une boîte Windows, alors PortQry est votre ami.
Je ne l'ai utilisé que pour tester les contrôleurs de domaine afin de détecter les problèmes de connectivité, mais cela a fonctionné à merveille et devrait donc fonctionner pour vous.
Voici une application de console .NET rapide et sale:
static void Main(string[] args)
{
string addressArgument = null, portArgument = null;
System.Net.Sockets.TcpClient tcpClient = null;
try
{
addressArgument = args[0];
portArgument = args[1];
int portNumber;
portNumber = Int32.Parse(portArgument);
tcpClient = new System.Net.Sockets.TcpClient();
tcpClient.ReceiveTimeout = tcpClient.SendTimeout = 2000;
IPAddress address;
if (IPAddress.TryParse(args[0], out address))
{
var endPoint = new System.Net.IPEndPoint(address, portNumber);
tcpClient.Connect(endPoint);
}
else
{
tcpClient.Connect(addressArgument, portNumber);
}
Console.WriteLine("Port {0} is listening.", portArgument);
}
catch (Exception e)
{
if (e is SocketException || e is TimeoutException)
{
Console.WriteLine("Not listening on port {0}.", portArgument);
}
else
{
Console.WriteLine("Usage:");
Console.WriteLine(" portquery [host|ip] [port]");
}
}
finally
{
if (tcpClient != null)
tcpClient.Close();
}
}
Non.
Rien ne garantit que le service exécuté sur le port comprend le ping. Cela pose également la question de la "saveur" du port que vous voulez utiliser, TCP ou UDP? Etant donné que le protocole "protocole" n'utilise aucun des deux (le ping est implémenté via ICMP ), cela n'a pas beaucoup de sens.
Je suis à peu près sûr que la sonde Nagios check_tcp fait ce que vous voulez. Ils peuvent être trouvés ici et bien que conçus pour être utilisés dans un contexte Nagios, ils sont tous des programmes autonomes.
$ ./check_tcp -H host -p 22
TCP OK - 0.010 second response time on port 22|time=0.009946s;0.000000;0.000000;0.000000;10.000000
C’est la seule solution qui fonctionne pour les VPN dont l’ordinateur client est Windows Vista ou Windows 7 , les autres réponses répertoriées ne fonctionnant tout simplement pas. Cette réponse avait été précédemment supprimée et n'aurait pas dû l'être car il s'agit de la seule solution pour un cas commun réel. Puisqu'il n'y a pas de recours disponible pour la suppression, je le republie pour éviter aux autres la frustration que j'ai éprouvée à essayer d'utiliser les autres réponses.
L'exemple ci-dessous recherche les adresses IP sur le VPN ayant VNC / port 5900 ouvertes avec le client s'exécutant sur Windows 7.
Un court script Python (v2.6.6) pour analyser une liste donnée d'adresses IP et de ports:
from socket import *
fTimeOutSec = 5.0
sNetworkAddress = '192.168.1'
aiHostAddresses = range(1,255)
aiPorts = [5900]
setdefaulttimeout(fTimeOutSec)
print "Starting Scan..."
for h in aiHostAddresses:
for p in aiPorts:
s = socket(AF_INET, SOCK_STREAM)
address = ('%s.%d' % (sNetworkAddress, h))
result = s.connect_ex((address,p))
if ( 0 == result ):
print "%s:%d - OPEN" % (address,p)
elif ( 10035 == result ):
#do nothing, was a timeout, probably host doesn't exist
pass
else:
print "%s:%d - closed (%d)" % (address,p,result)
s.close()
print "Scan Completed."
Les résultats ressemblaient à:
Starting Scan...
192.168.1.1:5900 - closed (10061)
192.168.1.7:5900 - closed (10061)
192.168.1.170:5900 - OPEN
192.168.1.170:5900 - closed (10061)
Scan Completed.
Les quatre variables du haut doivent être modifiées pour s'adapter aux délais, au réseau, aux hôtes et aux ports nécessaires. 5,0 secondes sur mon VPN semblent suffire pour fonctionner correctement, moins de résultats ne sont pas (toujours) exacts. Sur mon réseau local, 0,5 était plus que suffisant.
Il existe un outil léger, appelé tcping: http://www.linuxco.de/tcping/tcping.html
Dans le shell Bash, vous pouvez utiliser le fichier de pseudo-périphérique TCP , par exemple:
</dev/tcp/serverfault.com/80 && echo Port open || echo Port closed
Voici la version implémentant un délai d'expiration de 1 seconde:
timeout 1 bash -c "</dev/tcp/serverfault.com/81" && echo Port open || echo Port closed
Si vous utilisez un système d’exploitation * nix, essayez d’installer et d’utiliser «zenmap», c’est une interface graphique pour nmap et plusieurs profils d’analyse utiles qui aident beaucoup le nouvel utilisateur.