Bagaimana cara menangkap alamat IP pertama dari perintah ifconfig?

9

Bagaimana cara menangkap alamat IP pertama yang berasal dari ifconfigperintah?

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

Hasil yang diharapkan:

IP=100.14.22.12
yael
sumber
3
Pertanyaan telah dijawab, baik menggunakan awk atau grep / cut, dll. Tapi itu masih ide yang buruk untuk menggunakan dan grep dari ifconfig. ip lebih cocok dan lebih didukung di Linux modern.
Pedro
1
Ini terdengar seperti masalah XY. Informasi apa yang benar-benar Anda inginkan? Alamat IP utama yang menghadap jaringan dari mesin? Adakah alamat IP yang menghadap jaringan dari mesin? Alamat IP adaptor jaringan pertama? Ada alamat IP, tidak masalah apa itu? Mungkin ada cara yang lebih langsung, akurat, dan portabel untuk mendapatkan informasi yang Anda butuhkan.
alex.forencich

Jawaban:

20

Lebih baik hindari menggunakan ifconfiguntuk mendapatkan alamat IP dalam skrip karena sudah ditinggalkan di beberapa distribusi (misalnya CentOS dan yang lainnya, jangan menginstalnya secara default lagi).

Dalam sistem lain, output ifconfig bervariasi sesuai dengan rilis distribusi (misalnya output / spasi / bidang ifconfigberbeda dari Debian 8 ke Debian 9, misalnya).

Untuk mendapatkan alamat IP ip, dengan cara yang sama Anda bertanya:

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

Atau lebih baik lagi:

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

Atau, saat Anda bertanya "IP ="

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

Mengadaptasi ide dari @Roman tanpa malu-malu

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

Output normal:

 $ 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

Dari man ip:

-o, -oneline
output setiap record pada satu baris, mengganti feed baris dengan karakter '\'. Ini nyaman ketika Anda ingin menghitung catatan dengan wc (1) atau untuk grep (1) output.

Lihat satu contoh mengapa ifconfigtidak disarankan: BBB: `bbb-conf --check` menampilkan alamat IP sebagai` inet` - ifconfig kesengsaraan

Untuk memahami mengapa ifconfigada di jalan keluar, lihat Perbedaan antara perintah 'ifconfig' dan 'ip'

ifconfigberasal dari net-tools, yang belum dapat sepenuhnya mengikuti tumpukan jaringan Linux untuk waktu yang lama. Itu juga masih menggunakan ioctl untuk konfigurasi jaringan, yang merupakan cara jelek dan kurang kuat untuk berinteraksi dengan kernel.

Sekitar 2005, sebuah mekanisme baru untuk mengendalikan tumpukan jaringan diperkenalkan - soket netlink.

Untuk mengkonfigurasi antarmuka jaringan, iproute2gunakan mekanisme soket netlink dupleks penuh itu, sambil ifconfigmengandalkan panggilan sistem ioctl.

Rui F Ribeiro
sumber
Saya lebih suka untuk tidak menetapkan eth0 sebagai default karena nama ini berubah pada mesin, dapatkah kami memberikan sintaks yang fleksibel
yael
@yael Changed, mengeluarkan eth0. Namun Roman lebih baik dari saya mencetak "IP =" di dalamnya awk. Terlalu banyak kekuatan otak untukku, masih terbangun. Menghindari ifconfig, itu belum masa depan, dan posisi perubahan alamat IP, setidaknya ada dua versi / implementasi (?) Yang berbeda untuk Linux di luar sana yang saya kenal.
Rui F Ribeiro
Sekadar info, pada versi iproute2 yang lebih baru (misal: bukan pada CentOS7 atau Debian8) ip dapat mengambil -briefparameter dan hasilnya menjadi lebih mudah diurai (2015-08-31: git.kernel.org/pub/scm/network/iproute2 /iproute2.git/commit/… )
AB
@AB juga -o karena saya menggunakan bantuan, terima kasih, akan memeriksanya ou
Rui F Ribeiro
1
Ah, saya tidak tahu tentang -oyang memang berguna untuk skrip
AB
6

Awk larutan:

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

Output sampel:

IP=10.0.2.15
RomanPerekhrest
sumber
-3
ip addr | grep -v 127.0.0.1 | grep 'inet ' | \
awk {'print $2'} | awk -F "/" {'print "IP="$1'}
Brian Olson
sumber
1
lihat ini:ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '
Rui F Ribeiro
1
Mengapa Anda memahami localhost IP 127.0.0.1?
Jeff Schaller