Menampilkan alamat IP pada antarmuka eth0

24

Bagaimana saya bisa menampilkan alamat IP yang ditunjukkan pada eth0 menggunakan skrip?

pengguna43389
sumber

Jawaban:

28

simpan ini dalam file lalu jalankan bash <filename>

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

lebih akurat untuk mendapatkan hanya nomor yang menunjukkan alamat IP:

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

Pembaruan : Jika ini tidak berhasil untuk Anda, coba jawaban yang lain

Edward Torvalds
sumber
2
tentu saja ini tidak berfungsi di ubuntu terbaru. ifconfig terbaru mengembalikan "inet <ip>" bukannya "inet addr <ip>"
thang
Anda bisa menggunakangrep "inet"
Andrei Radulescu
26

Demi memberikan opsi lain, Anda bisa menggunakan ip addrperintah ini untuk mendapatkan alamat IP:

ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
  • ip addr show eth0 menunjukkan informasi tentang eth0
  • grep "inet\b"hanya menunjukkan baris yang memiliki alamat IPv4 (jika Anda menginginkan alamat IPv6, ubah ke "inet6\b")
  • awk '{print $2}' mencetak pada kolom kedua, yang memiliki ipaddress / mask, contoh 172.20.20.15/25
  • cut -d/ -f1 hanya mengambil porsi alamat IP.

Dalam naskah:

#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
Alaa Ali
sumber
solusi ini benar-benar berfungsi!
thang
ip -4 ... dan ip -6 ...! Terima kasih!
TamusJRoyce
17

Diambil dari /programming//a/14910952/1695680

hostname -i

Namun itu mungkin mengembalikan alamat ip lokal (127.0.0.1), jadi Anda mungkin harus menggunakan, dan filter:

hostname -I

Dari halaman hostname:

-i, --ip-address

Tampilkan alamat jaringan dari nama host. Perhatikan bahwa ini hanya berfungsi jika nama host dapat diselesaikan. Hindari menggunakan opsi ini; gunakan hostname --all-ip-address saja.

-I, --all-ip-addresses

Tampilkan semua alamat jaringan host. Opsi ini menyebutkan semua alamat yang dikonfigurasi pada semua antarmuka jaringan. Antarmuka loopback dan alamat IP-link-lokal dihilangkan. Berlawanan dengan opsi -i, opsi ini tidak bergantung pada resolusi nama. Jangan membuat asumsi tentang urutan output.

ThorSummoner
sumber
sebagai catatan, saya suka yang ip addr show label 'enp*'lebih baik, tapi saya parse yang menyebalkan, sesuatu seperti ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2bisa bekerja ... betapa cantiknya
ThorSummoner
5

Tanggapan @ markus-lindberg adalah favorit saya. Jika Anda menambahkan -o -4ke flag ip maka Anda mendapatkan output yang jauh lebih mudah diurai (dan konsisten):

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

-osingkatan --oneline, yang dimaksudkan untuk membantu dalam situasi seperti ini. The -4ditambahkan ke batas ke alamat IPv4, yang adalah apa yang semua tanggapan lain menyiratkan.

Amos Shapira
sumber
Cinta ipbendera. Menggunakan cutdaripada awksihir tingkat lanjut :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
DuffJ
@DuffJ mungkin karena masalah selera pribadi. Saya "menemukan" cutcara setelah saya tahu awk, dan saya suka meminimalkan jumlah perintah pada jaringan pipa saya. Saran bagus dalam hal apapun.
Amos Shapira
Saya sepenuhnya setuju, Amos. Terima kasih atas solusinya!
DuffJ
3

Berikut adalah beberapa oneliners .....

Awk

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

fungsi split dalam perintah awk di atas membagi kolom kedua berdasarkan pembatas :dan menyimpan nilai yang dipisahkan ke dalam array asosiatif a. Begitu a[2]memegang nilai dari bagian kedua.

sed

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

Dalam sed dasar, \(...\)disebut capturing group yang digunakan untuk menangkap karakter. Kita dapat merujuk karakter-karakter yang ditangkap melalui referensi-kembali. \([^[:space:]]\+\)menangkap karakter apa pun tetapi tidak spasi satu kali atau lebih.

grep

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

\Kmembuang karakter yang sebelumnya cocok dari pencetakan di final dan \S+cocok dengan satu atau lebih karakter non-spasi.

Perl

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

Satu atau lebih karakter non-spasi yang berada di sebelah inet addr:string ditangkap dan akhirnya kami hanya mencetak karakter yang ditangkap tersebut.

Avinash Raj
sumber
@edwardtorvalds menambahkan beberapa penjelasan. Saya pikir ini akan bermanfaat bagi pembaca masa depan. Jangan ragu untuk mengajukan pertanyaan dari perintah di atas ... :)
Avinash Raj
2

Ini yang bagus, hanya menggunakan grep sebagai perintah sekunder:

ip addr show eth0 | grep -oP 'inet \ K \ S [0-9.] +'

Saya tidak mengerti mengapa Anda harus menggunakan lebih banyak perintah daripada yang dibutuhkan

Rick
sumber
2

Anda harus menggunakan ip(bukan ifconfig) seperti saat ini, dipertahankan, dan mungkin yang paling penting untuk tujuan skrip, itu menghasilkan output yang konsisten & dapat diuraikan. Berikut ini adalah beberapa pendekatan serupa:

Jika Anda ingin alamat IPv4 untuk antarmuka Ethernet Anda eth0:

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

Sebagai skrip:

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

Output yang dihasilkan di atas adalah dalam notasi CIDR. Jika notasi CIDR tidak diinginkan, maka dapat dilucuti:

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

Pilihan lain yang IMHO adalah "paling elegan" mendapatkan alamat IPv4 untuk antarmuka apa pun yang digunakan untuk terhubung ke host jarak jauh yang ditentukan (8.8.8.8 dalam kasus ini). Atas perkenan @gatoatigrado dalam jawaban ini :

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

Sebagai skrip:

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

Ini berfungsi dengan baik pada host dengan satu antarmuka, tetapi lebih menguntungkan juga akan bekerja pada host dengan banyak antarmuka dan / atau spesifikasi rute.

Meskipun ipakan menjadi pendekatan yang saya sukai, tentu bukan satu-satunya cara untuk menguliti kucing ini. Berikut ini pendekatan lain yang digunakan hostnamejika Anda lebih suka sesuatu yang lebih mudah / lebih ringkas:

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

Atau, jika Anda menginginkan alamat IPv6:

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

Sebagai skrip:

$ 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
Seamus
sumber
1

Saya sarankan menggunakan perpustakaan python seperti netifaces yang dirancang khusus untuk tujuan ini.

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

Untuk mendapatkan antarmuka jaringan default yang digunakan.

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

Hanya satu opsi lagi yang dapat berguna jika Anda tidak memiliki awk (seperti yang terjadi pada beberapa perangkat yang disematkan):

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

ifconfig eth0|grep 'inet '|awk '{print $2}'

Maksim Kostromin
sumber
1

ini untuk IPv4 :

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

ini untuk IPv4 & dev tertentu (eth0):

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

untuk IPv6 :

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

XXL
sumber
0

ini dapat digunakan dengan pengguna normal juga.

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
Matheus Baldasso
sumber
ia meminta eth0, versi skrip Anda ini dapat membantu (juga menunjukkan loopback tho)ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
TiloBunt
Ini adalah jawaban yang hampir sama dengan askubuntu.com/a/560466/367990 , hanya menggunakan cutdua kali alih-alih kombinasi awkdan cutuntuk mem-parsing output. Lain kali Anda harus memeriksa semua jawaban lain terlebih dahulu dan memastikan Anda tidak mengirim solusi rangkap. Dalam hal ini di sini, saya pikir itu bisa diperdebatkan apakah itu duplikat atau hanya serupa, jadi silakan anggap sebagai petunjuk umum. Terima kasih.
Byte Commander
0

Ini adalah cara terpendek yang dapat saya temukan:

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

Ganti $1dengan antarmuka jaringan Anda.

ip -f inet memberitahu ip untuk hanya mengembalikan nilai untuk keluarga inet (ipv4).

grep -Po memberitahu grep untuk menginterperasikan nilai berikutnya sebagai perl-regex, dan hanya mencetak nilai yang cocok.

Regex \K[\d.]+mengatakan "buang semuanya hingga titik ini (\ K), dan cocokkan dengan nilai numerik sebanyak mungkin diikuti oleh satu titik dalam satu baris mungkin". Karena itu ini hanya akan cocok dengan alamat IP dan mengabaikan semuanya setelahnya, termasuk subnet mask shortform \ XX.

Ryan
sumber
0

pada hari-hari ini dengan banyak antarmuka (misalnya jika Anda menggunakan buruh pelabuhan) dan penamaan antarmuka oleh ETH tidak lagi menjadi norma.

Saya menggunakan perintah ini untuk mengekstrak IP / Mask:

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

Jadi, berapa pun jumlah antarmuka yang saya miliki dan apa pun nama mereka, GREP hanya akan mengambil yang pertama memiliki opsi MULTICAST.

Saya menggunakan perintah ini untuk mengekstrak hanya IP tanpa topeng:

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

Saya menggunakan perintah ini pada BDS & NIX yang berbeda itu tidak pernah gagal;)

JOduMonT
sumber
Jika Anda akan mem-parsing output ip, gunakan -oopsi.
muru
0

Dalam skrip saya, saya menggunakan sesuatu seperti itu:

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

Itu tidak menelurkan proses apa pun.

Maciej Wawrzyńczuk
sumber
0

Namun cara lain (dengan asumsi Anda tidak ingin CIDRalamat dan ingin IPv4):

$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
  • Menggunakan ipperintah yang bukandeprecated
  • Hanya menggunakan satu perintah untuk memfilter
htaccess
sumber