📅  最后修改于: 2023-12-03 14:43:57.368000             🧑  作者: Mango
在 Linux 系统中,有很多端口被预先分配给了一些常见协议和应用,如 HTTP 使用的 80 端口、SSH 使用的 22 端口等等。但是,有时候我们需要一个自由的端口来运行我们自己的服务或应用。本文将介绍如何找到和使用自由端口。
在 Linux 中,可以使用以下命令查看当前已经占用的端口以及占用端口的进程:
sudo netstat -tlnp
其中,参数 -tlnp
意义如下:
-t
:只显示 TCP 协议的连接;-l
:只显示监听状态的连接;-n
:以数字形式显示 IP 和端口号,而不是域名或服务名;-p
:显示占用端口的进程信息。这个命令将列出当前所有的监听状态的 TCP 连接和对应的占用端口的进程信息。如果需要查看 UDP 连接,可以把 -t
参数替换成 -u
。如果需要查看所有的连接,可以把 -l
参数去掉,因为若不加 -l
参数,netstat
会显示所有连接(包括已经建立、正在建立、等待连接的状态)。
要查找可用的自由端口,可以使用以下命令:
sudo netstat -tln | awk '{print $4}' | awk -F: '{print $NF}' | sort -n | uniq -c | awk '{if($1 == 1){print $2}}'
这个命令的意义如下:
sudo netstat -tln
:列出所有 TCP 的监听端口,不解析名字(因为我们只需要端口号);awk '{print $4}'
:用 awk 提取出监听状态的 TCP 链接中的第 4 列,格式为 IP:PORT;awk -F: '{print $NF}'
:用 awk 工具以 ':' 为分隔符把监听状态中的端口号部分提取出来;sort -n
:把端口号按数值大小排序;uniq -c
:把重复的端口号过滤,同时输出每个端口号的重复次数;awk '{if($1 == 1){print $2}}'
:只输出重复次数为 1 的端口号,也就是只输出可用的端口号。执行以上命令,会输出一些可用的端口号。
使用自由端口非常简单,只需要在你的服务或者应用中指定一个可用的端口号即可。以 Node.js 的 HTTP 服务器为例,以下代码将启动一个监听可用的自由端口的服务器:
const http = require('http')
const netstat = require('child_process').execSync('sudo netstat -tln | awk \'{print $4}\' | awk -F: \'{print $NF}\' | sort -n | uniq -c | awk \'{if($1 == 1){print $2}}\'')
const port = parseInt(netstat.toString().split('\n')[0])
http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'})
res.end('Hello World!\n')
}).listen(port)
console.log(`Server running at http://localhost:${port}/`)
这个 Node.js 服务器会在本机监听一个可用的自由端口,并返回一个 "Hello World!" 的响应。其中,我们使用了前面提到的找可用自由端口的命令来获取可用的端口号。注意,这个命令需要 sudo 权限来运行,否则可能无法获取所有的端口信息。
以上就是在 Linux 中查找和使用自由端口的方法。记得在使用自由端口时,要确保端口未被占用,否则会导致服务无法正常启动。