Eth0 arabiriminde IP adresi gösteriliyor


24

Bir komut dosyası kullanarak eth0'da gösterilen IP adresini nasıl görüntüleyebilirim?

Yanıtlar:


28

bunu bir dosyaya kaydedin ve sonra çalıştırın bash <filename>

#!/bin/bash
ifconfig eth0 | grep "inet addr"

IP adresini gösteren sadece sayı almak için daha doğru olmak:

#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1

Güncelleme : Bu sizin için işe yaramazsa, diğer cevabı deneyin.


2
Tabii bu en son ubuntuda çalışmıyor. "inet <ip>" yerine "inet addr <ip>" son ifconfig döner
thang

sadece kullanabilirsinizgrep "inet"
Andrei Radulescu

26

Başka bir seçenek sağlama uğruna ip addr, IP adresini almak için komutu bu şekilde kullanabilirsiniz:

ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
  • ip addr show eth0 hakkında bilgi gösterir eth0
  • grep "inet\b"sadece IPv4 adresi olan satırı gösterir (IPv6 adresini istiyorsanız, değiştirin "inet6\b")
  • awk '{print $2}' ipadresi / maskeye sahip ikinci alana basar, örneğin 172.20.20.15/25
  • cut -d/ -f1 sadece IP adres kısmını alır.

Bir komut dosyasında:

#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)

bu çözüm aslında işe yarıyor!
thang

ip -4 ... ve ip -6 ...! Teşekkür ederim!
TamusJRoyce

17

Alındığı /programming//a/14910952/1695680

hostname -i

Ancak bu yerel bir ip adresi (127.0.0.1) verebilir, bu nedenle kullanmanız ve filtrelemeniz gerekebilir:

hostname -I

Ana bilgisayar adının man sayfalarından:

-i, --ip-address

Ana bilgisayar adının ağ adreslerini görüntüleyin. Bunun yalnızca ana bilgisayar adı çözülebiliyorsa işe yaradığını unutmayın. Bu seçeneği kullanmaktan kaçının; bunun yerine hostname --all-ip-address kullanın.

-I, --all-ip-addresses

Ana bilgisayarın tüm ağ adreslerini görüntüleyin. Bu seçenek, tüm ağ arayüzlerinde yapılandırılmış tüm adresleri numaralandırır. Geridöngü arabirimi ve IPv6 yerel bağlantı adresleri atlandı. -İ seçeneğinin aksine, bu seçenek ad çözümlemesine bağlı değildir. Çıktının sırası hakkında herhangi bir varsayımda bulunmayın.


bilgin olsun, ister ip addr show label 'enp*'daha iyi, ama can sıkıcı ayrıştırma gibi bir şeydir ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2ne kadar güzel teneke işleri ...
ThorSummoner

5

@ markus-lindberg 'nin yanıtı benim favorim. -o -4İp'in bayraklarına eklerseniz , çok daha kolay çözümlenebilir (ve tutarlı) çıktılar elde edersiniz:

ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'

-oaçılımı --onelinedurumların tam olarak bu tür yardım amaçlı olan,. -4Diğer tüm yanıtları ima budur IPv4 adrese sınırı eklenir.


ipBayrakları seviyorum . cutGelişmiş awksihirbazlık kullanmak yerine :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
DuffJ

@DuffJ muhtemelen kişisel bir zevk meselesine bağlı. cutÖğrendikten sonra "keşfetti" yolunu seçtim awkve boru hatlarımdaki komut sayısını en aza indirmeyi seviyorum. Her durumda güzel öneri.
Amos Shapira

Tamamen katılıyorum Amos. Çözümünüz için teşekkürler!
DuffJ

3

İşte bazı oneliners .....

awk

ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'

Yukarıdaki awk komutundaki split işlevi, ayırıcıyı temel alarak ikinci sütunu böler :ve bölünmüş değeri ilişkisel bir dizide saklar a. Böylece a[2]ikinci bölümün değerini tutar.

sed

ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'

Temel sed'de, \(...\)karakterleri yakalamak için kullanılan yakalama grubu denir. Yakalanan karakterleri geri referanslama yoluyla yönlendirebiliriz. \([^[:space:]]\+\)herhangi bir karakteri yakalar ancak bir veya daha fazla kez boşluk bırakmaz.

grep

ifconfig eth0 | grep -oP 'inet addr:\K\S+'

\Könceden eşleşen karakterleri finalde yazdırmaktan atar ve \S+bir veya daha fazla boşluksuz karakterle eşleşir.

Perl

ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'

inet addr:Dizenin yanında bulunan bir veya daha fazla boşluk olmayan karakter yakalanır ve son olarak sadece bu karakterleri basarız.


@ edwardtorvalds bazı açıklamalarda bulundu. Bunun gelecekteki okuyucular için faydalı olacağını düşünüyorum. Yukarıdaki komutlardan soru sormaktan çekinmeyin ... :)
Avinash Raj

2

İşte iyi bir tane, ikincil komut olarak sadece grep kullanır:

IP adresi göster eth0 | grep -oP 'giriş \ K \ S [0-9.] +'

Neden gerekenden daha fazla komut kullanmanız gerektiğini anlamıyorum.


2

Sen kullanmalıdır ip(yerine ifconfigbir tutarlı ve ayrıştırılamaz çıktı üretir, komut dosyası amaçlı en önemlisi belki de muhafaza 's akım, gibi) ve. Aşağıdaki birkaç benzer yaklaşım vardır:

Ethernet arayüzünüz için IPv4 adresini istiyorsanız eth0:

$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24  

Bir komut dosyası olarak:

$ INTFC=eth0  
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}') 
$ echo $MYIPV4
192.168.1.166/24

Yukarıda üretilen çıktı CIDR notasyonundadır. CIDR notasyonu istenmiyorsa, sıyrılabilir:

$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1 
192.168.1.166  

IMHO'nun "en şık" olduğu bir diğer seçenek, belirtilen uzak ana bilgisayara bağlanmak için hangi arayüzün kullanıldığına ilişkin IPv4 adresini alır (bu durumda 8.8.8.8). Bu cevapta @ gatoatigrado izniyle :

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

Bir komut dosyası olarak:

$ RHOST=8.8.8.8  
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166

Bu, tek bir arayüze sahip bir ana bilgisayarda mükemmel şekilde çalışır, ancak daha avantajlı bir şekilde birden fazla arayüze ve / veya rota özelliklerine sahip ana bilgisayarlar üzerinde de çalışır.

ipTercih edilen yaklaşımım olsa da, kesinlikle bu kediyi cildin tek yolu bu değil. İşte hostnamedaha kolay / daha özlü bir şey tercih ederseniz kullanan başka bir yaklaşım :

$ hostname --all-ip-addresses | awk '{print $1}'  

Veya IPv6 adresini istiyorsanız:

$ hostname --all-ip-addresses | awk '{print $2}'  

Bir komut dosyası olarak:

$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}') 
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166 
$ echo $MYV6IP 
2601:7c1:103:b27:352e:e151:c7d8:3379

1

Bu amaç için özel olarak tasarlanmış netifaces gibi bir python kütüphanesi kullanmanızı öneririm .

sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"

Kullanımda olan varsayılan ağ arayüzünü elde etmek için.

default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]


1

Eğer awk yoksa (bazı gömülü aygıtlarda olduğu gibi) kullanışlı olabilecek bir seçenek daha:

ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"


1

IPv4 için burada :

ip -f inet a|grep -oP "(?<=inet ).+(?=\/)"

IPv4 ve belirli dev (eth0) için burada :

ip -f inet a show eth0|grep -oP "(?<=inet ).+(?=\/)"

için IPv6 :

ip -6 -o a|grep -oP "(?<=inet6 ).+(?=\/)"


0

bu normal bir kullanıcıyla da kullanılabilir.

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6

eth0 isteyin, betiğinizin bu sürümü yardımcı olabilir (ayrıca geri döngü göster)ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
TiloBunt

Bu hemen hemen aynı cevabı askubuntu.com/a/560466/367990 sadece kullanılarak cutyerine bir kombinasyonu iki kez awkve cutçıkışını ayrıştırmak. Bir dahaki sefere ilk önce diğer tüm cevapları kontrol etmeli ve yinelenen bir çözüm göndermemelisin. Burada bu durumda, bunun bir kopya mı yoksa benzer mi olduğu tartışılabilir olduğunu düşünüyorum, bu yüzden lütfen bunu genel bir ipucu olarak alın. Teşekkürler.
Byte Commander

0

Bu bulabildiğim en kısa yol:

ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'

$1Ağ arayüzünüzle değiştirin .

ip -f inet ip'e yalnızca inet (ipv4) ailesi için değerler döndürmesini bildirir.

grep -Po grep'e bir sonraki değeri perl-regex olarak araya koymasını ve sadece eşleşen değerleri yazdırmasını söyler.

Regex \K[\d.]+, "her şeyi bu noktaya kadar atmak (\ K) ve mümkün olduğunca üst üste bir nokta izleyen sayısal değerleri eşleştir" der. Bu nedenle, yalnızca IP adresiyle eşleşecek ve bundan sonra, shortform \ XX alt ağ maskesi de dahil olmak üzere her şeyi görmezden gelecektir.


0

çoklu günlerde ara yüzlerle (örneğin bir liman işçisi kullanıyorsanız) ve ETH tarafından adlandırma arayüzünü artık normal değil

IP / Maske ayıklamak için bu komutu kullanın:

IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)

Bu yüzden ne kadar arabirime sahip olacağım ve adı ne olursa olsun, GREP sadece ilk MULTICAST seçeneğine sahip olacak.

Bu komutu sadece maskeyi IP olmadan ayıklamak için kullanıyorum:

IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)

Bu komutu farklı BDS ve NIX'te kullanıyorum, asla başarısız olmuyor;)


Çıktısını ayrıştıracaksanız ip, -oseçeneği kullanın.
muru

0

Senaryomda şöyle bir şey kullanıyorum:

re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
    echo ${BASH_REMATCH[1]}
else
    echo "Cannot determin IP" 1>&2
fi

Herhangi bir işlem ortaya çıkmaz.


0

Yine bir başka yol (bir CIDRadres istemediğinizi ve istemediğinizi varsayarak IPv4):

$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
  • Olmayan ipkomutu kullanırdeprecated
  • Filtreleme için yalnızca bir komut kullanır.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.