将IP地址放入bash变量。有没有更好的办法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将IP地址放入bash变量。有没有更好的办法相关的知识,希望对你有一定的参考价值。
我正在尝试找到一种简短而强大的方法将我的IP地址放入bash变量中,如果有更简单的方法可以做到这一点,我很好奇。这就是我目前的做法:
ip=`ifconfig|xargs|awk '{print $7}'|sed -e 's/[a-z]*:/''/'`
你可以看看this site的替代品。
一种方法是:
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)
以下适用于Mac OS(主机名选项没有ip命令):
#!/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}');
我在用
IFACE='eth0'
IP=$(ip -4 address show $IFACE | grep 'inet' | sed 's/.*inet ([0-9.]+).*/1/')
这种方式的优点是指定接口(示例中的变量IFACE),以防您在主机上使用多个接口。
此外,您可以修改ip command以便在您方便时调整此代码段(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 ....
在我的脚本中,我确实只需要IP的网络部分,所以我这样做了
local=$(hostname -I | awk '{print $2}' | cut -f1,2,3 -d".")
切割的地方-f1,2,3 -d“。”可以读作“以逗号分隔前3个部分”要更改接口,只需将$ 2更改为您的接口编号,即可获得整个IP删除剪切。
ifconfig | grep -oP "(?<=inet addr:).*?(?= Bcast)"
当使用grep提取一部分行时(正如其他一些答案那样),perl look-ahead和look-behind断言是你的朋友。
快速解释是第一个(?<=inet addr:)
和最后一个(?= 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)"
要将其分配给变量,请使用以下命令:
ip=$(ifconfig | grep -oP "(?<=inet addr:).*?(?=Bcast)")
更深入的解释:
从男人grep:
-o
仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。
-P
将模式解释为Perl正则表达式。这是高度实验性的,'grep -P'可能会警告未实现的功能。
来自permonks.org:
(?<=pattern)
是一个积极的后卫断言
(?=pattern)
是一个积极的前瞻性断言
-o
告诉grep只返回与模式匹配的行部分。 grep不会将后视/前方视为返回模式的一部分。 ?
之后的.*
非常重要,因为我们希望它在。*模式匹配之后寻找下一个预测,而不是寻找最后的前瞻匹配。 (如果我们为IP地址而不是。*添加了正则表达式,则不需要这样做,但是,可读性)。
在试图避免太多管道,处理各种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`
我一直在努力解决这个问题,直到我发现这是一个简单的命令
hostname -i
就这么简单!
man hostname
建议使用--all-ip-addresses
标志(简写-I
),而不是-i
,因为-i
仅在主机名可以解析时起作用。所以这里是:
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地址转换为变量的最佳方法:
ip=$(ip route get 8.8.8.8 | awk 'NR==1 {print $NF}')
NB更新以支持新的Linux版本。 (适用于较旧的)
ip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}')
为什么它是最好的?
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可能不在第一个找到的接口上 - 如果接口有其他名称,如
eth0
服务器或VPS
,搜索wifi
可能会失败 ip route得8.8.8.8
尝试获取Googles DNS服务器的路由和接口(不打开任何会话)
如果你愿意的话,很容易得到ip
或界面名称。
这也可用于获取多路径网络上主机的接口的ip
地址
ifdata命令(位于moreutils包中)提供了一个接口,可以轻松检索ifconfig数据,而无需手动解析ifconfig的输出。它是通过一个命令实现的:
ifdata -pa eth1
其中eth1
是您的网络接口的名称。
我不知道在没有安装ifconfig时这个包的行为如何。正如Syncrho在他的回答中所说,ifconfig已经被弃用了一段时间,并且在很多现代发行版中都找不到了。
我的简短版本。当你有多个接口并且只想要主ip时很有用。
host `hostname` | awk '{print $4}'
不是更短或更简单,但它适用于我:
ip=$(ip addr show eth0 | grep -o 'inet [0-9]+.[0-9]+.[0-9]+.[0-9]+' | grep -o [0-9].*)
你可以只使用awk来完成ifconfig的所有解析:
ip=$(ifconfig | gawk '
/^[a-z]/ {interface = $1}
interface == "eth0" && match($0, /^.*inet addr:([.0-9]+)/, a) {
print a[1]
exit
}
')
以上是关于将IP地址放入bash变量。有没有更好的办法的主要内容,如果未能解决你的问题,请参考以下文章