取得IP Address

網路上有許多教學告訴你如何透過ifconfig去取得ip address,而本篇教學主要分享我認為比較通用且簡單的做法。

取得interface list方法很多種,除了可以透過ifconfig、ip等command外,先前我們是透過cat /proc/net/dev的方式。但我認為透過list /sys/class/net的方法比較簡單且通用:

net_base=/sys/class/net/
 
for dev in ${net_base}*; do
        dev_name=${dev##*/}
        is_carrier=`cat ${dev}/carrier`
        echo ${dev_name}
        echo ${is_carrier}
done
有幾個部分需要注意的,以eth0為例:

  • dev變數為/sys/class/net/eth0的完整路徑,因此透過${dev##*/}的方式刪除以/前最長的部分,即/sys/class/net/。
  • /sys/class/net/eth0/carrier如果在interface down的情況下,會出現如下圖錯誤;因此請先up後再做判斷。

許多教學都是透過ifconfig去達成,由於我們script需要能夠執行於Ubuntu Server的安裝環境下(無法用cut與awk),因此我使用ip command。

# 可在Ubuntu Server 14.04安裝環境下使用
ip addr show | grep -o 'inet [0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' | grep -o [0-9].*
如果要指定interface eth0:
ip addr show eth0
ipv6比較難寫,我改使用以下方法,將不需要的部分去頭去尾:
ip=`ip addr show eth0 | grep -o 'inet6 .*'`
ip=${ip%%/*}
ip=${ip#inet6 }