除了telnet以外,还有哪些检查开放端口的替代方法?


24

我们可以使用以下命令来测试telnet VIA端口;在以下示例中,我们测试端口6667:

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

由于在某些机器上我们不能使用telnet(出于内部原因),有什么替代方法来检查端口(如telnet)?


perl是一个选择吗?
Jeff Schaller

5
这些“内部原因”可能会禁止您使用其他端口扫描软件。我认识一个在银行工作的人,他的合同终止了,因为他的PC上有一份nmap的副本。他将其用于与工作相关的目的,但由于它在被禁止的名单上,因此他被护送出建筑物。
罗杰·利普斯科姆

2
perl是一个选择吗?–是
yael

2
请注意,telnet是一个复杂的协议。telnet如果在命令行中指定了端口,该实用程序将关闭协议行为。然后,它的行为很像netcat,只是带有行尾检测。
rexkogitans

unix.stackexchange.com/questions/499694是一个与操作系统无关的,甚至不能暗示端口扫描的问题
JdeBP

Answers:


23

如果使用Bash Shell,则可以使用其功能检查端口是打开还是关闭:

(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

请注意,如果服务器在1秒钟后仍未响应,则将达到超时,'中断之间的命令,因此不会打印任何内容。


5
也许您应该使用问题(kafka02)中的主机名代替127.0.0.1,这使其看起来仅适用于环回。
德米特里·格里戈里耶夫

1
(timeout 1 bash -c '</dev/tcp/www.google.com/444 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/null不为我打印任何内容。(timeout 1 bash -c '</dev/tcp/www.google.com/444' && echo PORT OPEN || echo PORT CLOSED) 2>/dev/null正常工作(打印PORT CLOSED)。注意的位置'
Thecarpy

你在bash -c'</ dev / tcp / kafka01 / 6667'上得到了什么
yael

然后回显$?(如果为0,则表示端口已打开,)
yael

IIRC此bash功能以前曾在Debian中禁用。这是一个巧妙的技巧,但并不总是有效。
AnonymousLurker

32

netcat是一种选择。

nc -zv kafka02 6667
  • -z =将nc设置为仅扫描侦听守护程序,而不实际向它们发送任何数据
  • -v =启用详细模式

是否可以从nc获取标准输出?因为我想用bash脚本写信
yael

2
阅读文档!没有选项的nc行为很像telnet
亨里克-停止伤害莫妮卡

是的,我阅读了文档,但-w标志不能用作超时
yael

示例-c -v -w 1 kafka01 6667(我们没有超时)
yael

nc -v -w 3 kafka01 6667 Ncat:版本6.40(nmap.org/ncat)Ncat:已连接到10.164.235.85:6667。(仍然悬挂)
yael

23

黄金标准无疑是nmapnmap.org),但通常需要root才能获得“最佳结果”。但是,可以使用独立的二进制文件,并且可以以非特权用户身份运行它,只是功能会降低。例如,它不是标准的隐身syn扫描(-sS),而是标准的TCP连接扫描(-sT)。这在功能上等效于netcat,但是具有不错的多主机加速功能。

一个例子:

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
在大多数组织中,nmap被视为一种扫描工具,没有适当的授权就不能使用nmap。同样,如果它是EC2实例,则还需要AWS的授权。
al mamun

4

如果选择Perl,则可以使用其IO::Socket模块测试与特定主机和端口的连接;下面的脚本将TCP硬编码为协议(telnet将使用该协议):

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

从封闭端口输出的样本:

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

从开放端口输出的样本:

$ ./above-script kafka02 4200
Success!

2

可以使用设备文件/ dev / tcp和/ dev / udp代替telnet。示例:echo 0> /dev/tcp/103.64.35.86/6667。然后使用#echo $?检查退出状态。。如果退出状态为0,则说明端口已打开。如果退出状态为非零,则该端口关闭。要检查udp数据包,请使用echo 0> /dev/udp/103.64.35.86/6667。


在/ dev /下的redhat 7中,我们没有tcp
yael 18'Nov

ls / dev / tcp / ls:无法访问/ dev / tcp /:没有这样的文件或目录
yael

您在哪个操作系统上进行测试?
yael

@yael,在ls时不会得到/ dev / tcp或/ dev / udp。在shell上尝试完全相同的命令,您将得到结果。顺便说一句,我经常在RHEL6,7上使用它
al mamun 18'Nov

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.