哪个终端命令仅获取IP地址,而没有其他内容?


117

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

在Unix终端中是否有一种简单的方法来获取IP地址而不是进行浏览ifconfig


是的,或者我想知道的有关该机器的任何其他唯一标识符。
梅森

1
您在主机名-i上获得无效的选项?

4
主机名不如ifconfig可靠
joel

2
乔尔是对的,特别是您在谈论MAC OS和Ubuntu的时候
zackaryka

2
浏览以下答案时,请记住,使用的输出ip -o address要比使用的输出容易得多ip address
jlh

Answers:


177

您可以编写仅返回IP的脚本,例如:

/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'

对于MAC:

ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d\  -f2

或用于linux系统

hostname -i | awk '{print $3}' # Ubuntu 

hostname -i # Debian

4
hostname -i在我的身上它会返回:::1 127.0.1.1 192.168.1.100
宙斯之书

1
在Debian上,我只有一个IP。因此,使用hostname不是便携式的。
Timofey Stolbov 2011年

1
它说-i和-I都是非法选项
Mason

3
总结:第一种方法取决于适配器,但并不总是相同。对我来说,第二个显示两个IP地址,后两个在Mac上不起作用。
马特

4
ifconfig在这里已过时且不可靠,例如grep在debian 9(拉伸)上失败,因为它不再输出“ inet addr:172.17.0.4”,而仅输出“ inet 172.17.0.4”。如stackoverflow.com/a/26694162/72717中所述,使用“ ip”代替。
jamshid

61

这将为您提供所有IPv4接口,包括环回127.0.0.1:

ip -4 addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}'

这只会显示eth0

ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'

这样,您就可以获取IPv6地址:

ip -6 addr | grep -oP '(?<=inet6\s)[\da-f:]+'

eth0IPv6:

ip -6 addr show eth0 | grep -oP '(?<=inet6\s)[\da-f:]+'

grep -oPbusybox v1.24.1上的失败:无效选项-P
Pro Backup,

1
grep几乎没有安装在每个docker conatiner for prod上。因此,尽管这些都是很好的命令,但它们在容器上不会有用:-(
AndyGee

1
对于我的特殊情况的最佳答案。您需要-P为Perl正则表达式进行切换,否则我们将无法使用lookbehind (?<=inet\s)令牌。您可以通过运行grep -oe 'inet [0-9\.]\+'或获得类似的结果,grep -oe 'inet6 [0-9a-f:]\+'但是通过这种方式,我无法摆脱第一个单词。在SuSE man grep报告中,该-P标志是实验性的。
豪尔赫·贝隆19'Mar

这是最好的答案。在大多数操作系统上,ifconfig已经过时了几年。
pozcircuitboy

2
第二个命令的简短版本:ip -4 a show eth0 | grep -Po 'inet \K[0-9.]*'
tukusejssirs

40

通常,永远不能保证系统只有一个IP地址,例如,您可以同时具有以太网和wlan连接,并且如果您具有活动的VPN连接,则将拥有另一个IP地址。

的Linux

在Linux上,hostname -I将列出当前IP地址。依靠它总是只返回一个IP地址在某些情况下(即VPN链接已建立)很可能无法按预期工作,因此一种更可靠的方法是将结果转换为数组,然后遍历元素:

ips=($(hostname -I))

for ip in "${ips[@]}"
do
    echo $ip
done

OSX

在OSX上,如果您知道接口,则可以使用:

~$ ipconfig getifaddr en0
192.168.1.123

它将返回IP地址。

或者,您可以循环搜索可能的接口名称,以后缀开头en

for NUMBER in $(seq 0 5); do
    ip=`ipconfig getifaddr en$NUMBER`
    if [ -n "$ip" ]; then
        myip="$ip"
        break
    fi
done

echo $myip

此外,如果同时建立了电缆和wifi连接,一台计算机具有多个以太网接口或存在VPN隧道,则获取IP地址变得不确定。

获取外部IP

如果需要外部IP,则可以查询文本模式服务,例如curl https://ipecho.net/plain将返回纯文本外部 IP。

获取外部IP的更快方法是查询已知的DNS服务器:

dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short

如何获得局域网的IP地址?
diEcho

17
hostname -I  

该命令将为您提供在Ubuntu中所需的确切IP地址。


与已经存在的(和高票数)答案相比,我认为这个答案不会增加任何价值……
Mischa

4
也在Centos主机名-I(大写i)上
zzapper

1
这实际上对我有所帮助
著名的

2
同样,这无需额外的工具即可完美完成工作,无需连续调用十五个二进制文件来清理输出。谢谢 !
Ulrar

11

在最新的Ubuntu版本(14.04-16.04)上,此命令对我有用

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

1
在手册页上:“ [...]此选项枚举了所有网络接口上的所有已配置地址。[...]不对输出顺序进行任何假设。” 最后一句话告诉您,print $1可能会或可能不会给您正确的结果。
0 0

7

如果您的环境有限,则可以使用以下命令:

ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1

3
甚至:ip -o -4 addr show dev eth0 | cut -d' ' -f7 | cut -d'/' -f1
何塞·奥尔本'18

是的,你是对的。但是请注意,如果eth0具有多个IP地址,则将显示所有这些IP地址。
caglar

bash-4.4#ip -4 addr show dev eth0 | grep inet | tr -s“” | 切-d“” -f3 | 头-n 1 172.17.0.3/16所以对/ 16
不好-AndyGee

在循环中再添加一个:ip -4 addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1。对于v4和v6:ip addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1
Sumit Murari

如果接口名称未知(或平台之间有所不同),但您搜索私有 IP地址,则不要ip -4 addr show eth0 | grep inet执行以下操作:ip -4 addr show | grep 192
cyberbird

6

要仅获取Mac OS X上的IP地址,可以键入以下命令:

ipconfig getifaddr en0

4

命令ifconfig已被弃用,您应该ip在Linux上使用命令。

ip a可以使您的示波器与IP处于同一行,因此更易于使用。

此命令将显示您的全局(外部)IP:

ip a | grep "scope global" | grep -Po '(?<=inet )[\d.]+'

所有IPv4(也是127.0.0.1):

ip a | grep "scope" | grep -Po '(?<=inet )[\d.]+'

所有IPv6(也:: 1):

ip a | grep "scope" | grep -Po '(?<=inet6 )[\da-z:]+'

4

我们只需要简单地使用2个命令(ifconfig + awk)就可以获取我们想要的IP(v4),如下所示:

在Linux上,假设要从eth0接口获取IP地址,请运行以下命令:

/sbin/ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'

在OSX上,假设要从en0接口获取IP地址,请运行以下命令:

/sbin/ifconfig en0 | awk '/inet /{print $2}'

要了解我们的公共/外部IP,请在 ~/.bashrc

whatismyip () {
    curl -s "http://api.duckduckgo.com/?q=ip&format=json" | jq '.Answer' | grep --color=auto -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
}

然后跑 whatismyip


4

要仅打印的IP地址eth0,而不打印其他文本:

ifconfig eth0 | grep -Po '(?<=inet )[\d.]+'

要确定您的主接口(因为它可能不是“ eth0”),请使用:

route | grep ^default | sed "s/.* //"

以上两行可以合并为一个命令,如下所示:

ifconfig `route | grep ^default | sed "s/.* //"` \
  | grep -Po '(?<=inet )[\d.]+'

3

我想要一个简单的东西作为Bash别名。我发现hostname -I最适合我的主机名(主机名v3.15)。hostname -i出于某种原因返回了回送IP,但hostname -I为我提供了wlan0的正确IP,而不必通过grep或awk传递输出。缺点是,如果有多个IP,hostname -I则会输出所有 IP。


2

在Mac上可以做到这一点:

ping $(ifconfig en0 | awk '$1 == "inet" {print $2}')

ping 192.168.1.2在我的机器上解决了。

专家提示$(...)表示运行子外壳程序中括号内的内容,并将其作为值返回。


2

man hostname一种更简单的方法中,它自动排除回送IP,并仅显示所有分配给主机ip地址的空格分隔的列表:

root@srv:~# hostname --all-ip-addresses
11.12.13.14 192.168.15.19 

root@srv:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
   inet6 ::1/128 scope host 
   valid_lft forever preferred_lft forever
2: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
  link/void 
  inet 11.12.13.14/32 scope global venet0:0
  inet 192.168.15.19/32 scope global venet0:1

2

您还可以使用以下命令:

ip route | grep src

注意:仅当您可以连接到Internet时,这才起作用。


2

几个答案似乎是使用较新的ip命令(替代ifconfig),所以这里是一个用途ip addrgrep以及awk简单地打印与相关联的IPv4地址wlan0的接口:

ip addr show wlan0|grep inet|grep -v inet6|awk '{print $2}'|awk '{split($0,a,"/"); print a[1]}'

虽然不是最紧凑或花哨的解决方案,但(可以说)它很容易理解(请参阅下面的说明),并可以出于其他目的进行修改,例如像这样获得MAC地址的最后3个八位字节:

ip addr show wlan0|grep link/ether|awk '{print $2}'|awk '{split($0,mac,":"); print mac[4] mac[5] mac[6]}'

说明: ip addr show wlan0输出与名为的网络接口关联的信息wlan0,该信息应与此类似:

4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether dc:a6:32:04:06:ab brd ff:ff:ff:ff:ff:ff
    inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::d340:5e4b:78e0:90f/64 scope link 
       valid_lft forever preferred_lft forever

接下来,grep inet过滤掉包含“ inet6” (IPv4和IPv6配置)grep -v inet6的行,并过滤掉包含“ inet6” 的其余行,这将导致这样的一行:

    inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0

最后,第一个awk提取“ 172.18.18.1/24”字段,第二个删除网络掩码的简写,仅保留IPv4地址。

另外,我认为值得一提的是,如果您正在编写脚本,那么通常会有许多功能更丰富和/或更强大的工具来获取此信息,您可能希望改用这些工具。例如,如果使用Node.js,则为ipaddr-linux,如果使用Ruby,则为linux-ip-parser,等等。

另请参见/unix/119269/how-to-get-ip-address-using-shell-script



1

这是我的版本,您可以在其中传递按优先级排序的接口列表:

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”。


1

我总是在最意想不到的时间需要这个,并且一定会在SO上寻找这样的线程。因此,我写了一个简单的脚本通过netstat获取IPv4地址,称为echoip- 您可以在此处找到它。网络地址的重击看起来像这样,它也从ipecho.net获取您的公共地址:

IPV4='\d+(\.\d+){3}'
INTERFACES=`netstat -i | grep -E "$IPV4" | cut -d ' ' -f 1`
INTERFACE_IPS=`netstat -i | grep -oE "$IPV4"`

for i in "${!INTERFACES[@]}"; do
  printf "%s:\t%s\n" "${INTERFACES[$i]}" "${INTERFACE_IPS[$i]}"
done

echoip脚本产生如下输出:

$ echoip
public: 26.106.59.169
en0:    10.1.10.2

1

使用这一行脚本: 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,2017年

1

我宁愿不要awk在脚本中使用诸如此类,ip也可以选择以JSON输出。

如果不进行操作,$interface那么您将获得所有IP地址:

ip -json addr show $interface | \
  jq -r '.[] | .addr_info[] | select(.family == "inet") | .local'

我喜欢ip结构的json结构格式的命令结果的方式。这是获取与上述类似的IP地址的另一种方法 bash ip -j addr show eth0 | jp "[0].addr_info[?family== 'inet'].local | [0]"
Jack Liu Shurui

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

显示您的所有IP


0

在Redhat 64bit上,这为我解决了问题。

ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'

或这样:curl ifconfig.me
Statham

0
#!/bin/sh
# Tested on Ubuntu 18.04 and Alpine Linux 
# List IPS of following network interfaces:
# virtual host interfaces
# PCI interfaces
# USB interfaces
# ACPI interfaces
# ETH interfaces
for NETWORK_INTERFACE in $(ls /sys/class/net -al | grep -iE "(/eth[0-9]+$|vif|pci|acpi|usb)" | sed -E "s@.* ([^ ]*) ->.*@\1@"); do 
    IPV4_ADDRESSES=$(ifconfig $NETWORK_INTERFACE | grep -iE '(inet addr[: ]+|inet[: ]+)' | sed -E "s@\s*(inet addr[: ]+|inet[: ]+)([^ ]*) .*@\2@")
    IPV6_ADDRESSES=$(ifconfig $NETWORK_INTERFACE | grep -iE '(inet6 addr[: ]+|inet6[: ]+)' | sed -E "s@\s*(inet6 addr[: ]+|inet6[: ]+)([^ ]*) .*@\2@")
    if [ -n "$IPV4_ADDRESSES" ] || [ -n "$IPV6_ADDRESSES" ]; then
        echo "NETWORK INTERFACE=$NETWORK_INTERFACE"
        for IPV4_ADDRESS in $IPV4_ADDRESSES; do 
            echo "IPV4=$IPV4_ADDRESS"
        done
        for IPV6_ADDRESS in $IPV6_ADDRESSES; do 
            echo "IPV6=$IPV6_ADDRESS"
        done
    fi
done

0

在NATed主机上查找外部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" "

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

hostname -i


-1
curl ifconfig.co 

这仅返回系统的IP地址。


1
这需要有效的Internet连接,并会返回您公开显示的IP地址,该IP地址可能是您想要的,也可能不是。
jlh

-2

我将使用Hostname -LIP来获取脚本中的变量。


也许您是想说hostname -i还是hostname -I
jlh

user@linux:~$ Hostname -L -bash: Hostname: command not found user@linux:~$ 1.资本H错误2.没有-L
萨布丽娜(Sabrina)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.