Diedit ( 2014-06-01 2018-01-09)
Untuk konfigurasi yang lebih kuat, dengan banyak antarmuka dan banyak IP yang dikonfigurasi pada masing-masing antarmuka, saya menulis skrip bash murni (tidak didasarkan pada 127.0.0.1
) untuk menemukan antarmuka dan ip yang benar, berdasarkan default route
. Saya memposting skrip ini di bagian paling bawah dari jawaban ini.
Intro
Karena keduanya memiliki pesta terinstal secara default, ada tip bash untuk Mac dan Linux:
Masalah lokal dicegah dengan menggunakan 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
Menempatkan ini dalam suatu fungsi:
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)
}
Penggunaan sederhana:
getMyIP
192.168.1.37
Fancy rapi:
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
}
Pemakaian:
getMyIP
192.168.1.37
atau, menjalankan fungsi yang sama, tetapi dengan argumen:
getMyIP varHostIP
echo $varHostIP
192.168.1.37
set | grep ^varHostIP
varHostIP=192.168.1.37
Catatan: Tanpa argumen, fungsi ini dihasilkan pada STDOUT, IP dan baris baru , dengan argumen, tidak ada yang dicetak, tetapi variabel bernama argumen dibuat dan berisi IP tanpa baris baru .
Nota2: Ini diuji pada Debian, LaCie hacked nas dan MaxOs. Jika ini tidak berhasil di lingkungan Anda, saya akan sangat tertarik dengan umpan balik!
Versi yang lebih lama dari jawaban ini
(Tidak dihapus karena berdasarkan sed
, bukan bash
.)
Peringatkan: Ada masalah tentang lokal!
Cepat dan kecil:
myIP=$(ip a s|sed -ne '/127.0.0.1/!{s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p}')
Meledak (bekerja juga;)
myIP=$(
ip a s |
sed -ne '
/127.0.0.1/!{
s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p
}
'
)
Edit:
Bagaimana! Ini sepertinya tidak berfungsi pada Mac OS ...
Oke, ini sepertinya berfungsi pada Mac OS seperti pada Linux saya :
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; }')
terpecah:
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;
}')
Skrip saya (Januari 2018):
Skrip ini pertama-tama akan menemukan rute default dan antarmuka yang Anda gunakan, kemudian mencari jaringan pencocokan ip lokal dari gateway dan mengisi variabel. Dua baris terakhir hanya mencetak, seperti:
Interface : en0
Local Ip : 10.2.5.3
Gateway : 10.2.4.204
Net mask : 255.255.252.0
Run on mac : true
atau
Interface : eth2
Local Ip : 192.168.1.31
Gateway : 192.168.1.1
Net mask : 255.255.255.0
Run on mac : false
Nah, itu dia:
#!/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