用于提取 IP 地址的 Linux bash 脚本

新手上路,请多包涵

我想在我的 Debian 7.3 上制作大脚本(类似于翻译的和更新的用户友好环境)。我有个问题。我只想使用命令给我的一些信息。例如我的 ifconfig 看起来像:

 eth0      Link encap:Ethernet  HWaddr 08:00:27:a3:e3:b0
          inet addr:192.168.1.103  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fea3:e3b0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1904 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2002 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1309425 (1.2 MiB)  T

我只想在一行中显示 IP 地址:echo “Your IP address is: (IP_ADDRESS)“。是否有任何命令可以让我做这样的事情,在流中搜索我想要获取的信息?我知道 grepsed 但我对它们不是很好。

编辑:首先要感谢您帮助我解决这个问题,现在我知道更多了。其次说项目正在进行中。如果有人对它感兴趣,请pm我。

原文由 user3232381 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 732
2 个回答

要获取您的 IP 地址:

 echo `ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'`

这将为您提供 eth0 的 IP 地址。

编辑:由于最近版本的 Ubuntu 中接口的名称更改,这不再起作用。相反,你可以使用这个:

hostname --all-ip-addresseshostname -I ,它做同样的事情(给你主机的所有 IP 地址)。

原文由 Marco Hegenberg 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果目标是找到连接到 Internet 的 IP 地址,那么这应该是一个很好的解决方案。

2021 年编辑:添加了“sed”和“grep”版本以及新的“awk”版本(有些是 gnu)


要查找连接到 Internet 的 IP 地址,我们可以使用 ip route 命令。使用较新版本的 Linux,您可以通过典型输出获得更多信息,如下所示:

 ip route get 8.8.8.8
8.8.8.8 via 10.36.15.1 dev ens160 src 10.36.15.150 uid 1002
    cache

所以要获得 IP ,你需要在 src 之后使用 awksedgrep 找到 IP

 ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}'
ip route get 8.8.8.8 | awk 'match($0,/src (\S*)/,a)&&$0=a[1]'
ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/src/)$0=$(i+1)}NR==1'

ip route get 8.8.8.8 | sed -E 's/.*src (\S+) .*/\1/;t;d'
ip route get 8.8.8.8 | sed 's/.*src \([^ ]*\).*/\1/;t;d'
ip route get 8.8.8.8 | sed  -nE '1{s/.*?src (\S+) .*/\1/;p}'

ip route get 8.8.8.8 | grep -oP 'src \K[^ ]+'
10.36.15.150

如果您喜欢使用 awksedgrep接口 名称

ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}'
ip route get 8.8.8.8 | awk 'match($0,/dev (\S*)/,a)&&$0=a[1]'
ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)$0=$(i+1)}NR==1'

ip route get 8.8.8.8 | sed -E 's/.*?dev (\S+) .*/\1/;t;d'
ip route get 8.8.8.8 | sed 's/.*dev \([^ ]*\).*/\1/;t;d'
ip route get 8.8.8.8 | sed  -nE '1{s/.*?dev (\S+) .*/\1/;p}'

ip route get 8.8.8.8 | grep -oP 'dev \K[^ ]+'
ens192

ip route 不打开任何连接,它只显示到达 8.8.8.8 所需的路线。 8.8.8.8 是谷歌的DNS。

如果您想将其存储到变量中,请执行以下操作:

 my_ip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}')

my_interface=$(ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}')


为什么其他解决方案可能会失败:

ifconfig eth0

  • 如果您的接口有其他名称(eno1、wifi、venet0 等)
  • 如果您有多个接口
  • IP 连接方向不是多个 IF 列表中的第一个

Hostname -I

  • 可能只得到 127.0.1.1
  • 不适用于所有系统。
  • 不仅给所有 IP 连接到互联网的一个。 -I, –all-ip-addresses 主机的所有地址

原文由 Jotne 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题