Comment obtenir L'adresse IP principale de la machine locale sous Linux et OS X?
je suis à la recherche d'une solution en ligne de commande qui me rendrait l'adresse IP primaire (première) du localhost, autre que 127.0.0.1
la solution devrait fonctionner au moins pour Linux (Debian et RedHat) et OS X 10.7 +
je suis conscient que ifconfig
est disponible sur les deux, mais sa sortie n'est pas si cohérente entre ces plates-formes.
30 réponses
utiliser grep
pour filtrer l'adresse IP de ifconfig
:
ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'
ou avec sed
:
ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*//p'
si vous êtes seulement intéressé par certaines interfaces, wlan0, eth0, etc. puis:
ifconfig wlan0 | ...
vous pouvez alias la commande dans votre .bashrc
à créer votre propre commande appelée myip
par exemple.
alias myip="ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*//p'"
une façon beaucoup plus simple est hostname -I
( hostname -i
pour les anciennes versions de hostname
mais voir les commentaires). Cependant, c'est que sous Linux.
ce qui suit fonctionnera sur Linux mais pas sur OSX.
cela ne dépend pas du tout du DNS, et cela fonctionne même si /etc/hosts
n'est pas défini correctement ( 1
est raccourci pour 1.0.0.0
):
ip route get 1 | awk '{print $NF;exit}'
ou en évitant awk
et en utilisant le DNS public de Google à 8.8.8.8
pour évidence:
ip route get 8.8.8.8 | head -1 | cut -d' ' -f8
une manière moins fiable: (voir commentaire ci-dessous)
hostname -I | cut -d' ' -f1
édité ( 2014-06-01 2018-01-09)
pour une configuration plus forte, avec de nombreuses interfaces et de nombreuses IP configurées sur chaque interface, j'ai écrit un script pure bash (non basé sur 127.0.0.1
) pour trouver l'interface correcte et ip, basé sur default route
. Je poste ce script au fond de cette réponse.
Intro
comme les deux Os ont bash installé par défaut, il y a une astuce bash pour Mac et Linux:
la question locale est empêchée par l'utilisation de LANG=C
:
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< <(LANG=C /sbin/ifconfig)
echo $myip
Mettre cela dans une fonction:
Minimal:
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< <(LANG=C /sbin/ifconfig)
}
usage Simple:
getMyIP
192.168.1.37
Fantaisie bien rangé:
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< <(LANG=C /sbin/ifconfig)
printf ${1+-v} "%s${_nl:0:$[${#1}>0?0:1]}" $_myip
}
Utilisation:
getMyIP
192.168.1.37
or, exécutant la même fonction, mais avec un argument:
getMyIP varHostIP
echo $varHostIP
192.168.1.37
set | grep ^varHostIP
varHostIP=192.168.1.37
Note: sans argument, cette sortie de fonction sur STDOUT, L'IP et un newline , avec un argument, rien n'est imprimé, mais une variable nommée comme argument est créé et contiennent IP sans newline .
Nota2: Cela a été testé sur Debian, LaCie a piraté nas et MaxOs. Si cela ne fonctionne pas sous votre environnement, je serai très intéressé par des feed-back!
version plus ancienne de cette réponse
(Non supprimé car fondé sur sed
, et non sur bash
. )
Avertir: Il y a un problème sur les locales!
rapide et petit:
myIP=$(ip a s|sed -ne '/127.0.0.1/!{s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$//p}')
Explosé (trop de travail;)
myIP=$(
ip a s |
sed -ne '
/127.0.0.1/!{
s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$//p
}
'
)
Edit:
comment! Cela ne semble pas fonctionner sur Mac OS ...
Ok, cela semble fonctionner tout à fait pareil sur Mac OS que sur mon Linux :
myIP=$(LANG=C /sbin/ifconfig | sed -ne $'/127.0.0.1/ ! { s/^[ \t]*inet[ \t]\{1,99\}\(addr:\)\{0,1\}\([0-9.]*\)[ \t\/].*$/\2/p; }')
coupée en deux:
myIP=$(
LANG=C /sbin/ifconfig |
sed -ne $'/127.0.0.1/ ! {
s/^[ \t]*inet[ \t]\{1,99\}\(addr:\)\{0,1\}\([0-9.]*\)[ \t\/].*$/\2/p;
}')
mon script (jan 2018):
Ce script va d'abord trouver votre route par défaut et interface utilisé pour, puis la recherche pour le réseau local de correspondance ip de passerelle et peupler les variables. Les deux dernières lignes sont imprimées, quelque chose comme:
Interface : en0
Local Ip : 10.2.5.3
Gateway : 10.2.4.204
Net mask : 255.255.252.0
Run on mac : true
ou
Interface : eth2
Local Ip : 192.168.1.31
Gateway : 192.168.1.1
Net mask : 255.255.255.0
Run on mac : false
Eh bien, il est là:
#!/bin/bash
runOnMac=false
int2ip() { printf ${2+-v} "%d.%d.%d.%d" \
$((>>24)) $((>>16&255)) $((>>8&255)) $((&255)) ;}
ip2int() { local _a=(${1//./ }) ; printf ${2+-v} "%u" $(( _a<<24 |
${_a[1]} << 16 | ${_a[2]} << 8 | ${_a[3]} )) ;}
while IFS=$' :\t\r\n' read a b c d; do
[ "$a" = "usage" ] && [ "$b" = "route" ] && runOnMac=true
if $runOnMac ;then
case $a in
gateway ) gWay=$b ;;
interface ) iFace=$b ;;
esac
else
[ "$a" = "0.0.0.0" ] && [ "$c" = "$a" ] && iFace=${d##* } gWay=$b
fi
done < <(/sbin/route -n 2>&1 || /sbin/route -n get 0.0.0.0/0)
ip2int $gWay gw
while read lhs rhs; do
[ "$lhs" ] && {
[ -z "${lhs#*:}" ] && iface=${lhs%:}
[ "$lhs" = "inet" ] && [ "$iface" = "$iFace" ] && {
mask=${rhs#*netmask }
mask=${mask%% *}
[ "$mask" ] && [ -z "${mask%0x*}" ] &&
printf -v mask %u $mask ||
ip2int $mask mask
ip2int ${rhs%% *} ip
(( ( ip & mask ) == ( gw & mask ) )) &&
int2ip $ip myIp && int2ip $mask netMask
}
}
done < <(/sbin/ifconfig)
printf "%-12s: %s\n" Interface $iFace Local\ Ip $myIp \
Gateway $gWay Net\ mask $netMask Run\ on\ mac $runOnMac
vous pouvez également essayer ceci, bien qu'il puisse vous dire 127.0.0.1
:
hostname -i
ou
hostname -I
vous pouvez également obtenir l'adresse IP version 4 de eth0 en utilisant cette commande sous linux
/sbin/ip -4 -o addr show dev eth0| awk '{split(,a,"/");print a[1]}'
sortie sera comme ceci
[root@localhost Sathish]# /sbin/ip -4 -o addr show dev eth0| awk '{split(,a,"/");print a[1]}'
192.168.1.22
sur linux
hostname -I
on macOS
ipconfig getifaddr en0
notez que hostname -I
peut retourner plusieurs adresses dans un ordre non fiable (voir man hostname
). Mais pour moi, il retourne juste 192.168.1.X
qui est ce que vous vouliez.
Solution
$ ip -o route get to 8.8.8.8 | sed -n 's/.*src \([0-9.]\+\).*//p'
192.168.8.16
explication
Le correct façon d'interroger les informations sur le réseau à l'aide de ip
:
-
-o
une ligne de sortie -
route get to
obtenir le véritable noyau de l'itinéraire jusqu'à une destination -
8.8.8.8
Google IP, mais peut utiliser la véritable IP que vous voulez atteindre
p.ex. ip
sortie:
8.8.8.8 via 192.168.8.254 dev enp0s25 src 192.168.8.16 uid 1000 \ cache
pour extraire le src
ip, sed
est le plus ligthest et le plus compatible avec le support regex:
-
-n
aucune sortie par défaut -
's/pattern/replacement/p'
correspond au motif et d'impression de remplacement seulement -
.*src \([0-9.]\+\).*
correspondent à l'IP src utilisée par le noyau, pour atteindre8.8.8.8
par exemple production finale:
192.168.8.16
autres réponses
je pense qu'aucune des réponses précédentes n'est assez bonne pour moi, car elles ne fonctionnent pas dans une machine récente (gentoo 2018).
les Questions que j'ai trouvé avec les réponses précédentes:
- utilisation de la colonne de position dans la sortie de commande;
- utilisation de
ifconfig
qui est dépréciée et -- par exemple -- ne pas énumérer les IPs multiples; - utilisation de
awk
pour une tâche simple que sed peut mieux gérer; -
ip route get 1
n'est pas clair, et est en fait un alias pourip route get to 1.0.0.0
- l'utilisation de "1519180920 de la commande", qui n'ont pas de
-I
option dans tous les appareil et qui retournent127.0.0.1
dans mon cas.
cela fonctionne sur Linux et OSX
cela va obtenir l'interface associée à la route par défaut
NET_IF=`netstat -rn | awk '/^0.0.0.0/ {thif=substr("151900920",74,10); print thif;} /^default.*UG/ {thif=substr("151900920",65,10); print thif;}'`
utilisez l'interface découverte ci-dessus pour obtenir l'adresse ip.
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
Darwin laptop 14.4.0 Darwin Kernel Version 14.4.0: Thu May 28 11: 35:04 PDT 2015; root: 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 Sep 3 04:03: 03 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
echo $NET_IF
eth0
echo $NET_IP
192.168.46.10
en utilisant certaines des autres méthodes, vous pouvez entrer un conflit où plusieurs adresses IP sont définies sur le système. Cette ligne obtient toujours l'adresse IP par défaut utilisé.
ip route get 8.8.8.8 | head -1 | awk '{print }'
interface réseau primaire IP
ifconfig `ip route | grep default | head -1 | sed 's/\(.*dev \)\([a-z0-9]*\)\(.*\)//g'` | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | head -1
le moyen le plus court pour obtenir votre adresse ipv4 locale sur votre système linux:
hostname -I | awk '{print }'
je dois ajouter à Collin Andersons réponse que cette méthode prend également en compte si vous avez deux interfaces et ils sont tous les deux en cours d'affichage.
ip route get 1 | awk '{print $NF;exit}'
j'ai travaillé sur une application avec Raspberry Pi et j'avais besoin de l'adresse IP qui était réellement utilisée, et pas seulement si elle était activée ou non. La plupart des autres réponses retourneront les deux adresses IP ce qui n'est pas nécessairement utile - pour mon scénario de toute façon.
pas sûr que cela fonctionne dans tous les os, essayer.
ifconfig | awk -F"[ :]+" '/inet addr/ && !/127.0/ {print }'
ip addr show | grep -E '^\s*inet' | grep -m1 global | awk '{ print }' | sed 's|/.*||'
l'Autre ifconfig
variantion qui fonctionne à la fois sur Linux et OSX:
ifconfig | grep "inet " | cut -f2 -d' '
j'ai traversé beaucoup de liens (StackExchange, AskUbuntu, StackOverflow etc) et j'ai pris la décision de combiner toutes les meilleures solutions en un seul script shell.
à mon avis, ces deux QAs sont les plus visibles:
Comment puis-je obtenir mon adresse IP externe dans un script shell? https://unix.stackexchange.com/q/22615
Comment trouver mon adresse ip interne? https://askubuntu.com/a/604691
voici ma solution basée sur quelques idées de RSP partagées dans son dépôt ( https://github.com/rsp/scripts / ).
Certains d'entre vous pourraient dire que ce script est très important pour donc une tâche simple mais j'aimerais le rendre facile et flexible dans l'utilisation autant que possible. Il prend en charge le fichier de configuration simple permettant de redéfinir les valeurs par défaut.
il était testé avec succès sous Cygwin, MINGW et Linux (Red Hat).
afficher l'adresse IP interne
myip -i
afficher l'adresse IP externe
myip -e
code Source, également disponible par le lien: https://github.com/ildar-shaimordanov/tea-set/blob/master/home/bin/myip . Exemple de fichier de configuration est là, à côté du script principal.
#!/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 ""151920920"" )/myip.conf" \
~/.myip.conf \
/etc/myip.conf
do
[ -f "$f" ] && {
. "$f"
break
}
done
# =========================================================================
show_usage() {
cat - <<HELP
USAGE
$( basename ""151920920"" ) [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 ""151920920"" ): $@" >&2
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's 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>&1
then
IPCMD="curl -s"
elif which wget >/dev/null 2>&1
then
IPCMD="wget -qO -"
else
die "Neither curl nor wget installed"
fi
}
# =========================================================================
resolveip() {
{
gethostip -d "" && return
getent ahostsv4 "" \
| grep RAW \
| awk '{ print ; 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 }'
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
je viens d'utiliser noms D'Interface réseau , ma commande personnalisée est
[[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@@p'
dans mon propre carnet
[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.*@@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@@p'
192.168.2.221
[flying@lempstacker ~]$
mais si l'interface réseau possède au moins une ip, alors elle affichera toutes les ip qui lui appartiennent
par exemple
Ubuntu 16.10
root@yakkety:~# sed -r -n 's@"@@g;s@^VERSION=(.*)@@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.*@@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@@p'
178.62.236.250
root@yakkety:~#
Debian Jessie
root@jessie:~# sed -r -n 's@"@@g;s@^PRETTY_NAME=(.*)@@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.*@@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@@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.*@@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@@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.*@@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@@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 ~]#
il semble que la commande ip route get 1 | awk '{print $NF;exit}'
fournie par link soit plus précise, plus courte.
si vous avez besoin de votre primaire public IP comme le reste du monde, essayez l'une de celles-ci:
wget http://ipecho.net/plain -O - -q
curl http://icanhazip.com
curl http://ifconfig.me/ip
il y a un paquet de noeuds pour tout. Exagéré? Probablement. Facile à utiliser et se souvenir? Vous pariez.
$ npm install --global internal-ip-cli
$ internal-ip
fe80::1
$ internal-ip --ipv4
192.168.0.3
im extraire mon commentaire à cette réponse:
ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$//p'
il se base sur la réponse de @CollinAnderson qui n'a pas fonctionné dans mon cas.
ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print }'
si vous connaissez l'interface réseau (eth0, wlan, tun0 etc):
ifconfig eth0 | grep addr: | awk '{ print }' | cut -d: -f2
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
ifconfig $(netstat -rn | grep -E "^default|^0.0.0.0" | head -1 | awk '{print $NF}') | grep 'inet ' | awk '{print }' | grep -Eo '([0-9]*\.){3}[0-9]*'
fonctionne sur Mac, Linux et à l'intérieur des conteneurs Docker:
$ hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*//p' | awk '{print
$1; exit}')
fonctionne aussi sur Makefile
comme:
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]*).*//p' | awk '{print ; exit}')}
pour linux, vous avez besoin de cette commande:
ifconfig |sed -n 2p|awk '{ print }'|awk -F : '{ print }'
tapez ceci dans votre shell et vous connaîtrez simplement votre ip.
C'est plus facile à lire:
ifconfig | grep 'inet addr:' |/usr/bin/awk '{print }' | tr -d addr:
si vous avez npm
et node
installés : npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"
sur un Mac, considérez ce qui suit:
scutil --nwi | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'