菜鸟科技网

Linux下如何快速获取本机IP地址?

在Linux系统中,获取本机IP地址是日常运维和开发中常见的操作,其方法因需求场景(如查看内网IP、公网IP、特定网卡IP等)而异,本文将系统介绍多种获取IP地址的命令及使用场景,涵盖传统工具与现代化方案,并结合实例说明,帮助用户根据实际需求选择合适的方法。

Linux下如何快速获取本机IP地址?-图1
(图片来源网络,侵删)

基础命令:查看网络接口与IP地址

Linux中IP地址的获取通常通过网络接口配置信息实现,核心工具包括ip命令、ifconfig命令等,其中ip命令是现代Linux系统(如CentOS 7+、Ubuntu 18.04+)的推荐工具,ifconfig则多用于旧系统或兼容场景。

ip命令:现代网络配置工具

ip命令是iproute2套件的核心工具,用于取代传统的ifconfig,功能更强大,支持更丰富的网络参数配置与查询,其基本语法为ip [选项] 对象 {命令 | help},获取IP地址主要通过ip addrip a(简写形式)实现。

基本用法

ip addr

或简写:

Linux下如何快速获取本机IP地址?-图2
(图片来源网络,侵删)
ip a

输出解析
执行命令后,系统会列出所有网络接口的详细信息,包括接口名称(如eth0ens33lo)、MAC地址、IPv4地址、IPv6地址等,以下是一个典型输出示例:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:12:34:56 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3eff:fe12:3456/64 scope link 
       valid_lft forever preferred_lft forever
  • 接口名称lo为回环接口(本地测试使用),eth0为以太网接口(名称可能因系统或虚拟化技术不同,如ens33enp0s3等)。
  • IPv4地址inet后跟随的是IPv4地址及子网掩码(如168.1.100/24/24表示子网掩码255.255.255.0)。
  • IPv6地址inet6后跟随的是IPv6地址(如fe80::216:3eff:fe12:3456/64)。

常用进阶选项

  • 指定接口查看:若只需查看特定接口(如eth0)的IP,可结合grep过滤:
    ip addr show eth0

    或简写:

    ip a show eth0
  • 仅显示IPv4地址:通过grepawk提取关键信息:
    ip a | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1

    输出结果为所有接口的IPv4地址(每行一个),如:

    Linux下如何快速获取本机IP地址?-图3
    (图片来源网络,侵删)
    0.0.1
    192.168.1.100
  • 仅显示非回环接口的IPv4地址:过滤掉lo接口:
    ip a | grep 'inet ' | grep -v 'lo' | awk '{print $2}' | cut -d'/' -f1

ifconfig命令:传统网络工具

ifconfignet-tools套件中的工具,曾在Linux系统中广泛使用,但部分现代发行版(如Ubuntu 22.04+、CentOS 9+)默认不再安装,需手动安装(sudo apt install net-toolssudo yum install net-tools)。

基本用法

ifconfig

输出解析
输出结构与ip addr类似,但格式略有不同,以下是一个典型示例:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.100  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::216:3eff:fe12:3456  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:12:34:56  txqueuelen 1000  (Ethernet)
        RX packets 12345  bytes 1234567 (1.2 MB)
        TX packets 6789  bytes 789012 (789.0 KB)
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.255.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        TX packets 0  bytes 0 (0.0 B)
  • IPv4地址inet后直接跟随IP地址,netmask为子网掩码(如255.255.0)。
  • 接口状态flags=4163<UP,BROADCAST,RUNNING,MULTICAST>UP表示接口已启用。

常用进阶选项

  • 指定接口查看
    ifconfig eth0
  • 仅显示IPv4地址
    ifconfig | grep 'inet ' | awk '{print $2}'

    输出结果为所有接口的IPv4地址(每行一个),如:

    168.1.100
    127.0.0.1

查看公网IP地址

上述方法获取的是内网IP(私有IP),若需获取本机在互联网中的公网IP(如路由器分配的动态IP或服务器弹性IP),需通过外部服务查询,常用方法包括curlwget等命令访问第三方API。

使用curl命令

curl是常用的命令行工具,支持HTTP、HTTPS等协议,可通过访问提供公网IP查询的网站获取IP。

常用API及用法

  • ipinfo.io(返回JSON格式,含IP、位置等信息):

    curl ipinfo.io

    输出示例:

    {
      "ip": "203.0.113.100",
      "hostname": "example.com",
      "city": "Beijing",
      "region": "Beijing",
      "country": "CN",
      "loc": "39.9042,116.4074",
      "org": "AS12345 Example ISP"
    }

    若仅需IP地址,可结合jq工具解析JSON(需提前安装jqsudo apt install jqsudo yum install jq):

    curl ipinfo.io | jq -r '.ip'
  • ifconfig.me(返回纯文本IP):

    curl ifconfig.me

    输出为纯文本IP,如:

    0.113.100
  • ip.sb(支持IPv4/IPv6,返回纯文本):

    curl ip.sb

    或指定IPv6:

    curl -6 ip.sb

使用wget命令

wget是另一种常用的下载工具,若系统未安装curl,可通过wget实现类似功能。

基本用法

wget -qO- ifconfig.me
  • -q:安静模式,不输出下载进度。
  • -O-:将输出重定向到标准输出(屏幕)。

输出结果为纯文本公网IP,如:

0.113.100

其他辅助工具与场景化方法

hostname命令:查看主机名与IP关联

hostname命令可查看或设置主机名,通过-I选项可快速获取本机所有非回环接口的IP地址(IPv4/IPv6)。

用法

hostname -I

输出示例(多个IP以空格分隔):

168.1.100 10.0.0.200 fe80::216:3eff:fe12:3456

若仅需IPv4,可结合awk处理:

hostname -I | awk '{print $1}'

nmcli命令:NetworkManager命令行工具

对于使用NetworkManager管理网络的系统(如Ubuntu Desktop、Fedora),nmcli可查看网络连接状态及IP信息。

基本用法

nmcli device show

输出示例:

GENERAL.DEVICE:                         eth0
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         00:16:3E:12:34:56
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (connected)
GENERAL.CONNECTION:                     Wired connection 1
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/1
IP4.ADDRESS[1]:                         192.168.1.100/24
IP4.GATEWAY:                            192.168.1.1
IP4.DNS[1]:                             8.8.8.8
IP4.DNS[2]:                             8.8.4.4
IP6.ADDRESS[1]:                         fe80::216:3eff:fe12:3456/64
IP6.GATEWAY:                            --

若仅需查看IPv4地址,可过滤:

nmcli device show | grep 'IP4.ADDRESS' | awk '{print $2}'

虚拟化与容器场景

在虚拟机(如VMware、KVM)或容器(如Docker)中,获取IP需注意接口名称差异:

  • Docker容器:容器内执行ip aifconfig查看容器IP(如eth0);宿主机可通过docker inspect <容器ID> | grep IPAddress查看容器IP。
  • KVM虚拟机:虚拟机内获取IP方式与物理机相同;宿主机可通过virsh domiflist <虚拟机名称>查看虚拟机网络接口,再结合ip a过滤。

常见命令对比与选择

为方便用户根据场景选择工具,以下表格对比了常用命令的特点:

命令 功能 适用场景 是否需要安装
ip addr 查看所有网络接口的IP/IPv6/状态 现代Linux系统(推荐) 系统自带(iproute2)
ifconfig 查看网络接口IP及状态 旧系统或兼容场景 需安装net-tools
hostname -I 快速获取非回环接口IP 脚本中快速提取IP 系统自带
curl ipinfo.io 获取公网IP及详细信息 需公网IP的场景 需安装curl
nmcli 查看NetworkManager管理的网络信息 使用NetworkManager的系统 系统自带(通常已安装)

相关问答FAQs

问题1:为什么执行ifconfig命令提示“command not found”?
解答:ifconfig属于net-tools套件,部分现代Linux发行版(如Ubuntu 22.04+、CentOS 9+)默认不再安装该工具,解决方法有两种:

  1. 安装net-tools
    • Debian/Ubuntu系统:sudo apt update && sudo apt install net-tools
    • CentOS/RHEL系统:sudo yum install net-tools
  2. 使用替代命令ip addr(推荐),该命令是现代Linux系统的标准工具,功能更强大且无需额外安装。

问题2:如何通过脚本获取本机IPv4地址并赋值给变量?
解答:在Shell脚本中,可通过命令替换()将命令输出赋值给变量,以下是两种常用方法:

  1. 使用ip命令(推荐,兼容现代系统):
    local_ip=$(ip a | grep 'inet ' | grep -v 'lo' | awk '{print $2}' | cut -d'/' -f1)
    echo "本机IPv4地址: $local_ip"
  2. 使用hostname命令(简洁,但可能返回多个IP):
    local_ip=$(hostname -I | awk '{print $1}')
    echo "本机IPv4地址: $local_ip"

    若需确保获取指定接口(如eth0)的IP,可修改为:

    local_ip=$(ip a show eth0 | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1)
分享:
扫描分享到社交APP
上一篇
下一篇