लिनक्स और ओएस एक्स पर स्थानीय मशीन का प्राथमिक आईपी पता कैसे प्राप्त करें? [बन्द है]


339

मैं एक कमांड लाइन समाधान की तलाश कर रहा हूं जो मुझे 127.0.0.1 के अलावा लोकलहोस्ट का प्राथमिक (पहला) आईपी पता लौटाएगा

समाधान को कम से कम लिनक्स (डेबियन और रेडहैट) और ओएस एक्स 10.7+ के लिए काम करना चाहिए

मुझे पता है कि ifconfigदोनों पर उपलब्ध है, लेकिन इसका उत्पादन इन प्लेटफार्मों के बीच इतना सुसंगत नहीं है।


2
क्या आप सिर्फ अपनी मशीन स्थानीय नेटवर्क आईपी चाहते हैं? यानी 192.168.0.12
क्रिस सेमोर

हां, स्थानीय आईपी, उनमें से पहले के रूप में यह एक से अधिक हो सकता है, लेकिन मैं एक सूची के साथ भी रह सकता था। फिलहाल मुझे केवल IPv4 पतों का समर्थन करने और IPv6 को नजरअंदाज करने की खुशी है, क्योंकि यह केवल हैश उत्पन्न करना चाहता है।
सोर्विन

2
आप "प्राथमिक" कैसे परिभाषित करते हैं? यदि आप "आईपी पता जो कि मेरे डिफ़ॉल्ट मार्ग के समान सबनेट पर है" सोच रहे हैं, तो आपको उसके लिए थोड़ा प्रोग्राम करना होगा। लेकिन क्या होगा अगर मशीन में कोई डिफ़ॉल्ट मार्ग नहीं है, लेकिन फिर भी> 1 आईपी पते हैं?
घोटी

4
कोशिश करो curl -4 ifconfig.co। यह आपके बाहरी IP4 पते के साथ जवाब देगा।
asmaier

जवाबों:


475

grepसे आईपी पते को फ़िल्टर करने के लिए उपयोग करें ifconfig:

ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'

या साथ sed:

ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'

यदि आप केवल कुछ विशेष इंटरफेस, wlan0, eth0 आदि में रुचि रखते हैं, तो:

ifconfig wlan0 | ...

आप अपने में आदेश उर्फ कर सकते हैं .bashrcकरने के लिए बनाने बुलाया अपने स्वयं के आदेश myipउदाहरण के लिए।

alias myip="ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'"

बहुत सरल तरीका है hostname -I( hostname -iपुराने संस्करणों के लिए, hostnameलेकिन टिप्पणियों को देखें)। हालाँकि, यह केवल लिनक्स पर है।


5
यह भी ध्यान दें कि OSX में, sed -Eविस्तारित RE के लिए विकल्प का उपयोग करता है, GNU- शैली -rविकल्प का नहीं।
19

1
दिलचस्प; मुझे एहसास नहीं हुआ कि GNU sed ने समर्थन किया है -E। FreeBSD के हाल के संस्करणों ने स्क्रिप्ट पोर्टेबिलिटी को कम करने के -rलिए एक उपनाम के रूप में विकल्प को जोड़ा -Eहै, लेकिन अपडेट अभी तक OSX पर नहीं लाया गया है, जिसे मैंने पिछले साल चेक किया था, अभी भी कुछ साल पहले FreeBSD के रिलीज़ से sed के एक संस्करण का उपयोग करता है। निश्चित रूप से निश्चित नहीं कि कौन सा, जैसा कि OSX ने पिछले कुछ वर्षों में FreeBSD स्रोत कोड को अपनाया है। मेरा मानना है कि के उपयोग -Eका इरादा था के बराबर होने के लिए grepके -Eविकल्प। -rइसके बजाय GNU लोगों के लिए चुना क्यों कोई विचार नहीं है ।
20

1
@ghoti मैंने -Eपोर्टेबिलिटी के बारे में सुनिश्चित करने के लिए उपयोग करने के लिए उत्तर बदल दिया , आपको लगता है कि --helpऔर man pagesअपडेट किया जाएगा .. इसने मेरे लिए पहले एक और सवाल का उपयोग करके थोड़ा भ्रम पैदा कर दिया-E
क्रिस सेमोर

1
मुझे एक समस्या मिली, जबकि यह ओएस एक्स पर काम करता है, यह एक से अधिक आईपी, आईपी की सूची लौटाता है। ऐसा लगता है कि पहले वाला सही है लेकिन फिर भी यह मेरे तर्क को तोड़ देगा। Gist.github.com/ssbarnea/31b9dcb0f8fd528b958c देखें - यह उन सक्रिय लोगों को भी लौटाता है जो सक्रिय हैं, लेकिन पराल द्वारा उपयोग किए जाते हैं।
सोरिन

13
OSX: ipconfig getifaddr en0
पारलेर

232

निम्नलिखित लिनक्स पर काम करेगा लेकिन OSX पर नहीं।

यह DNS पर बिल्कुल भी निर्भर नहीं करता है, और यह /etc/hostsसही ढंग से सेट नहीं होने पर भी काम करता है (इसके 1लिए शॉर्टहैंड है 1.0.0.0):

ip route get 1 | awk '{print $NF;exit}'

या स्पष्टता के लिए awkGoogle के सार्वजनिक DNS से बचें और उसका उपयोग करें 8.8.8.8:

ip route get 8.8.8.8 | head -1 | cut -d' ' -f8

एक कम विश्वसनीय तरीका: (नीचे टिप्पणी देखें)

hostname -I | cut -d' ' -f1

8
जिस विधि से पहला पता प्राप्त होता है hostname -Iवह अविश्वसनीय है, क्योंकि (प्रलेखन के अनुसार) कोई भी पते के आदेश के बारे में कोई धारणा नहीं बना सकता है। तो यह अच्छी तरह से कुछ आंतरिक नेटवर्क हो सकता है (जैसे कि वर्चुअल मशीन जिस नेटवर्क पर रह रहे हैं)। दूसरी विधि अच्छी लगती है।
एडम रिक्ज़ोव्स्की

3
यह स्वीकृत उत्तर होना चाहिए क्योंकि RHEL 7 में अब ifconfig शामिल नहीं है।
एंड्रयू

10
मेरे लिए ip route get 1 | awk '{print $(NF-2);exit}'के रूप में मैं प्राप्त uid संलग्न काम करता है outptut लिए
रितिक

13
यह (पहला वाला) केवल एकमात्र समाधान है । यह है महत्वपूर्ण डिफ़ॉल्ट मार्ग के साथ जुड़े इंटरफ़ेस से विशेष रूप से आईपी पढ़ने के लिए। अन्यथा आपको कुछ बेकार आंतरिक पता मिलने की काफी संभावना है।
जान हुदेक

12
यह मेरे लिए काम नहीं किया, लेकिन यह पर्याप्त बंद कर दिया गया था:ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
एस्टानी

230

Linux मशीनों के लिए (OS X नहीं):

hostname --ip-address

10
यह केवल तभी काम करता है जब नाम DNS में हो। यदि नहीं, तो आपको संदेश "होस्टनाम: नाम या सेवा ज्ञात नहीं है" मिलता है।
वेबजर्न लोजोसा

39
hostname -iबराबर छोटा रूप है
पॉल इवांस

75
यह कभी-कभी बस 127.0.0.1 वापस आ जाएगी। यदि उपलब्ध हो, तो बेहतर उपयोग hostname -I को मैनुअल (उबंटू) द्वारा सुझाए गए अनुसार: "--ip- पता होस्ट नाम का नेटवर्क पता (तों) प्रदर्शित करें। ध्यान दें कि यह केवल तभी काम करता है जब होस्ट नाम हल किया जा सकता है। इस विकल्प का उपयोग करें; इसके बजाय hostname --all-ip-address का उपयोग करें। "
ज्यार्तब

1
यह लिनक्स पर काम नहीं करता है, कम से कम hostnameGNU Coreutils संस्करण 8.26 में नहीं।
एके

5
मेरी मशीन पर, hostname -iकेवल स्थानीय आईपी hostname -Iदेता है , जबकि अन्य सभी आईपी देता है
एलेक्सिस पेक्स

62

लिनक्स पर

hostname -I

macOS पर

ipconfig getifaddr en0

hostname -Iएक अविश्वसनीय आदेश (देखें में एक से अधिक पते दिखा सकता है मैनपेज ), लेकिन मुझे यह सिर्फ रिटर्न के लिए , जो आप चाहते थे है।hostname192.168.1.X


1
मेरे लिए यह hostname -iएक कम I.
पॉल Woitaschek

2
@PaWWoitaschek लोअरकेस -iफ़्लैग के लिए मैनपेज यह कहता है Avoid using this option; use hostname -I instead:।
बोरिस


40

समाधान

$ ip -o route get to 8.8.8.8 | sed -n 's/.*src \([0-9.]\+\).*/\1/p'
192.168.8.16

व्याख्या

नेटवर्क जानकारी का उपयोग करने का सही तरीका है ip:

  • -o एक लाइन उत्पादन
  • route get to गंतव्य के लिए वास्तविक कर्नेल मार्ग प्राप्त करें
  • 8.8.8.8 Google IP, लेकिन उस वास्तविक IP का उपयोग कर सकते हैं जिसे आप पहुंचना चाहते हैं

उदा ipआउटपुट:

8.8.8.8 via 192.168.8.254 dev enp0s25 src 192.168.8.16 uid 1000 \   cache

srcआईपी निकालने के लिए , sedरीगेक्स समर्थन के साथ सबसे बड़ा और सबसे अधिक संगत है:

  • -n डिफ़ॉल्ट रूप से कोई आउटपुट नहीं
  • 's/pattern/replacement/p' मैच पैटर्न और प्रिंट प्रतिस्थापन केवल
  • .*src \([0-9.]\+\).* मिलान करने के लिए कर्नेल द्वारा उपयोग किए गए src आईपी से मिलान करें 8.8.8.8

जैसे अंतिम आउटपुट:

192.168.8.16

अन्य उत्तर

मुझे लगता है कि पूर्ववर्ती उत्तर में से कोई भी मेरे लिए पर्याप्त नहीं है, क्योंकि वे हाल की मशीन (Gentoo 2018) में काम नहीं करते हैं।

पूर्ववर्ती उत्तरों के साथ मुझे मिले मुद्दे:

  • कमांड आउटपुट में स्थितीय स्तंभ का उपयोग;
  • ifconfigजिसका उपयोग पदावनत है और - उदाहरण के लिए - मल्टीपल आईपी को सूचीबद्ध न करें;
  • awkएक सरल कार्य के लिए उपयोग जो sed बेहतर संभाल सकता है;
  • ip route get 1 अस्पष्ट है, और वास्तव में इसके लिए एक उपनाम है ip route get to 1.0.0.0
  • hostnameकमांड का उपयोग , जिसके पास -Iसभी उपकरण में विकल्प नहीं है और जो 127.0.0.1मेरे मामले में वापस आती है।

34

संपादित ( 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

1
@ सोरिन: हाँ, यह काम अब ifconfig के साथ। (जैसा sbinकि मेरे $PATHपूर्णपथ पर निर्दिष्ट नहीं है, लेकिन MacOS पर भी यही रास्ता मौजूद है। :-)
F. Hauri

1
@ सोरिन ने timeइसे चुनने की कोशिश की जिसे आप इतने लंबे समय तक इस्तेमाल करेंगे ...
F. Hauri

त्वरित और छोटा समाधान सबसे अच्छा तरीका था। नए समाधान मुझे वाक्यविन्यास त्रुटियाँ देते हैं। संगतता हमेशा एक प्लस है। धन्यवाद।
m3nda

29

उबंटू के केवल कुछ बिल्ड्स के लिए विशिष्ट। हालाँकि यह आपको बता सकता है 127.0.0.1:

hostname  -i

या

hostname -I

क्या यह हर मामले में काम करता है?
अकेलीइनडार्क

6
नहीं। - यह आपको 127.0.0.1 बता सकता है।
स्वेनडॉइडिट

hostname -I ubuntu पर काम करता है।
बोरजेड

1
$ hostname --ip-addressबस मुझे 127.0.0.1आर्क लिनक्स पर देता है
क्रस्टियानलम

1
उपयोग होस्ट नाम मैं या होस्टनाम --all-ip- पते
Aydin लालकृष्ण

24

लिनक्स में इस कमांड का उपयोग करके आप eth0 का IP संस्करण 4 पता भी प्राप्त कर सकते हैं

/sbin/ip -4 -o addr show dev eth0| awk '{split($4,a,"/");print a[1]}'

आउटपुट इस तरह होगा

[root@localhost Sathish]# /sbin/ip -4 -o addr show dev eth0| awk '{split($4,a,"/");print a[1]}'
192.168.1.22

मेरे लिए सबसे अच्छा जवाब! धन्यवाद @ सतीश! ;-)
शमूएल फान

1
मैं सहमत हूं, यह eth0 का IPv4 पाने का सबसे साफ तरीका है।
क्रिस मेंडेज़

यह eth0 को मानता है, जो वर्तमान नामकरण रणनीति नहीं है और कभी भी प्राथमिक इंटरफ़ेस होने की गारंटी नहीं थी।
rfay

यदि आप इंटरफ़ेस जानते हैं तो यह सबसे सुंदर तरीका है। आदर्श यदि आपके सिस्टम में कई इंटरफेस हैं, लेकिन आप सिर्फ एक विशेष में रुचि रखते हैं।
लेप

14

यह लिनक्स और OSX पर काम करता है

यह डिफ़ॉल्ट मार्ग से जुड़ा इंटरफ़ेस प्राप्त करेगा

NET_IF=`netstat -rn | awk '/^0.0.0.0/ {thif=substr($0,74,10); print thif;} /^default.*UG/ {thif=substr($0,65,10); print thif;}'`

ऊपर दिए गए इंटरफ़ेस का उपयोग करके, आईपी पता प्राप्त करें।

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

डार्विन लैपटॉप 14.4.0 डार्विन कर्नेल संस्करण 14.4.0: थू 28 मई 11:35:04 पीडीटी 2015; रूट: xnu-2782.30.5 ~ 1 / RELEASE_X86_64 x86_64

echo $NET_IF

en5

echo $NET_IP

192.168.0.130

CentOS लिनक्स

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


इस प्रश्न के सभी उत्तरों के बावजूद, यह एक ही प्रतीत होता है जो वास्तव में सही होने के करीब आता है। | head -1डिफ़ॉल्ट इंटरफ़ेस प्राप्त करने के लिए बस पहली पंक्ति के अंत में आवश्यकता होती है , और बाकी सब अच्छा है।
एंडरेथ

12

अन्य तरीकों में से कुछ का उपयोग करके आप एक संघर्ष में प्रवेश कर सकते हैं जहां कई आईपी सिस्टम पर परिभाषित किया गया है। यह पंक्ति हमेशा डिफ़ॉल्ट रूप से उपयोग किए गए आईपी पते को प्राप्त करती है।

ip route get 8.8.8.8 | head -1 | awk '{print $7}'

यदि कोई डिफ़ॉल्ट मार्ग (लेकिन अच्छा विचार) नहीं है तो यह विफल हो जाएगा
FractalSpace

अच्छा ... मान लीजिए अगर आपके पास इंटरनेट नहीं है तो भी काम करना है?
बोरिस चुरज़िन

8

Im इस उत्तर के लिए मेरी टिप्पणी निकालने:

ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'

यह @CollinAnderson जवाब पर आधारित है जो मेरे मामले में काम नहीं आया।


8
ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}'

1
यदि आप इसे एक bashउपनाम में बनाना चाहते हैं :alias myip="ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print \$2}'"
सैम ह्यूस्टन

सही। लेकिन सवाल शुरू में कमांड के बारे में था। इसलिए मैंने सिर्फ प्रासंगिक रूप से पोस्ट किया है। चीयर्स!
फैजान नूर

6

अपने लिनक्स सिस्टम पर अपने स्थानीय ipv4- पता प्राप्त करने का सबसे छोटा तरीका:

hostname -I | awk '{print $1}'

5
खराब। मैन पेज आपको विशेष रूप से आउटपुट के क्रम के बारे में कोई धारणा नहीं बनाने के लिए कहता है।
मैट

मेरे तुच्छ उपयोग के मामलों के लिए महान काम करता है - मुझे परवाह नहीं है अगर यह जल्दी और गंदा है! महान!
निकोलाई वीटकेम्पर

6

यह मानते हुए कि आपको अपनी प्राथमिक सार्वजनिक IP की आवश्यकता है जैसा कि बाकी दुनिया से देखा गया है, उनमें से कोई भी प्रयास करें:

wget http://ipecho.net/plain -O - -q
curl http://icanhazip.com
curl http://ifconfig.me/ip

6

मुझे कॉलिन एंडर्सन के जवाब में जोड़ना है कि यह विधि भी ध्यान में रखती है यदि आपके पास दो इंटरफेस हैं और वे दोनों ऊपर दिख रहे हैं।

ip route get 1 | awk '{print $NF;exit}'

मैं रास्पबेरी पाई के साथ एक एप्लिकेशन पर काम कर रहा हूं और आईपी पते की आवश्यकता है जो वास्तव में उपयोग किया जा रहा था, चाहे वह ऊपर था या नहीं। अन्य उत्तरों में से अधिकांश दोनों आईपी पते को वापस कर देंगे जो कि आवश्यक नहीं है - वैसे भी मेरे परिदृश्य के लिए।


5

प्राथमिक नेटवर्क इंटरफ़ेस आईपी

ifconfig `ip route | grep default | head -1 | sed 's/\(.*dev \)\([a-z0-9]*\)\(.*\)/\2/g'` | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | head -1

5

इस कंप्यूटर के एक IP पते को एक नेटवर्क में ढूँढता है जो एक डिफ़ॉल्ट गेटवे है (उदाहरण के लिए सभी वर्चुअल नेटवर्क, docker पुलों को शामिल करता है)। इंटरनेट गेटवे, वाईफाई गेटवे, ईथरनेट

ip route| grep $(ip route |grep default | awk '{ print $5 }') | grep -v "default" | awk '/scope/ { print $9 }'

लिनक्स पर काम करता है।

परीक्षा:

  ~ ip route| grep $(ip route |grep default | awk '{ print $5 }') | grep -v "default" | awk '/scope/ { print $9 }'
192.168.0.114

  reverse-networking git:(feature/type-local)  ifconfig wlp2s0
wlp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.114  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::d3b9:8e6e:caee:444  prefixlen 64  scopeid 0x20<link>
        ether ac:x:y:z  txqueuelen 1000  (Ethernet)
        RX packets 25883684  bytes 27620415278 (25.7 GiB)
        RX errors 0  dropped 27  overruns 0  frame 0
        TX packets 7511319  bytes 1077539831 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

अच्छा! टैको बेल प्रोग्रामिंग यह सबसे अच्छा है - इसके लिए धन्यवाद।
स्टीव हॉवर्ड


3

एक अन्य ifconfigसंस्करण जो लिनक्स और OSX दोनों पर काम करता है:

ifconfig | grep "inet " | cut -f2 -d' '

1
एक छोटी सी भिन्नता:ifconfig | grep '\<inet\>' | cut -d ' ' -f2 | grep -v '127.0.0.1'
jpbochi

इनमें से आधे उत्तर मेरे लिए काम क्यों नहीं करते?
सरप्राइज़डॉग

3

मैं बहुत सारे लिंक (StackExchange, AskUbuntu, StackOverflow आदि) से गुज़रा और एक शेल स्क्रिप्ट में सभी बेहतरीन समाधानों को संयोजित करने के निर्णय पर आया।

मेरी राय में ये दोनों QA सबसे अच्छे हैं:

मुझे शेल स्क्रिप्ट में अपना बाहरी आईपी पता कैसे मिल सकता है? https://unix.stackexchange.com/q/22615

मुझे अपना आंतरिक आईपी पता कैसे मिलेगा? https://askubuntu.com/a/604691

यहाँ मेरा समाधान उनके रिपॉजिटरी ( https://github.com/rsp/scripts/ ) में साझा किए गए rsp के कुछ विचारों पर आधारित है ।

आप में से कुछ कह सकते हैं कि यह स्क्रिप्ट इतने सरल कार्य के लिए बहुत बड़ी है, लेकिन मैं इसे जितना संभव हो उतना आसान और लचीला बनाना चाहता हूं। यह सरल कॉन्फ़िगरेशन फ़ाइल का समर्थन करता है जो डिफ़ॉल्ट मानों को फिर से परिभाषित करता है।

यह सफलतापूर्वक Cygwin, MINGW और Linux (Red Hat) के तहत परीक्षण किया गया था।

आंतरिक IP पता दिखाएं

myip -i

बाहरी IP पता दिखाएं

myip -e

स्रोत कोड, लिंक द्वारा भी उपलब्ध है: https://github.com/ildar-shaimordanov/tea-set/blob/master/home/bin/myip । कॉन्फ़िगरेशन फ़ाइल का उदाहरण मुख्य स्क्रिप्ट के बगल में है।

#!/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 "$0" )/myip.conf" \
    ~/.myip.conf \
    /etc/myip.conf
do
    [ -f "$f" ] && {
        . "$f"
        break
    }
done

# =========================================================================

show_usage() {
    cat - <<HELP
USAGE
  $( basename "$0" ) [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 "$0" ): $@" >&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 "$1" && return
        getent ahostsv4 "$1" \
        | grep RAW \
        | awk '{ print $1; 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 $4 }'
        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

3

मैं सिर्फ नेटवर्क इंटरफेस नाम का उपयोग करता हूं, मेरा कस्टम कमांड है

[[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p' 

मेरी अपनी नोटबुक में

[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.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
192.168.2.221
[flying@lempstacker ~]$

लेकिन अगर नेटवर्क इंटरफ़ेस कम से कम एक आईपी का मालिक है, तो यह दिखाएगा कि सभी आईपी उसके हैं

उदाहरण के लिए

उबंटू 16.10

root@yakkety:~# sed -r -n 's@"@@g;s@^VERSION=(.*)@\1@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.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
178.62.236.250
root@yakkety:~#

डेबियन जेसी

root@jessie:~# sed -r -n 's@"@@g;s@^PRETTY_NAME=(.*)@\1@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.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@p'
192.81.222.54
root@jessie:~# 

सेंटोस 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.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@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 ~]#

फेडोरा 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.*@\1@p' || ip addr show dev eth0 | sed -n -r 's@.*inet (.*)/.*brd.*@\1@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 ~]#

ऐसा लगता है कि लिंकip route get 1 | awk '{print $NF;exit}' द्वारा प्रदान की गई कमांड अधिक सटीक है, जो अधिक है, वह अधिक छोटी है।


2

सुनिश्चित नहीं है कि यह सभी ओएस में काम करता है, इसे आज़माएं।

ifconfig | awk -F"[ :]+" '/inet addr/ && !/127.0/ {print $4}'

CentOS 7.0 पर काम नहीं करता है
बेनोइट ब्लांचन

@BenoitBlanchon इसके बाद इसका उपयोग करें ip route get 1 | awk '{print $NF;exit}'। अधिकांश प्रणाली पर काम करना चाहिए।
जोतेन

वास्तव में ip route get 1 | awk '{print $NF;exit}'काम करता है
बेनोइट ब्लांचन

2

हर चीज के लिए एक नोड पैकेज है। यह क्रॉस-प्लेटफ़ॉर्म है और उपयोग में आसान है।

$ npm install --global internal-ip-cli

$ internal-ip
fe80::1

$ internal-ip --ipv4
192.168.0.3

यह एक विवादास्पद दृष्टिकोण है, लेकिन टूलिंग के लिए npm का उपयोग करना अधिक लोकप्रिय हो रहा है, जैसे यह या नहीं।


1

यदि आप नेटवर्क इंटरफ़ेस जानते हैं (eth0, wlan, tun0 आदि):

ifconfig eth0 | grep addr: | awk '{ print $2 }' | cut -d: -f2


1
ifconfig $(netstat -rn | grep -E "^default|^0.0.0.0" | head -1 | awk '{print $NF}') | grep 'inet ' | awk '{print $2}' | grep -Eo '([0-9]*\.){3}[0-9]*' 

1

मैक, लिनक्स और डॉकर कंटेनर के अंदर काम करता है:

$ hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print$ 1; बाहर जाएं}')

इस पर भी काम करता है Makefile:

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]*).*/\2/p' | awk '{print $1; exit}')}


Mac काम नहीं करता: hostname --ip-address=> hostname: illegal option -- -
macOS

1

लिनक्स के लिए, आपको क्या चाहिए यह कमांड है:

ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'

इसे अपने शेल में टाइप करें और आप बस अपने आईपी को जान पाएंगे।


नहीं, यह काम नहीं करता है।
फ्रैक्टलस्पेस


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.