有效地测试Linux上的端口是否打开?

时间:2012-03-07 21:12:04

标签: linux bash shell port

从bash脚本中,如何快速查明端口445是否在服务器上打开/侦听。

我尝试了几种选择,但我想要一些快速的东西:
1. lsof -i :445(需要几秒钟)
2. netstat -an |grep 445 |grep LISTEN(需要几秒钟)
3. telnet(不返回)
4. nmapnetcat在服务器上不可用

很高兴知道一种不首先枚举的方法和之后的greps。

13 个答案:

答案 0 :(得分:151)

我最近发现的一个惊喜是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是stdin,stdout和stderr。有时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

要确定某人是否正在侦听,请尝试通过环回进行连接。如果失败,则关闭端口或不允许访问。然后,关闭连接。

根据您的使用情况对此进行修改,例如发送电子邮件,在失败时退出脚本或启动所需服务。

答案 1 :(得分:100)

这里有一个非常简短的“快速回答”:How to test if remote TCP port is opened from Shell script?

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

我将它与127.0.0.1一起用作“远程”地址。

答案 2 :(得分:89)

您可以通过这种方式使用netstat以获得更快的结果:

在Linux上:

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

在Mac上:

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

这将输出侦听端口的进程列表(本例中为445),如果端口空闲,则不输出任何内容。

答案 3 :(得分:36)

您可以使用netcat。

nc ip port < /dev/null

连接到服务器并再次直接关闭连接。如果netcat无法连接,则返回非零退出代码。退出代码存储在变量$?中。例如,

nc ip port < /dev/null; echo $?
当且仅当netcat可以成功连接到端口时,

将返回0。

答案 4 :(得分:15)

它们列在/ 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之一必须是stackoverflow:o)

查看man 5 proc了解详情。并选择与sed等分开,留给温柔的读者练习......

答案 5 :(得分:13)

根据Spencer Rathbun的回答,使用bash:

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

答案 6 :(得分:11)

ss -tl4 '( sport = :22 )'

2ms足够快?

添加冒号,这适用于Linux

答案 7 :(得分:5)

这是适用于Mac和Linux的产品:

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

答案 8 :(得分:5)

nc -l 8000

其中8000是端口号。如果端口是空闲的,它将启动一个可以轻松关闭的服务器。如果不是,则会抛出错误:

nc: Address already in use

答案 9 :(得分:5)

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

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

在此示例中,我想检查端口 8080 是否在主机 test2.host.com上打开

答案 10 :(得分:1)

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.

答案 11 :(得分:0)

您也可以使用netcat命令

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

nc -zv [ip] [port]

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

答案 12 :(得分:-1)

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

即可

您可以从本地或远程服务器使用它。 它还可以帮助您识别防火墙是否阻止访问。