有效地测试如果一个端口是开放的Linux上?有效地测试如果一个端口是开放的Linux上?(Effic

2019-05-12 21:25发布

从bash脚本我怎么能快速找到一个端口是否445是开/听的服务器上。

我已经尝试了几个选项,但我想要的东西快:
1. lsof -i :445 (注意到秒)
2. netstat -an |grep 445 |grep LISTEN (注意到秒)
3. telnet (不返回)
4. nmapnetcat不可用在服务器上

这将是很好知道的,不一一列举后第一和里grep方式。

Answer 1:

我最近发现了一个令人惊讶的是击本身支持TCP连接的文件描述符 。 使用方法:

exec 6<>/dev/tcp/ip.addr.of.server/445
echo -e "GET / HTTP/1.0\n" >&6
cat <&6

我使用6作为文件描述符,因为0,1,2的标准输入,标准输出,和标准错误。 5有时会被猛砸子进程 ,所以1,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

要确定是否有人在听,试图通过回环连接。 如果失败,则该端口处于关闭或我们是不允许进入。 此后,关闭连接。

修改此为您的使用情况下,如发送电子邮件,在失败退出的脚本,或者启动所需的服务。



Answer 2:

有一个很短的有“快回答”在这里: 如果远程TCP端口从shell脚本打开如何测试?

$ nc -z <host> <port>; echo $?

我用它来与127.0.0.1作为“远程”地址。



Answer 3:

您可以用netstat这种方式更快的结果:

在Linux上:

netstat -lnt | awk '$6 == "LISTEN" && $4 ~ /\.445$/'

在Mac:

netstat -anp tcp | awk '$6 == "LISTEN" && $4 ~ /\.445$/'

这将输出的(在本例中445)端口上侦听的进程列表,或者如果该端口是免费的,会输出什么。



Answer 4:

您可以使用的netcat这一点。

nc ip port < /dev/null

连接到服务器并直接再次关闭连接。 如果netcat的是无法连接,它返回一个非零的退出代码。 退出代码存储在变量$? 举个例子,

nc ip port < /dev/null; echo $?

将返回0,当且仅当netcat的可以成功连接到该端口。



Answer 5:

他们列出在/ proc /网/ 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在第三列必须是计算器:○)

看着man 5 proc了解更多详情。 和采摘,除了与SED等保留为一个练习亲爱的读者...



Answer 6:

根据斯宾塞拉思的答案,使用bash:

true &>/dev/null </dev/tcp/127.0.0.1/$PORT && echo open || echo closed


Answer 7:

ss -tl4 '( sport = :22 )'

2ms的足够快?

添加结肠,这在Linux上工作



Answer 8:

下面是一个同时支持Mac和Linux的工作原理:

netstat -aln | awk '$6 == "LISTEN" && $4 ~ "[\\.\:]445$"'


Answer 9:

nc -l 8000

其中8000是端口号。 如果该端口是免费的,它会启动,你可以很容易地关闭服务器。 如果它是不是会引发错误:

nc: Address already in use


Answer 10:

我想检查是否一个端口是在我们的Linux测试服务器的一个开放的。 我能够尝试通过telnet从我的dev的机器连接到测试服务器来做到这一点。 在你的开发机器尝试运行:

$ telnet test2.host.com 8080
Trying 05.066.137.184...
Connected to test2.host.com

在这个例子中,我要检查端口8080是在主机开放test2.host.com



Answer 11:

tcping是一个非常低的overhead.It一个伟大的工具也有一个超时参数,使其更快:

[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.


Answer 12:

您可以使用的netcat命令以及

[location of netcat]/netcat -zv [ip] [port]

要么

nc -zv [ip] [port]

-z - 套数控只需扫描监听守护进程,没有任何资料传送给他们。
-v - 启用详细模式。



Answer 13:

nmap是正确的工具。 只需使用nmap example.com -p 80

您可以从本地或远程服务器中使用它。 它还可以帮助您确定如果防火墙阻止访问。



Answer 14:

如果您使用iptables的尝试:

iptables -nL

要么

iptables -nL | grep 445


文章来源: Efficiently test if a port is open on Linux?