怎样测试某个端口是不是打开
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样测试某个端口是不是打开相关的知识,希望对你有一定的参考价值。
参考技术A有些时候我们需要测试远程主机上的某个端口是否开启,现在无需使用太复杂的工作,Windows就自带了工具,那就是telnet。Telnet协议是TCP/IP协议族中的一种,是Internet远程登陆服务的标准协议和主要方式。下面就以telnet来测试端口是否打开。
工具/材料
电脑
- 01
以win8系统为例,安装telnet,打开控制面板——程序。如图:
02点击启用火关闭Windows功能,如图
03在跳出来的对话框中把telnet客户端和telnet服务器勾选上,其他的不用管,如图。然后点击确定。然后等待一段时间。
04安装完成后点击运行,如图:
05在跳出来的对话框中输入cmd,点击确定。如图
06 在新界面中输入telnet 192.192.193.211 22,输入完后按回车键。如图
(22为你想测试的端口)
运行后如下图,可以观察到端口有没有开了
有效地测试一个端口是不是在 Linux 上打开?
【中文标题】有效地测试一个端口是不是在 Linux 上打开?【英文标题】:Efficiently test if a port is open on Linux?有效地测试一个端口是否在 Linux 上打开? 【发布时间】:2012-03-25 10:22:51 【问题描述】:如何通过 bash 脚本快速确定端口 445
是否在服务器上打开/侦听。
我已经尝试了几个选项,但我想要一些快速的方法:
1.lsof -i :445
(需要几秒钟)
2.netstat -an |grep 445 |grep LISTEN
(需要几秒钟)
3.telnet
(不返回)
4、nmap
、netcat
在服务器上不可用
很高兴知道一种不先枚举然后再使用 greps 的方式。
【问题讨论】:
netcat 可用吗?它有一个快速失败路径 IIRC。 netcat.sourceforge.netnetstat -lnt
(带有-t
和不带-a
)将限制输出仅监听 TCP 连接。它可能会加快一点。只有在不需要 IPv6 时,才能为 IPv4 添加-4
。
lsof -i 是个人的最爱。
netstat -an | grep PORTNUMBER | grep -i listen
如果输出为空,则端口未使用。
我不知道为什么lsof
对您来说很慢,但通常它是您列出的解决方案中最好的。您的netstat
解决方案不是很可靠(您可以在使用grep
时猜到它;无论如何,如果有人在听例如4450,它会返回true)。 telnet
和 netcat
实际上试图创建一个连接,这可能并不总是你想要的。
【参考方案1】:
这里有一个非常简短的“快速回答”:How to test if remote TCP port is opened from Shell script?
nc -z <host> <port>; echo $?
我将它与 127.0.0.1 一起用作“远程”地址。
如果端口打开则返回“0”,如果端口关闭则返回“1”
例如
nc -z 127.0.0.1 80; echo $?
-z 指定 nc 应该只扫描监听守护进程, 无需向他们发送任何数据。使用此选项是错误的 同时—— 使用 -l 选项。
【讨论】:
这似乎是最简单的方法,谢谢。示例脚本链接不再起作用,但无论如何它都是不言自明的。 不错!这比打开许多端口的服务器上的其他答案要快得多。对我来说在 -z 标志在基于 nmap 的 ncat 中不可用,最新发行版随附:Fedora、Centos 等 (nmap-ncat-6.01-9.fc18.x86_64) 反直觉,如果端口打开则返回“0”,如果端口关闭则返回“1”。 @Sean unix 命令通常返回“0”表示成功,非零表示失败。所以'0'表示它成功连接,非零表示它由于某种原因没有连接。但是请注意,某些版本的 'nc' 不支持 '-z' 参数,因此***.com/a/25793128/6773916 可以说是更好的解决方案。【参考方案2】:你也可以使用 netcat 命令
[location of netcat]/netcat -zv [ip] [port]
或
nc -zv [ip] [port]
-z – 将 nc 设置为简单地扫描监听守护程序,而不实际向它们发送任何数据。 -v - 启用详细模式。
【讨论】:
【参考方案3】:tcping 是一个开销非常低的出色工具。它还有一个超时参数以使其更快:
[root@centos_f831dfb3 ~]# tcping 10.86.151.175 22 -t 1
10.86.151.175 port 22 open.
[root@centos_f831dfb3 ~]# tcping 10.86.150.194 22 -t 1
10.86.150.194 port 22 user timeout.
[root@centos_f831dfb3 ~]# tcping 1.1.1.1 22 -t 1
1.1.1.1 port 22 closed.
【讨论】:
当 Spencer 的解决方案不需要额外安装时,不确定 tcping 是否值得安装,但这是最干净、最易读的解决方案。【参考方案4】:您可以通过这种方式使用 netstat 获得更快的结果:
在 Linux 上:
netstat -lnt | awk '$6 == "LISTEN" && $4 ~ /\.445$/'
在 Mac 上:
netstat -anp tcp | awk '$6 == "LISTEN" && $4 ~ /\.445$/'
这将输出侦听端口(本例中为 445)的进程列表,如果端口空闲则不输出任何内容。
【讨论】:
您的 netstat 语法不正确。 netstat -ln --tcp 有效,但仍然很慢 实际上它是正确的语法,但可能您使用的是 Linux 而我使用的是 Mac。对于 Linux,请使用:netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".445"'
这个问题是关于 linux 的,所以也许评论应该在答案中。
为了检查端口 80,我需要使用 awk '$6 == "LISTEN" && $4 ~ "80$"'
。我没有使用\.80
检查端口号之前的点,而是使用80$
。否则,这也会匹配包含.80
的IP 地址和以80
开头的端口,例如8000
。
@PatrickOscity:说得好,但要使这对您更有效,您需要结合这两种方法:awk '$6 == "LISTEN" && $4 ~ "\.80$"'
【参考方案5】:
基于 Spencer Rathbun 的回答,使用 bash:
true &>/dev/null </dev/tcp/127.0.0.1/$PORT && echo open || echo closed
【讨论】:
很好,它将抑制“连接被拒绝”消息。如果服务接受连接而无需永远等待,则自动退出。 新连接后不发送数据的服务的最佳解决方案。比调用 netcat 快大约 20 倍。可简写为: &>/dev/null </dev/tcp/127.0.0.1/$PORT
【参考方案6】:
我想检查我们的一台 linux 测试服务器上是否打开了一个端口。 我可以通过尝试从我的开发机器连接到测试服务器的 telnet 来做到这一点。在你的开发机器上尝试运行:
$ telnet test2.host.com 8080
Trying 05.066.137.184...
Connected to test2.host.com
在本例中,我想检查主机 test2.host.com
上的端口 8080 是否打开【讨论】:
【参考方案7】:nmap
是正确的工具。
只需使用nmap example.com -p 80
您可以从本地或远程服务器使用它。 它还可以帮助您确定防火墙是否阻止了访问。
【讨论】:
【参考方案8】:如果你使用 iptables 试试:
iptables -nL
或
iptables -nL | grep 445
【讨论】:
仅列出 iptables 规则...可能与打开的端口无关。【参考方案9】:ss -tl4 '( sport = :22 )'
2ms 够快吗?
添加冒号,这适用于 Linux
【讨论】:
很棒,ss
甚至比nc
快一点。 l
用于监听,4
用于 IPv4; sport
代表(当然)源端口。上面的命令假设有一个监听 TCP 端口(@987654328@ 选项):对 UDP 使用 u
选项,或者对两种协议都不使用。有关ss
的更多信息,一如既往地在Nixcraft 上。注意:ss
过滤器在这里不起作用,不知道为什么(bash 4.3.11,ss 实用程序,iproute2-ss131122),必须使用 grep。
太糟糕了,ss
命令没有返回反映其发现的退出代码;它总是返回 0 退出代码。
| grep LISTEN
?
我收到了State Recv-Q Send-Q Local Address:Port Peer Address:Port
,现在呢?这是什么意思?【参考方案10】:
nc -l 8000
其中 8000 是端口号。如果端口空闲,它将启动一个您可以轻松关闭的服务器。如果不是,则会抛出错误:
nc: Address already in use
【讨论】:
【参考方案11】:您可以为此使用 netcat。
nc ip port < /dev/null
连接到服务器并再次直接关闭连接。如果 netcat 无法连接,它会返回一个非零退出代码。退出代码存储在变量 $? 中。例如,
nc ip port < /dev/null; echo $?
当且仅当 netcat 可以成功连接到端口时才会返回 0。
【讨论】:
这个答案需要更多的支持。 nc 非常适合这种情况。 /dev/tcp 技巧很聪明,但似乎很难实现带有信号中断的脚本。nc
具有用于此目的的 -z
标志,这不需要从 /dev/null
获取输入。使用上面的-z
标志已经有了答案。
@AbeVoelker 并非所有版本的 nc 都支持 -z 标志。我在 CentOS 7 上,发现 Tony 的解决方案正是我所需要的。
@Shadoninja 很高兴知道!如果我可以从 2014 年的评论中编辑掉轻率的内容,我会的。
'nc' 不再支持 '-z' 所以这个答案似乎是最好的解决方案。【参考方案12】:
这是适用于 Mac 和 Linux 的一个:
netstat -aln | awk '$6 == "LISTEN" && $4 ~ "[\\.\:]445$"'
【讨论】:
我认为您可以安全地删除[\\.\:]
。【参考方案13】:
我最近发现的一个惊喜是 Bash 原生支持 tcp connections as file descriptors。使用方法:
exec 6<>/dev/tcp/ip.addr.of.server/445
echo -e "GET / HTTP/1.0\n" >&6
cat <&6
我使用 6 作为文件描述符,因为 0,1,2 是标准输入、标准输出和标准错误。 Bash for child processes 有时会使用 5,因此 3、4、6、7、8 和 9 应该是安全的。
根据下面的评论,测试是否在脚本中侦听本地服务器:
exec 6<>/dev/tcp/127.0.0.1/445 || echo "No one is listening!"
exec 6>&- # close output connection
exec 6<&- # close input connection
要确定是否有人在收听,请尝试通过环回连接。如果失败,则端口将关闭或不允许我们访问。之后,关闭连接。
根据您的用例修改此设置,例如发送电子邮件、在失败时退出脚本或启动所需的服务。
【讨论】:
@AmanJain cat 等待 EOF 或 Ctrl-C 退出。您需要针对您的协议进行调整。顺便说一句,您是在远程服务器上运行它吗? 我想将端口检查代码嵌入到服务器上的脚本中,在 /etc/init.d/ 下 @AmanJain 我已经为本地系统更新了它。你只是想检查它是否听正确?没有任何协议检查,比如通过http请求页面? 如果一个端口被占用,它什么也不返回,有没有办法让它说“端口被/dev/tcp/IP/PORT
树而编译的 bash【参考方案14】:
它们列在 /proc/net/tcp 中。
它是第二列,在“:”之后,十六进制:
> cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 10863 1 ffff88020c785400 99 0 0 10 -1
1: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 7983 1 ffff88020eb7b3c0 99 0 0 10 -1
2: 0500010A:948F 0900010A:2328 01 00000000:00000000 02:00000576 00000000 1000 0 10562454 2 ffff88010040f7c0 22 3 30 5 3
3: 0500010A:E077 5F2F7D4A:0050 01 00000000:00000000 02:00000176 00000000 1000 0 10701021 2 ffff880100474080 41 3 22 10 -1
4: 0500010A:8773 16EC97D1:0050 01 00000000:00000000 02:00000BDC 00000000 1000 0 10700849 2 ffff880104335440 57 3 18 10 -1
5: 0500010A:8772 16EC97D1:0050 01 00000000:00000000 02:00000BF5 00000000 1000 0 10698952 2 ffff88010040e440 46 3 0 10 -1
6: 0500010A:DD2C 0900010A:0016 01 00000000:00000000 02:0006E764 00000000 1000 0 9562907 2 ffff880104334740 22 3 30 5 4
7: 0500010A:AAA4 6A717D4A:0050 08 00000000:00000001 02:00000929 00000000 1000 0 10696677 2 ffff880106cc77c0 45 3 0 10 -1
所以我猜第三列中的:50
之一必须是*** :o)
查看man 5 proc
了解更多详情。并将其与 sed 等分开作为一个练习留给温柔的读者......
【讨论】:
以上是关于怎样测试某个端口是不是打开的主要内容,如果未能解决你的问题,请参考以下文章