我正试图找到一种简短而健壮的方法将我的IP地址放入bash变量中,我想知道是否有更简单的方法。下面是我目前的做法:
ip=`ifconfig|xargs|awk '{print $7}'|sed -e 's/[a-z]*:/''/'`
我正试图找到一种简短而健壮的方法将我的IP地址放入bash变量中,我想知道是否有更简单的方法。下面是我目前的做法:
ip=`ifconfig|xargs|awk '{print $7}'|sed -e 's/[a-z]*:/''/'`
我也一直苦恼于此,直到我发现有一个简单的命令可以解决这个问题。
hostname -i
那很简单!
hostname -I | cut -f2 -d' '
。 - nurettinhostname
选项是-fs
。 - jeroentbthostname
实现之外的其他任何地方失败,因为在几乎所有其他工具中,此工具旨在设置主机名而不是查找有趣的东西。据我所知,这包括OSX、*BSD、Solaris和可能还有更多。 - he1ix192.168.0.77 192.168.2.77 192.168.1.77 172.17.0.1
。 - Eduardo Cuomoman hostname
建议使用 --all-ip-addresses
标志(简称 -I
),而不是 -i
,因为 -i
仅在可以解析主机名时才有效。因此这里是:
hostname -I
如果你只对主要部分感兴趣,删
掉它:
hostname -I | cut -f1 -d' '
hostname -I
获取到的是单个IP地址:192.168.1.30
。而在我的VPS服务器上,输出结果为127.0.0.2 143.127.52.130 2a00:dee0:ed3:83:245:70:fc12:d196
,因此我需要添加一些过滤器。在我的Linux调谐器上,不存在-I
选项,所以最好的方法是使用ip route get 8.8.8.8 | awk 'NR==1 {print $NF}'
。 - Jotneip
是正确的工具,因为 ifconfig
已经过时了一段时间。这是一个不需要 awk/sed/grep 的命令,比这里发布的任何其他命令都要快得多!:
ip
是正确的工具,因为 ifconfig
已经过时了一段时间。这是一个不需要 awk/sed/grep 的命令,比这里发布的任何其他命令都要快得多!:
ip=$(ip -f inet -o addr show eth0|cut -d\ -f 7 | cut -d/ -f 1)
(是的,在第一个-d
之后有一个转义空格)
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}'
Bcast:XXX.XXX.XXX.XXX
。 - LexLythiusawk | '{print $2}'
。但是您的更长的解决方案比这个更具互操作性。 - LexLythiusip a
。 - Synchroifconfig eth0 | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'
命令来获取特定接口的 IP 地址,例如在这个例子中,是 eth0
。 - zxcmehranifdata命令(在moreutils软件包中找到)提供了一个接口,可以轻松获取ifconfig数据,而无需手动解析ifconfig输出。只需使用一个命令即可实现:
ifdata -pa eth1
其中eth1
是您的网络接口的名称。
我不知道这个软件包在ifconfig未安装时的行为。正如Syncrho在他的答案中所述,ifconfig已经过时一段时间,在许多现代发行版中不再可用。
以下是将设备的IP地址存入变量的最佳方法:
ip=$(ip route get 8.8.8.8 | awk 'NR==1 {print $NF}')
更新以支持新的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地址。如果接口具有其他名称(如VPS
服务器或wifi
),则搜索eth0
可能会失败
ip route get 8.8.8.8
尝试获取到Google DNS服务器的路由和接口(不打开任何会话)
然后,如果需要,可以轻松获取ip
或接口名称。
这也可以用于获取多路由网络上主机接口的ip
地址。
我的简短版本。当您拥有多个接口并且只想获取主IP时非常有用。
host `hostname` | awk '{print $4}'
print $NF
(最后一个字段)而不是print $4
可能会更加健壮。 - wisbuckyip=$(ifconfig | gawk '
/^[a-z]/ {interface = $1}
interface == "eth0" && match($0, /^.*inet addr:([.0-9]+)/, a) {
print a[1]
exit
}
')
虽然不是更短或更简单,但对我来说很有效:
ip=$(ip addr show eth0 | grep -o 'inet [0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' | grep -o [0-9].*)
ifconfig | grep -oP "(?<=inet addr:).*?(?= Bcast)"
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 | grep -oP "(?<=inet addr:).*?(?=Bcast)"
ip=$(ifconfig | grep -oP "(?<=inet addr:).*?(?=Bcast)")
稍微深入解释一下:
来自man grep:
-o
仅打印匹配行中匹配(非空)部分,每个这样的部分都在单独的输出行上。
-P
将模式解释为Perl正则表达式。这是高度实验性的,“grep -P”可能会警告未实现的功能。
来自permonks.org:
(?<=pattern)
是一个正向后查找断言
(?=pattern)
是一个正向前查找断言
-o
告诉grep仅返回与模式匹配的行的部分。grep不认为查找断言是要返回的模式的一部分。在.*模式匹配后查找下一个查找断言很重要,因为我们不想查找最后一个查找断言匹配,而是想查找紧接着.*模式匹配的下一个查找断言。(如果我们添加了IP地址的正则表达式而不是.*,则不需要这样做,但可读性较差)。