Bearbeitet ( 2014-06-01 2018-01-09)
Für eine stärkere Konfiguration mit vielen Schnittstellen und vielen IP-Adressen, die auf jeder Schnittstelle konfiguriert sind, habe ich ein reines Bash- Skript (nicht basierend auf 127.0.0.1
) geschrieben, um die richtige Schnittstelle und IP basierend auf zu finden default route
. Ich poste dieses Skript ganz unten in dieser Antwort.
Intro
Wie beide Os haben Bash Standardmäßig installiert, gibt es einen Bash-Tipp für Mac und Linux:
Das Problem mit dem Gebietsschema wird durch Folgendes verhindert 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
Dies in eine Funktion umsetzen:
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)
}
Einfache Verwendung:
getMyIP
192.168.1.37
Lust auf Ordnung:
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
}
Verwendungszweck:
getMyIP
192.168.1.37
oder mit derselben Funktion, jedoch mit einem Argument:
getMyIP varHostIP
echo $varHostIP
192.168.1.37
set | grep ^varHostIP
varHostIP=192.168.1.37
Anmerkung: Ohne Argument wird diese Funktion auf STDOUT, der IP und einer Newline ausgegeben , mit einem Argument wird nichts gedruckt, aber eine als Argument bezeichnete Variable wird erstellt und enthält IP ohne Newline .
Nota2: Dies wurde auf Debian getestet, LaCie hackte nas und MaxOs. Wenn dies unter Ihrer Umgebung nicht funktioniert, bin ich sehr an Rückmeldungen interessiert!
Ältere Version dieser Antwort
(Nicht gelöscht, weil basierend auf sed
, nicht bash
.)
Warnung: Es gibt ein Problem mit Gebietsschemas!
Schnell und klein:
myIP=$(ip a s|sed -ne '/127.0.0.1/!{s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p}')
Explodiert (Arbeit auch;)
myIP=$(
ip a s |
sed -ne '
/127.0.0.1/!{
s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p
}
'
)
Bearbeiten:
Wie! Dies scheint unter Mac OS nicht zu funktionieren ...
Ok, dies scheint unter Mac OS genauso zu funktionieren wie unter 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; }')
aufgeteilt:
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;
}')
Mein Drehbuch (Januar 2018):
Dieses Skript findet zuerst Ihre Standardroute und -schnittstelle , für die es verwendet wird, und sucht dann nach dem lokalen IP-passenden Netzwerk des Gateways und füllt Variablen. Die letzten beiden Zeilen werden nur gedruckt, so etwas wie:
Interface : en0
Local Ip : 10.2.5.3
Gateway : 10.2.4.204
Net mask : 255.255.252.0
Run on mac : true
oder
Interface : eth2
Local Ip : 192.168.1.31
Gateway : 192.168.1.1
Net mask : 255.255.255.0
Run on mac : false
Nun, da ist es:
#!/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