GNU/Linux >> Znalost Linux >  >> Linux

Linux bash skript pro extrakci IP adresy

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

Chcete-li pouze získat vaši IP adresu:

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

Tím získáte IP adresu eth0.

Edit:Kvůli změnám názvů rozhraní v posledních verzích Ubuntu to již nefunguje. Místo toho můžete použít toto:

hostname --all-ip-addresses nebo hostname -I , který dělá to samé (dá vám VŠECHNY IP adresy hostitele).


Pokud je cílem najít IP adresu připojeno směrem k internetu, pak by to mělo být dobré řešení.

Edit 2021:Přidány verze „sed“ a „grep“ a nové verze „awk“ (některé jsou gnu)

Chcete-li zjistit, jaké adresy IP se používají připojené k internetu, můžeme použít ip route příkaz. S novější verzí Linuxu získáte více informací s typickým výstupem, jako je tento:

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

takže získat IP musíte najít IP za src pomocí awk , sed nebo 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

a pokud se vám líbí rozhraní pojmenujte pomocí awk , sed nebo 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 neotevře žádné spojení, pouze ukazuje cestu potřebnou k dosažení 8.8.8.8 . 8.8.8.8 je DNS společnosti Google.

Pokud to chcete uložit do proměnné, postupujte takto:

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]}')

Proč může jiné řešení selhat:

ifconfig eth0

  • Pokud má vaše rozhraní jiný název (eno1, wifi, venet0 atd.)
  • Pokud máte více než jedno rozhraní
  • Směr připojení IP není první v seznamu více než jednoho IF

Hostname -I

  • Mohou získat pouze 127.0.1.1
  • Nefunguje na všech systémech.
  • Udělte všechny IP adresy nejen té, která je připojena k internetu. -I, --all-ip-adresuje všechny adresy hostitele

Pokud chcete získat seznam vašich IP adres oddělený mezerami, můžete použít hostname příkaz s --all-ip-addresses (krátce -I ) příznak

hostname -I

jak je popsáno zde:Vložení IP adresy do proměnné bash. Existuje lepší způsob?


Linux
  1. Jak používat šifrované heslo ve skriptu Linux Bash Shell

  2. Jak přeložit název hostitele na IP adresu v Bash skriptu?

  3. Služba OS Linux „scsi_reserve“

  1. Analýza historie Bash v Linuxu

  2. Změna hesla systému Linux ve skriptu bash

  3. Jak spustit příkazy bash Linuxu ve skriptu PERL?

  1. Jak ladit Bash skript?

  2. Bash skript:špatný interpret

  3. spuštění php skriptu (funkce php) v linux bash