Bagaimana cara mendapatkan alamat IP utama dari mesin lokal di Linux dan OS X? [Tutup]

339

Saya mencari solusi baris perintah yang akan mengembalikan saya alamat IP primer (pertama) dari localhost, selain 127.0.0.1

Solusinya harus bekerja setidaknya untuk Linux (Debian dan RedHat) dan OS X 10.7+

Saya sadar bahwa ifconfigtersedia pada keduanya tetapi outputnya tidak begitu konsisten antara platform ini.

Sorin
sumber
2
Apakah Anda hanya ingin IP jaringan lokal mesin Anda? yaitu 192.168.0.12
Chris Seymour
Ya, IP lokal, pertama-tama karena dapat memiliki lebih dari satu, tetapi saya bisa hidup bahkan dengan daftar. Untuk saat ini saya senang hanya mendukung alamat IPv4 dan mengabaikan IPv6, karena hanya ingin menghasilkan hash.
Sorin
2
Bagaimana Anda mendefinisikan "primer"? Jika Anda berpikir "alamat IP yang berada di subnet yang sama dengan rute default saya", Anda perlu sedikit memprogram untuk itu. Tetapi bagaimana jika mesin tidak memiliki rute default, tetapi masih memiliki> 1 alamat IP?
ghoti
4
Coba curl -4 ifconfig.co. Ini akan menjawab dengan alamat IP4 eksternal Anda.
asmaier

Jawaban:

475

Gunakan grepuntuk memfilter alamat IP dari ifconfig:

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

Atau dengan sed:

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

Jika Anda hanya tertarik pada antarmuka tertentu, wlan0, eth0, dll. Maka:

ifconfig wlan0 | ...

Anda dapat alias perintah di Anda .bashrcuntuk membuat perintah Anda sendiri yang disebut myipmisalnya.

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

Cara yang lebih sederhana adalah hostname -I( hostname -iuntuk versi lama hostnametetapi lihat komentar). Namun, ini hanya di Linux.

Chris Seymour
sumber
5
Perhatikan juga bahwa di OSX, sed menggunakan -Eopsi untuk Extended RE, bukan -ropsi gaya GNU .
ghoti
1
Menarik; Saya tidak menyadari bahwa GNU sed didukung -E. Versi terbaru FreeBSD telah menambahkan -ropsi sebagai alias untuk -Ememudahkan portabilitas skrip, tetapi pembaruan belum dibawa ke OSX, yang terakhir saya periksa masih menggunakan versi sed dari rilis FreeBSD beberapa tahun yang lalu. Tidak yakin persis yang mana, karena OSX telah mengadopsi kode sumber FreeBSD beberapa kali selama bertahun-tahun. Saya percaya penggunaan -Edimaksudkan untuk menjadi sebanding dengan grep's -Epilihan. Tidak tahu mengapa orang-orang GNU memilih -r.
ghoti
1
@ ghoti Saya mengubah jawaban yang digunakan -Euntuk memastikan portabilitas, Anda akan berpikir itu --helpdan man pagesakan diperbarui .. itu memang menyebabkan sedikit kebingungan bagi saya sebelumnya dalam pertanyaan lain menggunakan-E
Chris Seymour
1
Saya menemukan masalah, sementara ini berfungsi pada OS X itu mengembalikan lebih dari satu IP, daftar IP. Tampaknya yang pertama adalah yang benar tetapi tetap saja ini akan mematahkan logika saya. Lihat gist.github.com/ssbarnea/31b9dcb0f8fd528b958c - itu juga mengembalikan yang vnic yang aktif tetapi digunakan oleh paralles.
sorin
13
OSX: ipconfig getifaddr en0
parleer
234

Berikut ini akan berfungsi di Linux tetapi tidak untuk OSX.

Ini tidak bergantung pada DNS sama sekali, dan itu berfungsi bahkan jika /etc/hoststidak diset dengan benar ( 1singkatan untuk 1.0.0.0):

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

atau menghindari awkdan menggunakan DNS publik Google 8.8.8.8untuk kejelasan:

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

Cara yang kurang dapat diandalkan: (lihat komentar di bawah)

hostname -I | cut -d' ' -f1
Collin Anderson
sumber
8
Metode yang mendapatkan alamat pertama yang dihasilkan oleh hostname -Itidak dapat diandalkan, karena (menurut dokumentasi) seseorang tidak dapat membuat asumsi tentang urutan alamat. Jadi mungkin ada beberapa jaringan internal (seperti jaringan tempat mesin virtual hidup). Metode lain sepertinya bagus.
Adam Ryczkowski
3
Ini harus menjadi jawaban yang diterima karena RHEL 7 tidak lagi menyertakan ifconfig.
Andrew
10
Bagi saya ip route get 1 | awk '{print $(NF-2);exit}'bekerja ketika saya mendapatkan ditambahkan ke outptut
Hritik
13
INI (yang pertama) ADALAH SOLUSI YANG HANYA BENAR . Hal ini penting untuk membaca IP khusus dari antarmuka terkait dengan rute default. Kalau tidak, Anda kemungkinan besar akan mendapatkan beberapa alamat internal yang tidak berharga.
Jan Hudec
12
itu tidak berhasil untuk saya tetapi cukup tertutup:ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
Estani
229

Untuk mesin linux (bukan OS X):

hostname --ip-address
Asiklik
sumber
10
Itu hanya berfungsi jika namanya ada di DNS. Jika tidak, Anda mendapatkan pesan "nama host: Nama atau layanan tidak dikenal."
Vebjorn Ljosa
39
hostname -iadalah bentuk pendek yang sepadan
Paul Evans
75
Ini terkadang hanya akan mengembalikan 127.0.0.1. Jika tersedia, lebih baik gunakan nama host -Saya seperti yang direkomendasikan oleh manual (Ubuntu): "--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. "
jrierab
1
Ini juga tidak bekerja di Linux, setidaknya tidak dengan hostnameGNU Coreutils versi 8.26.
ack
5
Di komputer saya, hostname -ihanya memberikan IP lokal, sementara hostname -Imemberikan semua IP lainnya
Alexis Paques
61

di Linux

hostname -I

pada MacOS

ipconfig getifaddr en0

hostname -Idapat mengembalikan beberapa alamat dalam urutan yang tidak dapat diandalkan (lihat halaman hostnamemanual ), tetapi bagi saya itu hanya mengembalikan 192.168.1.X, yang merupakan apa yang Anda inginkan.

Boris
sumber
1
bagi saya itu hostname -idengan I. rendah
Paul Woitaschek
2
@PaulWoitaschek halaman manual untuk huruf kecil -ibendera mengatakan ini: Avoid using this option; use hostname -I instead.
Boris
@Boris jika Anda menjalankan sesuatu seperti wadah buruh pelabuhan yang menjalankan Alpine (dan dengan demikian BusyBox) hanya akan menerima flag -i huruf kecil
bayetovsky
41

Larutan

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

Penjelasan

Cara yang benar untuk menanyakan informasi jaringan menggunakan ip:

  • -o output satu baris
  • route get to dapatkan rute kernel aktual ke tujuan
  • 8.8.8.8 Google IP, tetapi dapat menggunakan IP asli yang ingin Anda jangkau

misalnya ipkeluaran:

8.8.8.8 via 192.168.8.254 dev enp0s25 src 192.168.8.16 uid 1000 \   cache

Untuk mengekstrak srcip, sedadalah ligthest dan paling kompatibel dengan dukungan regex:

  • -n tidak ada output secara default
  • 's/pattern/replacement/p' hanya cocok dengan pola dan penggantian cetak
  • .*src \([0-9.]\+\).* cocok dengan IP src yang digunakan oleh kernel, untuk mencapai 8.8.8.8

misalnya hasil akhir:

192.168.8.16

Jawaban lain

Saya pikir tidak ada jawaban sebelumnya yang cukup baik untuk saya, karena mereka tidak bekerja di mesin baru-baru ini (Gentoo 2018).

Masalah yang saya temukan dengan jawaban sebelumnya:

  • penggunaan kolom posisi dalam output perintah;
  • penggunaan ifconfigyang sudah usang dan - misalnya - tidak mencantumkan IP multitingkat;
  • penggunaan awkuntuk tugas sederhana yang dapat ditangani dengan lebih baik;
  • ip route get 1 tidak jelas, dan sebenarnya adalah alias untuk ip route get to 1.0.0.0
  • penggunaan hostnameperintah, yang tidak memiliki -Iopsi di semua alat dan yang kembali 127.0.0.1dalam kasus saya.
giosh94mhz
sumber
34

Diedit ( 2014-06-01 2018-01-09)

Untuk konfigurasi yang lebih kuat, dengan banyak antarmuka dan banyak IP yang dikonfigurasi pada masing-masing antarmuka, saya menulis skrip bash murni (tidak didasarkan pada 127.0.0.1) untuk menemukan antarmuka dan ip yang benar, berdasarkan default route. Saya memposting skrip ini di bagian paling bawah dari jawaban ini.

Intro

Karena keduanya memiliki terinstal secara default, ada tip bash untuk Mac dan Linux:

Masalah lokal dicegah dengan menggunakan 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

Menempatkan ini dalam suatu fungsi:

Minimal:

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

Penggunaan sederhana:

getMyIP
192.168.1.37

Fancy rapi:

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
}

Pemakaian:

getMyIP
192.168.1.37

atau, menjalankan fungsi yang sama, tetapi dengan argumen:

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

Catatan: Tanpa argumen, fungsi ini dihasilkan pada STDOUT, IP dan baris baru , dengan argumen, tidak ada yang dicetak, tetapi variabel bernama argumen dibuat dan berisi IP tanpa baris baru .

Nota2: Ini diuji pada Debian, LaCie hacked nas dan MaxOs. Jika ini tidak berhasil di lingkungan Anda, saya akan sangat tertarik dengan umpan balik!

Versi yang lebih lama dari jawaban ini

(Tidak dihapus karena berdasarkan sed, bukan bash.)

Peringatkan: Ada masalah tentang lokal!

Cepat dan kecil:

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

Meledak (bekerja juga;)

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

Edit:

Bagaimana! Ini sepertinya tidak berfungsi pada Mac OS ...

Oke, ini sepertinya berfungsi pada Mac OS seperti pada Linux saya :

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

terpecah:

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

Skrip saya (Januari 2018):

Skrip ini pertama-tama akan menemukan rute default dan antarmuka yang Anda gunakan, kemudian mencari jaringan pencocokan ip lokal dari gateway dan mengisi variabel. Dua baris terakhir hanya mencetak, seperti:

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

atau

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

Nah, itu dia:

#!/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
F. Hauri
sumber
1
@sorin: ya, ini berfungsi sekarang dengan ifconfig. (seperti sbinyang tidak $PATHada pada jalur penuh saya harus ditentukan, tetapi jalur yang sama ada di MacOS juga. :-)
F. Hauri
1
@ Atau coba ini dengan timememilih mana yang akan Anda gunakan begitu lama ...
F. Hauri
solusi cepat dan kecil adalah pendekatan terbaik. Solusi yang lebih baru memberi saya kesalahan sintaks. Kompatibilitas selalu menjadi nilai tambah. Terima kasih.
m3nda
28

Khusus hanya untuk versi tertentu dari Ubuntu. Meskipun mungkin hanya memberitahu Anda 127.0.0.1:

hostname  -i

atau

hostname -I
pengguna3173508
sumber
apakah ini berhasil dalam setiap kasus?
AloneInTheDark
6
tidak. - ini hanya memberitahu Anda 127.0.0.1.
SvenDowideit
hostname -Saya bekerja di ubuntu.
Borzh
1
$ hostname --ip-addresshanya memberi saya 127.0.0.1di Arch Linux
kristianlm
1
gunakan hostname -I atau hostname --all-ip-address
Aydin K.
24

Anda juga bisa mendapatkan alamat IP versi 4 dari eth0 dengan menggunakan perintah ini di linux

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

Output akan seperti ini

[root@localhost Sathish]# /sbin/ip -4 -o addr show dev eth0| awk '{split($4,a,"/");print a[1]}'
192.168.1.22
Sathish
sumber
Jawaban terbaik untukku! Terima kasih @Sathish! ;-)
Samuel Phan
1
Saya setuju, ini adalah metode terbersih untuk mendapatkan eth0's IPv4.
Chris Mendez
Ini mengasumsikan eth0, yang bukan strategi penamaan saat ini dan tidak pernah dijamin menjadi antarmuka utama.
rfay
Ini adalah metode yang paling elegan jika Anda tahu antarmuka. Ideal jika sistem Anda memiliki banyak antarmuka tetapi Anda hanya tertarik pada yang tertentu.
lepe
14

Ini berfungsi di Linux dan OSX

Ini akan membuat antarmuka terkait dengan rute default

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;}'`

Menggunakan antarmuka yang ditemukan di atas, dapatkan alamat ip.

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

Laptop Darwin 14.4.0 Darwin Kernel Versi 14.4.0: Kamis 28 Mei 11:35:04 PDT 2015; root: 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 Kamis 3 Sep 04:03:03 EDT 2009 x86_64 x86_64 x86_64 GNU / Linux

echo $NET_IF

eth0

echo $NET_IP

192.168.46.10

Colin Fletcher
sumber
Terlepas dari semua jawaban untuk pertanyaan ini, yang satu ini tampaknya menjadi satu-satunya yang hampir benar. Hanya perlu | head -1di akhir baris pertama untuk mendapatkan antarmuka default, dan sisanya bagus.
Endareth
12

Menggunakan beberapa metode lain Anda dapat memasuki konflik di mana beberapa alamat IP didefinisikan pada sistem. Baris ini selalu mendapatkan alamat IP yang digunakan secara default.

ip route get 8.8.8.8 | head -1 | awk '{print $7}'
Kjeld Flarup
sumber
Ini akan gagal jika tidak ada rute default (tapi ide bagus)
FractalSpace
Bagus ... Misalkan bekerja bahkan jika Anda tidak memiliki internet?
Boris Churzin
8

Saya mengekstraksi komentar saya untuk jawaban ini:

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

Ini berdasarkan jawaban @CollinAnderson yang tidak berfungsi dalam kasus saya.

estani
sumber
8
ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}'
Faizan Noor
sumber
1
Jika Anda ingin menjadikan ini sebagai bashalias:alias myip="ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print \$2}'"
Sam Houston
Baik. Tetapi pertanyaan awalnya adalah tentang perintah. Jadi saya hanya memposting yang relevan. Bersulang!
Faizan Noor
6

Cara terpendek untuk mendapatkan alamat ipv4 lokal Anda di sistem linux Anda:

hostname -I | awk '{print $1}'
Harry
sumber
5
Buruk. Halaman manual memberitahu Anda secara khusus untuk tidak membuat asumsi tentang urutan output.
Matt
Bekerja sangat baik untuk kasus penggunaan sepele saya - saya tidak peduli apakah itu cepat dan kotor! Bagus!
Nicolai Weitkemper
6

Dengan asumsi Anda memerlukan IP publik utama Anda seperti yang terlihat dari seluruh dunia, cobalah salah satu dari mereka:

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

Saya harus menambahkan ke Collin Andersons menjawab bahwa metode ini juga memperhitungkan jika Anda memiliki dua antarmuka dan keduanya muncul sebagai muncul.

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

Saya telah mengerjakan sebuah aplikasi dengan Raspberry Pi dan membutuhkan alamat IP yang sebenarnya digunakan bukan hanya apakah itu naik atau tidak. Sebagian besar jawaban lain akan mengembalikan kedua alamat IP yang belum tentu membantu - untuk skenario saya.

c7borg
sumber
5

IP antarmuka jaringan primer

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
kaspars
sumber
5

Menemukan alamat IP komputer ini di jaringan yang merupakan gateway default (misalnya tidak termasuk semua jaringan virtual, jembatan buruh pelabuhan) mis. gateway internet, wifi gateway, ethernet

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

Bekerja di Linux.

Uji:

  ~ 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
Krzysztof Wesołowski
sumber
Bagus! Pemrograman Taco Bell yang terbaik - terima kasih untuk ini.
Stevie Howard
3
ip addr show | grep -E '^\s*inet' | grep -m1 global | awk '{ print $2 }' | sed 's|/.*||'
rbolante
sumber
3

ifconfigVarian lain yang berfungsi baik di Linux dan OSX:

ifconfig | grep "inet " | cut -f2 -d' '
ccpizza
sumber
1
satu variasi kecil:ifconfig | grep '\<inet\>' | cut -d ' ' -f2 | grep -v '127.0.0.1'
jpbochi
Mengapa separuh dari jawaban ini tidak berhasil sama sekali bagi saya?
SurpriseDog
3

Saya telah melalui banyak tautan (StackExchange, AskUbuntu, StackOverflow dll) dan sampai pada keputusan untuk menggabungkan semua solusi terbaik menjadi satu skrip shell.

Menurut pendapat saya, dua QA ini adalah yang terbaik untuk dilihat:

Bagaimana saya bisa mendapatkan alamat IP eksternal saya dalam skrip shell? https://unix.stackexchange.com/q/22615

Bagaimana cara menemukan alamat ip internal saya? https://askubuntu.com/a/604691

Ini solusi saya berdasarkan pada beberapa ide oleh rsp yang dibagikan di repositori-nya ( https://github.com/rsp/scripts/ ).

Beberapa dari Anda dapat mengatakan bahwa skrip ini sangat besar untuk tugas yang sangat sederhana tetapi saya ingin membuatnya mudah dan fleksibel dalam penggunaan sebanyak mungkin. Ini mendukung file konfigurasi sederhana yang memungkinkan mendefinisikan kembali nilai default.

Itu berhasil diuji di bawah Cygwin, MINGW dan Linux (Red Hat).

Tampilkan alamat IP internal

myip -i

Tampilkan alamat IP eksternal

myip -e

Kode sumber, juga tersedia melalui tautan: https://github.com/ildar-shaimordanov/tea-set/blob/master/home/bin/myip . Contoh file konfigurasi ada di sana, di sebelah skrip utama.

#!/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
jsxt
sumber
3

Saya hanya menggunakan Nama Antarmuka Jaringan , perintah khusus saya adalah

[[ $(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' 

di buku catatan saya sendiri

[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 ~]$

tetapi jika antarmuka jaringan memiliki setidaknya satu ip, maka itu akan menunjukkan semua ip miliknya

sebagai contoh

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 ~]#

Sepertinya perintah yang ip route get 1 | awk '{print $NF;exit}'disediakan oleh tautan lebih akurat, terlebih lagi, lebih pendek.

Komunitas
sumber
2

Tidak yakin apakah ini berfungsi di semua os, coba saja.

ifconfig | awk -F"[ :]+" '/inet addr/ && !/127.0/ {print $4}'
Jotne
sumber
Tidak berfungsi pada CentOS 7.0
Benoit Blanchon
@ BenenoBlanchon Lalu gunakan ini ip route get 1 | awk '{print $NF;exit}'. Harus bekerja pada sebagian besar sistem.
Jotne
Memang ip route get 1 | awk '{print $NF;exit}'berhasil
Benoit Blanchon
2

Ada paket simpul untuk semuanya. Ini lintas platform dan mudah digunakan.

$ npm install --global internal-ip-cli

$ internal-ip
fe80::1

$ internal-ip --ipv4
192.168.0.3

Ini adalah pendekatan yang kontroversial, tetapi menggunakan npm untuk tooling menjadi lebih populer, suka atau tidak.

Dennis
sumber
1

Jika Anda tahu antarmuka jaringan (eth0, wlan, tun0 dll):

ifconfig eth0 | grep addr: | awk '{ print $2 }' | cut -d: -f2
droidgren
sumber
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
pengguna2802053
sumber
tidak bekerja pada macOS 10.12.6
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]*' 
AlanG
sumber
1

Bekerja di Mac, Linux dan di dalam Docker Containers:

$ 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; keluar}')

Juga berfungsi Makefilesebagai:

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

peleteiro
sumber
Mac tidak berfungsi: hostname --ip-address=> hostname: illegal option -- -pada macOS Sierra
JL Peyret
1

Untuk linux, yang Anda butuhkan adalah perintah ini:

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

ketik ini di shell Anda dan Anda hanya akan tahu ip Anda.

Statham
sumber
Tidak. Itu tidak bekerja.
FractalSpace
1

Ini lebih mudah dibaca: ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr:

Cory Thorson
sumber
tidak bekerja pada macOS 10.12.6
Antoine F.
1

Jika Anda telah npmdan nodemenginstal:npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"

Antoine F.
sumber