2010-03-02 22 views
11

Kontekst: Na systemach * nix, można uzyskać adres IP urządzenia w skrypcie powłoki ten sposób:Skuteczny sposób na uzyskanie adresu IP w skryptach powłoki

ifconfig | grep 'inet' | grep -v '127.0.0.1' | cut -d: -f2 | awk '{print $1}' 

albo to zbyt :

ifconfig | grep 'inet' | grep -v '127.0.0.1' | awk '{print $2}' | sed 's/addr://' 

Pytanie: Byłoby bardziej proste, nadal przenośne sposób, aby uzyskać adres IP do użycia w skrypcie powłoki?

(my apologies to *BSD and Solaris users as the above command may not work, nie mogłem przetestować)

+2

Co zrobić, jeśli urządzenie posiada więcej niż jedną kartę sieciową? –

+1

Co masz na myśli przez "adres IP"? W dzisiejszych czasach bardzo często można mieć dwa lub więcej adresów IP, nawet na stacji roboczej ... –

+0

Tak, myślałem o tym problemie. Ale to zależy od tego, co skrypty muszą zrobić. Dla moich indywidualnych potrzeb zwykle przekazuję nazwę interfejsu do ifconfig (np. 'Ifconfig eth0', itp.). Sądziłem, że to pytanie byłoby zbyt szczegółowe. Jakąkolwiek sugestię, jak uczynić to pytanie bardziej znaczącym? Dzięki! –

Odpowiedz

12

możesz to zrobić za pomocą tylko jednego polecenia awk. Nie trzeba używać zbyt wielu rur.

$ ifconfig | awk -F':' '/inet addr/&&!/127.0.0.1/{split($2,_," ");print _[1]}' 
+0

+1, ale białe znaki nie są zagrożone: użyj więcej –

+0

Twoja propozycja jest bardzo dobra. Proste testy pokazują, że jest on również szybszy średnio niż moje podstawowe propozycje. Na razie chciałbym zaakceptować twoje. Przenośność nie jest lepsza, ze względu na '_ [1]' i '$ 2'. Na przykład, muszę zmienić indeksy pod * BSD (ah, może przetestować go tym razem). Szczerze mówiąc, wciąż zastanawiam się, czy istnieje narzędzie do uzyskania adresu IP w jednym ujęciu, być może przekazywania parametrów (np. Nazwy interfejsu). 'ifconfig' to rzeczywiście" konfiguracja parametrów interfejsu sieciowego ", brak parametrów ... Być może dobrze rozwinięta wersja' showip.c', wprowadzona przez Toma, byłaby świetna. –

+1

jeśli chcesz wziąć pod uwagę przenośność, możesz spróbować użyć biblioteki gniazd z różnych narzędzi programistycznych, takich jak Perl lub Python. np. W Pythonie można uzyskać adres IP za pomocą 'socket.gethostbyname (socket.gethostname())'. Oczywiście to tylko prosty przykład. Wiele osób wymyśliło niezależne od platformy sposoby wpisywania adresu interfejsu za pomocą tych bibliotek. więc możesz chcieć spróbować. – ghostdog74

5

dać bezpośredni interfejs zmniejszając jedną grep.

ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}' 
+0

Dzięki @coder za sugestię. Zastanawiam się, czy nie możemy pójść dalej! Po wszystkim narzędzia * nix robią coś prostego i robią to dobrze. Więc może istnieć standardowy sposób uzyskania adresu IP interfejsu. Na przykład coś takiego jak 'nazwa_hosta --ip-address' (to nie działa) byłoby świetne. –

+0

'ifconfig eth0 | grep inet | cut -d: -f2 | cut -d '' -f1' - w ten sposób pozbędziesz się awk wagi ciężkiej. Oczywiście nie będzie działać z ppp0 itp., Ale jeśli masz więcej niż jedną kartę NIC, dostaniesz więcej niż jedną odpowiedź za pomocą swojego rozwiązania. (głowa -1, aby złapać pierwszy?) –

+0

To działało, i krótsze niż inne odpowiedzi. – Quanlong

1

Spójrz tutaj w podręczniku Beej do networking aby uzyskać listę gniazd za pomocą prostego programu w języku C, aby wydrukować adresy IP używając getaddrinfo(...) połączenia. Ten prosty program w języku C może być użyty w części skryptu powłoki do wydrukowania adresów IP dostępnych pod numerem stdout, co byłoby łatwiejsze, niż poleganie na ifconfig, jeśli chcesz pozostać przenośny, ponieważ wyjście ifconfig może się różnić.

Mam nadzieję, że to pomoże, Pozdrawiam, Tom.

+0

Dzięki Tomkowi za wskazówkę; to pomaga. Kopalnia informacji. 'Showip.c' rozwiązuje problem (usuwa formatowanie wyjściowe).Zastanawiam się jednak, czy istnieje sposób polegania na "standardowych" narzędziach * nix w powłokach. Dla kontekstu piszę niektóre skrypty, które powinny działać na * nix i * BSD. Działa, ale moja droga nie jest zbyt elegancka. Używając 'showip.c', musiałbym wdrożyć program razem ze skryptem, co jak sądzę można uniknąć. –

0

ifconfig | grep 'broadcast \ | Bcast' | awk -F '' {'print $ 2'} | głowa -n 1 | sed -e '//addr: // g'

0

Może to pomóc.

more /etc/hosts | grep `hostname` | awk '{print $1}' 
+0

Pomoże to określić przynajmniej warunki, w których uważasz, że ta praca (system operacyjny itp.). 'Grep' jest dla mnie zbyt restrykcyjny (testowany na dwóch systemach operacyjnych, bez powodzenia). –

+0

Przetestowałem na serwerach AIX. Działa w porządku. –

+0

Nie działało to na CentOS i Mac OS X. Nie wiem wystarczająco dużo o standardach, ale zastanawiam się, jak regularna jest zawartość plików '/ etc/hosts' w różnych systemach. –

0
# for bash/linux 
ipaddr(){ 
if="${1:-eth0}" 
result=$(/sbin/ip -o -4 addr show dev "${if}" | sed 's/^.*inet // ; s/\/...*$//') 
printf %s "${result}" 
tty -s && printf "\n" 
} 
2

podstawie this można użyć następującego polecenia

ip route get 8.8.8.8 | awk 'NR==1 {print $NF}' 
Powiązane problemy