2012-09-18 102 views
4

我有一個在各種不同的Ubuntu Linux機器上運行的bash腳本。它的工作是找出本地主機的局域網IPv4地址。如何查找網絡接口名稱

腳本使用

ip addr show eth0 | sed -n '/inet /{s/^.*inet \([0-9.]\+\).*$/\1/;p}' 

這是很好的,但有些機器出於某種原因使用的eth1的,而不是eth0。我想能夠發現LAN的iface名稱,所以我可以在這裏替代它而不是eth0。

當然,如果你能想出一個不同的線索,做同樣的事情,一切都很好。

+0

你應該可以使用SNMP來代替腳本 –

+0

@Flexo啊,我只關心ipv4局域網。澄清了問題。 – artfulrobot

回答

10

不知道這是否有幫助,但似乎ip route get將顯示它用於連接到遠程主機的接口。

[email protected]:/nail/srv/elasticsearch$ ip route get 8.8.8.8 
8.8.8.8 via <gateway address> dev eth0 src <eth0 IP Address> 
當然

,你可以用類似的自動化,在shell腳本,

ip route get 8.8.8.8 | awk '{ print $NF; exit }' 
+0

做得非常簡潔可靠的解決方案。謝謝! – artfulrobot

+0

它似乎在我的Ubuntu 15.10機器上顯示IP地址而不是接口名稱。 @ user150471的答案如下:http://stackoverflow.com/a/30201105/1069083 – rubo77

+0

'ip route get 8.8.8.8 | sed -nr's /.* dev([^ \] +)。*/\ 1/p'' – h0tw1r3

1

我還是想知道如果有辦法做到這一點更簡單的方法,但是這是我的解決方法:我知道在局域網子網,所以......

ip addr show | grep "inet 10.67.5." \ 
    | sed -n '/inet /{s/^.*inet \([0-9.]\+\).*$/\1/;p}' 
2

如何搜索的字符串inetbrd(用於廣播)?這會給你:

ip addr show|egrep '^ *inet'|grep brd|awk -- '{ print $2; }'|sed -e 's:/[0-9]*$::' 

請注意,我使用更多的命令,而不是必要的;你可以使用sed和更復雜的正則表達式來達到同樣的效果,但我更喜歡一個命令,通過我得出結果的步驟來明確它。

如果你想在一個單一的命令來運行它,我建議嘗試awk

ip addr show|awk -- '$1 == "inet" && $3 == "brd" { split($2,a,"/"); print a[1]; }' 

這是不是比sed版本更長的時間,但更具可讀性。

+1稍微更具可讀性:

ip addr show | awk '$1 == "inet" && $3 == "brd" { sub (/\/.*/,""); print $2 }' 
1

1)這一次只打印接口名稱(我需要,對於即將到來的移交和downcoming PPP鏈路):

for i in $(ifconfig | grep 'ppp' | awk '{print $1}'); 
do 

printf "$i "; ## Or echo 

done 

結果:

ppp0的PPP1 ppp2

2)該一個打印接口名和IP

declare -a IPADDR 

index=0 

for i in $(ifconfig | grep 'inet addr' | awk '{print $2}'| sed 's#addr:##g'); 
do 
     IPADDR[$index]=$i 
     let "index += 1" 
done 

index=0 

for i in $(ifconfig | grep 'ppp' | awk '{print $1}'); 
do 
     echo $i 
     let "index += 1" 
done 

結果:

ppp0的地址:IP

PPP1地址:IP

ppp2地址:IP

2

信不信由你,沒有標準的,簡單的方法來獲取這些信息。目前沒有標準給我的當前IP和接口名稱的命令。 ifconfig返回的信息甚至沒有標準格式。

我會建議放棄純粹的外殼,並用腳本語言如Python在那裏你可以做到這一點去:

import socket 
socket.gethostbyname(socket.gethostname()) 

除了它沒有在大多數Linux系統上工作,因爲有通常在一個條目/etc/host文件指向127.0.0.1,環回地址。 Perl具有相同的問題。

你對所涉及的腳本有着堅定的把握,並且你已經看到了這些問題。我可以推薦的唯一方法就是在每臺要運行它的機器上測試它,然後看看彈出的內容。由於網絡的設置方式以及每個位置的接口名稱可能不同,所以不會出現適用於所有操作系統,甚至是同一操作系統上的不同系統的通用目的。

+0

當主機名沒有DNS或'/ etc/hosts'項時,它也不起作用。 – gatoatigrado

1

大多數recenttly systemd/udev已經自動開始分配接口名稱爲所有本地以太網,WLAN和WWAN接口的東西我們都習慣於。這與傳統的接口命名方案(「eth0」,「eth1」,「wlan0」,...)有所不同。現在我們必須首先檢查本地接口名稱是什麼,然後才能使用它,而之前我們是一個非常準確的猜測,「eth0」是正確的名字。什麼你問的是網絡名稱。這裏是一個小的腳本來解決這個問題

  1. 使用「IP路由得到8.8.8.8」找出哪些活動接口具有互聯網路由(或當前正在使用) 輸出應該是這樣的:

    通過10.10.1.1開發enp0s3 SRC 10.10.1.118 緩存

  2. 用awk打印的接口名稱第五文本塊8.8.4.4

    ]#ip route get 8.8.8.8 | AWK - '{打印$ 5}' 輸出:enp0s3

  3. 用awk打印的接口第七屆文本塊地址

    ]#IP路由得到8.8.8.8 | AWK - '{打印$ 7}' 輸出:10.10.1.118

+0

很好的答案。我發現ip命令輸出兩行(第二行中的「cache和ipid 0x2e6e」)。所以'ip route get 8.8.8.8 |頭-n1 | awk - '{print $ 7}''適合我! – artfulrobot

3

主要NIC通常有一個默認路由。所以:

ip -o -4 route show to default 

的NIC:

ip -o -4 route show to default | awk '{print $5}' 

網關:

ip -o -4 route show to default | awk '{print $3}' 

不同的ifconfig,IP具有一致&分析輸出。它只適用於Linux;它不會在其他Unixen上運行。