从一个bash脚本如何快速查找端口445是否在服务器上打开/监听。

我已经试过几个办法了,但我想快点: 1. lsof -i:445(需要数秒) 2. netstat -an |grep 445 |grep LISTEN(需要数秒) 3.Telnet(不返回) 4. 服务器上没有Nmap、netcat

知道一种不先枚举然后再grep的方法将会很好。


当前回答

你可以使用netcat。

nc ip port < /dev/null

连接到服务器,然后直接重新关闭连接。如果netcat不能连接,它将返回一个非零退出码。退出码存储在变量$?举个例子,

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

当且仅当netcat成功连接到端口时返回0。

其他回答

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

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

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

如果端口是开放的,返回“0”,如果端口是关闭的,返回“1”

e.g.

nc -z 127.0.0.1 80; echo $?

-z指定nc只扫描监听守护进程, 没有发送任何数据给他们。使用此选项是错误的 conjunc - 带有-l选项的Tion。

下面是一个适用于Mac和Linux的方法:

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

基于Spencer Rathbun的回答,使用bash:

true &>/dev/null </dev/tcp/127.0.0.1/$PORT && echo open || echo closed
nc -l 8000

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

nc: Address already in use

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

在Linux上:

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

在Mac:

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

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