如何使用终端命令只获取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个回答

0
在Redhat 64位系统上,这个方法解决了我的问题。
ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'

请返回翻译后的文本:curl ifconfig.me - Statham

0
如果您的意思是“Linux”并且可移植到嵌入式Linux操作系统:
ip route get 8.8.8.8 | head -n 1 | tr -s ' ' | cut -d ' ' -f 7

这样可以避免调用awk,因为并非所有嵌入式Linux都安装了它。Awk是一个比较繁重的进程,仅仅为了从字符串中获取一个字段。

每个Linux环境都会提供tr、head和cut。如果嵌入式环境真的很老,可能只有'ifconfig',但你明白这里的意思:获取行,去除填充,截取所需内容。


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

如果您不想使用 ifconfig 或正则表达式...

ip addr | grep eth0 | grep inet | awk '{print $2}' | cut -d"/" -f1

-2
curl ifconfig.co 

这将仅返回您系统的IP地址。


1
这需要一个可用的互联网连接,并将返回您公开可见的IP地址,这可能是您想要的,也可能不是。 - jlh
如果系统通过NAT连接到互联网,则仅返回公共地址而不是系统网络接口的地址。 - SePeF

-4
我会使用Hostname -L命令来获取IP地址,并将其作为脚本中的变量使用。

也许你想说的是 hostname -i 或者 hostname -I - jlh
user@linux:~$ Hostname -L -bash: Hostname: command not found user@linux:~$
  1. Capital H is wrong
  2. No such -L
- user9013730

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