菜鸟笔记
提升您的技术认知

Linux查询某个端口被占用的方法

Linux查询某个端口被占用的方法

Address already in use这个提示,想必大家遇到过,怎么能快速找到问题并解决呢?下面有几种姿势可以了解一下.

在对网络连接或特定于应用程序的问题进行故障排除时,首先要检查的事情之一应该是系统上实际使用了哪些端口,以及哪个应用程序正在侦听特定的端口。

本文介绍了如何使用命令找出哪些服务正在侦听哪些端口。该说明适用于所有基于Linux和Unix的操作系统,例如macOS。

什么是监听端口

网络端口由其编号,关联的IP地址和通信协议(例如TCP或UDP)的类型标识。

侦听端口是应用程序或进程在其上侦听的网络端口,充当通信端点。

每个监听端口都可以使用防火墙打开或关闭(过滤)。一般而言,开放端口是一个网络端口,它接受来自远程位置的传入数据包。

你不能让两个服务监听同一IP地址上的同一端口。

例如,如果你正在运行一个监听端口80和443的Apache Web服务器,并且尝试安装Nginx ,则后者将无法启动,因为HTTP和HTTPS端口是已经在使用中。

1:命令ss

检查监听端口

ss是新的netstat。它缺少netstat的某些功能,但是公开了更多的TCP状态,并且速度稍快。命令选项基本相同,因此从netstat到ss的转换并不困难。

要使用ss获取所有监听端口的列表,请输入:

ss -ntl

[root@app1812365 ~]# ss -ntl |grep 9090
LISTEN     0      128         :::9090                    :::*                  

2:命令netstat

netstat是一个命令行工具,可以提供有关网络连接的信息。

要列出所有正在侦听的TCP或UDP端口,包括使用端口的服务和套接字状态,请使用以下命令:

netstat -tunlp

此命令中使用的选项具有以下含义:

  • -t -显示TCP端口。
  • -u -显示UDP端口。
  • -n -显示数字地址而不是解析主机。
  • -l -仅显示监听端口。
  • -p -显示侦听器进程的PID和名称。仅当你以root用户或 sudo 用户身份运行命令时,才会显示此信息。
[root@app1812365 ~]# netstat -tanlp |grep 9090
tcp6       0      0 :::9090                 :::*                    LISTEN      60886/./sniper        

3:lsof

检查监听端口

lsof是功能强大的命令行应用程序,可提供有关进程打开的文件的信息。

在Linux中,所有内容都是文件。你可以将套接字视为写入网络的文件。

[root@app1812365 ~]# lsof -i:9090
COMMAND   PID USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
sniper  60886 root   34u  IPv6 937287521      0t0  TCP *:websm (LISTEN)

使用的选项如下:

  • -n-不要将端口号转换为端口名称。
  • -p -不解析主机名,显示数字地址。
[root@app1812365 ~]# lsof -nP -iTCP -sTCP:LISTEN
COMMAND     PID    USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
systemd       1    root   34u  IPv4   1551535      0t0  TCP *:111 (LISTEN)
systemd       1    root   36u  IPv6   1551537      0t0  TCP *:111 (LISTEN)
rpc.statd  8892 rpcuser    9u  IPv4   1552017      0t0  TCP *:48169 (LISTEN)
rpc.statd  8892 rpcuser   11u  IPv6   1552025      0t0  TCP *:33526 (LISTEN)
rpcbind   17251     rpc    4u  IPv4   1551535      0t0  TCP *:111 (LISTEN)
rpcbind   17251     rpc    6u  IPv6   1551537      0t0  TCP *:111 (LISTEN)
rpc.mount 29903    root    8u  IPv4 443337633      0t0  TCP *:892 (LISTEN)
rpc.mount 29903    root   10u  IPv6 443338326      0t0  TCP *:892 (LISTEN)
gov_defen 35507    root   56u  IPv4 782876729      0t0  TCP *:5555 (LISTEN)
sshd      47817    root    8u  IPv6 943206101      0t0  TCP [::1]:6010 (LISTEN)
sshd      47817    root    9u  IPv4 943206102      0t0  TCP 127.0.0.1:6010 (LISTEN)
sshd      49890    root    3u  IPv4  82447384      0t0  TCP *:22 (LISTEN)
sshd      49890    root    4u  IPv6  82447386      0t0  TCP *:22 (LISTEN)
sniper    60886    root   34u  IPv6 937287521      0t0  TCP *:9090 (LISTEN)
java      64932     ekp   43u  IPv4 916306241      0t0  TCP *:8080 (LISTEN)
java      64932     ekp   44u  IPv4 916306242      0t0  TCP *:8009 (LISTEN)
java      64932     ekp   46u  IPv4 916310218      0t0  TCP 127.0.0.1:8005 (LISTEN)
java      64932     ekp  486u  IPv4 916308389      0t0  TCP *:7800 (LISTEN)
[root@app1812365 ~]# lsof -nP -iTCP:9090 -sTCP:LISTEN
COMMAND   PID USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
sniper  60886 root   34u  IPv6 937287521      0t0  TCP *:9090 (LISTEN)
[root@app1812365 ~]# lsof -nP -iTCP:9090             
COMMAND   PID USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
sniper  60886 root   34u  IPv6 937287521      0t0  TCP *:9090 (LISTEN)

4:fuser

fuser命令和lsof正好相反,是查看某个文件被哪个进程占用的。Linux中,万物皆文件,所以可以查看普通文件、套接字文件、文件系统。而套接字文件就包含了端口号。比如查看9090端口。

每个进程号后面都跟随一个字母,该字母指示进程如何使用文件。

  • c:指示进程的工作目录。
  • e:指示该文件为进程的可执行文件(即进程由该文件拉起)。
  • f:指示该文件被进程打开,默认情况下f字符不显示。
  • F:指示该文件被进程打开进行写入,默认情况下F字符不显示。
  • r:指示该目录为进程的根目录
  • m:指示进程使用该文件进行内存映射,抑或该文件为共享库文件,被进程映射进内存。

语法

fuser [选项] [参数]
选项
-a:显示命令行中指定的所有文件;
-k:杀死访问指定文件的所有进程;
-i:杀死进程前需要用户进行确认;
-l:列出所有已知信号名;
-m:指定一个被加载的文件系统或一个被加载的块设备;
-n:选择不同的名称空间;
-u:在每个进程后显示所属的用户名。
参数

文件:可以是文件名或者TCP、UDP端口号。

root@ubuntu-n1:~# fuser 10050/tcp -v
                     用户     进程号 权限   命令
10050/tcp:           zabbix      765 F.... zabbix_agentd
                     zabbix      767 F.... zabbix_agentd
                     zabbix      768 F.... zabbix_agentd
                     zabbix      769 F.... zabbix_agentd
                     zabbix      770 F.... zabbix_agentd
                     zabbix      771 F.... zabbix_agentd                  

5:nmap

nmap默认总是会扫描端口,要扫描本机端口,很方便。

root@ubuntu-n1:~# nmap localhost

Starting Nmap 7.60 ( https://nmap.org ) at 2022-05-13 11:23 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000030s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 995 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
111/tcp  open  rpcbind
2049/tcp open  nfs
3306/tcp open  mysql

Nmap done: 1 IP address (1 host up) scanned in 1.67 seconds

root@ubuntu-n1:~# nmap  -v localhost

Starting Nmap 7.60 ( https://nmap.org ) at 2022-05-13 11:22 CST
Initiating SYN Stealth Scan at 11:22
Scanning localhost (127.0.0.1) [1000 ports]
Discovered open port 3306/tcp on 127.0.0.1
Discovered open port 80/tcp on 127.0.0.1
Discovered open port 22/tcp on 127.0.0.1
Discovered open port 111/tcp on 127.0.0.1
Discovered open port 2049/tcp on 127.0.0.1
Completed SYN Stealth Scan at 11:22, 1.58s elapsed (1000 total ports)
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000030s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 995 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
111/tcp  open  rpcbind
2049/tcp open  nfs
3306/tcp open  mysql

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 1.68 seconds
           Raw packets sent: 1061 (46.684KB) | Rcvd: 2127 (89.344KB)