telnet
来查看远程主机上的端口是否已打开:telnet hostname port
会尝试连接到任何主机上的任何端口,并让您访问原始TCP流。这些几天来,我使用的系统未安装telnet(出于安全原因),并且默认情况下会阻止所有主机的所有出站连接。随着时间的流逝,很容易失去对哪些端口打开了哪些主机的跟踪。
是否有另一种方法可以测试远程系统上的端口是否打开–使用数量有限的Linux系统软件包已安装,并且
telnet
不可用?#1 楼
Bash能够访问TCP和UDP端口已有一段时间。在手册页中:/dev/tcp/host/port
If host is a valid hostname or Internet address, and port is an integer port number
or service name, bash attempts to open a TCP connection to the corresponding socket.
/dev/udp/host/port
If host is a valid hostname or Internet address, and port is an integer port number
or service name, bash attempts to open a UDP connection to the corresponding socket.
所以您可以使用类似这样的东西:
xenon-lornix:~> cat < /dev/tcp/127.0.0.1/22
SSH-2.0-OpenSSH_6.2p2 Debian-6
^C pressed here
Taa Daa!
评论
这在MinGW中似乎也起作用。例如,192.168.2.100上的远程VNC服务器通过使用“ cat
– Peter Mortensen
15年7月21日在11:26
@lornix,好,但是在这种情况下,我必须使用不带-z选项的nc来获得相同的结果,但仍然无法正常工作:#nc -v -w5 127.0.0.1 18080连接到127.0.0.1 18080端口[tcp / *]成功! #cat
–亚历山大
16年6月14日在7:09
@Alexandr ...实际上,“挂起没有任何结果”是几乎可以预期的行为。猫正在等待输入。 nc具有额外的智能功能,使其能够感知无数据挂起并停止尝试。猫不是那么聪明。尝试cat dev / tcp / localhost / 22,您应该得到sshd标头。显然,端口18080上的进程在发送任何内容之前先等待某些内容进入。端口22(ssh)会用它的版本和诸如此类的字招呼您。试试看!
– lornix
16年6月14日在8:44
@lornix,非常感谢您的解释!现在限制很明确了。我认为使用nc应该是检查端口的首选方法。
–亚历山大
16年6月14日在14:29
当使用未安装任何东西的Docker容器时,这非常有用。能够快速验证该容器可以通过DNS访问非容器化的数据库。示例:cat dev / tcp / hostname / 5432
–迈克尔·霍布斯(Michael Hobbs)
18-10-24在14:09
#2 楼
很好,很冗长!从手册页。单个端口:
nc -zv 127.0.0.1 80
nc -zv 127.0.0.1 22 80 8080
端口范围:
nc -zv 127.0.0.1 20-30
评论
似乎是最好的答案,谢谢。 ;-)
–lpapp
2014年11月26日15:42
当在Ubuntu 14.04(Trusty Tahr)上尝试将远程服务器(相同的LAN)用于关闭的端口(在127秒后超时)时,此方法挂起-因此不适用于脚本。不过,对于端口已打开的服务,它确实起作用。使用选项“ -w2”可能是解决方案。
– Peter Mortensen
15年7月21日在12:36
对UDP端口使用-u选项。
– Efren
16-09-21在0:10
在6.4版本的ncat -z上无法识别。我没有z就可以做
–smishra
17年4月6日在17:18
您可以使用以下命令检查多个范围:nc -zv 127.0.0.1 22,80,8080,20-30,443-446(nc版本:1.107-4)。
– bobbel
17年7月6日在16:55
#3 楼
Netcat是一个有用的工具:nc 127.0.0.1 123 &> /dev/null; echo $?
如果端口123打开,将输出
0
,如果端口123关闭则将输出1
。评论
这是一个比我自己的答案更为优雅和可脚本化的答案。对于我来说,不幸的是,那些拒绝使用telnet的,具有安全意识的系统管理员也拒绝了nc(尽管–奇怪的是–没有curl或wget)。
–史蒂夫HHH
13年7月19日在19:51
是的,那是完全任意和愚蠢的。
–膝盖
13年7月19日在20:10
让FOR语句开始!
–乍得·哈里森(Chad Harrison)
13年7月19日在21:37
在Ubuntu 14.04(Trusty Tahr)上尝试将远程服务器(相同的LAN)用于关闭的端口(在大约127秒后超时)时,此方法挂起-因此不适用于脚本。但是对于打开端口并返回0的服务,它确实起作用。可以使用选项“ -w2”作为解决方案。
– Peter Mortensen
15年7月21日在13:06
我认为-G 2更适合TCP超时
– A B
15年8月24日在21:45
#4 楼
不使用其他工具(例如socat
)的最简单方法如上述@lornix的答案所述。这只是为了添加一个实际示例,说明如果您想测试另一台服务器是否具有可通过命令行访问的给定端口,那么将如何在Bash中使用psuedo设备/dev/tcp/...
。示例
假设我的网络上有一个名为
skinner
的主机。 ,echo > /dev/...
是因为如果不这样做,则通过测试连接断开,您会看到这些类型的消息。$ (echo > /dev/tcp/skinner/22) >/dev/null 2>&1 \
&& echo "It's up" || echo "It's down"
It's up
$ (echo > /dev/tcp/skinner/222) >/dev/null 2>&1 && \
echo "It's up" || echo "It's down"
It's down
这些可以t只是被重定向到
(echo > /dev/...)
,因为它们来自试图将数据写到设备/dev/null
的尝试。因此,我们在一个子命令(即/dev/tcp
)中捕获了所有输出,并重定向了该子命令的输出。评论
太好了希望它能获得最高票。我只在页面下半部分读过这本书,因为在关闭它之前我不小心滚动了它。
–Still.Tony
15年2月12日在13:44
@ Okuma.Tony-是的,Q总是有问题,答案很多8-)。感谢您的反馈,不胜感激。
–slm
2015年2月12日在14:26
#5 楼
我发现curl
可以通过与telnet
类似的方式完成工作,并且curl
甚至可以告诉您侦听器期望的协议。从主机名和端口构造HTTP URI作为第一个参数
curl
。如果curl
可以连接,它将报告协议不匹配并退出(如果侦听器不是Web服务)。如果curl
无法连接,它将超时。例如,主机10.0.0.99上的端口5672被防火墙关闭或阻止:
$ curl http://10.0.0.99:5672
curl: (7) couldn't connect to host
但是,从另一个系统,可以访问主机10.0.0.99上的端口5672,并且似乎正在运行AMQP侦听器。
$ curl http://10.0.0.99:5672
curl: (56) Failure when receiving data from the peer
AMQP
这很重要区分不同的消息:第一个失败是因为
curl
无法连接到端口。第二个失败是成功测试,尽管curl
期望使用HTTP侦听器而不是AMQP侦听器。 评论
如果curl不可用,则可能是wget。 wget -qS -O- http://ip.add.re.ss:port应该有效地做同样的事情。
–用户
13年7月19日在17:52
甚至可以与主机名一起使用,例如。我的主人:22。
–에이바
2014-2-25在16:17
这可能是不正确的。我正在运行一个tomcat服务,但收到404错误。 #curl -k 192.168.194.4:6443
评论
相关:在SO检查远程主机上一个端口的状态
我遇到了同样的问题。 @Subhranath Chunder的回答如下。但是,然后我发现安装Telnet是运行brew install telnet的一个小问题。因此,我希望Linux用户可以使用yum和apt-get进行相同操作。
如果“默认情况下阻止与所有主机的所有出站连接”,将无法执行此类测试-您处于离线状态