Kaip gauti pagrindinio vietinio kompiuterio IP adresą „Linux“ ir „OS X“?

Aš ieškau komandų eilutės sprendimo, kuris grąžins man pirminį (pirmąjį) vietinio kompiuterio IP adresą, išskyrus 127.0.0.1

Sprendimas turėtų veikti bent Linux (Debian ir RedHat) ir OS X 10.7 +

Žinau, kad ifconfig yra prieinama abiejuose, bet jų išvestis nėra tokia nuosekli tarp šių platformų.

173
10 нояб. nustatyti sorino lapkritis 10 2012-11-10 16:32 '12 16:32 2012-11-10 16:32
@ 25 atsakymai

Naudokite grep filtruoti IP adresus iš ifconfig :

ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'

Arba naudojant „ sed :

ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'

Jei jus domina tik tam tikros sąsajos, wlan0, eth0 ir tt, tada:

ifconfig wlan0 | ...

Jūs galite atlikti komandą .bashrc kad sukurtumėte savo komandą, pavadintą „ myip .

alias myip="ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'"

Daug lengviau naudoti hostname -I . Tačiau tai yra tik „Linux“.

293
10 нояб. Chris Seymour atsakymas lapkričio 10 d 2012-11-10 16:39 '12 at 4:39 pm 2012-11-10 16:39

Linux įrenginiams (ne OS X):

border=0
 hostname --ip-address 
128
20 сент. atsakymas, kurį pateikė ACyclic Sep 20 2013-09-20 00:58 '13 prie 0:58 2013-09-20 00:58

Jis yra visiškai nepriklausomas nuo DNS ir veikia net jei /etc/hosts nėra teisingai nustatyti ( 1 trumpas 1.0.0.0 ):

 ip route get 1 | awk '{print $NF;exit}' 

arba vengiant awk ir naudojant „Google“ viešąjį DNS 8.8.8.8

 ip route get 8.8.8.8 | head -1 | cut -d' ' -f8 

Mažiau patikimas būdas: (žr. Komentarą toliau)

 hostname -I | cut -d' ' -f1 
100
15 сент. atsakymą įteikė Collin Anderson 15 sep. 2014-09-15 18:08 '14, 18:08 2014-09-15 18:08

Redaguota (2014-06-01)

Kadangi abu „Os“ yra pagal nutylėjimą „Mac“ ir „Linux“ yra bazinis raginimas:

Su lokalės problema neleidžiama naudojant > :

 myip= while IFS=$': \t' read -a line ;do [ -z "${line%inet}" ]  ip=${line[${#line[1]}>4?1:2]}  [ "${ip#127.0.0.1}" ]  myip=$ip done< <(> 

Įskaitant šią funkciją:

Minimalus:

 getMyIP() { local _ip _line while IFS=$': \t' read -a _line ;do [ -z "${_line%inet}" ]  _ip=${_line[${#_line[1]}>4?1:2]}  [ "${_ip#127.0.0.1}" ]  echo $_ip  return 0 done< <(> 

Paprastas naudojimas:

 getMyIP 192.168.1.37 

Freakish order:

 getMyIP() { local _ip _myip _line _nl=$'\n' while IFS=$': \t' read -a _line ;do [ -z "${_line%inet}" ]  _ip=${_line[${#_line[1]}>4?1:2]}  [ "${_ip#127.0.0.1}" ]  _myip=$_ip done< <(> 

Naudoti:

 getMyIP 192.168.1.37 

arba, naudojant tą pačią funkciją, bet su argumentu:

 getMyIP varHostIP echo $varHostIP 192.168.1.37 set | grep ^varHostIP varHostIP=192.168.1.37 

Nota: Be argumento, ši funkcija yra perduodama į STDOUT, IP ir naują eilutę su argumentu, nieko spausdinama, bet kintamasis sukuriamas su pavadinimu kaip argumentas ir jame yra IP be naujos eilutės.

Nota2: jis buvo išbandytas „Debian“, „LaCie“, „nulaužti“ ir „MaxO“. Jei tai neveiks jūsų aplinkoje, atgalinės nuorodos man bus labai įdomios!

Sena šio atsakymo versija

Įspėjimas: problema kyla dėl vietos!

Greitas ir mažas:

 myIP=$(ip as|sed -ne '/127.0.0.1/!{s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p}') 

Įkvėptas (darbas taip pat;)

 myIP=$( ip as | sed -ne ' /127.0.0.1/!{ s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p } ' ) 

Redaguoti:

Kaip! Atrodo, kad „Mac OS“ neveikia ...

Na, tai, atrodo, veikia „Mac OS“ kaip ir mano „Linux“:

 myIP=$(> 

skyla:

 myIP=$( > 
23
10 нояб. atsakymas pateikiamas F. Hauri 10 lapkričio. 2012-11-10 16:57 '12 16:57 2012-11-10 16:57

Taip pat galite tai išbandyti, nors jis gali tiesiog pasakyti jums 127.0.0.1 :

 hostname -i 

arba

 hostname -I 
20
08 янв. Atsakymą pateikė user3173508 Jan 08 2014-01-08 16:45 '14, 16:45, 2014-01-08 16:45

Taip pat galite gauti 4 et0 versijos IP adresą naudodami šią komandą linux

 /sbin/ip -4 -o addr show dev eth0| awk '{split($4,a,"/");print a[1]}' 

Rezultatas bus:

 [root@localhost Sathish]# /sbin/ip -4 -o addr show dev eth0| awk '{split($4,a,"/");print a[1]}' 192.168.1.22 
14
25 марта '14 в 14:12 2014-03-25 14:12 atsakymą pateikė Sathish, kovo 25 d., 14 val. 14:12 2014-03-25 14:12

Jis veikia Linux ir OSX.

Tai suteiks sąsają, susijusią su numatytuoju maršrutu.

 NET_IF=`netstat -rn | awk '/^0.0.0.0/ {thif=substr($0,74,10); print thif;} /^default.*UG/ {thif=substr($0,65,10); print thif;}'` 

Naudodami aukščiau nurodytą sąsają, gaukite IP adresą.

 NET_IP=`ifconfig ${NET_IF} | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'` 

Osx

 uname -a 

Darvino nešiojamas 14.4.0 Darvino branduolys Versija 14.4.0: gegužės 28 d. 11:35:04 PDT 2015; šaknis: xnu-2782.30.5 ~ 1 / RELEASE_X86_64 x86_64

 echo $NET_IF 

en5

 echo $NET_IP 

192.168.0.130

„CentOS Linux“

 uname -a 

Linux dev-cil.medfx.local 2.6.18-164.el5xen 1 SMP Thu 3 rugsėjis 04:03:03 EDT 2009 x86_64 x86_64 x86_64 GNU / Linux

 echo $NET_IF 

eth0

 echo $NET_IP 

192.168.46.10

7
05 нояб. atsakymą pateikė Colin Fletcher 05 lapkričio. 2015-11-05 19:54 '15, 19:54, 2015-11-05 19:54

Linux

 hostname -I 

apie MacOS

 ipconfig getifaddr en0 

Atkreipkite dėmesį, kad hostname -I gali grąžinti kelis adresus nepatikima tvarka (žr. man hostname ). Bet man tai tiesiog grąžina 192.168.1.X ką norėjote.

3
04 окт. atsakymą pateikė boris . 2017-10-04 15:40 '17 at 15:40 2017-10-04 15:40

Naudokite kitus metodus. Galite įvesti konfliktą, kuriame sistemoje yra apibrėžti keli IP adresai. Ši eilutė visada gauna numatytąjį IP adresą.

ip maršrutas gauna 8.8.8.8 | galva -1 | awk '{print $ 7}'

3
03 марта '17 в 15:58 2017-03-03 15:58 Atsakymą pateikė Kjeldas Flarupas kovo 03 d. 17, 15:58 2017-03-03 15:58

Pirminė IP tinklo sąsaja

 ifconfig `ip route | grep default | head -1 | sed 's/\(.*dev \)\([a-z0-9]*\)\(.*\)/\2/g'` | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | head -1 
3
13 марта '15 в 22:24 2015-03-13 22:24 kaspars atsakymas kovo 13 d. 15, 22:24 2015-03-13 22:24

Darant prielaidą, kad jums reikia pirminio viešojo IP adreso, kurį jis mato iš kitų pasaulio šalių, pabandykite bet kurį iš jų:

 wget http://ipecho.net/plain -O - -q curl http://icanhazip.com curl http://ifconfig.me/ip 
3
11 июля '17 в 9:20 2017-07-11 09:20 atsakymą pateikė Putnik liepos 17 d. 17 val. 9:20 2017-07-11 09:20

Trumpiausias būdas gauti vietinį „ipv4“ adresą „Linux“ sistemoje:

 hostname -I | awk '{print $1}' 
2
05 окт. atsakymas pateikiamas Hario 05 okt. 2014-10-05 09:37 '14 at 9:37 AM 2014-10-05 09:37

Kitas variantas yra ifconfig , kuris veikia tiek „Linux“, tiek „OSX“:

2
19 июля '16 в 17:00 2016-07-19 17:00 atsakymas pateikiamas cppizza liepos 19 d. 16 val. 17:00 2016-07-19 17:00

Nežinote, ar jis veikia visose operacinėse sistemose, pabandykite.

 ifconfig | awk -F"[ :]+" '/inet addr/  !/127.0/ {print $4}' 
2
27 авг. Jotne atsakė 27 rugpjūčio mėn. 2013-08-27 23:59 '13, 23:59 pm 2013-08-27 23:59

Aš tiesiog naudoju tinklo sąsajos vardus , mano vartotojo komandą

 [[ $(ip addr | grep enp0s25) != '' ]]  ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' 

mano nešiojamuoju kompiuteriu

 [flying@lempstacker ~]$ cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [flying@lempstacker ~]$ [[ $(ip addr | grep enp0s25) != '' ]]  ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' 192.168.2.221 [flying@lempstacker ~]$ 

bet jei bent vienas ip priklauso tinklo sąsajai, tai parodys, kad visi IP yra jai priklausantys

Pavyzdžiui

Ubuntu 16.10

 root@yakkety:~# sed -r -n 's@"@@g;s@^VERSION=(.*)@\1@p' /etc/os-release 16.04.1 LTS (Xenial Xerus) root@yakkety:~# [[ $(ip addr | grep enp0s25) != '' ]]  ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' 178.62.236.250 root@yakkety:~# 

Debian jessie

 root@jessie:~# sed -r -n 's@"@@g;s@^PRETTY_NAME=(.*)@\1@p' /etc/os-release Debian GNU/Linux 8 (jessie) root@jessie:~# [[ $(ip addr | grep enp0s25) != '' ]]  ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' 192.81.222.54 root@jessie:~# 

CentOS 6.8

 [root@centos68 ~]# cat /etc/redhat-release CentOS release 6.8 (Final) [root@centos68 ~]# [[ $(ip addr | grep enp0s25) != '' ]]  ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' 162.243.17.224 10.13.0.5 [root@centos68 ~]# ip route get 1 | awk '{print $NF;exit}' 162.243.17.224 [root@centos68 ~]# 

Fedora 24

 [root@fedora24 ~]# cat /etc/redhat-release Fedora release 24 (Twenty Four) [root@fedora24 ~]# [[ $(ip addr | grep enp0s25) != '' ]]  ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' 104.131.54.185 10.17.0.5 [root@fedora24 ~]# ip route get 1 | awk '{print $NF;exit}' 104.131.54.185 [root@fedora24 ~]# 

Atrodo, kad ip route get 1 | awk '{print $NF;exit}' ip route get 1 | awk '{print $NF;exit}' , kurią teikia nuoroda, yra tikslesnė, o tai dar trumpesnė.

2
11 нояб. atsakymas pateiktas gorgon 11 nov. 2016-11-11 06:24 '16 at 6:24 am 2016-11-11 06:24
 ip addr show | grep -E '^\s*inet' | grep -m1 global | awk '{ print $2 }' | sed 's|/.*||' 
2
13 февр. atsakymą rbolante pateikė vasario 13 d. 2014-02-13 07:08 '14, 7:08, 2014-02-13 07:08

Nuvažiavau daugybę nuorodų („StackExchange“, „AskUbuntu“, „StackOverflow“ ir tt) ir priėjau sprendimą sujungti visus geriausius sprendimus į vieną scenarijų.

Mano nuomone, šie du QA geriausiai matomi:

Kaip gauti išorinį IP adresą scenarijaus apvalkalu? https://unix.stackexchange.com/q/22615

Kaip rasti vidinį IP adresą? https://askubuntu.com/a/604691

Čia pateikiamas mano sprendimas, pagrįstas kai kuriomis savo saugykloje bendrinamomis „rsp“ idėjomis ( https://github.com/rsp/scripts/ ).

Kai kurie iš jūsų gali pasakyti, kad šis scenarijus yra labai didžiulis tokiai paprastai užduočiai, bet norėčiau, kad jis būtų paprastas ir lankstus. Jis palaiko paprastą konfigūracijos failą, leidžiantį ignoruoti numatytas reikšmes.

Jis buvo sėkmingai išbandytas pagal „Cygwin“, „MINGW“ ir „Linux“ („Red Hat“).

Rodyti vidinį IP adresą

 myip -i 

Rodyti išorinį IP adresą

 myip -e 

Pradinis kodas taip pat prieinamas nuorodoje: https://github.com/ildar-shaimordanov/tea-set/blob/master/home/bin/myip . Pavyzdinis konfigūracijos failas yra šalia pagrindinio scenarijaus.

 #!/bin/bash # ========================================================================= # # Getting both internal and external IP addresses used for outgoing # Internet connections. # # Internal IP address is the IP address of your computer network interface # that would be used to connect to Internet. # # External IP address is the IP address that is visible by external # servers that you connect to over Internet. # # Copyright (C) 2016 Ildar Shaimordanov # # ========================================================================= # Details of the actual implementation are based on the following QA: # # How can I get my external IP address in a shell script? # https://unix.stackexchange.com/q/22615 # # How do I find my internal ip address? # https://askubuntu.com/a/604691 # ========================================================================= for f in \ "$( dirname "$0" )/myip.conf" \ ~/.myip.conf \ /etc/myip.conf do [ -f "$f" ]  { . "$f" break } done # ========================================================================= show_usage() { cat - <<HELP USAGE $( basename "$0" ) [OPTIONS] DESCRIPTION Display the internal and external IP addresses OPTIONS -i Display the internal IP address -e Display the external IP address -v Turn on verbosity -h Print this help and exit HELP exit } die() { echo "$( basename "$0" ): $@" > exit 2 } # ========================================================================= show_internal="" show_external="" show_verbose="" while getopts ":ievh" opt do case "$opt" in i ) show_internal=1 ;; e ) show_external=1 ;; v ) show_verbose=1 ;; h ) show_usage ;; \? ) die "Illegal option: $OPTARG" ;; esac done if [ -z "$show_internal" -a -z "$show_external" ] then show_internal=1 show_external=1 fi # ========================================================================= # Use Google public DNS to resolve the internal IP address [ -n "$TARGETADDR" ] || TARGETADDR="8.8.8.8" # Query the specific URL to resolve the external IP address [ -n "$IPURL" ] || IPURL="ipecho.net/plain" # Define explicitly $IPCMD to gather $IPURL using another tool [ -n "$IPCMD" ] || { if which curl >/dev/null 2> then IPCMD="curl -s" elif which wget >/dev/null 2> then IPCMD="wget -qO -" else die "Neither curl nor wget installed" fi } # ========================================================================= resolveip() { { gethostip -d "$1"  return getent ahostsv4 "$1" \ | grep RAW \ | awk '{ print $1; exit }' } 2>/dev/null } internalip() { [ -n "$show_verbose" ]  printf "Internal: " case "$( uname | tr '[:upper:]' '[:lower:]' )" in cygwin* | mingw* | msys* ) netstat -rn \ | grep -w '0.0.0.0' \ | awk '{ print $4 }' return ;; esac local t="$( resolveip "$TARGETADDR" )" [ -n "$t" ] || die "Cannot resolve $TARGETADDR" ip route get "$t" \ | awk '{ print $NF; exit }' } externalip() { [ -n "$show_verbose" ]  printf "External: " eval $IPCMD "$IPURL" $IPOPEN } # ========================================================================= [ -n "$show_internal" ]  internalip [ -n "$show_external" ]  externalip # ========================================================================= # EOF 
1
21 окт. atsakymas pateikiamas jsxt 21 okt. 2016-10-21 21:52 '16 at 21:52 2016-10-21 21:52

Linux jums reikia šios komandos:

 ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }' 

įveskite jį į savo apvalkalą, ir jūs tiesiog žinote savo IP.

0
24 июля '17 в 10:29 2017-07-24 10:29 atsakymas duotas Statham liepos 24 d., 17 val. 10:29 2017-07-24 10:29

Jei turite npm ir įdiegtas node : npm install -g ip node -e "const ip = require('ip'); console.log(ip.address())"

0
26 окт. Atsakymą pateikė Antoine F. 26 spalis. 2017-10-26 13:29 '17 at 13:29 pm 2017-10-26 13:29
 ifconfig $(netstat -rn | grep -E "^default|^0.0.0.0" | head -1 | awk '{print $NF}') | grep 'inet ' | awk '{print $2}' | grep -Eo '([0-9]*\.){3}[0-9]*' 
0
 ifconfig | grep "inet addr:" | grep -v "127.0.0.1" | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1 
0
21 сент. atsakymas pateikiamas vartotojo2802053 21 sep . 2013-09-21 15:32 '13, 15:32 2013-09-21 15:32

Veikia „Mac“, „Linux“ ir „Docker“ konteineriuose:

$ hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print $ hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print $ 1; Quit} ')

Taip pat veikia „ Makefile kaip:

LOCAL_HOST := ${shell hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print $1; exit}')}

0
02 мая '17 в 17:54 2017-05-02 17:54 atsakymą pateikė peleteiro 02 Geg '17, 17:54 2017-05-02 17:54

„Mac“ apsvarstykite šiuos dalykus:

 scutil --nwi | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' 
-1
08 дек. atsakymas pateikiamas cl0kc 08 dec. 2014-12-08 22:17 '14, 10:17 pm 2014-12-08 22:17

Lengviau skaityti: ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr: ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr:

-1
11 сент. Atsakymą pateikė Cory Thorson 11 sep. 2017-09-11 20:20 '17, 20:20 pm 2017-09-11 20:20

Kiti klausimai apie žymes arba Užduoti klausimą