把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}'
我一直在努力,直到我发现有一个简单的命令为此目的
hostname -i
那很简单!
man hostname
build议使用--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}')
为什么这是最好的?
-
Hostname -I
有时只得到IP或在我的VPS上得到127.0.0.2 143.127.52.130 2a00:dee0:ed3:83:245:70:fc12:d196
-
Hostnmae -I
不适用于所有系统。 - 使用
ifconfig
可能不总是给你喜欢的IP。
一个。 它会失败,你有多个接口(wifi / etcernet)等
湾 主IP可能不在第一个find的界面上 -
如果接口具有其他名称,如
VPS
服务器或wifi
,则eth0
search可能会失败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`