Hvordan får man IP-adresse ved hjælp af shell-script? [duplikat]

Dette spørgsmål har allerede svar her :

Kommentarer

  • Isn ' t ifconfig -a hvad du ' leder efter?
  • @rajcoumar Jeg kan ikke se, hvorfor brug af en privat IP forhindrer dig i at bruge output fra ifconfig -a. Det svar, du markerede som accepteret, gør netop det (bruger 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

Hvis du vil liste alle IP-adresser, uanset navn, skal du prøve dette:

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

eller:

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

Angiv grænsefladenavnet (f.eks. eth0) lige efter ifconfig hvis du kun vil have IP til en bestemt grænseflade:

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

eller:

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

Kommentarer

  • tak, dette er min output 192.168.56.102 10.192.1.218 10.0.2.15 127.0.0.1, Nu vil jeg tage 10.192.1.218 og tildele til ny variabel i shell-script. hvordan kan vi gøre?
  • der ville bare vise IP-adresserne .. det ville være bedre, hvis de tilsvarende grænsefladenavne som eth0, eth1, … vises også. 🙂
  • Brug absolut routingtabellerne som @ymattw antyder! Dette har den vidunderlige egenskab at returnere nøjagtigt den adresse, gennem hvilken din computer er konfigureret til at tale med den givne adresse. Jeg tror, du sandsynligvis vil have awk '{print $NF; exit}', dog for at få det sidste felt (kildeadresse) i første række.
  • Tak for at påpege, ligner min sidste redigering blev ikke gemt '. Interessant, jeg kunne ikke ' ikke redigere mit eget svar, så bare repost: ip route get 1.1.1.1 | awk '{print $NF; exit} # dette får ip af grænsefladen, som kan nå til uden for

Svar

Du kan gøre:

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

som giver dig den første private IP-adresse, der er angivet 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 at placere den i en variabel inde i et shell-script kan du gøre var=$(ip addr | grep "state UP" -A2 | tail -n1 | awk "{print $2}" | cut -f1 -d"/"). Nu indtil slutningen af scriptet har $var IP-adresseens værdi.

Kommentarer

  • Og faktisk ' er meget lig unix.stackexchange.com/questions/8518/… . Jeg ledte ikke efter dubletter før jeg sendte …
  • ip addr | grep ' tilstand UP ' -A2 | hale -n1 | awk ' {udskriv $ 2} ' | klip -f1 -d ' / ' ved hjælp af denne kommando fik jeg privat adresse. Nu vil jeg tildele output til en variabel
  • @rajcoumar Jeg opdaterede svaret. Bemærk, at dette spørgsmål allerede var blevet stillet og besvaret på dette websted. Se unix.stackexchange.com/questions/4569/… for detaljer.
  • Bemærk også at mit svar ikke er af det mest elegante. Der kan være en bedre måde at gøre dette end at analysere output fra ip addr.
  • ip addr | grep 'state UP' -A2 | tail -n1 | awk -F'[/ ]+' '{print $3}' dette fungerer også, forresten

Svar

Markant kopipasta fra stackoverflow da vi ikke kan narre på tværs af sider. Jeg ved, det er ikke bash eller sh, men hvem har ikke python installeret på dette tidspunkt alligevel?

Du skal bruge netifaces . Det er designet til at være på tværs af platforme 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, der bruges til at 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 */ 

Afslut kopi-indsæt

Hvis alt hvad du ønsker, er IP-adressen til op og udgående grænseflade, dette fungerer.

Alligevel EN ANDEN mulighed, hvis du bare vil tælle for store grænseflader, da ingen ser ud til at kunne under tand præcis, hvad 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

  • Bemærk, at OP angav i sit spørgsmål, at det ved ikke ' på forhånd, hvilken grænseflade der er OP.Han vil bare have IP-addr til grænsefladen i tilstand " op " uden at vide hvilken det er.
  • Derefter ' er det bare at få den lokale adresse fra et åbent stik til Google. Den måde, jeg læste det på, ville han opregne over alle grænseflader og kortlægge IPer til grænseflader i modsætning til bare at åbne en stikkontakt og lede efter den lokale IP.
  • Tilføjet et simpelt script til at adressere " Giv mig bare det udgående IP " problem.
  • Han gør ikke ' t ønsker hans eksterne adresse, men hans private adresse. Som jeg forstår det, kunne han være forbundet til et privat netværk ved hjælp af en hvilken som helst af hans grænseflader og vil bare kende hans private IP-adresse uden at vide, hvilken grænseflade der bruges.
  • Den private adresse vil stadig blive givet af det andet script er det ' bare den udgående private adresse.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *