লিনাক্স এবং ওএস এক্স এর স্থানীয় মেশিনের প্রাথমিক আইপি ঠিকানাটি কীভাবে পাবেন? [বন্ধ]


338

আমি একটি কমান্ড লাইন সমাধান খুঁজছি যা আমাকে লোকালহোস্টের প্রাথমিক (প্রথম) আইপি ঠিকানাটি ফিরিয়ে আনবে, 127.0.0.1 ব্যতীত

সমাধানটি কমপক্ষে লিনাক্স (ডেবিয়ান এবং রেডহ্যাট) এবং ওএস এক্স 10.7+ এর জন্য কাজ করা উচিত

আমি সচেতন যে ifconfigউভয়ে উপলব্ধ তবে এর আউটপুট এই প্ল্যাটফর্মগুলির মধ্যে এতটা সামঞ্জস্যপূর্ণ নয়।


2
আপনি কি কেবল নিজের মেশিনের স্থানীয় নেটওয়ার্ক আইপি চান? যেমন 192.168.0.12
ক্রিস সিমর

হ্যাঁ, স্থানীয় আইপি, এর মধ্যে প্রথমে একাধিক থাকতে পারে তবে আমি এমনকি একটি তালিকা সহ বাঁচতে পারি। এই মুহুর্তে আমি কেবল আইপিভি 4 অ্যাড্রেস সমর্থন করতে এবং আইপিভি 6 উপেক্ষা করে খুশি, কারণ এটি কেবল একটি হ্যাশ তৈরি করতে চায়।
সোমিন

2
আপনি কীভাবে "প্রাথমিক" সংজ্ঞা দেন? যদি আপনি "আমার ডিফল্ট রুটের একই সাবনেটের আইপি ঠিকানা" ভাবছেন, তবে আপনাকে এটির জন্য কিছুটা প্রোগ্রাম করতে হবে। তবে কী যদি মেশিনটির কোনও ডিফল্ট রুট না থাকে তবে তারপরে> 1 টি আইপি ঠিকানা থাকে?
ঘোটি

4
ব্যবহার করে দেখুন curl -4 ifconfig.co। এটি আপনার বাহ্যিক আইপি 4 ঠিকানা দিয়ে উত্তর দেবে।
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
আরও লক্ষ করুন যে ওএসএক্সে সেড -Eজিএনইউ-স্টাইল -rবিকল্প নয়, প্রসারিত আরই জন্য বিকল্প ব্যবহার করে ।
ঘোটি

1
মজাদার; আমি বুঝতে পারছি না যে গনুহ সমর্থিত SED -E। ফ্রিবিএসডি-র সাম্প্রতিক সংস্করণগুলি স্ক্রিপ্ট বহনযোগ্যতা সহজ করার -rজন্য একটি উপন্যাস হিসাবে বিকল্প যুক্ত করেছে -E, তবে আপডেটটি এখনও ওএসএক্সের কাছে আনা যায় নি, যা সর্বশেষে আমি যাচাই করেছি কয়েক বছর আগে একটি ফ্রিবিএসডি রিলিজ থেকে সেডের একটি সংস্করণ ব্যবহার করে। ওএসএক্স কয়েক বছর ধরে কয়েকবার ফ্রিবিএসডি উত্স কোড গ্রহণ করেছে বলে সঠিকভাবে নিশ্চিত নয়। আমি বিশ্বাস করি এর ব্যবহারটি এর বিকল্পের -Eসাথে তুলনীয় হওয়ার উদ্দেশ্যে করা হয়েছিল । GNU লোকেরা পরিবর্তে কীভাবে বেছে নিয়েছে তা ধারণা নেই । grep-E-r
ঘোটি

1
@ ঘোটি আমি -Eবহনযোগ্যতার বিষয়ে নিশ্চিত হতে ব্যবহারের উত্তরটি পরিবর্তন করেছি , আপনি কি মনে করেন --helpএবং এটি man pagesআপডেট করা হবে .. এটি অন্য একটি প্রশ্নে আমার আগে সামান্য বিভ্রান্তির কারণ হয়েছিল-E
ক্রিস সেমোর

1
আমি একটি সমস্যা পেয়েছি, যখন এটি ওএস এক্স এ কাজ করে এটি একাধিক আইপি, আইপিগুলির একটি তালিকা ফেরত দেয় না। দেখে মনে হচ্ছে প্রথমটি হ'ল সঠিক তবে তবুও এটি আমার যুক্তি ভঙ্গ করবে। Gist.github.com/ssbarnea/31b9dcb0f8fd528b958c দেখুন - এটি এমন ভানিকগুলিও ফিরিয়ে দেয় যা সক্রিয় তবে প্যারালগুলি দ্বারা ব্যবহৃত হয়।
sorin

13
ওএসএক্স: ipconfig gephaaddr en0
parleer

232

নিম্নলিখিতগুলি লিনাক্সে কাজ করবে তবে ওএসএক্স নয়।

এটি মোটেও ডিএনএসের উপর নির্ভর করে না এবং /etc/hostsসঠিকভাবে সেট না করা সত্ত্বেও এটি কাজ করে (এর 1জন্য শর্টহ্যান্ড 1.0.0.0):

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

বা স্পষ্টতার জন্য এড়ানো awkএবং গুগলের পাবলিক ডিএনএস 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
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত কারণ আরএইচইএল 7 এর মধ্যে আর আইফনফিগ থাকে না।
অ্যান্ড্রু

10
আমার জন্য ip route get 1 | awk '{print $(NF-2);exit}'যেমন আমি পেতে ইউআইডি যোগ কাজ করে outptut করতে
Hritik

13
এই (প্রথমটি) হ'ল একমাত্র সঠিক সমাধান । এটা গুরুত্বপূর্ণ ডিফল্ট রুট সঙ্গে যুক্ত ইন্টারফেস থেকে বিশেষভাবে আইপি পড়তে। অন্যথায় আপনি বেশিরভাগ মূল্যহীন অভ্যন্তরীণ ঠিকানা পেতে পারেন।
জানু হুডেক

12
এটি আমার পক্ষে কাজ করে না তবে এটি যথেষ্টভাবে বন্ধ ছিল:ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
ইস্টানি

230

লিনাক্স মেশিনগুলির জন্য (ওএস এক্স নয়):

hostname --ip-address

10
নামটি ডিএনএসে থাকলে কেবল এটিই কাজ করে। যদি তা না হয় তবে আপনি "হোস্টনাম: নাম বা পরিষেবাটি জানেন না" বার্তাটি পান।
Vebjorn Ljosa

39
hostname -iসমতুল্য সংক্ষিপ্ত ফর্ম
পল ইভান্স

75
এটি কখনও কখনও 127.0.0.1 এ ফিরে আসবে। যদি উপলভ্য থাকে তবে ম্যানুয়াল (উবুন্টু) অনুসারে হোস্ট-নেম-এর আরও ভাল ব্যবহার করুন : "- আইপি-ঠিকানা হোস্ট নামের নেটওয়ার্কের ঠিকানা (এস) প্রদর্শন করুন Note মনে রাখবেন যে হোস্টের নামটি সমাধান করা যায় তবেই এটি কাজ করে using ব্যবহার করা এড়ান এই বিকল্পটি; পরিবর্তে হোস্ট-নেম - সমস্ত-আইপি-ঠিকানা ব্যবহার করুন। "
jrierab

1
এটি লিনাক্সেও কাজ করে না, কমপক্ষে hostnameGNU Coreutils সংস্করণ 8.26 এর সাথে নয়।
ack

5
আমার মেশিনে, hostname -iকেবলমাত্র স্থানীয় আইপি hostname -Iদেয়, অন্য সমস্ত আইপি দেয়
আলেকিস পাকস

62

লিনাক্সে

hostname -I

ম্যাকোজে

ipconfig getifaddr en0

hostname -Iএকটি অবিশ্বস্ত অর্ডার (দেখুন একাধিক ঠিকানা আসতে পারেন র manpage ), কিন্তু আমাকে এটা ঠিক আয় জন্য , যা আপনি কি চেয়েছিলাম আমি।hostname192.168.1.X


1
আমার জন্য এটি ছিল hostname -iএকটি নিম্ন আই সঙ্গে
পল Woitaschek

2
@PaulWoitaschek ছোট হাতের জন্য র manpage -iপতাকা এই বলে: Avoid using this option; use hostname -I instead
বরিস

@ বোরিস যদি আপনি আল্পাইন চালিত কোনও ডকারের ধারক (এবং এভাবে ব্যাসিবক্স) এর মতো কোনও কিছুতে ছুটে চলেছেন তবে এটি কেবল লোয়ারকেস -i পতাকা গ্রহণ করবে
বায়েটভস্কি

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 গুগল আইপি, তবে আপনি পৌঁছাতে চান এমন আসল আইপি ব্যবহার করতে পারেন

যেমন 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

অন্যান্য উত্তর

আমি মনে করি পূর্ববর্তী উত্তরগুলির কোনওটিই আমার পক্ষে যথেষ্ট ভাল নয়, কারণ তারা সাম্প্রতিক কোনও মেশিনে কাজ করে না (জেন্টো 2018)।

পূর্ববর্তী উত্তরগুলি সহ আমি যে সমস্যাগুলি পেয়েছি:

  • কমান্ড আউটপুটে অবস্থানিক কলামের ব্যবহার;
  • ifconfigযার ব্যবহার অবমাননাকৃত এবং - উদাহরণস্বরূপ - একাধিক আইপি তালিকাভুক্ত করবেন না;
  • awkএকটি সহজ কাজের জন্য ব্যবহার যা সেড আরও ভাল পরিচালনা করতে পারে;
  • 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, আইপি এবং একটি নিউলাইন , এই যুক্তির সাহায্যে এই ফাংশন আউটপুটটি কিছুই মুদ্রিত হয় না, তবে আর্গুমেন্ট নামে একটি ভেরিয়েবল তৈরি হয় এবং নিউলাইন ছাড়াই আইপি ধারণ করে ।

নোটা 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; }')

ফাটানো:

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;
        }')

আমার স্ক্রিপ্ট (জানুয়ারী 2018):

এই স্ক্রিপ্টটি প্রথমে আপনার ডিফল্ট রুট এবং ইন্টারফেসের জন্য ব্যবহৃত হবে, তারপরে গেটওয়ের স্থানীয় আইপ ম্যাচিং নেটওয়ার্ক অনুসন্ধান করবে এবং ভেরিয়েবলগুলি পপুলেট করবে। শেষ দুটি লাইন কেবল মুদ্রণ করুন, এরকম কিছু:

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
@ সোরিন: হ্যাঁ, এখন এই আইফোনফিগ দিয়ে কাজ করুন। (যেমনটি sbinআমার $PATHপুরোপথটিতে নেই তা নির্দিষ্ট করতে হবে তবে ম্যাকওএসেও একই পথ বিদ্যমান: :-)
এফ হৌরি

1
আপনি এতক্ষণ কোনটি timeব্যবহার করবেন তা নির্বাচন করার জন্য @ সোরিন চেষ্টা করে দেখুন ...
এফ। হাউরি

দ্রুত এবং ছোট সমাধানটি ছিল সর্বোত্তম পন্থা। আরও নতুন সমাধানগুলি আমাকে সিনট্যাক্স ত্রুটি দেয়। সামঞ্জস্যতা সর্বদা একটি প্লাস। ধন্যবাদ.
m3nda

29

উবুন্টুর কয়েকটি নির্দিষ্ট বিল্ডের জন্য নির্দিষ্ট। যদিও এটি আপনাকে কেবল বলতে পারে 127.0.0.1:

hostname  -i

অথবা

hostname -I

এই কি প্রতিটি ক্ষেত্রে কাজ করে?
অলোনইনডার্ট

6
কোন। - এটি আপনাকে কেবল 127.0.0.1 বলতে পারে।
সোভেনডাউডাইট

হোস্ট-নেম উবুন্টুতে কাজ করে।
বোরঝ

1
$ hostname --ip-addressখালি আমাকে 127.0.0.1আর্চ লিনাক্সে
ক্রিশ্চিয়ালম

1
হোস্টনাম -I বা হোস্ট-নেম - সমস্ত আইপি-ঠিকানা ব্যবহার করুন
আইয়িন কে।

24

আপনি লিনাক্সে এই কমান্ডটি ব্যবহার করে এথ 0 এর আইপি সংস্করণ 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
আমি সম্মত, এথ 0 এর আইপিভি 4 পাওয়ার সবচেয়ে পরিষ্কার পদ্ধতি।
ক্রিস মেন্ডেজ

এটি এথ0 ধরে নিয়েছে, যা বর্তমানের নামকরণ কৌশল নয় এবং এটি কখনও কখনও প্রাথমিক ইন্টারফেস হওয়ার গ্যারান্টিযুক্ত ছিল না।
rfay

আপনি যদি ইন্টারফেসটি জানেন তবে এটি সর্বাধিক মার্জিত পদ্ধতি। আদর্শ যদি আপনার সিস্টেমে একাধিক ইন্টারফেস থাকে তবে আপনি কেবল একটি নির্দিষ্টটিতে আগ্রহী।
লিপ করুন

14

এটি লিনাক্স এবং ওএসএক্স-এ কাজ করে

এটি ডিফল্ট রুটের সাথে সম্পর্কিত ইন্টারফেসটি পাবে

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'`

ওএসএক্স

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

সেন্টস লিনাক্স

uname -a

লিনাক্স dev-cil.medfx.local 2.6.18-164.el5xen 1 এসএমপি থু 3 সেপ্টেম্বর 04:03:03 EDT 2009 x86_64 x86_64 x86_64 জিএনইউ / লিনাক্স

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}'

কোনও ডিফল্ট রুট না থাকলে এটি ব্যর্থ হবে (তবে ভাল ধারণা)
ফ্র্যাক্টালস্পেস

ভাল ... ধরুন আপনার ইন্টারনেট না থাকলেও কাজ করবেন?
বরিস চুরজিন

8

আমি এই উত্তরে আমার মন্তব্যটি বের করছি:

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

এটি @ কলিনএন্ডারসন উত্তরের ভিত্তিতে যা আমার ক্ষেত্রে কার্যকর হয়নি।


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

আপনার লিনাক্স সিস্টেমে আপনার স্থানীয় আইপিভি 4-ঠিকানা পাওয়ার সংক্ষিপ্ততম উপায়:

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

5
খারাপ। ম্যান পৃষ্ঠাটি আপনাকে আউটপুট ক্রম সম্পর্কে কোনও অনুমান না করার জন্য বিশেষভাবে বলেছে।
ম্যাট

আমার তুচ্ছ ব্যবহারের ক্ষেত্রে দুর্দান্ত কাজ করে - যদি তা দ্রুত এবং নোংরা হয় আমি তা চিন্তা করি না! গ্রেট!
নিকোলাই ওয়েটকেম্পার

6

ধরে নেওয়া আপনার পৃথিবীর অন্যান্য অংশ থেকে যেমন দেখানো হয়েছে আপনার প্রাথমিক পাবলিক আইপি দরকার , এর মধ্যে যে কোনও একটি ব্যবহার করে দেখুন:

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}'

আমি রাস্পবেরি পাই এর সাথে একটি অ্যাপ্লিকেশন নিয়ে কাজ করছি এবং যে আইপি ঠিকানাটি আসলে ব্যবহার করা হচ্ছে এটি কেবল আপ ছিল কিনা তা নয় needed অন্য উত্তরগুলির বেশিরভাগই উভয় আইপি ঠিকানা ফেরত দেবে যা প্রয়োজনীয়ভাবে কার্যকর নয় - যাইহোক আমার দৃশ্যের জন্য।


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 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লিনাক্স এবং ওএসএক্স উভয় ক্ষেত্রে কাজ করে এমন একটি অন্য রূপ:

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

1
একটি ছোট পার্থক্য:ifconfig | grep '\<inet\>' | cut -d ' ' -f2 | grep -v '127.0.0.1'
jpbochi

কেন এই উত্তরগুলির অর্ধেকটি আমার পক্ষে মোটেও কার্যকর হয় না?
সারপ্রাইজডগ

3

আমি প্রচুর সংযোগ দিয়েছি (স্ট্যাকএক্সচেঞ্জ, এসকউবুন্টু, স্ট্যাকওভারফ্লো ইত্যাদি) এবং সর্বোত্তম সমাধানগুলি একটি শেল স্ক্রিপ্টে একত্রিত করার সিদ্ধান্তে এসেছি।

আমার মতে এই দুটি কিউএ সবচেয়ে ভাল দেখা:

আমি কীভাবে শেল স্ক্রিপ্টে আমার বাহ্যিক আইপি ঠিকানা পেতে পারি? https://unix.stackexchange.com/q/22615

আমি আমার অভ্যন্তরীণ আইপি ঠিকানাটি কীভাবে খুঁজে পাব? https://askubuntu.com/a/604691

তার সংগ্রহস্থলে ( https://github.com/rsp/scriptts/ ) শেয়ার করে আরএসপি দ্বারা কিছু ধারণার ভিত্তিতে আমার সমাধানটি এখানে দেওয়া হয়েছে ।

আপনারা কেউ বলতে পারেন যে এই স্ক্রিপ্টটি এত সাধারণ কাজের জন্য অত্যন্ত বিশাল তবে আমি এটি যতটা সম্ভব ব্যবহারের ক্ষেত্রে সহজ এবং নমনীয় করে তুলতে চাই। এটি সাধারণ কনফিগারেশন ফাইলটিকে ডিফল্ট মানগুলিকে নতুন করে সংজ্ঞায়িত করতে সহায়তা করে।

এটি সফলভাবে সাইগউইন, এমইংডাব্লু এবং লিনাক্স (রেড হ্যাট) এর অধীনে পরীক্ষা করা হয়েছিল।

অভ্যন্তরীণ আইপি ঠিকানা প্রদর্শন করুন

myip -i

বাহ্যিক আইপি ঠিকানা প্রদর্শন করুন

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:~# 

CentOS 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}'কাজ করে
বেনইট Blanchon

2

সমস্ত কিছুর জন্য নোড প্যাকেজ রয়েছে। এটি ক্রস প্ল্যাটফর্ম এবং সহজেই ব্যবহারযোগ্য।

$ npm install --global internal-ip-cli

$ internal-ip
fe80::1

$ internal-ip --ipv4
192.168.0.3

এটি একটি বিতর্কিত পদ্ধতির, তবে টুলিংয়ের জন্য এনপিএম ব্যবহার আরও জনপ্রিয় হয়ে উঠছে, এটি পছন্দ করুন বা না করুন।


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}')}


ম্যাক কাজ করে না: hostname --ip-address=> hostname: illegal option -- -MacOS সিয়েরা উপর
জেএল Peyret

1

লিনাক্সের জন্য আপনার যা প্রয়োজন তা হ'ল এই আদেশ:

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

আপনার শেল এ এটি টাইপ করুন এবং আপনি সহজেই আপনার আইপি জানতে হবে।


না এটি কাজ করে না।
ফ্র্যাক্টালস্পেস


1

আপনি যদি ইনস্টল করে থাকেন npmএবং nodeইনস্টল করেন:npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.