📜  linux 中的自由端口 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 14:43:57.368000             🧑  作者: Mango

Linux 中的自由端口

在 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}}'

这个命令的意义如下:

  1. sudo netstat -tln:列出所有 TCP 的监听端口,不解析名字(因为我们只需要端口号);
  2. awk '{print $4}':用 awk 提取出监听状态的 TCP 链接中的第 4 列,格式为 IP:PORT;
  3. awk -F: '{print $NF}':用 awk 工具以 ':' 为分隔符把监听状态中的端口号部分提取出来;
  4. sort -n:把端口号按数值大小排序;
  5. uniq -c:把重复的端口号过滤,同时输出每个端口号的重复次数;
  6. 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 中查找和使用自由端口的方法。记得在使用自由端口时,要确保端口未被占用,否则会导致服务无法正常启动。