Bir ifconfig komutundan ilk IP adresi nasıl alınır?


9

Komuttan gelen ilk IP adresini nasıl yakalayabilirim ifconfig?

ifconfig -a
enw178032: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 100.14.22.12  netmask 255.255.0.0  broadcast 100.14.255.255
        inet6 fe80::250:56ff:fe9c:158a  prefixlen 64  scopeid 0x20<link>
        ether 00:10:56:9c:65:8a  txqueuelen 1000  (Ethernet)
        RX packets 26846250  bytes 12068811576 (11.2 GiB)
        RX errors 0  dropped 58671  overruns 0  frame 0
        TX packets 3368855  bytes 1139160934 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Beklenen Sonuç:

IP=100.14.22.12

3
Soru, awk veya grep / cut, vb. Kullanılarak cevaplandı. Ancak ifconfig'den grep kullanmak ve genel olarak hala kötü bir fikir. ip, modern Linux yapılarında daha uygundur ve daha iyi desteklenir.
Pedro

1
Bu bir XY sorunu gibi geliyor. Gerçekten hangi bilgileri istiyorsun? Makinenin ağa bakan ana IP adresi? Makinenin ağa bakan IP adresi var mı? İlk ağ bağdaştırıcısının IP adresi? Herhangi bir IP adresi, ne olduğu önemli değil mi? Muhtemelen ihtiyacınız olan bilgiyi almanın daha doğrudan, doğru ve taşınabilir bir yolu vardır.
alex.forencich

Yanıtlar:


20

ifconfigBazı dağıtımlarda kullanımdan kaldırılan bir komut dosyasında IP adresi almaktan kaçınmak daha iyidir (örneğin, CentOS ve diğerleri, artık varsayılan olarak yüklemeyin).

Diğer sistemlerde, ifconfig çıktısı dağıtımın serbest bırakılmasına göre değişir (örneğin çıktı / aralık / alanlar ifconfigDebian 8'den Debian 9'a farklılık gösterir).

IP adresini almak için ip, benzer bir şekilde soruyorsunuz:

ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '

Veya daha iyisi:

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '
192.168.1.249

Veya "IP ="

#!/bin/bash
echo -n "IP="
ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '

@Roman'ın fikrini utanmadan uyarlamak

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print "IP="$4 } ' 
IP=192.168.1.249

Normal çıktı:

 $ ip -o -4  address show 
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
2: eth0    inet 192.168.1.249/24 brd 192.168.1.255 scope global eth0\       valid_lft forever preferred_lft forever

Gönderen man ip:

-o, -oneline
satır kayıtlarını '\' karakteri ile değiştirerek her kaydı tek bir satırda çıkarır . Bu, wc (1) ile kayıtları saymak veya çıkışı grep (1) yapmak istediğinizde kullanışlıdır.

Neden ifconfigönerilmediği bir örneğe bakın : BBB: IP adreslerini `` inet '' olarak gösteren `` bbb-conf --check`` - ifconfig woes

Neden çıkışta ifconfigolduğunu anlamak için bkz. 'İfconfig' ve 'ip' komutları arasındaki fark

ifconfigLinux ağ yığınına uzun zamandır tam olarak ayak uyduramayan net araçlardan geliyor. Aynı zamanda çekirdek yapılandırması ile çirkin ve daha az güçlü bir iletişim yolu olan ağ yapılandırması için ioctl kullanmaktadır.

2005 yılı civarında ağ yığınını kontrol etmek için yeni bir mekanizma tanıtıldı - netlink soketleri.

Ağ arabirimini yapılandırmak için ioctl sistem çağrısına iproute2dayanırken, tam çift yönlü netlink soket mekanizmasını ifconfigkullanır.



@yael Değişti, eth0'ı çıkardı. Ancak Roma, içeriden "IP =" yazdırarak benden daha iyisini yaptı awk. Benim için çok fazla beyin gücü, hala uyanıyorum. Önlemek ifconfig, geleceği yok ve IP adresinin konumu değişir, Linux için bildiğim en az iki farklı sürüm / uygulama (?) Vardır.
Rui F Ribeiro

Sadece bilgi için, iproute2'nin daha yeni sürümlerinde (örneğin: CentOS7 veya Debian8'de değil) ip bir -briefparametre alabilir ve çıktısının ayrıştırılması daha kolay hale gelir (2015-08-31: git.kernel.org/pub/scm/network/iproute2 /iproute2.git/commit/… )
AB

@AB ayrıca -o kullandığım gibi yardımcı olur, teşekkürler, ou kontrol edecek
Rui F Ribeiro

1
Ah, -ohangi senaryolar için gerçekten yararlı göründüğünü bilmiyordum
AB

6

Awk çözüm:

ifconfig -a | awk 'NR==2{ sub(/^[^0-9]*/, "", $2); printf "IP=%s\n", $2; exit }'

Örnek çıktı:

IP=10.0.2.15

-3
ip addr | grep -v 127.0.0.1 | grep 'inet ' | \
awk {'print $2'} | awk -F "/" {'print "IP="$1'}

1
ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '
Rui F Ribeiro

1
Neden localhost IP 127.0.0.1 için selamlıyorsunuz?
Jeff Schaller
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.