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 ifconfig
tersedia pada keduanya tetapi outputnya tidak begitu konsisten antara platform ini.
curl -4 ifconfig.co
. Ini akan menjawab dengan alamat IP4 eksternal Anda.Jawaban:
Gunakan
grep
untuk memfilter alamat IP dariifconfig
: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
.bashrc
untuk membuat perintah Anda sendiri yang disebutmyip
misalnya.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 -i
untuk versi lamahostname
tetapi lihat komentar). Namun, ini hanya di Linux.sumber
-E
opsi untuk Extended RE, bukan-r
opsi gaya GNU .-E
. Versi terbaru FreeBSD telah menambahkan-r
opsi sebagai alias untuk-E
memudahkan 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-E
dimaksudkan untuk menjadi sebanding dengangrep
's-E
pilihan. Tidak tahu mengapa orang-orang GNU memilih-r
.-E
untuk memastikan portabilitas, Anda akan berpikir itu--help
danman pages
akan diperbarui .. itu memang menyebabkan sedikit kebingungan bagi saya sebelumnya dalam pertanyaan lain menggunakan-E
Berikut ini akan berfungsi di Linux tetapi tidak untuk OSX.
Ini tidak bergantung pada DNS sama sekali, dan itu berfungsi bahkan jika
/etc/hosts
tidak diset dengan benar (1
singkatan untuk1.0.0.0
):atau menghindari
awk
dan menggunakan DNS publik Google8.8.8.8
untuk kejelasan:Cara yang kurang dapat diandalkan: (lihat komentar di bawah)
sumber
hostname -I
tidak 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.ip route get 1 | awk '{print $(NF-2);exit}'
bekerja ketika saya mendapatkan ditambahkan ke outptutip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
Untuk mesin linux (bukan OS X):
sumber
hostname -i
adalah bentuk pendek yang sepadanhostname
GNU Coreutils versi 8.26.hostname -i
hanya memberikan IP lokal, sementarahostname -I
memberikan semua IP lainnyadi Linux
pada MacOS
hostname -I
dapat mengembalikan beberapa alamat dalam urutan yang tidak dapat diandalkan (lihat halamanhostname
manual ), tetapi bagi saya itu hanya mengembalikan192.168.1.X
, yang merupakan apa yang Anda inginkan.sumber
hostname -i
dengan I. rendah-i
bendera mengatakan ini:Avoid using this option; use hostname -I instead
.Larutan
Penjelasan
Cara yang benar untuk menanyakan informasi jaringan menggunakan
ip
:-o
output satu barisroute get to
dapatkan rute kernel aktual ke tujuan8.8.8.8
Google IP, tetapi dapat menggunakan IP asli yang ingin Anda jangkaumisalnya
ip
keluaran:Untuk mengekstrak
src
ip,sed
adalah 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 mencapai8.8.8.8
misalnya hasil akhir:
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:
ifconfig
yang sudah usang dan - misalnya - tidak mencantumkan IP multitingkat;awk
untuk tugas sederhana yang dapat ditangani dengan lebih baik;ip route get 1
tidak jelas, dan sebenarnya adalah alias untukip route get to 1.0.0.0
hostname
perintah, yang tidak memiliki-I
opsi di semua alat dan yang kembali127.0.0.1
dalam kasus saya.sumber
Diedit (
2014-06-012018-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, berdasarkandefault route
. Saya memposting skrip ini di bagian paling bawah dari jawaban ini.Intro
Karena keduanya memiliki pesta terinstal secara default, ada tip bash untuk Mac dan Linux:
Masalah lokal dicegah dengan menggunakan
LANG=C
:Menempatkan ini dalam suatu fungsi:
Minimal:
Penggunaan sederhana:
Fancy rapi:
Pemakaian:
atau, menjalankan fungsi yang sama, tetapi dengan argumen:
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
, bukanbash
.)Peringatkan: Ada masalah tentang lokal!
Cepat dan kecil:
Meledak (bekerja juga;)
Edit:
Bagaimana! Ini sepertinya tidak berfungsi pada Mac OS ...
Oke, ini sepertinya berfungsi pada Mac OS seperti pada Linux saya :
terpecah:
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:
atau
Nah, itu dia:
sumber
sbin
yang tidak$PATH
ada pada jalur penuh saya harus ditentukan, tetapi jalur yang sama ada di MacOS juga. :-)time
memilih mana yang akan Anda gunakan begitu lama ...Khusus hanya untuk versi tertentu dari Ubuntu. Meskipun mungkin hanya memberitahu Anda
127.0.0.1
:atau
sumber
$ hostname --ip-address
hanya memberi saya127.0.0.1
di Arch LinuxAnda juga bisa mendapatkan alamat IP versi 4 dari eth0 dengan menggunakan perintah ini di linux
Output akan seperti ini
sumber
Ini berfungsi di Linux dan OSX
Ini akan membuat antarmuka terkait dengan rute default
Menggunakan antarmuka yang ditemukan di atas, dapatkan alamat ip.
OSX
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
en5
192.168.0.130
CentOS Linux
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
eth0
192.168.46.10
sumber
| head -1
di akhir baris pertama untuk mendapatkan antarmuka default, dan sisanya bagus.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.
sumber
Saya mengekstraksi komentar saya untuk jawaban ini:
Ini berdasarkan jawaban @CollinAnderson yang tidak berfungsi dalam kasus saya.
sumber
sumber
bash
alias:alias myip="ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print \$2}'"
Cara terpendek untuk mendapatkan alamat ipv4 lokal Anda di sistem linux Anda:
sumber
Dengan asumsi Anda memerlukan IP publik utama Anda seperti yang terlihat dari seluruh dunia, cobalah salah satu dari mereka:
sumber
Saya harus menambahkan ke Collin Andersons menjawab bahwa metode ini juga memperhitungkan jika Anda memiliki dua antarmuka dan keduanya muncul sebagai muncul.
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.
sumber
IP antarmuka jaringan primer
sumber
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
Bekerja di Linux.
Uji:
sumber
sumber
ifconfig
Varian lain yang berfungsi baik di Linux dan OSX:sumber
ifconfig | grep '\<inet\>' | cut -d ' ' -f2 | grep -v '127.0.0.1'
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
Tampilkan alamat IP eksternal
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.
sumber
Saya hanya menggunakan Nama Antarmuka Jaringan , perintah khusus saya adalah
di buku catatan saya sendiri
tetapi jika antarmuka jaringan memiliki setidaknya satu ip, maka itu akan menunjukkan semua ip miliknya
sebagai contoh
Ubuntu 16.10
Debian Jessie
CentOS 6.8
Fedora 24
Sepertinya perintah yang
ip route get 1 | awk '{print $NF;exit}'
disediakan oleh tautan lebih akurat, terlebih lagi, lebih pendek.sumber
Tidak yakin apakah ini berfungsi di semua os, coba saja.
sumber
ip route get 1 | awk '{print $NF;exit}'
. Harus bekerja pada sebagian besar sistem.ip route get 1 | awk '{print $NF;exit}'
berhasilAda paket simpul untuk semuanya. Ini lintas platform dan mudah digunakan.
Ini adalah pendekatan yang kontroversial, tetapi menggunakan npm untuk tooling menjadi lebih populer, suka atau tidak.
sumber
Jika Anda tahu antarmuka jaringan (eth0, wlan, tun0 dll):
sumber
sumber
sumber
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
Makefile
sebagai: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}')}
sumber
hostname --ip-address
=>hostname: illegal option -- -
pada macOS SierraUntuk linux, yang Anda butuhkan adalah perintah ini:
ketik ini di shell Anda dan Anda hanya akan tahu ip Anda.
sumber
Ini lebih mudah dibaca:
ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr:
sumber
Jika Anda telah
npm
dannode
menginstal:npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"
sumber