哪个终端命令只获得IP地址而没有别的?

Mas*_*son 101 unix shell ip-address

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

在unix终端中是否有一种简单的方法来获取IP地址,而不是通过查找ifconfig

Boo*_*eus 150

你可以编写一个只返回IP的脚本:

/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

对于MAC:

ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d\  -f2
Run Code Online (Sandbox Code Playgroud)

或者对于linux系统

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

hostname -i # Debian
Run Code Online (Sandbox Code Playgroud)

  • 我的`hostname -i`返回:`:: 1 127.0.1.1 192.168.1.100` (4认同)
  • ifconfig在这里已被弃用且不可靠,例如grep在debian 9(拉伸)上失败,因为它不再输出“ inet addr:172.17.0.4”,而仅输出“ inet 172.17.0.4”。如/sf/answers/1868591371/所述,使用“ ip”代替。 (4认同)
  • 用主机名awk?为什么? (3认同)
  • 总结:第一种方法取决于适配器,它并不总是相同的.对我来说,第二个显示两个IP地址,最后两个在Mac上不起作用. (3认同)

SAM*_*SAM 46

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

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

这只会显示eth0:

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

这样你就可以获得IPv6地址:

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

只有eth0IPv6:

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

  • 第二个命令的简短版本:`ip -4 a show eth0 | grep -Po 'inet \K[0-9.]*'` (3认同)
  • 针对我的具体情况的最佳答案。Perl 正则表达式需要 `-P` 开关,否则我们无法使用后视 `(?&lt;=inet\s)` 标记。您可以通过运行 `grep -oe 'inet [0-9\.]\+'` 或 `grep -oe 'inet6 [0-9a-f:]\+'` 获得类似的结果,但这样我就可以'不要去掉第一个词。在 SuSE 中,“man grep”报告“-P”标志是实验性的。 (2认同)
  • 当使用 ip 命令的 -br(简短)开关时,您可以摆脱正则表达式:`ip -4 -br addr show eth0 | awk '{print $3}'` (2认同)

ccp*_*zza 33

通常,系统永远不会保证只有一个IP地址,例如,您可以同时拥有以太网和Wlan连接,如果您有一个活动的VPN连接,那么您将拥有另一个IP地址.

Linux的

在Linux上,hostname -I将列出当前的IP地址.依赖于它总是只返回一个IP地址很可能在某些情况下不能正常工作(即VPN链接已启动),因此更可靠的方法是将结果转换为数组,然后循环遍历元素:

ips=($(hostname -I))

for ip in "${ips[@]}"
do
    echo $ip
done
Run Code Online (Sandbox Code Playgroud)

OSX

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

~$ ipconfig getifaddr en0
192.168.1.123
Run Code Online (Sandbox Code Playgroud)

这将返回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
Run Code Online (Sandbox Code Playgroud)

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

获得外部IP

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


Vig*_*eth 11

hostname -I  
Run Code Online (Sandbox Code Playgroud)

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

  • 也在Centos主机名-I(大写i) (4认同)
  • 同样,这可以完美地完成工作,无需额外的工具,也无需连续调用十五个二进制文件来清理输出。谢谢 ! (2认同)

小智 10

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

ipconfig getifaddr en0
Run Code Online (Sandbox Code Playgroud)


Da *_*Kid 10

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

hostname -I | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

  • 从手册页:“[...]此选项枚举所有网络接口上的所有配置地址。[...]不要对输出的顺序做出任何假设”。最后一句告诉您“print $1”可能会也可能不会给您正确的结果。 (3认同)

Tal*_*ion 10

我不喜欢在脚本中使用awk此类。ip可以选择以 JSON 格式输出。

如果省略,$interface您将获得所有 IP 地址:

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


cag*_*lar 7

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

ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1
Run Code Online (Sandbox Code Playgroud)

  • 甚至:`ip -o -4 addr show dev eth0 | 切-d'' - f7 | cut -d'/' - f1` (3认同)

use*_*706 6

ip -4 addr show eth0在某些机器上不起作用。例如,我收到此错误: ip: symbol lookup error: ip: undefined symbol: bpf_program__section_name, version LIBBPF_0.2.0

这对我有用:

/sbin/ifconfig eth0 | grep 'inet ' | awk '{ print $2}'
Run Code Online (Sandbox Code Playgroud)

这比接受的答案少了一个管道。另外,我的 ifconfig 输出没有inet addr.

要获取 IPv6 地址,请使用以下命令:

/sbin/ifconfig eth0 | grep 'inet6 ' | awk '{ print $2}'
Run Code Online (Sandbox Code Playgroud)


And*_*eno 5

我想要一些简单的东西作为 Bash 别名。我发现这hostname -I最适合我(主机名 v3.15)。hostname -i由于某种原因返回环回 IP,但hostname -I为我提供了 wlan0 的正确 IP,并且无需通过 grep 或 awk 管道输出。缺点是如果您有多个 IP,hostname -I则会输出所有IP。


Nux*_*Nux 5

命令ifconfig已删除,您应该ip在Linux上使用命令.

同时ip a会给你范围在同一行的IP所以它更容易使用.

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

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

所有IPv4(也是127.0.0.1):

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

所有IPv6(也是:: 1):

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


per*_*oud 5

只打印 的 IP 地址eth0,不打印其他文本:

ifconfig eth0 | grep -Po '(?<=inet addr:)[\d.]+'
Run Code Online (Sandbox Code Playgroud)

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

route | grep ^default | sed "s/.* //"
Run Code Online (Sandbox Code Playgroud)

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

ifconfig `route | grep ^default | sed "s/.* //"` \
  | grep -Po '(?<=inet addr:)[\d.]+'
Run Code Online (Sandbox Code Playgroud)


iX3*_*iX3 5

几个答案似乎是使用较新的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]}'
Run Code Online (Sandbox Code Playgroud)

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

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

说明: 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
Run Code Online (Sandbox Code Playgroud)

接着grep inet过滤器的行数不包含“INET”(IPv4和IPv6配置)和grep -v inet6过滤出各剩余行的是含有“INET6”,这将导致这样的一个单条线:

    inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0
Run Code Online (Sandbox Code Playgroud)

最后,第一个awk提取“172.18.18.1/24”字段,第二个删除网络掩码速记,只留下 IPv4 地址。

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

另见https://unix.stackexchange.com/questions/119269/how-to-get-ip-address-using-shell-script


小智 5

ip addr,最短的方法

ip -4 -br addr show enp1s0 | awk -F" " '{print $3}'|cut -d'/' -f1

或缩短

ip -4 -br a s enp1s0 | awk -F" " '{print $3}'|cut -d'/' -f1

必须在大多数现代 Linux 发行版中工作


Far*_*had 5

Ubuntu(以及Debian之类的发行版)上

要仅获取本地地址数字,请执行以下命令:

hostname -I | awk '{print $1}' 
Run Code Online (Sandbox Code Playgroud)

要全面了解网络接口配置和全局 IP 地址使用情况:

curl -4 icanhazip.com
curl  ifconfig.co //this responds faster
Run Code Online (Sandbox Code Playgroud)

要深入了解任何 IP 地址(包括您自己的 IP 地址)的奥秘:

 whois $(curl ifconfig.co)   
Run Code Online (Sandbox Code Playgroud)

确保您已whois安装该工具。如果没有,只需执行:

sudo apt-get install whois
Run Code Online (Sandbox Code Playgroud)