GNU/Linux >> Znalost Linux >  >> Linux

IP localhost

Vaše otázka má zásadní nedostatky. Za prvé, hostitelé mohou (a pravděpodobně budou) mít více než jednu adresu (např. více rozhraní) a dokonce více než jednu adresu na rozhraní. To je ještě větší problém s protokolem IPv6, kde je každý globálně připojený hostitel nejméně dva adresy.

Za druhé, "nejlepší" způsob, jak to udělat ze shellu, se bude systém od systému lišit.

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

Dokonce i nejnižší společný jmenovatel a použití ifconfig nebude konzistentní, protože výstupní formát se může změnit. Chcete-li však svůj příklad vyčistit, použijte toto:

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

Pokud používáte lepší jazyk jako perl, ruby, java atd., místo shellu bude mít každý jazyk svůj vlastní způsob získávání těchto dat z jádra. Nalezení tohoto nechám na vás.


Informace se mohou kdykoli změnit, takže je třeba je získat z jádra, nelze je uložit do souboru.

Neexistuje žádný opravdu pěkný způsob, jak tyto informace získat. Vaše analýza je stejně dobrá jako kterákoli jiná, až na to, že zakódování druhého řádku je špatné:neexistuje žádná záruka, že rozhraní budou uvedena v jakémkoli konkrétním pořadí. Je poměrně běžné, že počítač má více než jedno rozhraní:můžete mít více síťových karet nebo virtuálních rozhraní.

Často je IP adresa, která vás zajímá, ta, která je spojena s výchozí trasou. U většiny konfigurací můžete získat správné rozhraní pomocí route a poté extrahujte IP adresu tohoto rozhraní pomocí 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)}'

Pamatujte, že není třeba volat sudo . ifconfig a route často nejsou ve výchozím nastavení PATH pro uživatele bez oprávnění root, ale můžete je používat bez zvláštních oprávnění, pokud pouze čtete informace a neměníte nastavení.

Na unixových variantách jiných než Linux možná budete muset vyladit výše uvedené příkazy. Většina má příkazy nazvané ifconfig a route , ale výstupní formát se může lišit.

Pod Linuxem místo ifconfig a route , můžete použít ip příkaz ze sady nástrojů iproute2. Zatímco autoři iproute2 zvažují ifconfig a route být zastaralý, tam je ve skutečnosti malá výhoda použití ip , protože výstup ip není výrazně jednodušší na analýzu a ifconfig a route jsou vždy k dispozici, zatímco některé zkrácené instalace Linuxu vynechávají ip .


Všechny odpovědi zde jsou technicky správné, ale nejsou to, co bych považoval za „správnou“ odpověď. Bohužel je vaše otázka extrémně vágní (což chápu, pokud nejste opravdu dobří v tom, jak funguje síť v Linuxu), takže vám dám několik odpovědí na možné interpretace této otázky.


Primární IP adresa počítače

Stroj má jednu IP nad všemi ostatními, která je považována za primární IP stroje. Všimněte si však, že je to docela nesmyslné, protože krabice může mít více IP adres a která se používá se liší (za chvíli se k tomu pustím).

Primární IP je jednoduše IP přidružená k názvu hostitele počítače. Tuto IP adresu můžete najít spuštěním následujícího

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

Nyní to udělá, že vyhledá IP pro název hostitele počítače podle /etc/nsswitch.conf . Ve většině případů /etc/nsswitch.conf soubor obsahuje hosts: files dns . To znamená, že když se pokusíte provést jakýkoli druh vyhledávání názvu hostitele nebo adresy, bude to vypadat v /etc/hosts nejprve a poté se obraťte na DNS (jak je nakonfigurováno pomocí /etc/resolv.conf ).
Tedy příkaz getent hosts "$(hostname)" pravděpodobně získá odpovídající záznam z /etc/hosts . awk prostě jen chytne jen IP z tohoto řádku.

(getent je jen jednoduchý nástroj pro dotazování 'databází' uvedených v /etc/nsswitch.conf )


IP používaná ke komunikaci s vnějším světem

Jak jsem zmínil dříve, primární IP počítače je docela nesmyslná. Stroj může pro komunikaci používat kteroukoli z více IP adres. Ve vašem případě pravděpodobně máte pouze jedno rozhraní a jednu (nelocalhost) IP. Server však může mít více rozhraní nebo IP (někdy více IP na jednom rozhraní).
Která IP bude použita, je určena směrovací tabulkou jádra. Nebudu se zabývat specifiky toho, jak směrovací tabulka funguje, protože to není jednoduché (existuje více směrovacích tabulek a která z nich se použije, závisí na pravidlech výběru tabulky). Jen vám řeknu, jak zjistit, která IP by se používala.

Chcete-li zjistit, která IP bude použita pro komunikaci s konkrétním cílem, použijte následující příkaz:

ip route get 1.2.3.4

(s 1.2.3.4 je adresa IP cíle)

Pokud to na svém počítači udělám s jednou z IP adres google.com (74.125.139.102 ), dostávám následující:

74.125.139.102 via 192.168.0.1 dev wlan0  src 192.168.0.24 
    cache 

To mi říká, že IP 192.168.0.24 bude použito vždy, když můj počítač začne mluvit s 74.125.139.102 .

Pokud chcete pouze IP, můžete přidat extra grep na konci.

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

grep se používá místo awk protože je méně náchylný k chybám. Je možné, že se řádek změní, ve kterém IP nebude na stejném místě, ale vždy bude následovat „src“, takže prostě vezmeme hodnotu bezprostředně za „src“


IP výchozí brány

Nakonec je tu výchozí brána. Pokud nemáte konkrétní cíl, na který byste se chtěli zeptat, která IP bude použita, můžete vybrat ten z výchozí brány. Pokud máte pouze jedno rozhraní, bude to stejně důležité.
Jde v podstatě o totéž, co je uvedeno výše, pouze pro vyhledání použijeme výchozí bránu jako cíl

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

Získáte tak řádek jako ve výše uvedené části. src hodnota je IP, která bude použita pro provoz proudící přes výchozí bránu.

Stejně jako v předchozí části, chcete-li získat pouze IP, přidejte grep .

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

Linux
  1. Už jste někdy nabourali server?

  2. Jak synchronizovat pouze jeden oddíl?

  3. Najít -exec + Vs Najít | Xargs:Který si vybrat?

  1. Vytvořit symbolický odkaz – přepsat, pokud existuje?

  2. popisovač procesu v lldbinit

  3. Co se stane, když je mv přerušeno?

  1. Moje sada pro přežití Linux sysadmin

  2. Vykonat řadu příkazů jedním sudem?

  3. Ocas a zástupné znaky