GNU/Linux >> Belajar Linux >  >> Linux

IP dari host lokal

Ada kelemahan mendasar dengan pertanyaan Anda. Pertama, host mungkin (dan kemungkinan akan) memiliki lebih dari satu alamat (mis., banyak antarmuka) dan bahkan lebih dari satu alamat per antarmuka. Ini bahkan lebih merupakan masalah dengan IPv6 di mana setiap host yang terhubung secara global setidaknya dua alamat.

Kedua, cara "terbaik" untuk melakukan ini dari sebuah shell akan bervariasi dari satu sistem ke sistem lainnya.

Linux:

/sbin/ip addr show eth0 | awk -F"[ /]+" '/inet / {print $3}'

>=Solaris 11:

ipadm show-addr net0/v4 | awk -F"[ /]+" '/ok/ {print $5}'

Mac OS X/Darwin:

ipconfig getifaddr en0

Bahkan menggunakan penyebut umum terendah dan menggunakan ifconfig tidak akan konsisten karena format keluaran dapat berubah. Namun, untuk membersihkan contoh Anda, gunakan ini:

ifconfig eth0 | awk -F"[ :]+" '/inet / {print $4}'

Jika Anda menggunakan bahasa yang lebih bagus seperti perl, ruby, java, dll., alih-alih shell, setiap bahasa akan memiliki caranya sendiri untuk mendapatkan data ini dari kernel. Saya akan membiarkan pencarian ini terserah Anda.


Informasi dapat berubah sewaktu-waktu, sehingga perlu diambil dari kernel, tidak dapat disimpan dalam file.

Tidak ada cara yang benar-benar bagus untuk mendapatkan informasi ini. Penguraian Anda sebagus apa pun, kecuali hard-coding baris kedua salah:tidak ada jaminan bahwa antarmuka akan dicantumkan dalam urutan tertentu. Sangat umum bagi sebuah mesin untuk memiliki lebih dari satu antarmuka:Anda mungkin memiliki beberapa kartu jaringan, atau antarmuka virtual.

Seringkali, alamat IP yang Anda minati adalah alamat yang terkait dengan rute default. Dengan sebagian besar konfigurasi, Anda bisa mendapatkan antarmuka yang tepat dengan route perintah, lalu ekstrak alamat IP antarmuka itu dengan ifconfig .

/sbin/ifconfig $(/sbin/route -n |
                 awk '$1 == "0.0.0.0" {print $8}') |
awk 'match($0, /inet addr:[.0-9]+/) {print substr($0, RSTART+10, RLENGTH-10)}'

Perhatikan bahwa tidak perlu memanggil sudo . ifconfig dan route sering tidak ada di PATH default untuk pengguna non-root, tetapi Anda dapat menggunakannya tanpa hak khusus selama Anda hanya membaca informasi dan tidak mengubah setelan.

Pada varian unix selain Linux, Anda mungkin harus men-tweak perintah di atas. Sebagian besar memiliki perintah yang disebut ifconfig dan route , tetapi format keluarannya mungkin berbeda.

Di Linux, bukan ifconfig dan route , Anda dapat menggunakan ip perintah dari rangkaian alat iproute2. Sementara penulis iproute2 mempertimbangkan ifconfig dan route tidak digunakan lagi, sebenarnya ada sedikit keuntungan menggunakan ip , sejak output dari ip tidak jauh lebih mudah untuk diuraikan, dan ifconfig dan route selalu tersedia sedangkan beberapa instalasi Linux yang dipreteli menghilangkan ip .


Semua jawaban di sini secara teknis benar, tetapi bukan itu yang saya anggap sebagai jawaban yang "benar". Sayangnya, pertanyaan Anda sangat kabur (yang dapat saya pahami jika Anda tidak begitu paham dengan cara kerja jaringan di Linux), jadi saya akan memberikan beberapa jawaban untuk kemungkinan interpretasi pertanyaan tersebut.


IP primer mesin

Mesin memiliki satu IP di atas yang lainnya yang dianggap sebagai IP utama mesin. Perhatikan bahwa ini tidak ada artinya, karena sebuah kotak dapat memiliki banyak IP dan mana yang digunakan berbeda-beda (saya akan membahasnya sebentar lagi).

IP primer hanyalah IP yang terkait dengan nama host mesin. Anda dapat menemukan IP ini dengan menjalankan yang berikut

getent hosts "$(hostname)" | awk '{ print $1 }'

Sekarang, yang dilakukan adalah mencari IP untuk nama host mesin menurut /etc/nsswitch.conf . Biasanya, /etc/nsswitch.conf file berisi hosts: files dns . Ini berarti bahwa ketika mencoba melakukan segala jenis pencarian nama host atau alamat, itu akan terlihat di /etc/hosts terlebih dahulu, lalu lihat DNS (sebagaimana dikonfigurasi oleh /etc/resolv.conf ).
Jadi perintah getent hosts "$(hostname)" kemungkinan akan mengambil entri yang cocok dari /etc/hosts . awk cukup ambil saja IP dari baris itu.

(getent hanyalah utilitas sederhana untuk menanyakan 'database' yang terdaftar di /etc/nsswitch.conf )


IP digunakan untuk berkomunikasi dengan dunia luar

Seperti yang saya sebutkan sebelumnya, IP utama mesin tidak ada artinya. Mesin dapat menggunakan beberapa IP untuk komunikasi. Dalam kasus Anda, Anda mungkin hanya memiliki satu antarmuka dan satu IP (non-localhost). Namun server dapat memiliki banyak antarmuka atau IP (terkadang beberapa IP pada satu antarmuka).
IP mana yang digunakan ditentukan oleh tabel perutean kernel. Saya tidak akan membahas secara spesifik tentang cara kerja tabel perutean karena tidak sederhana (ada beberapa tabel perutean, dan mana yang digunakan bergantung pada aturan pemilihan tabel). Saya hanya akan memberi tahu Anda cara menemukan IP mana yang akan digunakan.

Untuk mengetahui IP mana yang akan digunakan untuk berkomunikasi dengan tujuan tertentu, gunakan perintah berikut:

ip route get 1.2.3.4

(dengan 1.2.3.4 menjadi IP tujuan)

Di mesin saya, jika saya melakukan ini dengan salah satu IP google.com (74.125.139.102 ), saya mendapatkan yang berikut:

74.125.139.102 via 192.168.0.1 dev wlan0  src 192.168.0.24 
    cache 

Ini memberitahu saya bahwa IP 192.168.0.24 akan digunakan setiap kali mesin saya berbicara dengan 74.125.139.102 .

Jika Anda hanya menginginkan IP, Anda dapat menambahkan grep tambahan pada akhirnya.

ip route get 1.2.3.4 | grep -oP '(?<=src )\S+'

grep digunakan sebagai pengganti awk karena kurang rentan terhadap kesalahan. Ada kemungkinan baris dapat berubah di mana IP tidak akan berada di tempat yang sama, tetapi akan selalu mengikuti "src", jadi kita ambil nilainya segera setelah "src"


IP gerbang bawaan

Terakhir, ada gateway default. Jika Anda tidak memiliki tujuan khusus untuk menanyakan IP mana yang akan digunakan, Anda dapat memilih salah satu dari gateway default. Jika Anda hanya memiliki satu antarmuka, ini saja yang penting.
Ini pada dasarnya sama persis seperti di atas, hanya menggunakan gateway default sebagai tujuan kita untuk mencari

ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')"

Ini akan memberi Anda garis seperti yang ada di bagian atas. src value adalah IP yang akan digunakan untuk lalu lintas yang mengalir melalui gateway default.

Seperti pada bagian sebelumnya, untuk mendapatkan IP saja, tambahkan grep .

ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')" | grep -oP '(?<=src )\S+'

Linux
  1. Kit kelangsungan hidup sysadmin Linux saya

  2. Apakah Anda pernah memeras server?

  3. Jalankan Baris Perintah Dengan Satu Sudo?

  1. Cara Menyinkronkan Hanya Satu Partisi?

  2. Temukan -exec + Vs Temukan | Xargs:Yang Mana Yang Harus Dipilih?

  3. Buat Symlink – Timpa Jika Ada?

  1. Menemukan konten dari satu file di file lain

  2. pegangan proses di lldbinit

  3. Apa yang terjadi jika mv terganggu?