Hur får man IP-adress med skalskript? [duplicera]

<åt sidan class = "s-notice s-notice__info js-post-notice mb16" role = "status">

Den här frågan har redan svar här :

Kommentarer

  • Är ' t ifconfig -a vad du ' letar efter?
  • @rajcoumar Jag förstår inte varför det är förbjudet att använda en privat IP utdata från ifconfig -a. Svaret du markerade som godkänt gör just det (använder bara ip istället för ifconfig).
  • ip -4 route get 8.8.8.8 | awk {'print $7'} | tr -d '\n'
  • MY_IP=$(getent hosts $(hostname) | awk '{print $1}')

Svar

För att lista alla IP-adresser, oavsett namn, prova detta:

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

eller:

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

Ange gränssnittsnamnet (t.ex. eth0) direkt efter ifconfig om du bara vill ha IP för ett specifikt gränssnitt:

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

eller:

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

Kommentarer

  • tack, det här är min utgång 192.168.56.102 10.192.1.218 10.0.2.15 127.0.0.1, Nu vill jag ta 10.192.1.218 och tilldela till ny variabel i skalskript. hur vi kan göra?
  • som bara visar IP-adresserna .. det vore bättre om motsvarande gränssnittsnamn som eth0, eth1, … visas också. 🙂
  • Använd absolut routingtabellerna som @ymattw föreslår! Detta har den underbara egenskapen att returnera exakt adressen genom vilken din dator är konfigurerad för att prata med den angivna adressen. Jag tror att du antagligen vill att awk '{print $NF; exit}' ska få det sista fältet (källadress) på första raden.
  • Tack för att du påpekade, ser ut som mitt sista redigeringen sparades inte '. Intressant, jag kunde inte ' t redigera mitt eget svar, så bara reposta: ip route get 1.1.1.1 | awk '{print $NF; exit} # detta får ip av gränssnittet som kan nå utanför

Svar

Du kan göra:

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

vilket ger dig den första privata IP-adressen som anges i ip addr.

Till exempel med ip addr, jag 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 kommandoraden innan får jag 192.168.0.85 som är IP-adressen till em1.

För att lägga den i en variabel i ett skalskript kan du göra var=$(ip addr | grep "state UP" -A2 | tail -n1 | awk "{print $2}" | cut -f1 -d"/"). Fram till slutet av skriptet har $var IP-adressens värde.

Kommentarer

  • Och faktiskt ' liknar unix.stackexchange.com/questions/8518/… . Jag letade inte efter dubbletter innan jag publicerade …
  • ip addr | grep ' status UP ' -A2 | svans -n1 | awk ' {skriv ut $ 2} ' | klipp -f1 -d ' / ' med det här kommandot fick jag en privat adress. Nu vill jag tilldela utdata till en variabel
  • @rajcoumar Jag uppdaterade svaret. Observera att denna fråga redan hade ställts och besvarats på den här webbplatsen. Se unix.stackexchange.com/questions/4569/… för mer information.
  • Obs också att mitt svar inte är av det mest eleganta. Det kan finnas ett bättre sätt att göra detta än att analysera utdata från ip addr.
  • ip addr | grep 'state UP' -A2 | tail -n1 | awk -F'[/ ]+' '{print $3}' det fungerar också, förresten

Svar

Flagrande kopieringspasta från stackoverflow eftersom vi inte kan lura över webbplatser. Jag vet att det inte är bash eller sh, men vem har inte python installerat vid den här tiden?

Du bör använda netifaces . Det är utformat för att vara plattformsoberoende på Mac   OS   X, Linux och 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" 

Siffrorna som används för att indexera protokoll är från /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 */ 

Avsluta kopiera klistra in

Om allt du vill är IP: n för upp och utgående gränssnitt, detta fungerar.

Ännu ett annat alternativ om du bara vill räkna upp över gränssnitt, eftersom ingen verkar kunna unders tand exakt vad du vill:

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

  • Observera att OP angav i sin fråga att det vet ' inte i förväg vilket gränssnitt som är UPP.Han vill bara ha IP-tillägget för gränssnittet i tillstånd " upp " utan att veta vilken det är.
  • Då ' bara får den lokala adressen från ett öppet uttag till Google. Så som jag läste det ville han räkna över alla gränssnitt och mappa IP-adresser till gränssnitt i motsats till att bara öppna ett uttag och leta efter den lokala IP-adressen.
  • Lade till ett enkelt skript för att adressera " ge mig bara utgående IP " problem.
  • Han gör inte ' t vill ha hans externa adress men hans privata adress. Så som jag förstår det kan han vara ansluten till ett privat nätverk med något av hans gränssnitt och vill bara veta sin privata IP-adress utan att veta vilket gränssnitt som används.
  • Den privata adressen skulle fortfarande ges av det andra skriptet ' är bara den utgående privata adressen.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *