Bagaimana saya bisa mendapatkan alamat IP saya sendiri dan menyimpannya ke variabel dalam skrip shell?
networking
shell-script
ip
Tom Brito
sumber
sumber
Jawaban:
Tidak mudah jika Anda ingin mempertimbangkan wlan akun dan antarmuka alternatif lainnya. Jika Anda tahu antarmuka mana yang Anda inginkan untuk alamat (mis., Eth0, kartu Ethernet pertama), Anda dapat menggunakan ini:
Dengan kata lain, dapatkan saya informasi konfigurasi jaringan, cari
eth0
, dapatkan baris itu dan yang berikutnya (-A 1
), dapatkan hanya baris terakhir, dapatkan bagian kedua dari baris itu ketika dipisah:
, kemudian dapatkan bagian pertama dari itu ketika membelah dengan ruang.sumber
grep
ke kode Anda untuk mengabaikan semua antarmuka dengan "eth0:" di dalamnya; ini sekarang berfungsi seperti yang saya harapkan (hanya memberikan alamat IP "eth0" dan bukan sub-antarmuka (eth0: 0, eth0: 1, dll.):ip="$(ifconfig | grep -v 'eth0:' | grep -A 1 'eth0' | tail -1 | cut -d ':' -f 2 | cut -d ' ' -f 1)"
ifconfig eth0
ip address
bukannyaSaya percaya cara "alat modern" untuk mendapatkan alamat ipv4 Anda adalah mengurai 'ip' daripada 'ifconfig', jadi itu akan menjadi seperti:
atau semacam itu.
sumber
ip
tersedia di semua distro Red Hat dan Fedora yang saya gunakan.ip
adalah bagian dari paket iproute2 ( linuxfoundation.org/collaborate/workgroups/networking/iproute2 ).ifconfig
danroute
seharusnya sudah usang, meskipun mereka terus digunakan oleh banyak orang, terutama dalam skrip.ip
jauh lebih parsable, menurut pendapat saya.ip
juga tersedia di semua distro berbasis Debian dan Debian yang pernah saya lihat. Itu adalah bagian dari paket iproute yang ditandai sebagai penting.ip
adalah bagian dari paket iproute2 yang banyak distro secara default. Ada di repo yang paling bagus. en.wikipedia.org/wiki/Iproute2/sbin/ip
bukanip
?awk
dancut
sedikit menghibur bagi saya, inilah alternatif yang mungkin sebenarnya tidak lebih baik:ip -o -4 addr show eth0 | awk '{ split($4, ip_addr, "/"); print ip_addr[1] }'
Mengapa tidak melakukannya
IP=$(hostname -I)
?sumber
hostname -i
beri saya adil127.0.0.1
,hostname -I
beri saya IP-Adress yang benar ...-i Display the network address(es) of the host name. Note that this works only if the host name can be resolved. Avoid using this option; use hostname --all-ip-addresses
/etc/hosts
, bersama dengan alamat IP yang sesuai-I
di FreeBSD, tetapi Anda bisa menggunakandig +short `hostname -f`
Jika Anda menginginkan alamat suatu antarmuka, cara termudah adalah menginstal lebih banyak kernel lalu:
ifdata
jawaban hampir setiap pertanyaan Anda akan tergoda untuk menguraiifconfig
output.Jika Anda ingin mengetahui alamat IP Anda seperti yang dilihat orang luar (di luar NAT, dll.), Ada banyak layanan yang akan melakukannya. Satu cukup mudah:
sumber
ifdata
ditambahkaniproute2
. Mungkin biner baru bernamaipdata
Untuk mendapatkan alamat IPv4 dan IPv6, dan tidak menganggap antarmuka utama
eth0
(hariem1
ini lebih umum ), coba:-o
menggunakan satu-line format output, yang lebih mudah untuk memproses denganread
,grep
, dllup
tidak termasuk perangkat yang tidak aktifscope global
tidak termasuk alamat pribadi / lokal seperti127.0.0.1
danfe80::/64
primary
mengecualikan alamat sementara (dengan asumsi Anda menginginkan alamat yang tidak berubah)sumber
-4
/-6
memfilter jenis alamat. Anda juga dapat dengan mudah mendapatkan parameter antarmuka lainnya. Secara pribadi, saya tidak suka saat loop dan saya lebih sukagrep -o 'inet6\? [0-9a-f\.:]*' | cut -f 2 -d ' '
Tergantung apa yang Anda maksud dengan alamat IP sendiri. Sistem memiliki alamat IP pada beberapa subnet (kadang-kadang beberapa per subnet), beberapa di antaranya IPv4, beberapa IPv6 menggunakan perangkat seperti adaptor ethernet, antarmuka loopback, terowongan VPN, jembatan, antarmuka virtual ...
Maksud saya, alamat IP yang digunakan perangkat lain untuk mencapai komputer Anda, Anda harus mencari tahu subnet yang mana, dan versi IP mana yang sedang kita bicarakan. Juga, ingatlah bahwa karena NAT dilakukan oleh firewall / router, alamat IP suatu antarmuka mungkin tidak sama dengan host jarak jauh melihat koneksi masuk dari komputer Anda berasal.
Ketika ada routing sumber mewah atau per protokol / port routing mungkin sulit untuk menemukan antarmuka mana yang akan digunakan untuk berbicara dengan satu komputer jarak jauh melalui protokol yang diberikan dan bahkan kemudian, tidak ada jaminan bahwa alamat IP dari antarmuka itu mungkin langsung dialamatkan oleh komputer jarak jauh yang ingin membuat koneksi baru ke komputer Anda.
Untuk IPv4 (mungkin juga berfungsi untuk IPv6), trik yang bekerja di banyak kesatuan termasuk Linux untuk mengetahui alamat IP antarmuka yang digunakan untuk mencapai host yang diberikan adalah dengan menggunakan koneksi (2) pada soket UDP dan menggunakan nama panggilan ():
Misalnya, di komputer rumah saya:
Akan digunakan untuk mencari tahu alamat IP dari antarmuka melalui mana saya akan mencapai 8.8.8.8 (server DNS Google). Ini akan mengembalikan sesuatu seperti "192.168.1.123" yang merupakan alamat antarmuka untuk rute default ke internet. Namun, Google tidak akan melihat permintaan DNS dari mesin saya sebagai berasal dari alamat IP yang bersifat pribadi, karena ada NAT yang dilakukan oleh router broadband rumah saya.
terhubung () pada soket UDP tidak mengirim paket apa pun (UDP adalah koneksi-kurang), tetapi mempersiapkan soket dengan menanyakan tabel routing.
sumber
sumber
-I
alih-alih-i
lebih baik karena Anda ingin mengabaikan alamat loopback, jadi perintah terakhirnya adalahipa=$(hostname -I|cut -f1 -d ' ')
grep
tidak cukup, jangan disalurkan ke hal lain. Hanya menggunakan sesuatu yang lain (sed
,awk
, dll).Saya tidak bermaksud menjadi brengsek, tetapi memang ada cara yang benar dan ini dia. Anda memangkas output
ip route
untuk hanya mendapatkan IP sumber. Bergantung pada IP apa yang Anda coba jangkau, "alamat ip saya sendiri" (kata-kata OP) akan berbeda. Jika Anda ingin menjangkau internet publik, menggunakan server DNS Google 8.8.8.8 cukup standar. Begitu...Jawaban singkatnya adalah:
Inilah penjelasan terperinci
Jika saya ingin ip yang saya gunakan untuk mencapai internet , saya menggunakan ini:
Jika saya ingin ip yang saya gunakan untuk mencapai sesuatu di VPN saya , saya menggunakan ini:
Jika saya ingin ip yang saya gunakan untuk menjangkau diri sendiri , saya akan menggunakan ini:
Lebih lanjut tentang
sed
perintah ituPertama izinkan saya mengatakan bahwa ketika memilih alat unix, Anda mencoba memilih alat yang membutuhkan pipa paling sedikit. Jadi, sementara beberapa jawaban akan pipa
ifconfig
untukgrep
untuksed
untukhead
, yang jarang pernah diperlukan. Ketika Anda melihatnya, itu akan menaikkan bendera merah bahwa Anda menerima saran dari seseorang dengan sedikit pengalaman. Itu tidak membuat "solusi" salah. Tapi, itu mungkin bisa menggunakan beberapa perampingan.Saya telah memilih
sed
karena ini lebih singkat daripada alur kerja yang sama diawk
. (Saya sudah sejak contoh awk di bawah ini.) Saya tidak berpikir alat lain tapi 2 itu akan sesuai.Mari kita periksa apa yang
catatan:sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
dilakukan:Saya dulu menggunakan
sed -n '/src/{s/.*src *//p;q}'
tetapi komentator menunjukkan bahwa beberapa sistem memiliki data trailing setelahsrc
bidang.Menggunakan awk
Lebih lanjut tentang jaringan saya
ifconfig
Acara saya yang saya milikitun0
untuk VPN saya daneth0
untuk lan saya.sumber
ip route get 8.8.8.8 | sed -n '/src/{s/.*src *//p;q}'
memberi saya10.1.2.3 uid 1002
. Jadi saya menambahkan untuk menambahkan| awk '{print $1}'
hanya menyimpan alamat IP.Pada FreeBSD Anda dapat menggunakan
Ini dapat bekerja untuk lingkungan lain, tergantung pada pengaturan Anda.
sumber
/etc/resolv.conf
dan bagaimana router jaringan menangani nama host lokal. Tidak masalah untuk menggunakannya di lingkungan Anda jika Anda mengujinya dan berfungsi. Tetapi jika Anda melakukannya, Anda sedang membangun sistem "rapuh" yang akan menyebabkan masalah lain jika Anda berbagi ini. Gunakan dengan hati-hati.Dengan asumsi bahwa Anda mungkin memiliki berbagai antarmuka dengan berbagai nama tetapi Anda menginginkan yang non-localhost satu dan non-ipv6, Anda dapat mencoba:
sumber
Saya menggunakan one-liner ini:
Penggunaan
ifconfig
(tersedia secara luas), tidak mengambillocalhost
alamat, tidak mengikat Anda ke nama antarmuka yang diberikan, tidak memperhitungkan IPv6 dan mencoba untuk mendapatkan IP dari antarmuka jaringan pertama yang tersedia.sumber
atau
sumber
Anda harus menggunakan
ip
(bukanifconfig
) seperti saat ini, dipertahankan, dan mungkin yang paling penting untuk tujuan skrip, itu menghasilkan output yang konsisten & dapat diuraikan. Berikut ini adalah beberapa pendekatan serupa:Jika Anda ingin alamat IPv4 untuk antarmuka Ethernet Anda
eth0
:Sebagai skrip:
Output yang dihasilkan di atas adalah dalam notasi CIDR. Jika notasi CIDR tidak diinginkan, maka dapat dilucuti:
Pilihan lain yang IMHO adalah "paling elegan" mendapatkan alamat IPv4 untuk antarmuka apa pun yang digunakan untuk terhubung ke host jarak jauh yang ditentukan (8.8.8.8 dalam kasus ini). Atas perkenan @gatoatigrado dalam jawaban ini :
Sebagai skrip:
Ini berfungsi dengan baik pada host dengan satu antarmuka, tetapi lebih menguntungkan juga akan bekerja pada host dengan banyak antarmuka dan / atau spesifikasi rute.
ip
akan menjadi pendekatan yang saya sukai, tetapi tentu saja bukan satu-satunya cara untuk menguliti kucing ini. Berikut ini pendekatan lain yang digunakanhostname
jika Anda lebih suka sesuatu yang lebih mudah / lebih ringkas:Atau, jika Anda menginginkan alamat IPv6:
sumber
Saya perlu melakukan ini dalam alias untuk memulai server radio pada NIC kabel saya. Saya menggunakan
sumber
egrep
disusutkan. Gunakangrep -E
sebagai gantinya.Beberapa perintah bekerja pada centos 6 atau 7, perintah di bawah ini bekerja pada keduanya,
sumber
grep | awk | awk
. line dapat disingkat menjadi/sbin/ifconfig eth0 | awk '$1 == "inet" { print substr($2,6); next ; } '
Dengan asumsi Anda memerlukan IP publik utama Anda seperti yang terlihat dari seluruh dunia , cobalah salah satu dari mereka:
sumber
Cuplikan ini menghindari pengodean nama perangkat (seperti 'eth0') dan akan menggunakan
ip
alih-alihifconfig
:Ini akan mengembalikan IP perangkat aktif pertama yang tercantum dalam output dari
ip addr
. Bergantung pada mesin Anda, ini bisa berupa alamat ipv4 atau ipv6.Untuk menyimpannya ke dalam variabel, gunakan:
sumber
semua solusi menggunakan awk / sed / grep tampak terlalu rumit dan jelek untuk situasi saya ... jadi saya datang dengan solusi yang sangat sederhana ini TAPI waspadalah karena itu membuat beberapa asumsi, yaitu asumsi bahwa antarmuka TERAKHIR adalah yang Anda tertarik. jika Anda setuju dengan itu maka ini cukup bersih:
ifconfig | awk '/net / { x = $2 } END { print x }'
kalau tidak, Anda bisa melakukan
if
pernyataan konyol untuk menguji awalan tertentu atau kriteria apa pun yang Anda miliki.sumber
Perintah sederhana untuk menyempurnakan Alamat IP dengan antarmuka default.
Diuji pada Semua OS Unix
sumber
Ini mungkin bukan solusi yang paling kuat atau benar, tetapi tidak seperti kebanyakan dari solusi lain, perintah ini berfungsi pada Linux dan Mac (BSD).
sumber
Jika Anda mencari alamat IP publik kotak tersebut , Anda dapat menggunakan yang berikut:
dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \"
Anda dapat menggunakan
dig(1)
opsi seperti-4
atau-6
untuk secara khusus mencari alamat IPv4 atau IPv6; Google akan memberikan jawaban dalam catatanTXT
jenis, yang akan memiliki tanda kutip ketika disajikan olehdig
; jika Anda ingin menggunakan variabel dengan utilitas sepertitraceroute
, Anda harus menggunakan sesuatu seperti tr (1) untuk menghapus tanda kutip tersebut.Pilihan lain termasuk
whoami.akamai.net
danmyip.opendns.com
, yang menjawabA
danAAAA
mencatat (alih-alihTXT
seperti pada contoh di atas dari Google), jadi, mereka tidak perlu menghapus tanda kutip:dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short
dig -4 @resolver1.opendns.com -t any myip.opendns.com +short
dig -6 @resolver1.opendns.com -t any myip.opendns.com +short
Berikut ini contoh skrip yang menggunakan semua opsi di atas untuk mengatur variabel:
Jika Anda mencari alamat IP pribadi, atau satu set semua alamat IP yang ditetapkan untuk kotak, Anda dapat menggunakan beberapa kombinasi
ifconfig
(pada BSD dan GNU / Linux),ip addr
(pada GNU / Linux),hostname
(opsi-i
dan-I
pada GNU / Linux) dannetstat
untuk melihat apa yang terjadi.sumber
ini akan melakukan semua yang Anda inginkan
sumber
hostname: invalid option -- 'l'
...