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?