Hoe krijg ik een IP-adres met behulp van een shell-script? [duplicate]

Deze vraag heeft hier al antwoorden :

Reacties

  • Isn ' t ifconfig -a waarnaar u ' zoekt?
  • @rajcoumar Ik begrijp niet waarom het gebruik van een privé-IP-adres u verbiedt de uitvoer van ifconfig -a. In feite doet het antwoord dat u als geaccepteerd heeft gemarkeerd precies dat (gebruikt alleen ip in plaats van ifconfig).
  • ip -4 route get 8.8.8.8 | awk {'print $7'} | tr -d '\n'
  • MY_IP=$(getent hosts $(hostname) | awk '{print $1}')

Antwoord

Probeer dit om alle IP-adressen weer te geven, ongeacht de naam:

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

of:

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

Specificeer de interfacenaam (bijv. eth0) direct na ifconfig als je alleen het IP-adres van een specifieke interface wilt:

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

of:

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

Reacties

  • bedankt, dit is mijn uitvoer 192.168.56.102 10.192.1.218 10.0.2.15 127.0.0.1, Nu wil ik 10.192.1.218 nemen en toewijzen aan een nieuwe variabele in shell-script. hoe kunnen we dat doen?
  • dat zou alleen de IP-adressen weergeven .. het zou beter zijn als de corresponderende interfacenamen zoals eth0, eth1, … worden ook weergegeven. 🙂
  • Gebruik absoluut de routeringstabellen zoals @ymattw suggereert! Dit heeft de geweldige eigenschap dat het exact het adres retourneert waarmee uw computer is geconfigureerd om met het opgegeven adres te praten. Ik denk dat je waarschijnlijk awk '{print $NF; exit}' wilt hebben om het laatste veld (bronadres) van de eerste rij te krijgen.
  • Bedankt voor het aangeven, het lijkt op mijn laatste bewerking is niet ' t opgeslagen. Interessant, ik kon ' mijn eigen antwoord niet bewerken, dus plaats het gewoon opnieuw: ip route get 1.1.1.1 | awk '{print $NF; exit} # dit krijgt het ip van de interface die kan bereiken buiten

Antwoord

U kunt doen:

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

waarmee u het eerste privé-IP-adres krijgt dat wordt vermeld in ip addr.

Bijvoorbeeld met ip addr, ik krijg:

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 

Met de vorige commandoregel krijg ik 192.168.0.85 dat is het IP-adres van em1.

Om het in een variabele in een shellscript te plaatsen, kun je var=$(ip addr | grep "state UP" -A2 | tail -n1 | awk "{print $2}" | cut -f1 -d"/"). Nu, tot het einde van het script, heeft $var de waarde van het IP-adres.

Opmerkingen

  • En inderdaad, het ' lijkt erg op unix.stackexchange.com/questions/8518/… . Ik heb niet gezocht naar duplicaten voordat ik het plaatste …
  • ip addr | grep ' status UP ' -A2 | staart -n1 | awk ' {print $ 2} ' | cut -f1 -d ' / ' met dit commando heb ik een privéadres gekregen. Nu wil ik de uitvoer aan een variabele toewijzen.
  • @rajcoumar Ik heb het antwoord bijgewerkt. Merk op dat deze vraag al op deze site is gesteld en beantwoord. Zie unix.stackexchange.com/questions/4569/… voor details.
  • Opmerking ook dat mijn antwoord niet het meest elegante is. Er is misschien een betere manier om dit te doen dan de uitvoer van ip addr te parseren.
  • ip addr | grep 'state UP' -A2 | tail -n1 | awk -F'[/ ]+' '{print $3}' dit werkt ook, trouwens

Antwoord

Flagrante copy-paste van stackoverflow , aangezien we niet over sites heen kunnen duperen. Ik weet dat het geen bash of sh is, maar wie heeft python op dit moment toch niet geïnstalleerd?

Je moet netifaces . Het is ontworpen om platformonafhankelijk te zijn op Mac   OS   X, Linux en 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" 

De nummers die worden gebruikt om protocollen te indexeren zijn van /usr/include/linux/socket.h (in Linux) …

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

Einde kopiëren plakken

Als u alleen het IP-adres van de up- en uitgaande interface, dit werkt.

Nog EEN ANDERE optie als je alleen maar meer interfaces wilt opsommen, aangezien niemand in staat lijkt te zijn om tand precies wat je wilt:

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 

Reacties

  • Merk op dat het OP in zijn vraag stelde dat het weet niet ' van tevoren welke interface UP is.Hij wil gewoon het IP-adres van de interface in staat " omhoog " zonder te weten welke het is.
  • Vervolgens ' krijgt alleen het lokale adres van een open socket naar Google. Zoals ik het las, wilde hij alle interfaces opsommen en IPs aan interfaces toewijzen, in plaats van alleen een socket te openen en naar het lokale IP-adres te zoeken.
  • Een eenvoudig script toegevoegd om het " geef me gewoon het uitgaande IP " probleem.
  • Hij doet niet ' t wil zijn externe adres maar zijn privé adres. Zoals ik het begrijp, kan hij via elk van zijn interfaces met een privé-netwerk worden verbonden en wil hij gewoon zijn privé-IP-adres weten zonder te weten welke interface wordt gebruikt.
  • Het privé-adres wordt nog steeds gegeven door het tweede script, het ' is alleen het uitgaande privé-adres.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *