Hvordan får jeg IP-adresse ved hjelp av skallskript? [duplikat]

Dette spørsmålet har allerede svar her :

Kommentarer

  • Isn ' t ifconfig -a hva du ' leter etter?
  • @rajcoumar Jeg kan ikke se hvorfor bruk av privat IP forbyr deg å bruke utgangen av ifconfig -a. Svaret du merket som akseptert, gjør nettopp det (bruker bare ip i stedet for ifconfig).
  • ip -4 route get 8.8.8.8 | awk {'print $7'} | tr -d '\n'
  • MY_IP=$(getent hosts $(hostname) | awk '{print $1}')

Svar

For å liste opp alle IP-adresser, uavhengig av navn, prøv dette:

ifconfig | perl -nle "s/dr:(\S+)/print $1/e" 

eller:

ifconfig | awk "/inet addr/{print substr($2,6)}" 

Spesifiser grensesnittnavnet (f.eks. eth0) rett etter ifconfig hvis du bare vil ha IP-adressen til et bestemt grensesnitt:

ifconfig eth0 | perl -nle "s/dr:(\S+)/print $1/e" 

eller:

ifconfig eth0 | awk "/inet addr/{print substr($2,6)}" 

Kommentarer

  • takk, dette er min utgang 192.168.56.102 10.192.1.218 10.0.2.15 127.0.0.1, Nå vil jeg ta 10.192.1.218 og tildele til ny variabel i skallskript. hvordan kan vi gjøre?
  • som bare viser IP-adressene .. det ville være bedre om de tilsvarende grensesnittnavnene som eth0, eth1, … vises også. 🙂
  • Bruk absolutt rutetabellene slik @ymattw antyder! Dette har den fantastiske egenskapen å returnere nøyaktig adressen som datamaskinen din er konfigurert til å snakke med den gitte adressen. Jeg tror du sannsynligvis vil at awk '{print $NF; exit}' skal få det siste feltet (kildeadresse) på første rad.
  • Takk for at du påpekte, ser ut som min siste redigering ble ikke ' t lagret. Interessant, jeg kunne ikke ' ikke redigere mitt eget svar, så bare repost: ip route get 1.1.1.1 | awk '{print $NF; exit} # dette får ip av grensesnittet som kan nå til utenfor

Svar

Du kan gjøre:

ip addr | grep "state UP" -A2 | tail -n1 | awk "{print $2}" | cut -f1 -d"/"

som gir deg den første private IP-adressen som er oppført i ip addr.

For eksempel med ip addr, jeg får:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:16:76:de:c1:f1 brd ff:ff:ff:ff:ff:ff inet 192.168.0.85/24 brd 192.168.0.255 scope global dynamic em1 valid_lft 42505sec preferred_lft 42505sec inet6 fe80::216:76ff:fede:c1f1/64 scope link valid_lft forever preferred_lft forever 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 52:54:00:da:92:d0 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 500 link/ether 52:54:00:da:92:d0 brd ff:ff:ff:ff:ff:ff 

Med kommandolinjen før får jeg 192.168.0.85 som er IP-adressen til em1.

For å sette den i en variabel i et skallskript, kan du gjøre var=$(ip addr | grep "state UP" -A2 | tail -n1 | awk "{print $2}" | cut -f1 -d"/"). Nå, til slutten av skriptet, vil $var ha IP-adressen.

Kommentarer

  • Og faktisk ' ligner veldig på unix.stackexchange.com/questions/8518/… . Jeg lette ikke etter duplikater før jeg postet …
  • ip addr | grep ' state UP ' -A2 | hale -n1 | awk ' {print $ 2} ' | klipp -f1 -d ' / ' ved hjelp av denne kommandoen fikk jeg privat adresse. Nå vil jeg tilordne utgangen til en variabel
  • @rajcoumar, jeg oppdaterte svaret. Merk at dette spørsmålet allerede var stilt og besvart på dette nettstedet. Se unix.stackexchange.com/questions/4569/… for detaljer.
  • Merk også at svaret mitt ikke er av det mest elegante. Det kan være en bedre måte å gjøre dette enn å analysere utdataene til ip addr.
  • ip addr | grep 'state UP' -A2 | tail -n1 | awk -F'[/ ]+' '{print $3}' dette fungerer også, forresten

Svar

Flagrende kopipasta fra stackoverflow siden vi ikke kan lure på tvers av nettsteder. Jeg vet at det ikke er bash eller sh, men hvem har ikke python installert på dette tidspunktet?

Du bør bruke netifaces . Den er designet for å være plattformoverskridende på Mac   OS   X, Linux og Windows.

>>> import netifaces as ni >>> ni.interfaces() ["lo", "eth0", "eth1", "vboxnet0", "dummy1"] >>> ni.ifaddresses("eth0") {17: [{"broadcast": "ff:ff:ff:ff:ff:ff", "addr": "00:02:55:7b:b2:f6"}], 2: [{"broadcast": "24.19.161.7", "netmask": "255.255.255.248", "addr": "24.19.161.6"}], 10: [{"netmask": "ffff:ffff:ffff:ffff::", "addr": "fe80::202:55ff:fe7b:b2f6%eth0"}]} >>> >>> ni.ifaddresses.__doc__ "Obtain information about the specified network interface.\n\nReturns a dict whose keys are equal to the address family constants,\ne.g. netifaces.AF_INET, and whose values are a list of addresses in\nthat family that are attached to the network interface." >>> # for the IPv4 address of eth0 >>> ni.ifaddresses("eth0")[2][0]["addr"] "24.19.161.6" 

Tallene som brukes til å indeksere protokoller er fra /usr/include/linux/socket.h (i Linux) …

#define AF_INET 2 /* Internet IP Protocol */ #define AF_INET6 10 /* IP version 6 */ #define AF_PACKET 17 /* Packet family */ 

Slutt kopieringslim

Hvis alt du vil er IP-en til opp og utgående grensesnitt, dette fungerer.

Ennå ETT annet alternativ hvis du bare vil telle opp over grensesnitt, siden ingen ser ut til å være i stand til å under Tand nøyaktig hva du vil:

import netifaces as ni ints = ni.interfaces() for i in ints: if "eth" in i: try: ni.ifaddresses(i)[2][0]["addr"] print("interface: " + i) print("address: " + ni.ifaddresses(i)[2][0]["addr"]) except: pass elif "wlan" in i: try: ni.ifaddresses(i)[2][0]["addr"] print("interface: " + i) print("address: " + ni.ifaddresses(i)[2][0]["addr"]) except: pass 

Kommentarer

  • Merk at OP uttalte i spørsmålet hans at det vet ikke ' hvilket grensesnitt som er OPP.Han vil bare ha IP-tillegget til grensesnittet i tilstand " opp " uten å vite hvilken det er.
  • Så er det ' bare å få den lokale adressen fra en åpen stikkontakt til Google. Slik jeg leste det, ønsket han å telle over alle grensesnitt og kartlegge IP-er til grensesnitt i motsetning til bare å åpne en stikkontakt og lete etter den lokale IP-en.
  • Lagt til et enkelt skript for å adressere " bare gi meg den utgående IP " problemet.
  • Han gjør ikke ' t ønsker hans eksterne adresse, men hans private adresse. Slik jeg forstår det, kan han være koblet til et privat nettverk av et hvilket som helst av grensesnittene hans, og vil bare vite sin private IP-adresse uten å vite hvilket grensesnitt som brukes.
  • Den private adressen vil fremdeles bli gitt av det andre skriptet, det ' er bare den utgående private adressen.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *