有没有什么命令我可以从bash运行,告诉我一个端口是否已经打开?
使用“netstat”来检查目前使用的端口。
netstat -antp 原始Recv-Q发送-Q本地地址外部地址状态PID /程序名称 tcp 0 0 xxx.xxx.xxx.xxx 0.0.0.0:* LISTEN 16297 / named tcp 0 0 xxx.xxx.xxx.xxx:53 0.0.0.0:* LISTEN 16297 / named tcp 0 0 xxx.xxx.xxx.xxx:53 0.0.0.0:* LISTEN 16297 / named tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 16297 / named
这(netstat)是最快的解决scheme…
netstat -lnt
…但是这会给你更多的控制权(以速度为代价(有时候速度很快))…
lsof -n -i -a -u www-data
以上例子显示了所有打开的TCP端口处于LISTEN
状态,AND( -a
)属于Apache( www-data
)用户。
所有好的答案。
但是,如果您login到有问题的计算机,则不提。 ; p
如果没有,那么nmap是你的朋友。
对于初学者尝试:
nmap -O
target
amap也是一个不错的select,它也会尝试通过抓取横幅页面来猜测服务器软件。
对于初学者尝试:
amap
target
1-6000
尝试
lsof -i :<port number>
如果你得到了任何结果,有些东西是倾听和约束的,例如
# lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 1833 nobody 3u IPv4 51091229 0t0 TCP odessa.cheney.net:http->79.173.188.214:52918 (ESTABLISHED) nginx 1833 nobody 5u IPv4 46221856 0t0 TCP odessa.cheney.net:http->66.36.243.182:37876 (CLOSE_WAIT) nginx 1833 nobody 9u IPv4 34733048 0t0 TCP localhost.localdomain:http (LISTEN) nginx 1833 nobody 10u IPv4 34733049 0t0 TCP odessa.cheney.net:http (LISTEN) nginx 1833 nobody 14u IPv4 46221857 0t0 TCP odessa.cheney.net:http->66.36.243.182:37880 (CLOSE_WAIT) nginx 1833 nobody 15u IPv4 51091030 0t0 TCP odessa.cheney.net:http->msnbot-65-55-106-132.search.msn.com:51708 (ESTABLISHED) nginx 11832 root 9u IPv4 34733048 0t0 TCP localhost.localdomain:http (LISTEN) nginx 11832 root 10u IPv4 34733049 0t0 TCP odessa.cheney.net:http (LISTEN)
netstat -tlnp
显示正在等待的cp端口,只显示n
个成员(不parsing名称 – 使其更快),并显示正在进行侦听的程序(只有root用户才能使用p
)
netstat -ulnp
显示正在等待的dp端口,仅显示n
(不parsing名称 – 使其更快),并显示正在进行侦听的程序(只有root用户才能使用p
)
netstat -unp
显示打开但未侦听的dp端口,仅显示n
个部分(不要parsing名称 – 使其更快),并显示正在进行侦听的程序(只有root用户才能使用p
)
netstat -an
显示正在使用的端口,仅显示n
– 不parsing名称
lsof -i <proto>@<host>:<port>
例如
lsof -i tcp@localhost:25
查看是否有任何东西正在监听端口本地主机25 / TCP,或
lsof -i [email protected]:636
查看是否有本地或远程的任何套接字,无论是监听(本地)还是连接到(本地或远程)任何主机/接口
lsof(列表打开的文件)是一个很好的工具,用来查看一个进程是否在监听一个端口
lsof -P | grep:<port-number>
netstat是查看是否有任何活动连接的好工具。
netstat -n | grep:<port-number>
你没有提到你想要使用的协议,例如TCP或者UDP – 同样重要的是要认识到,“端口”不像系统支持消除套接字那样精细。 例如,如果您的系统有多个IP地址,则所有IP地址都可以使用端口80(应用程序绑定为“0.0.0.0”或“::”或连接到每个IP地址),或者可能位于仅在这些IP地址的一个子集上使用。
确定一个端口/地址是否可用并且可用的最好也是最可靠的方法是尝试绑定它。 Netcat对此很方便。
nc -l [-s abcd] -p NN
将尝试绑定到TCP端口NN上(可选,默认将所有地址)abcd添加-u选项在UDP中执行相同的操作。
接下来,要告诉您端口是否真正“打开”,您需要开始查看潜在的防火墙规则。 最简单的事情就是尝试连接到端口。 如上所述,在服务器上使用netcat,从客户端使用netcat尝试连接到您打开的端口。
nc [-u] abcd NN
将连接到abcd上的端口NN,如果指定-u标志,则使用UDP。 然后你可以input到客户端,它应该显示在服务器上。 如果没有,则需要查看系统和networking特定的工具。
我使用热熔器 (在包psmisc):
fuser -n tcp PORT
带回绑定到此端口的进程的pid 。
如果这是要知道一个端口是否正在监听,那么好的旧的telnet就会窍门:)
telnet 127.0.0.1 PORT
这一行将得到所有使用的TCP端口列表。 它在Ubuntu和OS X的bash中工作。
netstat -ant | sed -e '/^tcp/ !d' -e 's/^[^ ]* *[^ ]* *[^ ]* *.*[\.:]\([0-9]*\) .*$/\1/' | sort -g | uniq
该列表将每行有一个端口,没有任何额外的信息。