Linux ve OS X'te yerel makinenin birincil IP adresini nasıl alabilirim? [kapalı]


339

127.0.0.1 dışında localhost'un birincil (ilk) IP adresini döndürecek bir komut satırı çözümü arıyorum

Çözüm en azından Linux (Debian ve RedHat) ve OS X 10.7+ için çalışmalıdır

Her ifconfigikisinde de mevcut olduğunun farkındayım ancak çıktıları bu platformlar arasında çok tutarlı değil.


2
Makinenizin yerel ağ IP adresini mi istiyorsunuz? 192.168.0.12
Chris Seymour

Evet, yerel IP, ilk olarak birden fazla olabilir, ancak bir listeyle bile yaşayabilirim. Şu an için sadece IPv4 adreslerini desteklemekten ve IPv6'yı görmezden gelmekten mutluyum, çünkü sadece bir karma oluşturmak istiyoruz.
sorin

2
"Birincil" i nasıl tanımlıyorsunuz? "Varsayılan yolumla aynı alt ağda bulunan IP adresini" düşünüyorsanız, bunun için biraz programlamanız gerekir. Ancak, makinenin varsayılan yolu yoksa, ancak yine de> 1 IP adresi varsa?
ghoti

4
Deneyin curl -4 ifconfig.co. Harici IP4 adresinizle cevap verecektir.
asmaier

Yanıtlar:


475

grepIP adresini şunlardan filtrelemek için kullanın ifconfig:

ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'

Veya sed:

ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'

Yalnızca belirli arabirimler, wlan0, eth0, vb. İle ilgileniyorsanız, o zaman:

ifconfig wlan0 | ...

Sen Gözlerinde farklı komutu diğer ad olabilir .bashrciçin yaratmak denilen kendi komutu myipmesela.

alias myip="ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'"

Çok daha basit bir yol hostname -I( hostname -ieski sürümleri için hostnameama yorumlara bakın). Ancak, bu sadece Linux'ta.


5
OSX'te sed'in -EGNU stili -rseçeneğini değil Genişletilmiş RE seçeneğini kullandığını unutmayın.
ghoti

1
İlginç; GNU sed'in desteklendiğinin farkında değildim -E. FreeBSD'nin son sürümleri, komut dosyası taşınabilirliğini kolaylaştırmak -riçin bir takma ad olarak seçenek ekledi -E, ancak güncelleme henüz OSX'e getirilmedi, son kontrol ettiğim birkaç yıl önce bir FreeBSD sürümünün sed sürümünü kullanıyor. OSX'in yıllar boyunca birkaç kez FreeBSD kaynak kodunu benimsediğinden tam olarak hangisinden emin değilim. Bence kullanımının ' seçeneğiyle -Ekarşılaştırılabilir olması grep' düşünülüyor -E. -rBunun yerine GNU milletinin neden tercih ettiği hakkında hiçbir fikrim yok .
ghoti

1
@ghoti Ben -Etaşınabilirlik emin olmak için kullanmak için cevap değiştirdim , sen düşünecektim --helpve man pagesgüncelleneceğini .. başka bir soruda daha önce benim için biraz karışıklık neden oldu-E
Chris Seymour

1
Bir sorun buldum, bu OS X üzerinde çalışırken birden fazla IP, IP listesi döndürüyor. Birincisi doğru olanı gibi görünüyor ama yine de bu benim mantığımı kıracak. Bkz. Gist.github.com/ssbarnea/31b9dcb0f8fd528b958c - ayrıca aktif olan ancak paralles tarafından kullanılan vnic olanları döndürür.
sorin

13
OSX: ipconfig getifaddr en0
parleer

232

Aşağıdakiler Linux üzerinde çalışır, ancak OSX üzerinde çalışmaz.

Bu, DNS'ye hiç güvenmez ve /etc/hostsdoğru ayarlanmamış olsa bile çalışır ( 1kısayol içindir 1.0.0.0):

ip route get 1 | awk '{print $NF;exit}'

veya açıklık için awkGoogle'ın genel 8.8.8.8DNS'inden kaçınma ve kullanma :

ip route get 8.8.8.8 | head -1 | cut -d' ' -f8

Daha az güvenilir bir yol: (aşağıdaki yoruma bakın)

hostname -I | cut -d' ' -f1

8
Tarafından üretilen ilk adresi alan hostname -Iyöntem güvenilmezdir, çünkü (belgelere göre) adreslerin sırası hakkında herhangi bir varsayım yapılamaz. Bu yüzden bazı iç ağlar olabilir (sanal makinelerin yaşadığı ağ gibi). Diğer yöntem iyi görünüyor.
Adam Ryczkowski

3
RHEL 7 artık ifconfig içermediğinden bu kabul edilen cevap olmalıdır.
Andrew

10
Benim için ip route get 1 | awk '{print $(NF-2);exit}'çalışır upt ekli uid olsun gibi
Hritik

13
BU (ilki) SADECE DOĞRU ÇÖZÜMDÜR . Öyle önemli varsayılan rota ile ilgili arayüzünden özellikle IP okumak için. Aksi takdirde, değersiz bir dahili adres alma olasılığınız oldukça yüksektir.
Jan Hudec

12
benim için işe yaramadı ama yeterince kapatıldı:ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
estani

230

Linux makineleri için (OS X hariç):

hostname --ip-address

10
Bu yalnızca ad DNS'deyse çalışır. Aksi takdirde, "ana bilgisayar adı: Adı veya hizmeti bilinmiyor" iletisini alırsınız.
Vebjorn Ljosa

39
hostname -ikısa formudur
Paul Evans

75
Bu bazen 127.0.0.1 döndürür. Varsa , el kitabı (Ubuntu) tarafından önerilen ana bilgisayar adı -I'yi kullanın
jrierab

1
Linux üzerinde de çalışmaz, en azından hostnameGNU Coreutils sürüm 8.26 ile çalışmaz.
ack

5
Benim makinede hostname -iise, sadece yerel IP verir hostname -I, diğer tüm IP'leri verir
Alexis Pâques

62

Linux'ta

hostname -I

macOS'ta

ipconfig getifaddr en0

hostname -Igüvenilmez bir sırayla (bkz birden fazla adres dönebilirsiniz manpage ), ama bana sadece iadeler için , hangi istediğim budur.hostname192.168.1.X


1
benim için daha hostname -idüşük bir I. ile oldu
Paul Woitaschek

2
@PaulWoitaschek küçük harf için manpage -ibayrağı bu diyor: Avoid using this option; use hostname -I instead.
Boris

@Boris, Alpine (ve dolayısıyla BusyBox) çalıştıran bir liman işçisi konteyneri gibi bir şeyde çalışıyorsanız, sadece küçük harf kabul eder
bayetovsky

40

Çözüm

$ ip -o route get to 8.8.8.8 | sed -n 's/.*src \([0-9.]\+\).*/\1/p'
192.168.8.16

açıklama

Doğru sorgu ağ bilgilerine yolu kullanıyor ip:

  • -o tek satırlık çıktı
  • route get to bir hedefe giden gerçek çekirdek rotasını alma
  • 8.8.8.8 Google IP, ancak ulaşmak istediğiniz gerçek IP'yi kullanabilir

örneğin ipçıktı:

8.8.8.8 via 192.168.8.254 dev enp0s25 src 192.168.8.16 uid 1000 \   cache

srcIp çıkarmak için, sedligthest ve regex desteği ile en uyumludur:

  • -n varsayılan olarak çıktı yok
  • 's/pattern/replacement/p' yalnızca desen eşleştirme ve baskı değiştirme
  • .*src \([0-9.]\+\).* ulaşmak için çekirdek tarafından kullanılan src IP'sini eşleştirin 8.8.8.8

örneğin nihai çıktı:

192.168.8.16

Diğer cevaplar

Bence önceki cevapların hiçbiri benim için yeterince iyi değil, çünkü yeni bir makinede çalışmıyorlar (Gentoo 2018).

Önceki yanıtlarda bulduğum sorunlar:

  • komut çıkışında konumsal sütun kullanımı;
  • kullanımı ifconfig kaldırılmıştır ve - örneğin, çoklu IP'leri listelemeyin;
  • kullanımı awksed'in daha iyi işleyebileceği basit bir görev için ;
  • ip route get 1 belirsiz ve aslında bir takma ad ip route get to 1.0.0.0
  • tüm cihazda seçeneği hostnameolmayan -Ive 127.0.0.1benim durumumda dönen komutun kullanımı .

34

Düzenlendi ( 2014-06-01 2018-01-09)

Daha güçlü yapılandırma için, her arabirimde birçok arabirim ve birçok IP yapılandırılmış olarak, doğru arabirimi ve ipi bulmak için saf bir bash betiği (tabanlı değil 127.0.0.1) yazdım . Bu senaryoyu bu cevabın en altına gönderiyorum.default route

giriş

Her iki Os'un da varsayılan olarak yüklendiğinde, hem Mac hem de Linux için bir bash ipucu vardır:

Yerel ayar sorunu aşağıdakilerin kullanımı ile engellenir LANG=C:

myip=
while IFS=$': \t' read -a line ;do
    [ -z "${line%inet}" ] && ip=${line[${#line[1]}>4?1:2]} &&
        [ "${ip#127.0.0.1}" ] && myip=$ip
  done< <(LANG=C /sbin/ifconfig)
echo $myip

Bunu bir işleve koymak:

En az:

getMyIP() {
    local _ip _line
    while IFS=$': \t' read -a _line ;do
        [ -z "${_line%inet}" ] &&
           _ip=${_line[${#_line[1]}>4?1:2]} &&
           [ "${_ip#127.0.0.1}" ] && echo $_ip && return 0
      done< <(LANG=C /sbin/ifconfig)
}

Basit kullanım:

getMyIP
192.168.1.37

Süslü düzenli:

getMyIP() {
    local _ip _myip _line _nl=$'\n'
    while IFS=$': \t' read -a _line ;do
        [ -z "${_line%inet}" ] &&
           _ip=${_line[${#_line[1]}>4?1:2]} &&
           [ "${_ip#127.0.0.1}" ] && _myip=$_ip
      done< <(LANG=C /sbin/ifconfig)
    printf ${1+-v} $1 "%s${_nl:0:$[${#1}>0?0:1]}" $_myip
}

Kullanımı:

getMyIP
192.168.1.37

ya da aynı işlevi yürütüyor ancak bir argümanla:

getMyIP varHostIP
echo $varHostIP
192.168.1.37
set | grep ^varHostIP
varHostIP=192.168.1.37

Not: Bağımsız değişken olmadan, STDOUT, IP ve yeni satırdaki bu işlev çıktısı, bağımsız değişkenle hiçbir şey yazdırılmaz, ancak bağımsız değişken olarak adlandırılan bir değişken oluşturulur ve yeni satır olmadan IP içerir .

Not 2: Bu Debian, LaCie hack nas ve MaxOs üzerinde test edildi. Bu, ortamınız altında çalışmazsa, geri bildirimlerle çok ilgileneceğim!

Bu cevabın eski sürümü

(Dayanan çünkü Silinmedi seddeğil bash.)

Uyarı: Yerel ayarlarla ilgili bir sorun var!

Hızlı ve küçük:

myIP=$(ip a s|sed -ne '/127.0.0.1/!{s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p}')

Patladı (çok çalışın;)

myIP=$(
    ip a s |
    sed -ne '
        /127.0.0.1/!{
            s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p
        }
    '
)

Düzenle:

Nasıl! Bu Mac OS'de çalışmıyor gibi görünüyor ...

Tamam, bu işi oldukça aynı görünüyor Mac OS benim olduğu gibi Linux :

myIP=$(LANG=C /sbin/ifconfig  | sed -ne $'/127.0.0.1/ ! { s/^[ \t]*inet[ \t]\\{1,99\\}\\(addr:\\)\\{0,1\\}\\([0-9.]*\\)[ \t\/].*$/\\2/p; }')

splitted:

myIP=$(
    LANG=C /sbin/ifconfig  |
        sed -ne $'/127.0.0.1/ ! {
            s/^[ \t]*inet[ \t]\\{1,99\\}\\(addr:\\)\\{0,1\\}\\([0-9.]*\\)[ \t\/].*$/\\2/p;
        }')

Senaryom (Ocak 2018):

Bu komut dosyası önce kullanılan varsayılan rotanızı ve arayüzünüzü bulur , ardından ağ geçidinin yerel ip eşleştirme ağını arar ve değişkenleri doldurur. Son iki satır yazdırılıyor:

Interface   : en0
Local Ip    : 10.2.5.3
Gateway     : 10.2.4.204
Net mask    : 255.255.252.0
Run on mac  : true

veya

Interface   : eth2
Local Ip    : 192.168.1.31
Gateway     : 192.168.1.1
Net mask    : 255.255.255.0
Run on mac  : false

İşte burada:

#!/bin/bash
runOnMac=false
int2ip() { printf ${2+-v} $2 "%d.%d.%d.%d" \
        $(($1>>24)) $(($1>>16&255)) $(($1>>8&255)) $(($1&255)) ;}
ip2int() { local _a=(${1//./ }) ; printf ${2+-v} $2 "%u" $(( _a<<24 |
                  ${_a[1]} << 16 | ${_a[2]} << 8 | ${_a[3]} )) ;}
while IFS=$' :\t\r\n' read a b c d; do
    [ "$a" = "usage" ] && [ "$b" = "route" ] && runOnMac=true
    if $runOnMac ;then
        case $a in 
            gateway )    gWay=$b  ;;
            interface )  iFace=$b ;;
        esac
    else
        [ "$a" = "0.0.0.0" ] && [ "$c" = "$a" ] && iFace=${d##* } gWay=$b
    fi
done < <(/sbin/route -n 2>&1 || /sbin/route -n get 0.0.0.0/0)
ip2int $gWay gw
while read lhs rhs; do
    [ "$lhs" ] && { 
        [ -z "${lhs#*:}" ] && iface=${lhs%:}
        [ "$lhs" = "inet" ] && [ "$iface" = "$iFace" ] && {
            mask=${rhs#*netmask }
            mask=${mask%% *}
            [ "$mask" ] && [ -z "${mask%0x*}" ] &&
                printf -v mask %u $mask ||
                ip2int $mask mask
            ip2int ${rhs%% *} ip
            (( ( ip & mask ) == ( gw & mask ) )) &&
                int2ip $ip myIp && int2ip $mask netMask
        }
    }
done < <(/sbin/ifconfig)
printf "%-12s: %s\n" Interface $iFace Local\ Ip $myIp \
       Gateway $gWay Net\ mask $netMask Run\ on\ mac $runOnMac

1
@sorin: evet, bu şimdi ifconfig ile çalışıyor. ( sbintam $PATHyolumda olmadığı gibi ,
MacOS'ta

1
@sorin, bu timekadar uzun süre kullanacağınızı seçmek için bunu deneyin ...
F. Hauri

hızlı ve küçük çözüm en iyi yaklaşımdı. Daha yeni çözümler bana sözdizimi hataları veriyor. Uyumluluk her zaman bir artıdır. Teşekkür ederim.
m3nda

29

Yalnızca belirli Ubuntu yapılarına özgüdür. Gerçi size şunu söyleyebilir 127.0.0.1:

hostname  -i

veya

hostname -I

bu her durumda işe yarıyor mu?
AloneInTheDark

6
Hayır. - sadece 127.0.0.1'i söyleyebilir.
SvenDowideit

hostname -Iubuntu üzerinde çalışıyorum.
Borzh

1
$ hostname --ip-addresssadece 127.0.0.1Arch Linux üzerinde veriyor
kristianlm

1
hostname -I veya hostname kullan --all-ip-adresler
Aydın K.

24

Linux'taki bu komutu kullanarak eth0'un IP sürüm 4 adresini de alabilirsiniz

/sbin/ip -4 -o addr show dev eth0| awk '{split($4,a,"/");print a[1]}'

Çıktı böyle olacak

[root@localhost Sathish]# /sbin/ip -4 -o addr show dev eth0| awk '{split($4,a,"/");print a[1]}'
192.168.1.22

Bana en iyi cevap! Teşekkürler @Sathish! ;-)
Samuel Phan

1
Katılıyorum, bu eth0 IPv4 almak için en temiz yöntemdir.
Chris Mendez

Bu, mevcut adlandırma stratejisi olmayan ve hiçbir zaman birincil arabirim olduğu garanti edilmeyen eth0'ı varsayar.
rfay

Arayüzü biliyorsanız en zarif yöntem budur. Sisteminizde birden fazla arabirim varsa, ancak yalnızca belirli bir arabirimle ilgileniyorsanız idealdir.
lepe

14

Linux ve OSX üzerinde çalışır

Bu, varsayılan rota ile ilişkili arabirimi alır

NET_IF=`netstat -rn | awk '/^0.0.0.0/ {thif=substr($0,74,10); print thif;} /^default.*UG/ {thif=substr($0,65,10); print thif;}'`

Yukarıda bulunan arayüzü kullanarak ip adresini alın.

NET_IP=`ifconfig ${NET_IF} | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'`

OSX

uname -a

Darwin dizüstü bilgisayar 14.4.0 Darwin Çekirdek Sürüm 14.4.0: Per 28 Mayıs 11:35:04 PDT 2015; kök: xnu-2782.30.5 ~ 1 / RELEASE_X86_64 x86_64

echo $NET_IF

EN5

echo $NET_IP

192.168.0.130

CentOS Linux

uname -a

Linux dev-cil.medfx.local 2.6.18-164.el5xen 1 SMP Per Eylül 3 04:03:03 EDT 2009 x86_64 x86_64 x86_64 GNU / Linux

echo $NET_IF

eth0

echo $NET_IP

192.168.46.10


Bu sorunun tüm cevaplarına rağmen, aslında doğru olana yaklaşan tek soru bu gibi görünüyor. Sadece | head -1varsayılan arabirimi almak için ilk satırın sonunda bir gerekir ve gerisi iyi.
Endareth

12

Diğer yöntemlerden bazılarını kullanma Sistemde birden çok IP adresinin tanımlandığı bir çakışma girebilirsiniz. Bu satır her zaman varsayılan olarak IP adresini alır.

ip route get 8.8.8.8 | head -1 | awk '{print $7}'

Varsayılan bir rota yoksa (ancak iyi fikir) başarısız olur
FractalSpace

Güzel ... İnternetiniz olmasa bile çalışmayı düşünüyor musunuz?
Boris Churzin

8

Bu yanıta yorumumu çıkarıyorum:

ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'

Benim durumumda işe yaramayan @CollinAnderson cevabına dayanıyor.


8
ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}'

1
Bunu bir bashtakma ad haline getirmek istiyorsanız :alias myip="ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print \$2}'"
Sam Houston

Sağ. Ama soru başlangıçta komuta ile ilgiliydi. Ben de konuyla ilgili olarak yayınladım. Şerefe!
Faizan Noor

6

Linux sisteminizde yerel ipv4 adresinizi almanın en kısa yolu:

hostname -I | awk '{print $1}'

5
Kötü. Man sayfası, çıktının sırası hakkında herhangi bir varsayımda bulunmamanızı özellikle belirtir.
Matt

Önemsiz kullanım durumlarım için harika çalışıyor - Hızlı ve kirli olup olmadığı umurumda değil! Harika!
Nicolai Weitkemper

6

Dünyanın geri kalanından görüldüğü gibi birincil herkese açık IP'nize ihtiyacınız olduğunu varsayarsak , bunlardan birini deneyin:

wget http://ipecho.net/plain -O - -q
curl http://icanhazip.com
curl http://ifconfig.me/ip

6

Collin Andersons'a eklemek zorundayım, iki arayüzünüz varsa ve her ikisi de gösteriliyorsa, bu yöntemin de dikkate aldığını cevaplamalıyım.

ip route get 1 | awk '{print $NF;exit}'

Raspberry Pi's ile bir uygulama üzerinde çalışıyorum ve aslında sadece ya da değil olup olmadığını kullanılan IP adresi gerekiyordu. Diğer yanıtların çoğu, zaten benim senaryom için her zaman IP adresi gerekmeyecektir.


5

Birincil ağ arabirimi IP'si

ifconfig `ip route | grep default | head -1 | sed 's/\(.*dev \)\([a-z0-9]*\)\(.*\)/\2/g'` | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | head -1

5

Varsayılan ağ geçidi olan bir ağda bu bilgisayarın IP adresini bulur (örneğin tüm sanal ağları, liman işçileri köprülerini hariç tutar). internet ağ geçidi, wifi ağ geçidi, ethernet

ip route| grep $(ip route |grep default | awk '{ print $5 }') | grep -v "default" | awk '/scope/ { print $9 }'

Linux üzerinde çalışır.

Ölçek:

  ~ ip route| grep $(ip route |grep default | awk '{ print $5 }') | grep -v "default" | awk '/scope/ { print $9 }'
192.168.0.114

  reverse-networking git:(feature/type-local)  ifconfig wlp2s0
wlp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.114  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::d3b9:8e6e:caee:444  prefixlen 64  scopeid 0x20<link>
        ether ac:x:y:z  txqueuelen 1000  (Ethernet)
        RX packets 25883684  bytes 27620415278 (25.7 GiB)
        RX errors 0  dropped 27  overruns 0  frame 0
        TX packets 7511319  bytes 1077539831 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Güzel! Taco Bell programlama en iyisi - bunun için teşekkürler.
Stevie Howard

3
ip addr show | grep -E '^\s*inet' | grep -m1 global | awk '{ print $2 }' | sed 's|/.*||'

3

ifconfigHem Linux hem de OSX'te çalışan başka bir varyasyon:

ifconfig | grep "inet " | cut -f2 -d' '

1
küçük bir varyasyon:ifconfig | grep '\<inet\>' | cut -d ' ' -f2 | grep -v '127.0.0.1'
jpbochi

Neden bu cevapların yarısı benim için hiç çalışmıyor?
SurpriseDog

3

Bir sürü bağlantıdan (StackExchange, AskUbuntu, StackOverflow vb) geçtim ve tüm en iyi çözümleri tek bir kabuk komut dosyasına birleştirmeye karar verdim.

Kanımca bu iki KG görülenin en iyisi:

Harici IP adresimi bir kabuk betiğinde nasıl alabilirim? https://unix.stackexchange.com/q/22615

Dahili IP adresimi nasıl bulabilirim? https://askubuntu.com/a/604691

İşte benim deposunda paylaşılan rsp bazı fikirler dayalı benim çözüm ( https://github.com/rsp/scripts/ ).

Bazılarınız bu komut dosyasının bu kadar basit bir görev için son derece büyük olduğunu söyleyebiliriz, ancak kullanımı mümkün olduğunca kolay ve esnek hale getirmek istiyorum. Varsayılan değerleri yeniden tanımlamayı sağlayan basit yapılandırma dosyasını destekler.

Cygwin, MINGW ve Linux (Red Hat) altında başarıyla test edildi.

Dahili IP adresini göster

myip -i

Harici IP adresini göster

myip -e

Kaynak kodu, ayrıca şu bağlantıdan da edinilebilir: https://github.com/ildar-shaimordanov/tea-set/blob/master/home/bin/myip . Ana komut dosyasının yanında yapılandırma dosyası örneği vardır.

#!/bin/bash

# =========================================================================
#
# Getting both internal and external IP addresses used for outgoing 
# Internet connections.
#
# Internal IP address is the IP address of your computer network interface 
# that would be used to connect to Internet.
#
# External IP address is the IP address that is visible by external 
# servers that you connect to over Internet.
#
# Copyright (C) 2016 Ildar Shaimordanov
#
# =========================================================================

# Details of the actual implementation are based on the following QA:
#
# How can I get my external IP address in a shell script?
# https://unix.stackexchange.com/q/22615
#
# How do I find my internal ip address?
# https://askubuntu.com/a/604691

# =========================================================================

for f in \
    "$( dirname "$0" )/myip.conf" \
    ~/.myip.conf \
    /etc/myip.conf
do
    [ -f "$f" ] && {
        . "$f"
        break
    }
done

# =========================================================================

show_usage() {
    cat - <<HELP
USAGE
  $( basename "$0" ) [OPTIONS]

DESCRIPTION
  Display the internal and external IP addresses

OPTIONS
  -i  Display the internal IP address
  -e  Display the external IP address
  -v  Turn on verbosity
  -h  Print this help and exit
HELP
    exit
}

die() {
    echo "$( basename "$0" ): $@" >&2
    exit 2
}

# =========================================================================

show_internal=""
show_external=""
show_verbose=""

while getopts ":ievh" opt
do
    case "$opt" in
    i )
        show_internal=1
        ;;
    e )
        show_external=1
        ;;
    v )
        show_verbose=1
        ;;
    h )
        show_usage
        ;;
    \? )
        die "Illegal option: $OPTARG"
        ;;
    esac
done

if [ -z "$show_internal" -a -z "$show_external" ]
then
    show_internal=1
    show_external=1
fi

# =========================================================================

# Use Google's public DNS to resolve the internal IP address
[ -n "$TARGETADDR" ] || TARGETADDR="8.8.8.8"

# Query the specific URL to resolve the external IP address
[ -n "$IPURL" ] || IPURL="ipecho.net/plain"

# Define explicitly $IPCMD to gather $IPURL using another tool
[ -n "$IPCMD" ] || {
    if   which curl >/dev/null 2>&1
    then
        IPCMD="curl -s"
    elif which wget >/dev/null 2>&1
    then
        IPCMD="wget -qO -"
    else
        die "Neither curl nor wget installed"
    fi
}

# =========================================================================

resolveip() {
    {
        gethostip -d "$1" && return
        getent ahostsv4 "$1" \
        | grep RAW \
        | awk '{ print $1; exit }' 
    } 2>/dev/null
}

internalip() {
    [ -n "$show_verbose" ] && printf "Internal: "

    case "$( uname | tr '[:upper:]' '[:lower:]' )" in
    cygwin* | mingw* | msys* )
        netstat -rn \
        | grep -w '0.0.0.0' \
        | awk '{ print $4 }'
        return
        ;;
    esac

    local t="$( resolveip "$TARGETADDR" )"
    [ -n "$t" ] || die "Cannot resolve $TARGETADDR"
    ip route get "$t" \
    | awk '{ print $NF; exit }'
}

externalip() {
    [ -n "$show_verbose" ] && printf "External: "

    eval $IPCMD "$IPURL" $IPOPEN
}

# =========================================================================

[ -n "$show_internal" ] && internalip
[ -n "$show_external" ] && externalip

# =========================================================================

# EOF

3

Sadece Ağ Arabirimi Adları kullanıyorum , özel komutum

[[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' 

kendi defterimde

[flying@lempstacker ~]$ cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
[flying@lempstacker ~]$ [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
192.168.2.221
[flying@lempstacker ~]$

ancak ağ arabirimi en az bir ipe sahipse, tüm ipin kendisine ait olduğunu gösterecektir

Örneğin

Ubuntu 16.10

root@yakkety:~# sed -r -n 's@"@@g;s@^VERSION=(.*)@\1@p' /etc/os-release
16.04.1 LTS (Xenial Xerus)
root@yakkety:~# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
178.62.236.250
root@yakkety:~#

Debian Jessie

root@jessie:~# sed -r -n 's@"@@g;s@^PRETTY_NAME=(.*)@\1@p' /etc/os-release
Debian GNU/Linux 8 (jessie)
root@jessie:~# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
192.81.222.54
root@jessie:~# 

CentOS 6.8

[root@centos68 ~]# cat /etc/redhat-release 
CentOS release 6.8 (Final)
[root@centos68 ~]# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
162.243.17.224
10.13.0.5
[root@centos68 ~]# ip route get 1 | awk '{print $NF;exit}'
162.243.17.224
[root@centos68 ~]#

Fedora 24

[root@fedora24 ~]# cat /etc/redhat-release 
Fedora release 24 (Twenty Four)
[root@fedora24 ~]# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
104.131.54.185
10.17.0.5
[root@fedora24 ~]# ip route get 1 | awk '{print $NF;exit}'
104.131.54.185
[root@fedora24 ~]#

Linkip route get 1 | awk '{print $NF;exit}' tarafından sağlanan komut daha doğru görünüyor, dahası, daha kısa.


2

Bunun tüm işletim sistemlerinde çalışıp çalışmadığından emin değil, deneyin.

ifconfig | awk -F"[ :]+" '/inet addr/ && !/127.0/ {print $4}'

CentOS 7.0
Benoit Blanchon

@BenoitBlanchon Sonra bunu kullanın ip route get 1 | awk '{print $NF;exit}'. Çoğu sistemde çalışmalıdır.
Jotne

Nitekim ip route get 1 | awk '{print $NF;exit}'çalışır
Benoit Blanchon

2

Her şey için bir düğüm paketi var. Platformlar arası ve kullanımı kolaydır.

$ npm install --global internal-ip-cli

$ internal-ip
fe80::1

$ internal-ip --ipv4
192.168.0.3

Bu tartışmalı bir yaklaşımdır, ancak takım için npm kullanmak, beğen ya da beğenme gibi daha popüler hale gelmektedir.


1

Ağ arayüzünü biliyorsanız (eth0, wlan, tun0 vb.):

ifconfig eth0 | grep addr: | awk '{ print $2 }' | cut -d: -f2

1
ifconfig | grep "inet addr:" | grep -v "127.0.0.1" | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'  | head -1

macOS 10.12.6 üzerinde çalışmıyor
Antoine F.

1
ifconfig $(netstat -rn | grep -E "^default|^0.0.0.0" | head -1 | awk '{print $NF}') | grep 'inet ' | awk '{print $2}' | grep -Eo '([0-9]*\.){3}[0-9]*' 

1

Mac, Linux ve Docker Konteynerlerinin içinde çalışır:

$ hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print$ 1; çıkış}')

Ayrıca şu şekilde çalışır Makefile:

LOCAL_HOST := ${shell hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print $1; exit}')}


Mac çalışmıyor: hostname --ip-address=> hostname: illegal option -- -macOS Sierra'da
JL Peyret

1

Linux için ihtiyacınız olan şey bu komuttur:

ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'

bunu kabuğuna yazdığınızda ipinizi bileceksiniz.


Hayır. Çalışmıyor.
FractalSpace

1

Bunu okumak daha kolay: ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr:


macOS 10.12.6 üzerinde çalışmıyor
Antoine F.

1

Yüklediyseniz npmve nodeyüklediyseniz:npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.