簡體   English   中英

使用 Bash 解析 ifconfig 以僅獲取我的 IP 地址

[英]Parse ifconfig to get only my IP address using Bash

我想編輯 bashrc 文件以運行一個名為“myip”的簡單函數。 正如您可能猜到的,函數 myip 只打印我機器的內部 IP 地址。

就我開始工作而言,這是腳本:

ifconfig en1 | awk '{ print $2}' | sort

這得到了我的輸出:

10.0.0.12
options=1<PERFORMNUD>
flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST>
fe80::daa2:5eff:fe96:ba2f%en1
d8:a2:5e:96:ba:2f
autoselect
active

我在 Mac OS X 上工作。

我怎樣才能做到這一點?

以下兩者都在這里工作(CentOS 5)。

ip addr show eth0 | awk '$1 == "inet" {gsub(/\/.*$/, "", $2); print $2}'

ifconfig eth0 | awk '/inet addr/ {gsub("addr:", "", $2); print $2}'

對於 OS X(至少v10.11 (El Capitan)):

ifconfig en0 | awk '$1 == "inet" {print $2}'

這是獲取 IP 地址的更“不可知”的方式,無論您使用 *nix 系統(Mac OS、Linux)、接口名稱,甚至您的語言環境配置:

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d:

如果您有多個活動 IP,將在單獨的一行中列出每個 IP。 如果您只想要第一個 IP,請添加| head -n1 | head -n1到表達式:

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" \
     | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1

如果您想要特定接口的 IP 地址,請將第一個表達式ifconfig替換為ifconfig INTERFACENAME ,例如ifconfig eth0 | grep -E ... ifconfig eth0 | grep -E ... .

最后,您注意到腳本所做的一件事是省略系統管理員和開發人員“localhost”調用的 IP 127.0.0.1 ,但考慮到某些應用程序還可能添加具有 IP 的虛擬網絡設備,這可能是如果未添加到省略列表,則返回,例如。 Docker 添加了一個虛擬接口docker0 ,它通常具有 IP 172.17.0.1 ,如果您想省略此 IP 以及“localhost”,請更改表達式grep -v 127.0.0.1以考慮另一個 IP。 在這種情況下(省略 localhost 和 docker),最終表達式將是:

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v '[127.0|172.17].0.1' | awk '{ print $2 }' | cut -f2 -d: | head -n1

這些是本頁中提到的一些在某些情況下失敗的示例以及原因:

  • ip route ...ip命令未安裝在 OSX 機器中。
  • hostname -I-I選項在 OSX 中無效。
  • ifconfig en0 ... :Linux 和 OSX 中的接口名稱( eth0en0 )不同,在 Linux 中,名稱還取決於接口類型( ethX用於以太網連接, wlanX用於無線等)。
  • python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))' python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))' :這在 Ubuntu Linux 14.04 中得到了127.0.1.1 (一個環回 IP ),所以不起作用。
  • ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' ' ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' ' :Geograph 的帖子更接近,但在某些未配置LANG=en Linux 發行版中不起作用,因為grep查找的文本inet addr:是在其他語言環境中使用不同文本輸出的,而在 Mac OS 中,該標簽也不同。

在 eth0 的情況下,以下對我有用。 嘗試用相同的邏輯調整它。

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

好吧,經過幾個小時的掙扎,我終於做對了:

ifconfig en1 | awk '{ print $2}' | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"

我遺漏的最后一部分只是從我的列表中 grep 一個 IP 地址模式。

您可以使用awk來執行inet行的選擇和 IP 地址的解析,如下所示:

$ ip addr ls docker0 | awk '/inet / {print $2}' | cut -d"/" -f1
172.17.42.1

在上面的示例中,將設備句柄eth0替換為docker0 另外,如果你想要一個純粹的AWK實現,你可以像這樣進行“切割”:

$ ip addr ls docker0 | awk '/inet / {split($2, ary, /\//); print ary[1]}'
172.17.42.1

使用 BASH4+ 的 IPv4 示例

示例 1 ,使用主機名:

  hostname -I|cut -d" " -f 1

示例 2,設備是已知的(並且永遠不會改變):

  ifconfig ens5 | grep "inet" | awk '{print $2}' |  sed 's/[^0-9.]*//g'

示例 3 ,不要現在的設備(例如 eth0、eth1、enp0s23 或 wpxxx):

 ip a | awk 'BEGIN{ "hostname -I|cut -d\" \" -f 1" | getline ip} $2 ~ ip {print "Device: "$NF "  IP: "$2}'

例4 ,想要網絡IP地址:

 wget -q -O /dev/stdout http://checkip.dyndns.org/ | cut -d":" -f2 | cut -d \< -f1

請享用。

除了解析 ifconfig 之外,還有另一種簡單的方法來獲取 IP 地址。

hostname -I -I, --all-ip-addresses all addresses for the host -i, --ip-address addresses for the hostname

參考: http : //linux.die.net/man/1/hostname

例子:

[ec2-user@terraform ~]$ 主機名 -I
10.10.10.10

無需在 Bash 中進行不可移植的 ifconfig 解析。 這是 Python 中的一個簡單的單行代碼:

python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))'

如果您只是在尋找“inet”而不是“inet6”,這對我有用:

/usr/bin/ifconfig eth0 | grep --word-regexp inet | awk '{print $2}'

“--word-regexp”將使grep查找整個單詞“inet”而不匹配單詞的部分,即“inet”不會匹配“inet6” - “inet”只會匹配其中包含“inet”的行.

你也可以試試這個

user@linux:~$ cat script.sh
ifconfig | grep ad.*Bc | cut -d: -f2 | awk '{ print $1}'
user@linux:~$ 

輸出

user@linux:~$ ./script.sh
192.168.1.1
10.0.1.1
user@linux:~$

請注意,ifconfig 輸出可能會因您的 linux 版本而異。 因此,您可能希望相應地更改腳本。

順便說一句,這是我的 ifconfig 輸出

user@linux:~$ ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:00:00:00:00:10  
          inet addr:192.168.1.1  Bcast:192.168.56.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:112 errors:0 dropped:0 overruns:0 frame:0
          TX packets:93 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:14616 (14.2 KiB)  TX bytes:17776 (17.3 KiB)

eth1      Link encap:Ethernet  HWaddr 00:00:00:00:00:11
          inet addr:10.0.1.1  Bcast:10.0.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

user@linux:~$

類似於 JSR,但awkcut的順序相反:

my_ip=$(ifconfig en1 | grep 'inet addr' | awk '{print $2}' | cut -d: -f 2)
echo ${my_ip}

這對我有用:
ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'

也適用於 VDS/VPS 的代碼:

ifconfig | grep -A2 "venet0:0\|eth0" | grep 'inet addr:' | sed -r 's/.*inet addr:([^ ]+).*/\1/' | head -1

或者

ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' '

采取補丁的答案,使其更一般,

即:跳過所有內容直到第一個數字。

ifconfig eth0 | awk '/inet addr/{sub(/[^0-9]*/,""); print $1}'

或者甚至更好:

ifconfig eth0 | awk '/inet /{sub(/[^0-9]*/,""); print $1}'

  • 請注意最后的打印部分 - 從$2更改為$1

使用 Perl 正則表達式:

ifconfig eth0 | grep -oP '(?<= inet addr:)[^ ]+'

說明:grep -oP 使用 Perl 正則表達式搜索完全匹配。
“棘手”的部分是正則表達式本身;
1. (?<= inet addr:)表示 - 字符串inet addr:位於我們要查找的內容的左側。
2. [^ ]+ (請注意 ^ 后面的空格)- 表示查找所有內容,直到第一個空格為止- 在我們的示例中,它是 IP 地址。

用:

ifconfig enops3 | greb broadcast | cut -d " " -f10

其中enops3是接口名稱。

此代碼輸出所有網絡連接(環回除外)的 IP 地址,並且可以大多數OS X 和 Linux 版本之間移植

它對於在以下機器上運行的腳本特別有用:

  • 活動網絡適配器未知,
  • 在 Wi-Fi 和以太網連接之間切換的筆記本電腦,以及
  • 具有多個網絡連接的機器。

腳本是:

/sbin/ifconfig -a | awk '/(cast)/ {print $2}' | cut -d: -f2

這可以在腳本中分配給一個變量,如下所示:

myip=$(/sbin/ifconfig -a | awk '/(cast)/ {print $2}' | cut -d: -f2)

腳本可以通過使用循環處理結果來處理可能的多個地址,如下所示:

if [[ -n $myip ]]; then
  count=0
  for i in $myip; do
    myips[count]=$i       # Or process as desired
    ((++count))
  done
  numIPaddresses=$count   # Optional parameter, if wanted
fi

筆記:

  • 它在“cast”上過濾“ifconfig”,因為這具有過濾環回地址的附加效果,同時也適用於大多數 OS X 和 Linux 版本。
  • 最后的“cut”函數對於 Linux 上的正確功能是必需的,但不是 OS X。但是,它不會影響 OS X 結果 - 因此為了可移植性而保留它。

在嘗試了一些解決方案后,我發現這最方便,將其添加到您的別名中:

alias iconfig='ifconfig | awk '\''{if ( $1 >= "en" && $2 >= "flags" && $3 == "mtu") {print $1}; if ( $1 == "inet" || $1 == "status:"){print $0};}'\''|egrep "en|lo|inet"'

輸出如下所示:

shady@Shadys-MacBook-Pro:xxxx/xxx ‹dev*›$ iconfig lo0: inet 127.0.0.1 netmask 0xff000000 en0: inet 10.16.27.115 netmask 0xffffff00 broadcast 10.16.27.255 en1: en2: en5: inet 192.168.2.196 netmask 0xffffff00 broadcast 192.168.2.255

在 grep ifconfig遇到麻煩之后,我找到了一個包裝庫來簡化我的生活

pip install my_ip 
mip
ifconfig eth0 | awk '/inet addr/{sub("addr:",""); print $2}'

一個簡單的 AWK + Bash 腳本示例,它可以提供如何解析命令輸出並將語法混合在一起的總體思路。

完整代碼位於: https : //gist.github.com/darkphase/67d7ec22d47dbebd329e

BEGIN { RS = "" ; FS = "\n" }  # Change separator characters
{
    while ( "'"$cmd"'" | getline ){
        # print $0
        if ( $1 !~ /LOOPBACK/ ){

            split($1,arr," ")
            print "'"$blue"'"arr[1]"'"$reset"'"

            for(i = 1; i <= NF; i++) { # Loop through fields (this case lines)
                split($i,arr," ")
                switch ( arr[1] ) {
                    case "inet":
                        print "'"$red"'" "IPV4:" "'"$reset"'" "\n IP: " "'"$yellow"'" arr[2] "'"$reset"'" "\n NM: "arr[4]"\n BC: "arr[6]
                        break
                    case "inet6":
                        print "'"$red"'" "IPV6:" "'"$reset"'" "\n IP: "arr[2]"\n PL: "arr[4]
                        break
                    case "ether":
                        print "'"$red"'" "MAC: " "'"$reset"'" arr[2]
                        break
                    default:
                }
            }
            print ""
        }
    }
}'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM