Bagaimana saya bisa menampilkan alamat IP yang ditunjukkan pada eth0 menggunakan skrip?
24
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
grep "inet"
Demi memberikan opsi lain, Anda bisa menggunakan
ip addr
perintah ini untuk mendapatkan alamat IP:ip addr show eth0
menunjukkan informasi tentangeth0
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, contoh172.20.20.15/25
cut -d/ -f1
hanya mengambil porsi alamat IP.Dalam naskah:
sumber
Diambil dari /programming//a/14910952/1695680
Namun itu mungkin mengembalikan alamat ip lokal (127.0.0.1), jadi Anda mungkin harus menggunakan, dan filter:
Dari halaman hostname:
sumber
ip addr show label 'enp*'
lebih baik, tapi saya parse yang menyebalkan, sesuatu sepertiip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
bisa bekerja ... betapa cantiknyaTanggapan @ markus-lindberg adalah favorit saya. Jika Anda menambahkan
-o -4
ke flag ip maka Anda mendapatkan output yang jauh lebih mudah diurai (dan konsisten):-o
singkatan--oneline
, yang dimaksudkan untuk membantu dalam situasi seperti ini. The-4
ditambahkan ke batas ke alamat IPv4, yang adalah apa yang semua tanggapan lain menyiratkan.sumber
ip
bendera. Menggunakancut
daripadaawk
sihir tingkat lanjut :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
cut
cara setelah saya tahuawk
, dan saya suka meminimalkan jumlah perintah pada jaringan pipa saya. Saran bagus dalam hal apapun.Berikut adalah beberapa oneliners .....
Awk
fungsi split dalam perintah awk di atas membagi kolom kedua berdasarkan pembatas
:
dan menyimpan nilai yang dipisahkan ke dalam array asosiatifa
. Begitua[2]
memegang nilai dari bagian kedua.sed
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
\K
membuang karakter yang sebelumnya cocok dari pencetakan di final dan\S+
cocok dengan satu atau lebih karakter non-spasi.Perl
Satu atau lebih karakter non-spasi yang berada di sebelah
inet addr:
string ditangkap dan akhirnya kami hanya mencetak karakter yang ditangkap tersebut.sumber
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
sumber
Anda harus menggunakan
ip
(bukanifconfig
) 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
:Sebagai skrip:
Output yang dihasilkan di atas adalah dalam notasi CIDR. Jika notasi CIDR tidak diinginkan, maka dapat dilucuti:
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 :
Sebagai skrip:
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
ip
akan menjadi pendekatan yang saya sukai, tentu bukan satu-satunya cara untuk menguliti kucing ini. Berikut ini pendekatan lain yang digunakanhostname
jika Anda lebih suka sesuatu yang lebih mudah / lebih ringkas:Atau, jika Anda menginginkan alamat IPv6:
Sebagai skrip:
sumber
Saya sarankan menggunakan perpustakaan python seperti netifaces yang dirancang khusus untuk tujuan ini.
Untuk mendapatkan antarmuka jaringan default yang digunakan.
sumber
Ini hanya menggunakan
ip addr
yang merupakan penggantiifconfig
danawk
dikombinasikan dengan substitusi (gsub).Berhentilah menggunakan terlalu banyak proses untuk tugas-tugas sederhana
sumber
Hanya satu opsi lagi yang dapat berguna jika Anda tidak memiliki awk (seperti yang terjadi pada beberapa perangkat yang disematkan):
sumber
ifconfig eth0|grep 'inet '|awk '{print $2}'
sumber
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 ).+(?=\/)"
sumber
ini dapat digunakan dengan pengguna normal juga.
sumber
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
dua kali alih-alih kombinasiawk
dancut
untuk 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.Ini adalah cara terpendek yang dapat saya temukan:
ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'
Ganti
$1
dengan 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.sumber
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:
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:
Saya menggunakan perintah ini pada BDS & NIX yang berbeda itu tidak pernah gagal;)
sumber
ip
, gunakan-o
opsi.Dalam skrip saya, saya menggunakan sesuatu seperti itu:
Itu tidak menelurkan proses apa pun.
sumber
Namun cara lain (dengan asumsi Anda tidak ingin
CIDR
alamat dan inginIPv4
):ip
perintah yang bukandeprecated
sumber