Bagaimana saya bisa menampilkan alamat IP yang ditunjukkan pada eth0 menggunakan skrip?
Bagaimana saya bisa menampilkan alamat IP yang ditunjukkan pada eth0 menggunakan skrip?
Jawaban:
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 | 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)
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.
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' ' -f2
bisa bekerja ... betapa cantiknya
Tanggapan @ markus-lindberg adalah favorit saya. Jika Anda menambahkan -o -4
ke flag ip maka Anda mendapatkan output yang jauh lebih mudah diurai (dan konsisten):
ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'
-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.
ip
bendera. Menggunakan cut
daripada awk
sihir tingkat lanjut :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
cut
cara setelah saya tahu awk
, dan saya suka meminimalkan jumlah perintah pada jaringan pipa saya. Saran bagus dalam hal apapun.
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+'
\K
membuang 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.
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 ip
akan menjadi pendekatan yang saya sukai, tentu bukan satu-satunya cara untuk menguliti kucing ini. Berikut ini pendekatan lain yang digunakan hostname
jika 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
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]
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
Ini hanya menggunakan ip addr
yang merupakan pengganti ifconfig
dan awk
dikombinasikan dengan substitusi (gsub).
Berhentilah menggunakan terlalu banyak proses untuk tugas-tugas sederhana
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}"
ifconfig eth0|grep 'inet '|awk '{print $2}'
ini dapat digunakan dengan pengguna normal juga.
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
dua kali alih-alih kombinasi awk
dan cut
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.
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;)
ip
, gunakan -o
opsi.
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.