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

5

我想要一个简单实用的Bash别名。我发现对于我来说hostname -I效果最好(hostname v3.15)。hostname -i由于某种原因返回回环IP,但是hostname -I为我提供了正确的wlan0 IP,而且不需要通过grep或awk管道输出。缺点是,如果您有多个IP,则hostname -I将输出所有 IP。


5

仅打印eth0的IP地址,不显示其他文本:

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

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

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

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

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

请注意,ifconfig输出在多个版本中不稳定。有些版本需要inet addr:,但有些版本只需要inet - Mikko Rantalainen

5

很少有答案使用新的ip命令(代替ifconfig),因此这里是一个使用ip addrgrepawk来简单打印与wlan0接口相关联的IPv4地址的方法:

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过滤掉不包含“inet”(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等。
另请参见https://unix.stackexchange.com/questions/119269/how-to-get-ip-address-using-shell-script

4

IP地址的简写方式

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发行版中使用。


4

我们可以仅使用两个命令(ifconfig + awk)来获取所需的IP地址(v4),如下所示:

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


ifconfig eth0 | awk '/inet /{print $2}'

/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
在 Mac 上,可以这样做:
ping $(ifconfig en0 | awk '$1 == "inet" {print $2}')

在我的机器上,它解析为ping 192.168.1.2

专业提示: $(...)表示在子shell中运行括号内的内容,并将其返回为值。


4

Ubuntu(和类似的Debian发行版)上

查看本地IP地址的方法:

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

查看您的全局IP地址:

curl -4 icanhazip.com
curl  ifconfig.co //this responds faster

查看有关您(或任何人)的IP地址的所有信息:

 whois $(curl ifconfig.co)     

假设您已经在计算机上安装了whois,如果没有安装:
sudo apt-get install whois

3

最简单的方法是像Mikko所说的那样

hostname --all-ip-addresses

输出结果 这里输入图片描述

若需要更多详细信息,您也可以这样做:

ip route

输出结果 在这里输入图片描述

3

我总是在最意想不到的时候需要它,而且总是不得不在SO上搜索这样的线程。因此,我编写了一个简单的脚本来通过netstat获取IPv4地址,称为echoip - 你可以在这里找到它。网络地址的bash代码如下,它还从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

3
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

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