Linux bash脚本来提取IP地址

我想在我的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“您的IP地址是:(IP_ADDRESS)”。 有没有什么命令可以让我做这样的事情,来search我想要得到的信息? 我知道关于grepsed但是我对他们不是很好。

编辑:首先要说谢谢你帮我解决这个问题,现在我知道得多了。 其次说项目正在进行中。 如果有人会对我感兴趣的话。

要获取您的IP地址:

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

这会给你eth0的IP地址。

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

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

ifconfig eth0并不是一个好的解决方案。

如果您的界面有其他名称,或者您有多个界面,则会失败。

所以要获得用于通信的IP和接口,请执行以下操作:

 ip route get 8.8.8.8 8.8.8.8 via 10.10.10.1 dev eno1 src 192.168.3.33 cache 

那么为了得到你的IP,你可以这样做:

 ip route get 8.8.8.8 | awk 'NR==1 {print $NF}' 192.168.3.33 

ip route不会打开任何连接,只是显示需要达到8.8.8.8的路由。 8.8.8.8是Google的DNS。


为什么这是最好的办法呢?

  1. Hostname -I有时只得到IP或在我的VPS上得到127.0.0.2 143.127.52.130 2a00:dee0:ed3:83:245:70:fc12:d196
  2. Hostname -I不适用于所有系统。
  3. 使用ifconfig可能不总是给你喜欢的IP。
    一个。 如果你有多个接口(wifi / ethernet)等,将会失败
    湾 主IP可能不在第一个找到的界面上
  4. 如果在VPS服务器或wifi或更新的Ubuntu中,接口具有其他名称,则搜索eth0可能会失败

在Wily Werewolf中,从systemd / udev开始,将为所有本地以太网,Wlan和Wwan接口自动分配可预测,稳定的网络接口名称。

udev现在支持以下不同的网络接口命名方案:

 1) Names incorporating Firmware/BIOS provided index numbers for on-board devices (example: eno1) 2) Names incorporating Firmware/BIOS provided PCI Express hotplug slot index numbers (example: ens1) 3) Names incorporating physical/geographical location of the connector of the hardware (example: enp2s0) 4) Names incorporating the interfaces's MAC address (example: enx78e7d1ea46da) 5) Classic, unpredictable kernel-native ethX naming (example: eth0) - depreciated 

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

 my_ip=$(ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $NF}') my_interface=$(ip route get 8.8.8.8 | awk '/dev/ {f=NR} f&&NR-1==f' RS=" ") 

如果要获取空间分隔的IP列表,可以使用带有--all-ip-addresses (short -I )标志的hostname命令

 hostname -I 

如下所述: 将IP地址放入bash变量中。 有更好的方法吗?

 ip -4 addr show eth0 | grep -oP "(?<=inet ).*(?=/)" 

拿你的选择:

 $ cat file 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 $ awk 'sub(/inet addr:/,""){print $1}' file 192.168.1.103 $ awk -F'[ :]+' '/inet addr/{print $4}' file 192.168.1.103 
  /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}' 

只是一个说明,因为我只是花了一些时间麻烦 – 在服务器上的僵化升级。 原来,(几年前),我已经实施了一个测试,看看动态添加的接口(如eth0:1)是否存在,如果是的话,我会将某些程序绑定到eth0上的“主”IP。 基本上它是'ifconfig | grep … | sed …'解决方案的一个变体(加上检查'eth0:'的存在)。
升级带来了新的网络工具,产量也有所变化:

旧的ifconfig:

 eth0 Link encap:Ethernet HWaddr 42:01:0A:F0:B0:1D inet addr:10.240.176.29 Bcast:10.240.176.29 Mask:255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1 ...<SNIP> 

而新版本将显示这个:

 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1460 inet 10.240.212.165 netmask 255.255.255.255 broadcast 10.240.212.165 ...<SNIP> 

寻找'eth0:'以及'inet addr:'搜索已经结束(不要紧,名为'em0','br0'或'wlan0'的接口…)。 当然你可以检查'inet'(或者'inet6'),并且addr:part是可选的,但是看起来更接近,你会看到或多或少的一切都变了,'Mask'现在是'netmask'.. 。

“ip route …”的建议非常漂亮 – 所以也许:

 _MyIP="$( ip route get 8.8.8.8 | awk 'NR==1 {print $NF}' )" if [ "A$_MyIP" == "A" ] then _MyIPs="$( hostname -I )" for _MyIP in "$_MyIPs" do echo "Found IP: \"$_MyIP\"" done else echo "Found IP: $_MyIP" fi 

那么,无论如何,这样的事情。 由于所有提出的解决方案似乎都有失败的情况,因此请检查可能的边缘情况 – 没有eth,多个eth's&lo's,何时会发生hostname -i失败,然后决定最佳解决方案,检查是否有效,否则第二好的。

干杯啤酒!

 ip route get 8.8.8.8| grep src| sed 's/.*src \(.*\)$/\1/g' 

可能不是所有的情况下(特别是如果你有几个网卡),这将有助于:

 hostname -I | awk '{ print $1 }' 

在我看来,最简单和最优雅的方式来实现你所需要的是这样的:

 ip route get 8.8.8.8 | tr -s ' ' | cut -d' ' -f7 

ip route get [host] – 为您提供用于到达远程主机的网关,例如:

 8.8.8.8 via 192.168.0.1 dev enp0s3 src 192.168.0.109 

tr -s ' ' – 删除任何额外的空间,现在你有统一性,例如:

 8.8.8.8 via 192.168.0.1 dev enp0s3 src 192.168.0.109 

cut -d' ' -f7cut -d' ' -f7 – 将字符串截断为空格分隔的字段,然后从中选择字段#7,例如:

 192.168.0.109