Hogyan lehet IP-címet kapni a shell szkript segítségével? [duplicate]

Erre a kérdésre már itt vannak válaszok :

megjegyzések

  • Isn ' t ifconfig -a amit ' keresel?
  • @rajcoumar Nem értem, miért tiltja a privát IP használata a használatát az ifconfig -a kimenete. Valójában az elfogadottként megjelölt válasz éppen ezt teszi (csak a ip szót használja a ifconfig helyett).
  • ip -4 route get 8.8.8.8 | awk {'print $7'} | tr -d '\n'
  • MY_IP=$(getent hosts $(hostname) | awk '{print $1}')

Válasz

Az összes IP-cím felsorolásához, névtől függetlenül, próbálja meg ezt:

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

vagy:

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

Adja meg az interfész nevét (pl. eth0) közvetlenül a ifconfig után, ha csak egy adott interfész IP-jét szeretné:

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

vagy:

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

megjegyzések

  • köszi, ez az én kimenetem 192.168.56.102 10.192.1.218 10.0.2.15 127.0.0.1, Most szeretném venni a 10.192.1.218-at, és hozzárendelni egy új változathoz a shell scriptben. hogyan tehetnénk?
  • ez csak az IP-címeket jelenítené meg. jobb lenne, ha a megfelelő interfésznevek, például eth0, eth1, … is megjelennek. 🙂
  • Abszolút használja az útválasztási táblázatokat, ahogy a @ymattw javasolja! Ennek az a csodálatos tulajdonsága, hogy pontosan adja vissza azt a címet, amelyen keresztül számítógépe úgy van konfigurálva, hogy beszéljen az adott címmel. Azt hiszem, valószínűleg azt szeretné, hogy awk '{print $NF; exit}' megkapja az első sor utolsó mezőjét (forráscímét).
  • Köszönjük, hogy rámutatott, úgy néz ki, mint az utolsó a szerkesztést nem mentették el '. Érdekes, hogy nem tudtam ' szerkeszteni a saját válaszomat, ezért egyszerűen csak újból közzé kell tenni: ip route get 1.1.1.1 | awk '{print $NF; exit} # ezzel megkapom az interfész IP-címét, kívül

Válasz

Megteheti:

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

amely megadja az első privát IP-címet a ip addr listában.

Például a ip addr, kapom:

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 

Az előző parancssorral 192.168.0.85 amely a em1 IP-címe.

A shell parancsfájl belsejében lévő változóba történő belépéshez megteheti a következőt: var=$(ip addr | grep "state UP" -A2 | tail -n1 | awk "{print $2}" | cut -f1 -d"/"). Most a szkript végéig a $var megkapja az IP-cím értékét.

Megjegyzések

  • És ' nagyon hasonlít a unix.stackexchange.com/questions/8518/… . Nem kerestem duplikátumokat a közzététel előtt …
  • ip addr | grep ' állapot UP ' -A2 | farok -n1 | awk ' {print $ 2} ' | -f1 -d ' / ' kivágás ezzel a paranccsal privát címet kaptam. Most kimenetet szeretnék rendelni egy változóhoz
  • @rajcoumar frissítettem a választ. Vegye figyelembe, hogy ezt a kérdést már feltették és megválaszolták ezen a webhelyen. A részletekért lásd: unix.stackexchange.com/questions/4569/… .
  • Megjegyzés az is, hogy a válaszom nem a legelegánsabb. Jobb módszer lehet erre, mint a ip addr kimenetének elemzése.
  • ip addr | grep 'state UP' -A2 | tail -n1 | awk -F'[/ ]+' '{print $3}' ez is működik, egyébként

Válasz

Vakmerő másolás beillesztése a következőből: stackoverflow , mivel nem tudunk átverni a webhelyeken. Tudom, hogy ez nem bash vagy sh, de kinek sincs még telepítve a python ezen a ponton?

Használja a netiface . Úgy lett megtervezve, hogy platformokon átívelő legyen Mac-en   OS   X, Linux és 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" 

A protokollok indexeléséhez használt számok /usr/include/linux/socket.h (Linux alatt) …

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

Másolás beillesztése

Ha csak a fel és a kimenő felület, ez működik.

Mégis egy másik lehetőség, ha csak felfelé akarja felsorolni a felfelé mutató interfészeket, mivel úgy tűnik, senki sem képes alávetni pontosan beírja, amit akar:

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 

Megjegyzések

  • Ne feledje, hogy az OP kérdésében kijelentette, hogy nem ' nem tudja előre, melyik interfész van FEL.Csak azt akarja, hogy az interfész IP-címe " fel " állapotban legyen, anélkül, hogy tudná, melyikről van szó.
  • Ezután ' csak a helyi címet kapja meg egy nyitott aljzatból a Google számára. Ahogy olvastam, az összes felületen fel akarta sorolni, és az IP-ket interfészekhez rendelte, ahelyett, hogy csak megnyitott egy foglalatot és kereste a helyi IP-t.
  • Egy egyszerű szkriptet adott hozzá a " csak adja meg a kimenő IP " problémát.
  • Nem ' t külső címét akarja, de magán címét. Ahogy megértem, bármelyik interfésze összekapcsolható magánhálózattal, és csak a saját IP-címét akarja tudni anélkül, hogy tudná, melyik felületet használják.
  • A privát címet továbbra is a a második szkript ' csak a kimenő privát címet jelenti.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük