Just a quick sanity check here.
Can you ping a specific port of a machine, and if so, can you provide an example?
I'm looking for something like ping ip address portNum.
You can't ping ports, as Ping is using ICMP which is an internet layer protocol that doesn't have ports. Ports belong to the transport layer protocols like TCP and UDP.
However, you could use nmap to see whether ports are open or not
nmap -p 80 example.com
Edit: As flokra mentioned, nmap is more than just a ping-for-ports-thingy. It's the security auditers and hackers best friend and comes with tons of cool options. Check the doc for all possible flags.
-PN to skip the host discovery nmap usually does before testing the given port.
– flokra
Oct 08 '09 at 10:06
nmap windows), BUT it does not work over VPNs. PaPing didn't seem to be able to scan a range of addresses. I have posted Python script below that will work over VPN to scan a range of ports on a range of addresses.
–
Sep 08 '11 at 07:19
brew install nmap or MacPorts.
– Highway of Life
Mar 27 '12 at 15:58
nc as the option) : nc -z host port (default is tcp, but you can specify udp). The return code can be used in a test.
– Esteban
May 12 '17 at 06:44
Open a telnet session to the specific port, for example:
# telnet google.com 80
Trying 74.125.226.48...
Connected to google.com.
Escape character is '^]'.
To close your session, hit Ctrl+].
netcat is now built-in MacOS HighSierra, wherein telnet can be installed from HomeBrew brew install telnet
– sandiejat
Aug 03 '18 at 22:12
If you're on a windows installation with powershell v4 or newer, you can use the test-netconnection powershell module:
Test-NetConnection <host> -port <port>
Example: Test-NetConnection example.com -port 80
This cmdlet also has the alias tnc. Eg tnc example.com -port 80
$ nc -vz google.com 80
Connection to google.com 80 port [tcp/http] succeeded!
time like in time nc -vz www.example.com 80 and you'll have sort of an RTT, too.
– xebeche
Feb 21 '14 at 08:58
You can use 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
Try curl command, like:
$ curl host:port
For example:
$ curl -s localhost:80 >/dev/null && echo Success. || echo Fail.
Success.
Above command will return Fail on a non-zero exit status codes. In some particular cases, such as empty or malformed response (see man curl), you may want to handle specific exit codes as successful, so please check this post for more detailed explanation.
curl is present by default on CentOS, so I don't have to install anything.
– bdemarest
Jan 12 '16 at 17:34
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."
– Lefty G Balogh
Apr 28 '17 at 14:36
No, you can't, because ping uses the ICMP protocol, which doesn't even have a concept of ports.
I found a simpler solution using PsPing:
psping 192.168.2.2:5000
It's part of Windows Sysinternals.
PsPing implements Ping functionality, TCP ping, latency and bandwidth measurement.
On Linux you can use hping but it uses TCP, rather than ICMP.
hping example.com -S -V -p 80
flags=SA (i.e. SYN ACK), and if it's closed you get flags=SR (i.e. SYN RST). Note that you probably don't need the -V flag here, but you do need sudo/root to run hping.
– mc0e
Feb 07 '17 at 04:19
ping and pings until stopped.
– Edward Anderson
Jun 04 '18 at 19:46
Ping is very specific but if you want to check whether a port is open or not, and are running a Windows box then PortQry is your friend.
I've only used it for testing Domain Controllers for connectivity issues, but it worked a treat for that, so should work for you.
Here's a quick and dirty .NET console app:
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();
}
}
This is the only solution that works for VPNs with the client machine being Windows Vista or Windows 7, as other listed answers simply do not function. This answer was previously deleted and should not have been, as this is the only solution for a real-world common case. Since there is no appeal available for the delete, I am reposting it to save others the frustration I had with trying to use the other answers.
The example below finds which IPs on the VPN that have VNC/port 5900 open with the client running on Windows 7.
A short Python (v2.6.6) script to scan a given list of IPs and 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."
Results looked like:
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.
The four variables at the top would need to be changed to be appropriate to whatever timeout, network, hosts, and ports that are needed. 5.0 seconds on my VPN seemed to be enough to work properly consistently, less didn't (always) give accurate results. On my local network, 0.5 was more than enough.
As per CMCDragonkai's comment, you can use nping, which is part of Nmap.
nping example.com --tcp-connect -p 80,443
Here's a link to the manpage.
I'm quite sure that Nagios check_tcp probe does what you want. They can be found here and although designed to be used in a Nagios context, they're all standalone programs.
$ ./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
In Bash shell, you can use TCP pseudo-device file, for example:
</dev/tcp/serverfault.com/80 && echo Port open || echo Port closed
Here is the version implementing a timeout of 1 second:
timeout 1 bash -c "</dev/tcp/serverfault.com/81" && echo Port open || echo Port closed
There is a lightweigth tool for it, called tcping: http://www.linuxco.de/tcping/tcping.html
If you are running a *nix operating system try installing and using "zenmap", it is a GUI for nmap and has several useful scan profiles which are a great help to the new user.