Ala*_*Ali 40
为了提供另一个选项,您可以通过ip addr这种方式使用该命令来获取 IP 地址:
ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
Run Code Online (Sandbox Code Playgroud)
ip addr show eth0 显示有关的信息 eth0grep "inet\b"仅显示具有 IPv4 地址的行(如果您想要 IPv6 地址,请将其更改为"inet6\b")awk '{print $2}' 打印在具有 ipaddress/mask 的第二个字段上,例如 172.20.20.15/25cut -d/ -f1 只取 IP 地址部分。在脚本中:
#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
Run Code Online (Sandbox Code Playgroud)
Edw*_*lds 31
注意:此答案适用于较旧的系统。如果这对您不起作用,请考虑其他答案。这个答案并没有错。
将其保存在一个文件中,然后运行 bash <filename>
#!/bin/bash
ifconfig eth0 | grep "inet addr"
Run Code Online (Sandbox Code Playgroud)
更准确地获取仅显示 IP 地址的数字:
#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1
Run Code Online (Sandbox Code Playgroud)
更新:如果这对您不起作用,请尝试其他答案
更新:对于 Ubuntu 18+,请尝试:(不要忘记替换eth0为您需要 IP 的接口。感谢@ignacio)
ifconfig eth0 | grep "inet " | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)
Tho*_*ner 25
hostname -i
Run Code Online (Sandbox Code Playgroud)
但是,这可能会返回本地 IP 地址 (127.0.0.1),因此您可能必须使用并过滤:
hostname -I
Run Code Online (Sandbox Code Playgroud)
从主机名的联机帮助页:
-i, --ip-address显示主机名的网络地址。请注意,这仅在可以解析主机名时才有效。避免使用此选项;改用主机名 --all-ip-addresses。
-I, --all-ip-addresses显示主机的所有网络地址。此选项枚举所有网络接口上的所有配置地址。环回接口和 IPv6 链路本地地址被省略。与选项 -i 相反,此选项不依赖于名称解析。不要对输出的顺序做任何假设。
@markus-lindberg 的回答是我最喜欢的。如果你添加-o -4到 ip 的标志,那么你会得到一个更容易解析(和一致)的输出:
ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'
Run Code Online (Sandbox Code Playgroud)
-o代表--oneline,这意味着在这种情况下提供帮助。将-4被添加到限制的IPv4地址,这是所有其他答复暗示。
您应该使用ip(而不是ifconfig),因为它是当前的、维护的,也许最重要的是用于脚本目的,它会产生一致且可解析的输出。以下是一些类似的方法:
如果您想要以太网接口的 IPv4 地址eth0:
$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24
Run Code Online (Sandbox Code Playgroud)
作为脚本:
$ INTFC=eth0
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}')
$ echo $MYIPV4
192.168.1.166/24
Run Code Online (Sandbox Code Playgroud)
上面产生的输出采用CIDR 表示法。如果不需要 CIDR 表示法,则可以将其删除:
$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1
192.168.1.166
Run Code Online (Sandbox Code Playgroud)
恕我直言“最优雅”的另一个选项是获取用于连接到指定远程主机(在这种情况下为 8.8.8.8)的任何接口的 IPv4 地址。在此答案中由@gatoatigrado 提供:
$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166
Run Code Online (Sandbox Code Playgroud)
作为脚本:
$ RHOST=8.8.8.8
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166
Run Code Online (Sandbox Code Playgroud)
这在具有单个接口的主机上非常有效,但更有利的是也适用于具有多个接口和/或路由规范的主机。
虽然ip这是我的首选方法,但这肯定不是给这只猫剥皮的唯一方法。hostname如果您更喜欢更简单/更简洁的内容,则可以使用另一种方法:
$ hostname --all-ip-addresses | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)
或者,如果您想要 IPv6 地址:
$ hostname --all-ip-addresses | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)
作为脚本:
$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}')
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166
$ echo $MYV6IP
2601:7c1:103:b27:352e:e151:c7d8:3379
Run Code Online (Sandbox Code Playgroud)