如何使用终端命令只获取IP地址而不包括其他信息?

183

我正在尝试在我编写的脚本中将IP地址(inet)作为参数使用。

在Unix终端中,是否有一种简单的方法可以仅获取IP地址,而不必查看ifconfig


是的,或者我猜可以使用任何其他关于机器的唯一标识符。 - Mason
1
你在使用 hostname -i 命令时遇到了无效选项? - Ken
是的,在Mac OS X Lion上。但事实证明我将在Ubuntu上完成它,那里它可以工作。谢谢! - Mason
4
主机名不如ifconfig可靠。 - joel
2
Joel是正确的,特别是当你谈论MAC OS和Ubuntu时。 - zackaryka
2
当浏览下面的答案时,请记住,“ip -o address”的输出比“ip address”的输出更易于处理。 - jlh
36个回答

2

使用这个一行脚本: ifconfig | grep "inet " | grep -v 127.0.0.1|awk 'match($0, /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {print substr($0,RSTART,RLENGTH)}' 在Mac和Linux(Ubuntu测试通过)都可以工作。


很好,它可以在两种情况下工作。而且,如果你知道你想要的接口,你可以使用ifconfig en0ifconfig eth1等来调用它 :) - jaygooby

2
您也可以使用以下命令:
ip route | grep src
注意:此方法仅在您连接到互联网时才有效。

如果您有多个接口,则会发出多个IP。如果您想要传出互联网连接的IP,则需要找出默认路由。 - Mikko Rantalainen

2
使用以下命令:
/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' '

2

这里是我的版本,你可以传递一个按优先级排序的接口列表:

getIpFromInterface()
{
    interface=$1
    ifconfig ${interface}  > /dev/null 2>&1 && ifconfig ${interface} | awk -F'inet ' '{ print $2 }' | awk '{ print $1 }' | grep .
}

getCurrentIpAddress(){
    IFLIST=(${@:-${IFLIST[@]}})
    for currentInterface in ${IFLIST[@]}
    do
        IP=$(getIpFromInterface  $currentInterface)
        [[ -z "$IP" ]] && continue
    echo ${IP/*:}
    return
    done
}

IFLIST=(tap0 en1 en0)
getCurrentIpAddress $@

如果我同时连接了VPN、WiFi和以太网,那么我的VPN地址(在接口tap0上)将被返回。该脚本适用于Linux和OSX,并且可以带参数,如果您想覆盖IFLIST。

请注意,如果您想使用IPV6,则必须将“inet”替换为“inet6”。


2

默认路由的IPv4地址:

ip address show $(ip route | grep "^default " | head -n1 | grep -Po "(?<=dev )[^ ]+") | grep -Po "(?<=inet )[^ /]+"

默认路由的IPv6地址:

ip address show $(ip route | grep "^default " | head -n1 | grep -Po "(?<=dev )[^ ]+") | grep -Po "(?<=inet6 )[^ /]+"

这些只需要使用命令ipgrep,并支持-P-o选项。需要使用head -1是因为当系统的网络设置足够复杂时,ip route可能会显示多个默认路由。

如果你不关心IP地址的顺序,只需执行以下命令即可:

ip route | grep -Po '(?<=src )[^ ]+'

或者

hostname --all-ip-addresses

如果存在某个系统支持ip命令但不支持grep -Po,则可以用sedawk替换它。grep -Po未被POSIX定义...但是POSIX没有定义任何网络命令,因此您无法仅使用POSIX工具来完成此操作。 - Mikko Rantalainen

1

另一种方法来完成它。

我经常需要检查各种接口(例如eth0,隧道等)的IP地址。

这就是我如何做到的:

ip -4 -br a | awk '{print $1,$3}'

输出:

$ ip -4 -br a | awk '{print $1,$3}'
lo 127.0.0.1/8
eth0 192.168.0.248/24
tun0 192.168.119.1

如果你不关心网络适配器,只需从 awk 命令中删除 $1 即可。
ip -4 -br a | awk '{print $3}'   
127.0.0.1/8
192.168.0.248/24
192.168.119.124/24

为了方便起见,我只是将其作为别名添加(记得转义$符号!)
$ alias me="ip -4 -br a | awk '{print \$1,\$3}'" 
                                                                                                                              
$ me                                            
lo 127.0.0.1/8
eth0 192.168.0.248/24
tun0 192.168.119.124/24

1

我还没有看到使用命令行工具控制NetworkManager的nmcli的任何答案。

所以这里是:

wolf@linux:~$ nmcli device 
DEVICE  TYPE      STATE        CONNECTION 
eth1    ethernet  unavailable  --         
eth0    ethernet  unmanaged    --         
lo      loopback  unmanaged    --         
wolf@linux:~$ 

如果您想从特定的网络接口获取信息(例如,本例中使用lo),请按如下操作:
wolf@linux:~$ nmcli device show lo
GENERAL.DEVICE:                         lo
GENERAL.TYPE:                           loopback
GENERAL.HWADDR:                         00:00:00:00:00:00
GENERAL.MTU:                            65536
GENERAL.STATE:                          10 (unmanaged)
GENERAL.CONNECTION:                     --
GENERAL.CON-PATH:                       --
IP4.ADDRESS[1]:                         127.0.0.1/8
IP4.GATEWAY:                            --
IP4.ROUTE[1]:                           dst = 127.0.0.0/8, nh = 0.0.0.0,>
IP4.ROUTE[2]:                           dst = 127.0.0.1/32, nh = 0.0.0.0>
IP6.ADDRESS[1]:                         ::1/128
IP6.GATEWAY:                            --
IP6.ROUTE[1]:                           dst = ::1/128, nh = ::, mt = 256
IP6.ROUTE[2]:                           dst = ::1/128, nh = ::, mt = 0, >
wolf@linux:~$ 

但是,如果您只想获取IP地址,请将输出发送到grepcutawk

让我们一步一步来。 (不确定哪里出了问题,这3个示例的代码样本格式都不起作用。)

  1. 获取IPv4行

    wolf@linux:~$ nmcli device show lo | grep 4.A IP4.ADDRESS[1]: 127.0.0.1/8 wolf@linux:~$

  2. 使用awk获取IP

    wolf@linux:~$ nmcli device show lo | awk '/4.A/ {print $2}' 127.0.0.1/8 wolf@linux:~$

  3. 使用cut删除CIDR注释(/8)

    wolf@linux:~$ nmcli device show lo | awk '/4.A/ {print $2}' | cut -d / -f1 127.0.0.1 wolf@linux:~$

您的答案在这里。

请注意,使用我刚才演示的工具有很多方法可以实现它。
让我们回顾一下我使用的命令。
nmcli device show lo | grep 4.A
nmcli device show lo | awk '/4.A/ {print $2}'
nmcli device show lo | awk '/4.A/ {print $2}' | cut -d / -f1

以下是这三个命令的示例输出

命令1的输出

IP4.ADDRESS[1]:                         127.0.0.1/8

命令2输出

127.0.0.1/8

命令3的输出

127.0.0.1

nmcli是一个不错的工具。它几乎可以在不使用辅助工具的情况下使用。请考虑使用这种更本地化/优雅的方法更新答案:nmcli -g IP4.ADDRESS device show lo | cut -d / -f 1 - Jean Spector

0

当在NAT主机上查找外部IP地址时,很多答案建议使用基于HTTP的方法,如ifconfig.me

$ curl ifconfig.me/ip

多年来,我看到许多此类网站的兴衰更替,我发现这种基于 DNS 的方法更加稳健。
$ dig +short myip.opendns.com @resolver1.opendns.com

我在我的~/.bashrc中有这个方便的别名:

alias wip='dig +short myip.opendns.com @resolver1.opendns.com'

0

以下两种方法对我有效:

获取接口eth0的IP地址。在下面的示例中,将eth0替换为您的接口名称。 ifconfig eth0 | grep -w "inet" | tr -s " " | cut -f3 -d" "

使用主机名: 这将给出您的etho的inet即IPAddress。使用-I将为所有接口提供具有此值的inet值。

hostname -i


0
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

显示所有IP地址


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接