संपादित ( 2014-06-01 2018-01-09)
मजबूत इंटरफेस के लिए, कई इंटरफेस के साथ और प्रत्येक इंटरफेस पर कई आईपी कॉन्फ़िगर किए गए, मैंने सही इंटरफ़ेस और आईपी खोजने के लिए एक शुद्ध बैश स्क्रिप्ट (आधारित नहीं 127.0.0.1
) लिखा , जिसके आधार पर । मैं इस जवाब के बहुत नीचे इस स्क्रिप्ट को पोस्ट करता हूं।default route
पहचान
जैसा कि दोनों के पास है दे घुमा के डिफ़ॉल्ट रूप से स्थापित, मैक और लिनक्स दोनों के लिए एक बैश टिप है:
स्थानीय मुद्दे को इसके उपयोग से रोका जाता है 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
इसे एक समारोह में लाना:
कम से कम:
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)
}
सरल उपयोग:
getMyIP
192.168.1.37
फैंसी साफ:
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
}
उपयोग:
getMyIP
192.168.1.37
या, एक ही कार्य चल रहा है, लेकिन एक तर्क के साथ:
getMyIP varHostIP
echo $varHostIP
192.168.1.37
set | grep ^varHostIP
varHostIP=192.168.1.37
नोट: बिना तर्क के, यह फ़ंक्शन आउटपुट STDOUT, IP और एक नई लाइन पर , एक तर्क के साथ, कुछ भी नहीं मुद्रित होता है, लेकिन तर्क के रूप में नामित एक चर बनाया जाता है और इसमें बिना newline के IP होता है ।
नोट 2: इसका परीक्षण डेबियन, लाची हैक एनएएस और मैक्सओ पर किया गया था। अगर यह आपके एनकाउंटर के तहत काम नहीं करेगा, तो मुझे फीड-बैक से बहुत दिलचस्पी होगी!
इस उत्तर का पुराना संस्करण
(नहीं के आधार पर हटाया गया sed
, नहीं bash
।)
चेतावनी: स्थानों के बारे में एक मुद्दा है!
त्वरित और छोटा:
myIP=$(ip a s|sed -ne '/127.0.0.1/!{s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p}')
विस्फोट (काम भी)
myIP=$(
ip a s |
sed -ne '
/127.0.0.1/!{
s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p
}
'
)
संपादित करें:
किस तरह! मैक ओएस पर यह काम नहीं लगता ...
ठीक है, यह मेरे लिनक्स पर मैक ओएस पर काफी समान काम करता है :
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; }')
splitted:
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;
}')
मेरी स्क्रिप्ट (जान २०१8):
यह स्क्रिप्ट पहले आपके डिफ़ॉल्ट मार्ग और इंटरफ़ेस का उपयोग करेगी , फिर गेटवे के स्थानीय आईपी मिलान नेटवर्क की खोज करें और चरों को आबाद करें। अंतिम दो पंक्तियाँ सिर्फ प्रिंट करती हैं, कुछ इस तरह:
Interface : en0
Local Ip : 10.2.5.3
Gateway : 10.2.4.204
Net mask : 255.255.252.0
Run on mac : true
या
Interface : eth2
Local Ip : 192.168.1.31
Gateway : 192.168.1.1
Net mask : 255.255.255.0
Run on mac : false
खैर, वहाँ यह है:
#!/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