23

We can use the following in order to test telnet VIA port; in the following example we test port 6667:

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

Since on some machines we can't use telnet (for internal reasons) what are the alternatives to check ports, as telnet?

  • Is perl an option? – Jeff Schaller Nov 4 '18 at 15:01
  • 5
    Those "internal reasons" might bar you from using other port-scanning software. I knew a guy that worked at a bank and had his contract terminated because he had a copy of nmap on his PC. He was using it for work-related purposes, but it was on the proscribed list, so he was escorted out of the building. – Roger Lipscombe Nov 4 '18 at 15:39
  • 2
    Is perl an option? – YES – yael Nov 4 '18 at 17:47
  • 2
    Note that telnet is a sophisticated protocol. The telnet utility turns off the protocol behaviour if a port is given at command line. Then it behaves much like netcat, just with line ending detection. – rexkogitans Nov 5 '18 at 8:29
  • A more operating-system agnostic question, that does not even hint at port scanning, is unix.stackexchange.com/questions/499694 . – JdeBP Feb 10 at 10:40
18

If using Bash Shell, then you can use its feature to check if a port is open or closed:

(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

Note that if the server does not respond after 1 second the timeout is reached, the commands between ' interrupted, and thus nothing is printed.

  • 5
    Perhaps you should use the hostname from the question (kafka02) instead of 127.0.0.1, which makes it look like it only works with the loopback. – Dmitry Grigoryev Nov 5 '18 at 9:52
  • 1
    (timeout 1 bash -c '</dev/tcp/www.google.com/444 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/null prints nothing for me. (timeout 1 bash -c '</dev/tcp/www.google.com/444' && echo PORT OPEN || echo PORT CLOSED) 2>/dev/null worked as expected (prints PORT CLOSED). Note the location of the '. – thecarpy Nov 7 '18 at 9:21
  • what you get on bash -c '</dev/tcp/kafka01/6667' – yael Nov 7 '18 at 10:45
  • then echo $? ( if 0 then port is open ,) – yael Nov 7 '18 at 10:46
  • IIRC this bash feature used to be disabled in Debian some time ago. It's a neat trick but doesn't always work. – AnonymousLurker Nov 27 '18 at 9:50
27

netcat is one option.

nc -zv kafka02 6667
  • -z = sets nc to simply scan for listening daemons, without actually sending any data to them
  • -v = enables verbose mode
  • is it possible to get standard output from the nc ? because I want to write in in my bash script – yael Nov 4 '18 at 10:36
  • 2
    Read the documentation! Without options nc behaves a lot like telnet. – Henrik Nov 4 '18 at 11:03
  • yes I read the docs but -w flag not works as timeout – yael Nov 4 '18 at 11:09
  • example - c -v -w 1 kafka01 6667 ( we not get timeout ) – yael Nov 4 '18 at 11:09
  • nc -v -w 3 kafka01 6667 Ncat: Version 6.40 ( nmap.org/ncat ) Ncat: Connected to 10.164.235.85:6667. ( this still hang ) – yael Nov 4 '18 at 11:10
23

The gold standard is undoubtedly nmap (nmap.org), but it typically requires root for “best results”. However, standalone binaries are available and it is possible to run it as an unprivileged user, just with degraded capabilities. For example, instead of a stealth syn scan (-sS), it falls back to a standard TCP connect scan (-sT). This is functionally equivalent to netcat, but with the nice multi-host, sped-up capabilities that it has.

An example:

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
  • 1
    in most organizations nmap is considered as a scaning tool and one can not use nmap without proper authorization. Also if it is an EC2 instance, authorization required from AWS as well. – al mamun Nov 6 '18 at 20:52
4

If Perl is an option, you can use its IO::Socket module to test a connection to a particular host and port; the script below hard-codes TCP as the protocol (which is what telnet would use):

#!/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"

Sample output from a closed port:

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

Sample output from an open port:

$ ./above-script kafka02 4200
Success!
1

Device file /dev/tcp and /dev/udp can be used instead of telnet. Example: echo 0 > /dev/tcp/103.64.35.86/6667 . Then check the exit status using #echo $? . If exit status is 0 then the port is open. If exit status is non-zero then the port is closed. For checking udp packets, use echo 0 > /dev/udp/103.64.35.86/6667 .

  • in my redhat 7 under /dev/ , we not have tcp – yael Nov 7 '18 at 10:47
  • ls /dev/tcp/ ls: cannot access /dev/tcp/: No such file or directory – yael Nov 7 '18 at 10:48
  • on which OS you test it? – yael Nov 7 '18 at 10:49
  • @yael, you will not get /dev/tcp or /dev/udp while ls. try the exact same command on your shell and you will get the result. by the way, I frequently use it on RHEL6,7 – al mamun Nov 7 '18 at 15:29
0
ss -lt 

this is another command you can use.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.