Answers:
使用“ netstat”检查当前使用的端口。
netstat -antp Proto Recv-Q Send-Q本地地址外部地址状态PID /程序名称 tcp 0 0 xxx.xxx.xxx.xxx 0.0.0.0:* LISTEN 16297 /命名 tcp 0 0 xxx.xxx.xxx.xxx:53 0.0.0.0:* LISTEN 16297 /命名 tcp 0 0 xxx.xxx.xxx.xxx:53 0.0.0.0:* LISTEN 16297 /命名 tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 16297 /命名
尝试
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
显示t
正在l
分配的cp端口,n
仅显示umbers (不解析名称-使其更快)并显示p
正在监听的进程(p
如果您是root用户,则仅适用)
netstat -ulnp
显示u
正在l
分配的dp端口,n
仅显示umbers (不解析名称-使其更快),并显示p
正在监听的进程(p
如果您是root用户,则仅适用)
netstat -unp
显示u
打开但未监听的dp端口,n
仅显示umbers(不解析名称-使其速度更快),并显示p
正在监听的进程(p
只有root用户才能使用)
netstat -an
显示a
正在使用的所有端口,n
仅显示数字-不解析名称
lsof -i <proto>@<host>:<port>
例如
lsof -i tcp@localhost:25
查看端口localhost 25 / TCP上是否正在侦听任何内容,或者
lsof -i tcp@0.0.0.0:636
查看是否有任何本地或远程套接字正在侦听(本地)或连接到(本地或远程)任何主机/接口
您没有提及要使用的协议,即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
如果指定了-u标志,它将使用UDP连接到abcd上的端口NN。然后,您可以在客户端输入输入,它应该显示在服务器上。如果不是这样,则需要研究系统和网络特定的工具。
这一单行代码将为您提供所有使用中的TCP端口的列表。它可以在Ubuntu和OS X上以bash运行。
netstat -ant | sed -e '/^tcp/ !d' -e 's/^[^ ]* *[^ ]* *[^ ]* *.*[\.:]\([0-9]*\) .*$/\1/' | sort -g | uniq
该列表每行只有一个端口,没有任何其他信息。
for port in $(netstat -ant | sed -e '/^tcp/ !d' -e 's/^[^ ]* *[^ ]* *[^ ]* *.*[\.:]\([0-9]*\) .*$/\1/' | sort -g | uniq); do echo EXECUTE COMMAND FOR PORT $port; done
这样做的很多方法给我带来了问题,因为它们在linux和osx上不起作用,和/或因为它们没有显示docker使用的端口或root拥有的进程。现在,我只使用此javascript程序:
(请确保您已安装节点,它与工作node
不只是nodejs
或修改相应的程序)
将以下内容保存到check-port
您的路径或项目中称为的文件中
#!/usr/bin/env node
var http = require('http');
var app = new http.Server();
app.listen(process.argv[2], () => {
process.exit(0)
});
设定权限
chmod +x path/to/check-port
从你的路跑
check-port 8080
或从同一目录运行
./check-port 8080
到目前为止,它运行良好。