Jak mogę wyświetlić adres IP pokazany na eth0 za pomocą skryptu?
Jak mogę wyświetlić adres IP pokazany na eth0 za pomocą skryptu?
Odpowiedzi:
zapisz to w pliku, a następnie uruchom bash <filename>
#!/bin/bash
ifconfig eth0 | grep "inet addr"
dokładniejsze, aby uzyskać tylko numer pokazujący adres IP:
#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1
Aktualizacja : jeśli to nie zadziała, wypróbuj inną odpowiedź
grep "inet"
Aby zapewnić inną opcję, możesz użyć ip addr
polecenia w ten sposób, aby uzyskać adres IP:
ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
ip addr show eth0
pokazuje informacje o eth0
grep "inet\b"
pokazuje tylko linię, która ma adres IPv4 (jeśli chcesz adres IPv6, zmień go na "inet6\b"
)awk '{print $2}'
drukuje na drugim polu, na przykład ipaddress / mask 172.20.20.15/25
cut -d/ -f1
zajmuje tylko część adresu IP.W skrypcie:
#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
Zaczerpnięte z /programming//a/14910952/1695680
hostname -i
Może to jednak zwrócić lokalny adres IP (127.0.0.1), więc może być konieczne użycie i filtrowanie:
hostname -I
Na stronach podręcznych nazwy hosta:
-i, --ip-address
Wyświetl adresy sieciowe nazwy hosta. Pamiętaj, że działa to tylko wtedy, gdy nazwa hosta może zostać rozwiązana. Unikaj korzystania z tej opcji; zamiast tego użyj nazwy hosta - all-ip-address.
-I, --all-ip-addresses
Wyświetl wszystkie adresy sieciowe hosta. Ta opcja wylicza wszystkie skonfigurowane adresy na wszystkich interfejsach sieciowych. Interfejs pętli zwrotnej i adresy lokalne łącza IPv6 są pomijane. W przeciwieństwie do opcji -i, ta opcja nie zależy od rozpoznawania nazw. Nie przyjmuj żadnych założeń dotyczących kolejności danych wyjściowych.
ip addr show label 'enp*'
ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
Odpowiedź Markusa-Lindberga jest moją ulubioną. Jeśli dodasz -o -4
do flag ip, to uzyskasz dużo łatwiejsze do parsowania (i spójne) wyjście:
ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'
-o
oznacza --oneline
, co ma pomóc w dokładnie takich sytuacjach. -4
Jest dodawana do limitu na adres IPv4, który jest co wszystkie inne odpowiedzi sugerować.
ip
flagi. Używanie cut
zamiast zaawansowanego awk
czarodziejstwa:ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
cut
sposób po tym, jak się dowiedziałem awk
i lubię minimalizować liczbę poleceń w moich potokach. W każdym razie miła sugestia.
Oto kilka onelinerów .....
Awk
ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'
funkcja split w powyższej komendzie awk dzieli drugą kolumnę na podstawie separatora :
i zapisuje podzieloną wartość w tablicy asocjacyjnej a
. Tak a[2]
utrzymuje wartość drugiej części.
sed
ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'
W podstawowym sed, \(...\)
zwanym grupą przechwytującą, która służy do przechwytywania postaci. Możemy przechwycić te przechwycone znaki poprzez odsyłanie wstecz. \([^[:space:]]\+\)
przechwytuje dowolną postać, ale nie spację raz lub więcej razy.
grep
ifconfig eth0 | grep -oP 'inet addr:\K\S+'
\K
odrzuca poprzednio dopasowane znaki z wydruku na końcu i \S+
dopasowuje jeden lub więcej znaków spacji.
Perl
ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'
inet addr:
Przechwytywany jest jeden lub więcej znaków spacji, które znajdują się obok ciągu, i na końcu drukujemy tylko te przechwycone znaki.
Powinieneś używać ip
(zamiast ifconfig
), ponieważ jest aktualny, utrzymywany, a być może co najważniejsze do celów skryptowych, daje spójne i możliwe do przetworzenia wyjście. Oto kilka podobnych podejść:
Jeśli chcesz mieć adres IPv4 dla swojego interfejsu Ethernet eth0
:
$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24
Jako skrypt:
$ INTFC=eth0
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}')
$ echo $MYIPV4
192.168.1.166/24
Dane wyjściowe wytworzone powyżej są zapisane w notacji CIDR. Jeśli notacja CIDR nie jest pożądana, można ją usunąć:
$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1
192.168.1.166
Inna opcja, że IMHO jest „najbardziej elegancka”, otrzymuje adres IPv4 dla dowolnego interfejsu używanego do łączenia się z określonym zdalnym hostem (w tym przypadku 8.8.8.8). Dzięki uprzejmości @gatoatigrado w tej odpowiedzi :
$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166
Jako skrypt:
$ RHOST=8.8.8.8
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166
Działa to doskonale na hoście z jednym interfejsem, ale korzystniej działa również na hostach z wieloma interfejsami i / lub specyfikacjami tras.
Chociaż ip
byłoby to moje preferowane podejście, z pewnością nie jest to jedyny sposób na skórowanie tego kota. Oto inne podejście, które stosuje się, hostname
jeśli wolisz coś łatwiejszego / bardziej zwięzłego:
$ hostname --all-ip-addresses | awk '{print $1}'
Lub jeśli chcesz adres IPv6:
$ hostname --all-ip-addresses | awk '{print $2}'
Jako skrypt:
$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}')
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166
$ echo $MYV6IP
2601:7c1:103:b27:352e:e151:c7d8:3379
Sugeruję użycie biblioteki Pythona, takiej jak netifaces, która została specjalnie zaprojektowana do tego celu.
sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"
Aby uzyskać domyślny używany interfejs sieciowy.
default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
To jedyne zastosowanie, ip addr
które jest zamiennikiem ifconfig
i awk
połączone z podstawieniem (gsub).
Jeszcze jedna opcja, która może być przydatna, jeśli nie masz awk (jak ma to miejsce w przypadku niektórych urządzeń osadzonych):
ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"
ifconfig eth0|grep 'inet '|awk '{print $2}'
można tego używać także u zwykłego użytkownika.
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
dwa razy zamiast kombinacji awk
i cut
do parsowania wyniku. Następnym razem lepiej najpierw sprawdź wszystkie inne odpowiedzi i upewnij się, że nie opublikujesz duplikatu rozwiązania. W tym przypadku myślę, że jest dyskusyjne, czy jest to duplikat, czy po prostu podobny, więc weź to jako ogólną wskazówkę. Dzięki.
To jest najkrótsza droga, jaką mogłem znaleźć:
ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'
Zamień $1
na interfejs sieciowy.
ip -f inet
każe ip zwracać tylko wartości dla rodziny inet (ipv4).
grep -Po
mówi grepowi, aby interpretuje następną wartość jako perl-regex i wypisuje tylko pasujące wartości.
Wyrażenie regularne \K[\d.]+
mówi „wyrzuć wszystko do tego punktu (\ K) i dopasuj jak najwięcej wartości liczbowych, a następnie kropkę w rzędzie, jak to możliwe”. Dlatego dopasuje tylko adres IP i zignoruje wszystko po nim, w tym krótką maskę podsieci \ XX.
w dzisiejszych czasach z wieloma interfejsami (np. jeśli używasz dokera) i interfejs nazewnictwa ETH nie jest już normą
Używam tego polecenia do wyodrębnienia adresu IP / maski:
IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)
Bez względu na to, ile interfejsów będę mieć i jak będą się nazywać, GREP pobierze tylko pierwszego z opcją MULTICAST.
Używam tego polecenia, aby wyodrębnić tylko adres IP bez maski:
IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)
Używam tych poleceń na różnych systemach BDS i NIX, które nigdy nie zawodzą;)
ip
, użyj -o
opcji.
W moim skrypcie używam czegoś takiego:
re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
echo ${BASH_REMATCH[1]}
else
echo "Cannot determin IP" 1>&2
fi
Nie spawnuje żadnego procesu.