将IP地址放入bash变量。有没有更好的办法

时间:2011-07-26 11:54:05

标签: bash

我试图找到一种简短而强大的方法将我的IP地址放入bash变量中,并且好奇如果有更简单的方法可以做到这一点。这就是我目前正在做的事情:

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

18 个答案:

答案 0 :(得分:67)

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

hostname -i

就这么简单!

答案 1 :(得分:57)

man hostname建议使用--all-ip-addresses标记(简写-I),而不是-i,因为-i只有在可以解析主机名时才有效。所以这就是:

hostname  -I

如果您只对主要版本感兴趣,cut

hostname  -I | cut -f1 -d' '

答案 2 :(得分:36)

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

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

(是的,这是第一个-d之后的转义空间)

答案 3 :(得分:24)

您可以查看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

答案 4 :(得分:11)

以下是将设备的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]}')

为什么它是最好的?

  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可能不在第一个找到的界面上
  4. 如果界面具有eth0服务器中的其他名称或VPS

    ,则wifi的搜索可能会失败

    ip route get 8.8.8.8

  5. 尝试获取Googles DNS服务器的路由和接口(不打开任何会话)
    然后,如果您愿意,可以轻松获取ip或接口名称。

    这也可用于获取多宿主网络上主机接口的ip地址

答案 5 :(得分:10)

ifdata命令(在moreutils包中找到)提供了一个界面,可以轻松检索ifconfig数据,而无需手动解析ifconfig的输出。它只需一个命令即可实现:

ifdata -pa eth1

其中eth1是您的网络接口的名称。

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

答案 6 :(得分:7)

我的简短版本。当你有多个界面并且只想要主ip时很有用。

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

答案 7 :(得分:4)

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

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

答案 8 :(得分:4)

你可以只使用awk来完成ifconfig的所有解析:

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

答案 9 :(得分:3)

以下适用于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}');

答案 10 :(得分:2)

在我的脚本中,我确实只需要IP的网络部分,所以我就这样做了

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

切割-f1,2,3 -d"。"可以读作"前三个部分用逗号分隔" 要更改接口,只需将$ 2更改为您的接口号,即可获得整个IP删除功能。

答案 11 :(得分:2)

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)")

稍微深入一点的解释:

来自man grep:

-o仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。

-P将模式解释为Perl正则表达式。这是高度实验性的,'grep -P'可能会警告未实现的功能。

来自permonks.org

(?<=pattern)是一个积极的后瞻性断言

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

-o告诉grep只返回与模式匹配的行部分。 grep不会将后视/前方视为返回模式的一部分。 ?之后的.*非常重要,因为我们希望它在。*模式匹配后寻找下一个预测,而不是寻找最后一个前瞻匹配。 (如果我们为IP地址而不是。*添加了正则表达式,则不需要这样做,但是,可读性)。

答案 12 :(得分:2)

我认为最可靠的答案是:

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时,它会显示所有内容....

答案 13 :(得分:2)

我正在使用

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

这种方式的优点是在您使用主机上的多个接口时指定接口(示例中的变量 IFACE )。

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

答案 14 :(得分:1)

在尝试避免使用太多管道,处理各种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”的问题......

答案 15 :(得分:0)

就我而言,我在eth0之前的列表中有更多接口。通过此命令,您可以获取任何接口的ip4地址。为此,您需要将eth0更改为您需要的界面。

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

答案 16 :(得分:0)

&#34; eth3&#34;是可选的(对多个NIC很有用)

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

答案 17 :(得分:0)

在Mac OS X上,您可以使用ipconfig getifaddr [interface]来获取本地ip:

$ ipconfig getifaddr en0
192.168.1.30
$ man ipconfig 

DESCRIPTION
     ipconfig is a utility that communicates with the IPConfiguration agent to
     retrieve and set IP configuration parameters.  It should only be used in
     a test and debug context.  Using it for any other purpose is strongly
     discouraged.  Public API's in the SystemConfiguration framework are cur-
     rently the only supported way to access and control the state of IPCon-
     figuration.

     ...

     getifaddr interface-name
                 Prints to standard output the IP address for the first net-
                 work service associated with the given interface.  The output
                 will be empty if no service is currently configured or active
                 on the interface.