把IP地址放入bashvariables。 有没有更好的办法

我试图find一个简短而强大的方法,把我的IP地址变成一个bashvariables,并好奇是否有一个更简单的方法来做到这一点。 这是我目前的做法:

ip=`ifconfig|xargs|awk '{print $7}'|sed -e 's/[az]*:/''/'` 

你可以看看这个网站的替代品。

一种方法是:

 ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}' 

稍小一点,虽然它不是健壮的,并且可以根据你的系统返回错误的值:

 $ /sbin/ifconfig | sed -n '2 p' | awk '{print $3}' 

(来自http://www.htmlstaff.org/ver.php?id=22346

我一直在努力,直到我发现有一个简单的命令为此目的

 hostname -i 

那很简单!

man hostnamebuild议使用--all-ip-addresses标志(简写-I )而不是-i ,因为-i只有在主机名可以parsing的情况下才起作用。 所以这里是:

 hostname -I 

如果你只对主要的感兴趣,就把它cut

 hostname -I | cut -f1 -d' ' 

ip是正确的工具,因为ifconfig现在已经被弃用了一段时间了。 这里有一个awk / sed / grep-free命令,比其他任何人发布的速度快得多!

 ip=$(ip -f inet -o addr show eth0|cut -d\ -f 7 | cut -d/ -f 1) 

(是的,这是第一个-d之后的逃脱空间)

以下是将设备的IP地址变为variables的最佳方法:

 ip=$(ip route get 8.8.8.8 | awk 'NR==1 {print $NF}') 

为什么这是最好的?

  1. Hostname -I有时只得到IP或在我的VPS上得到127.0.0.2 143.127.52.130 2a00:dee0:ed3:83:245:70:fc12:d196
  2. Hostnmae -I不适用于所有系统。
  3. 使用ifconfig可能不总是给你喜欢的IP。
    一个。 它会失败,你有多个接口(wifi / etcernet)等
    湾 主IP可能不在第一个find的界面上
  4. 如果接口具有其他名称,如VPS服务器或wifi ,则eth0search可能会失败

    ip route获得8.8.8.8

尝试获取路线和接口到谷歌DNS服务器(不打开任何会话)
然后,如果你喜欢,它很容易得到ip或接口名称。

这也可以用来获取到一个multirutednetworking主机的接口的ip地址

ifdata命令(在moreutils包中find)提供了一个接口,可以轻松检索ifconfig数据,而无需手动parsingifconfig的输出。 这是用一个命令实现的:

 ifdata -pa eth1 

eth1是networking接口的名称。

我不知道如果没有安装ifconfig,这个软件包的行为如何。 正如Syncrho在他的回答中所述,ifconfig已经被弃用了一段时间,并且在很多现代发行版中不再被发现。

不是真的更短或更简单,但它适用于我:

 ip=$(ip addr show eth0 | grep -o 'inet [0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' | grep -o [0-9].*) 

我的短版。 有用的时候你有多个接口,只需要主要的IP。

 host `hostname` | awk '{print $4}' 

你可以得到awk来完成ifconfig的所有parsing:

 ip=$(ifconfig | gawk ' /^[az]/ {interface = $1} interface == "eth0" && match($0, /^.*inet addr:([.0-9]+)/, a) { print a[1] exit } ') 

我在用

 IFACE='eth0' IP=$(ip -4 address show $IFACE | grep 'inet' | sed 's/.*inet \([0-9\.]\+\).*/\1/') 

这种方式的优点是指定接口(在本例中为variablesIFACE ),以防您在主机上使用多个接口。

此外,您可以修改ip命令 ,以便在您方便的时候调整此代码段(IPv6地址等)。

我认为最可靠的答案是:

 ifconfig | grep 'inet addr:' | grep -v '127.0.0.1' | awk -F: '{print $2}' | awk '{print $1}' | head -1 

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

因为当你不使用head -1它显示所有ips ….

在我的脚本中,我只需要知识产权的networking部分,所以我就这样做了

 local=$(hostname -I | awk '{print $2}' | cut -f1,2,3 -d".") 

哪里切-f1,2,3 -d“。” 可以理解为“以逗号分开前3个部分”。要更改接口,只需将$ 2更改为您的接口号,即可获得整个IP删除剪切。

以下在Mac OS上工作(没有ip commnand或hostname选项):

 #!/bin/bash #get interface used for defalt route (usually en0) IF=$(route get default |grep 'interface' |awk -F: '{print $2}'); #get the IP address for inteface IF #does ifconfig, greps for interface plus 5 lines, greps for line with 'inet ' IP=$(ifconfig |grep -A5 $IF | grep 'inet ' | cut -d: -f2 |awk '{print $2}'); #get the gateway for the default route GW=$(route get default | awk '/gateway:/ {print $2}'); 
 ifconfig | grep -oP "(?<=inet addr:).*?(?= Bcast)" 

当使用grep来提取一行的一部分(就像其他的答案一样),perl预览和look-behind声明是你的朋友。

快速解释是第一个(?<=inet addr:)和last (?= Bcast)括号包含必须匹配的模式,但匹配这些模式的字符不会被grep返回,只有两种模式之间匹配模式.*? 在括号的集合之间被发现,被返回。

示例ifconfig输出:

 eth0 Link encap:Ethernet HWaddr d0:67:e5:3f:b7:d3 inet addr:10.0.0.114 Bcast:10.0.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1392392 errors:0 dropped:0 overruns:0 frame:0 TX packets:1197193 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1294730881 (1.2 GB) TX bytes:167208753 (167.2 MB) Interrupt:18 

这将从ifconfig输出中提取您的IP地址:

 ifconfig | grep -oP "(?<=inet addr:).*?(?=Bcast)" 

要将其分配给variables,请使用以下命令:

 ip=$(ifconfig | grep -oP "(?<=inet addr:).*?(?=Bcast)") 

稍微更深入的解释:

从男人grep:

-o仅打印匹配行的匹配(非空白)部分,每个这样的部分位于单独的输出行中。

-P将该模式解释为Perl正则expression式。 这是非常实验性的,“grep -P”可能会警告未实现的function。

来自permonks.org :

(?<=pattern)是一个积极的后顾之言

(?=pattern)是一个积极的前瞻断言

-o告诉grep只返回匹配模式的那一行。 grep不考虑look-behind / ahead,它是返回模式的一部分。 这个? 之后.*是很重要的,因为我们希望它在。*模式匹配后寻找下一个预见,而不是寻找最后的预见匹配。 (如果我们为IP地址添加了一个正则expression式而不是。*,那么这是不需要的,但是,可读性)。

在试图避免过多的pipe道,在各种Linux上工作,设置退出代码,并避免ifconfig或其他包,我尝试了awk的整个事情:

  ip addr show | awk ' BEGIN {FS="/"} /^[0-9]+: eth[0-9]+.*UP*/ {ss=1} ss==1 && /^ +inet / {print substr($1,10); exit 0} END {exit 1}' 

并且注意,如果你不想要第一个eth接口,那么可以在“ip addr show”之后指定一个特定的接口。 而适应ipv6是寻找“inet6”而不是“inet”的问题…

在我的情况下,我在eth0之前有更多的接口。 通过这个命令你可以得到任何接口的ip4地址。 为此,您需要将eth0更改为您需要的接口。

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

“eth3”是可选的(对多个NIC有用)

 ipaddress=`ip addr show eth3 | grep 'inet ' | awk '{ print $2}' | cut -d'/' -f1`