Modifié ( 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 fichier pure bash script (non basée sur 127.0.0.1
) pour trouver l'interface correcte et ip, sur la base de default route
. Je poste ce script tout en bas de cette réponse.
Intro
Comme les deux Os ont bash installé par défaut, il existe une astuce bash pour Mac et Linux :
Le problème de la locale est évité 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
En mettant ça 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)
}
Utilisation simple :
getMyIP
192.168.1.37
Rangement de fantaisie :
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} $1 "%s${_nl:0:$[${#1}>0?0:1]}" $_myip
}
Utilisation :
getMyIP
192.168.1.37
ou, exécuter la même fonction, mais avec un argument :
getMyIP varHostIP
echo $varHostIP
192.168.1.37
set | grep ^varHostIP
varHostIP=192.168.1.37
Nota : Sans argument, cette fonction émet en sortie sur STDOUT, l'IP et un nouvelle ligne avec un argument, rien n'est imprimé, mais une variable nommée en tant qu'argument est créée et contient l'IP sans le nom de la variable. nouvelle ligne .
Nota2 : Ceci a été testé sur Debian, LaCie hacked nas et MaxOs. Si cela ne fonctionne pas sous votre environnement, je serai très intéressé par les retours d'expérience !
Ancienne version de cette réponse
( Non supprimé car basé sur sed
pas bash
. )
Warn : Il y a un problème avec les locales !
Rapide et petit :
myIP=$(ip a s|sed -ne '/127.0.0.1/!{s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p}')
Explosé (le travail aussi ;)
myIP=$(
ip a s |
sed -ne '
/127.0.0.1/!{
s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p
}
'
)
Edit :
Comment ! Cela ne semble pas fonctionner sur Mac OS ...
Ok, cela semble fonctionner de la même manière sur Mac OS comme 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; }')
divisé :
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 pour lequel il est utilisé, puis rechercher l'ip local correspondant au réseau de passerelle et de remplir les variables. Les deux dernières lignes ne font qu'imprimer, 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, voilà :
#!/bin/bash
runOnMac=false
int2ip() { printf ${2+-v} $2 "%d.%d.%d.%d" \
$(($1>>24)) $(($1>>16&255)) $(($1>>8&255)) $(($1&255)) ;}
ip2int() { local _a=(${1//./ }) ; printf ${2+-v} $2 "%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
2 votes
Voulez-vous seulement l'adresse IP du réseau local de votre machine ? par exemple 192.168.0.12.
0 votes
Oui, l'IP locale, la première d'entre elles car elle peut en avoir plusieurs, mais je pourrais vivre même avec une liste. Pour le moment, je suis content de ne supporter que les adresses IPv4 et d'ignorer l'IPv6, car je ne veux que générer un hash.
2 votes
Comment définissez-vous le terme "primaire" ? Si vous pensez à "l'adresse IP qui est sur le même sous-réseau que ma route par défaut", vous devrez programmer un peu pour cela. Mais que se passe-t-il si la machine n'a pas de route par défaut, mais a quand même >1 adresses IP ?
10 votes
Essayez
curl -4 ifconfig.co
. Il répondra avec votre adresse IP4 externe.0 votes
En quoi est-ce un hors-sujet ?
0 votes
J'ai juste utilisé
curl ifconfig.me
et ça a bien marché.