GNU/Linux >> Belajar Linux >  >> Linux

Skrip bash Linux untuk mengekstrak alamat IP

ip -4 addr show eth0 | grep -oP "(?<=inet ).*(?=/)"

Untuk mendapatkan alamat IP Anda:

echo `ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'`

Ini akan memberi Anda alamat IP eth0.

Sunting:Karena perubahan nama antarmuka di versi terbaru Ubuntu, ini tidak berfungsi lagi. Sebagai gantinya, Anda bisa menggunakan ini:

hostname --all-ip-addresses atau hostname -I , yang melakukan hal yang sama (memberi Anda SEMUA alamat IP host).


Jika tujuannya adalah untuk menemukan alamat IP terhubung ke internet, maka ini harus menjadi solusi yang baik.

Sunting 2021:Menambahkan versi "sed" dan "grep" dan versi "awk" baru (beberapa gnu)

Untuk mengetahui IP adder apa saja yang digunakan untuk terhubung ke internet, kita dapat menggunakan ip route memerintah. Dengan versi Linux yang lebih baru, Anda mendapatkan lebih banyak informasi dengan keluaran tipikal seperti ini:

ip route get 8.8.8.8
8.8.8.8 via 10.36.15.1 dev ens160 src 10.36.15.150 uid 1002
    cache

jadi untuk mendapatkan IP Anda perlu menemukan IP setelah src , menggunakan awk , sed atau grep

ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}'
ip route get 8.8.8.8 | awk 'match($0,/src (\S*)/,a)&&$0=a[1]'
ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/src/)$0=$(i+1)}NR==1'

ip route get 8.8.8.8 | sed -E 's/.*src (\S+) .*/\1/;t;d'
ip route get 8.8.8.8 | sed 's/.*src \([^ ]*\).*/\1/;t;d'
ip route get 8.8.8.8 | sed  -nE '1{s/.*?src (\S+) .*/\1/;p}'

ip route get 8.8.8.8 | grep -oP 'src \K[^ ]+'
10.36.15.150

dan jika Anda menyukai antarmuka nama menggunakan awk , sed atau grep

ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}'
ip route get 8.8.8.8 | awk 'match($0,/dev (\S*)/,a)&&$0=a[1]'
ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)$0=$(i+1)}NR==1'

ip route get 8.8.8.8 | sed -E 's/.*?dev (\S+) .*/\1/;t;d'
ip route get 8.8.8.8 | sed 's/.*dev \([^ ]*\).*/\1/;t;d'
ip route get 8.8.8.8 | sed  -nE '1{s/.*?dev (\S+) .*/\1/;p}'

ip route get 8.8.8.8 | grep -oP 'dev \K[^ ]+'
ens192

ip route tidak membuka koneksi apa pun, itu hanya menunjukkan rute yang diperlukan untuk sampai ke 8.8.8.8 . 8.8.8.8 adalah DNS Google.

Jika Anda ingin menyimpan ini ke dalam variabel, lakukan:

my_ip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}')

my_interface=$(ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}')

Mengapa solusi lain mungkin gagal:

ifconfig eth0

  • Jika antarmuka yang Anda miliki memiliki nama lain (eno1, wifi, venet0 dll)
  • Jika Anda memiliki lebih dari satu antarmuka
  • Arah sambungan IP bukan yang pertama dalam daftar lebih dari satu JIKA

Hostname -I

  • Mungkin hanya mendapatkan 127.0.1.1
  • Tidak berfungsi di semua sistem.
  • Berikan semua IP tidak hanya yang terhubung ke internet. -I, --all-ip-addresses semua alamat untuk host

Jika Anda ingin mendapatkan daftar IP Anda yang dipisahkan oleh spasi, Anda dapat menggunakan hostname perintah dengan --all-ip-addresses (pendek -I ) bendera

hostname -I

seperti yang dijelaskan di sini:Menempatkan Alamat IP ke dalam variabel bash. Apakah ada cara yang lebih baik?


Linux
  1. Cara Menggunakan Kata Sandi Terenkripsi di Linux Bash Shell Script

  2. Bagaimana menjalankan perintah bash Linux dalam skrip PERL?

  3. Layanan OS Linux 'scsi_reserve'

  1. Mengurai riwayat Bash di Linux

  2. Mengubah kata sandi sistem Linux dalam skrip bash

  3. Bagaimana Cara Men-debug Skrip Bash?

  1. Bagaimana Cara Menyelesaikan Nama Host Ke Alamat Ip Dalam Skrip Bash?

  2. Skrip Bash:juru bahasa yang buruk

  3. menjalankan skrip php (fungsi php) di linux bash