高效地testingLinux上的端口是否打开(没有nmap或netcat)

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

我已经尝试了几个选项,但是我想要一些东西:
1. lsof -i :445 (以秒为单位)
2. netstat -an |grep 445 |grep LISTEN (需要秒)
3. telnet (不返回)
4. nmapnetcat在服务器上不可用

这将是很高兴知道一种方式,不列举第一次,然后greps。

我最近发现的一个惊喜是,Bash原生支持TCP连接作为文件描述符 。 使用:

 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。 5有时被Bash用于subprocess ,所以3,4,6,7,8和9应该是安全的。

根据下面的注释,testing脚本中的本地服务器上的侦听:

 exec 6<>/dev/tcp/127.0.0.1/445 || echo "No one is listening!" exec 6>&- # close output connection exec 6<&- # close input connection 

要确定是否正在收听,请尝试通过回送进行连接。 如果失败,则港口closures,或者我们不允许进入。 之后,closures连接。

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

你可以这样使用netstat来获得更快的结果:

在Linux上:

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

在Mac上:

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

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

这里有一个很短的“快速回答”: 如何testing是否从Shell脚本打开远程TCP端口?

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

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

你可以使用netcat来做到这一点。

 nc ip port < /dev/null 

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

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

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

他们列在/ proc / net / tcp中。

它是第二列,在“:”之后,在hex:

 > 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第三列中的:50必须是stackoverflow:o)

查看man 5 proc了解更多详情。 和sed等分开挑选留下作为一个温和的读者的练习…

 ss -tl4 '( sport = :22 )' 

2ms足够快吗?

添加冒号,这在Linux上的作品

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

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

这是一个适用于Mac和Linux的应用程序:

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

8000是端口号码。 如果端口是免费的,它将启动一个服务器,您可以轻松closures。 如果不是,它会抛出一个错误:

 nc: Address already in use 

我想检查一个端口是否在我们的一个linuxtesting服务器上打开。 我能够做到这一点,试图从我的开发机器连接到testing服务器的telnet。 在你的开发机器上尝试运行:

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

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

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

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

如果您使用iptables,请尝试:

 iptables -nL 

要么

 iptables -nL | grep 445