bash কিভাবে লিনাক্স এবং ওএস এক্স এ স্থানীয় মেশিনের প্রাথমিক আইপি ঠিকানা পেতে হয়?



unix ip (20)

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

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

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

https://ffff65535.com


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

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

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; root: xnu-2782.30.5 ~ 1 / RELEASE_X86_64 x86_64

echo $NET_IF

en5

echo $NET_IP

192.168.0.130

CentOS লিনাক্স

uname -a

লিনাক্স ডেভ-সিএল.এমডিএফএক্স.লোকাল 2.6.18-164.েল5xen 1 এসএমপি থু সেপ্টেম্বর 3 04:03:03 EDT 2009 x86_64 x86_64 x86_64 জিএনইউ / লিনাক্স

echo $NET_IF

eth0 এর

echo $NET_IP

192.168.46.10


সমাধান

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

ব্যাখ্যা

নেটওয়ার্ক তথ্য অনুসন্ধানের সঠিক উপায় ip ব্যবহার করা হচ্ছে:

  • এক লাইন আউটপুট
  • 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 সবচেয়ে কম এবং regex সমর্থনের সাথে সর্বাধিক সামঞ্জস্যপূর্ণ:

  • ডিফল্ট দ্বারা আউটপুট আউটপুট
  • 's/pattern/replacement/p' ম্যাচ প্যাটার্ন এবং মুদ্রণ প্রতিস্থাপন শুধুমাত্র
  • .*src \([0-9.]\+\).* কার্নেল দ্বারা ব্যবহৃত সোর্স 8.8.8.8 তে পৌঁছানোর জন্য

যেমন চূড়ান্ত আউটপুট:

192.168.8.16

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

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

আমি পূর্ববর্তী উত্তর সঙ্গে পাওয়া সমস্যা:

  • কমান্ড আউটপুট মধ্যে অবস্থানগত কলাম ব্যবহার;
  • ifconfig ব্যবহার নিষ্ক্রিয় করা হয় এবং - উদাহরণস্বরূপ - মাল্টিপল আইপি তালিকাভুক্ত করবেন না;
  • সহজ কাজ পরিচালনা করতে পারে যা একটি সহজ কাজ জন্য awk ব্যবহার;
  • ip route get 1 অস্পষ্ট, এবং আসলে ip route get to 1.0.0.0 একটি উপনাম
  • hostname কমান্ড ব্যবহার করুন, যা সমস্ত সরঞ্জামে -I বিকল্প নেই এবং যা আমার ক্ষেত্রে 127.0.0.1 প্রত্যাবর্তন করে।

linux উপর

hostname -I

MacOS উপর

ipconfig getifaddr en0

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


অন্য কিছু পদ্ধতি ব্যবহার করে আপনি একটি দ্বন্দ্ব প্রবেশ করতে পারেন যেখানে সিস্টেমে একাধিক আইপি অ্যাড্রেস সংজ্ঞায়িত করা হয়। এই লাইন সবসময় ডিফল্ট ব্যবহার করে আইপি ঠিকানা পায়।

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

আপনি linux এ এই কমান্ডটি ব্যবহার করে eth0 এর আইপি সংস্করণ 4 ঠিকানাটি পেতে পারেন

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

আউটপুট এই মত হবে

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

আপনি এটি চেষ্টা করতে পারেন, যদিও এটি আপনাকে কেবল 127.0.0.1 বলতে পারে:

hostname  -i

অথবা

hostname -I

আমি অনেক লিঙ্ক (স্ট্যাক এক্সচেঞ্জ, AskUbuntu, ইত্যাদি) মাধ্যমে গিয়েছিলাম এবং সমস্ত শেল স্ক্রিপ্টে একত্রিত করার সিদ্ধান্তে এসেছি।

আমার মতে এই দুই QAs সেরা দেখা হয়:

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

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

এখানে আমার সমাধানটি তার রিপোজিটোরিতে ভাগ করা rsp দ্বারা কিছু ধারনাগুলির উপর ভিত্তি করে ( https://github.com/rsp/scripts/ )।

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

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

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

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" ): [email protected]" >&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

আমি এই উত্তর আমার মন্তব্য extracting:

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

এটি @ কোলিন অ্যান্ডারসনের উত্তরটি যা আমার ক্ষেত্রে কাজ করে না।


আমি শুধু নেটওয়ার্ক ইন্টারফেস নাম ব্যবহার, আমার কাস্টম কমান্ড হয়

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

আমার নিজের নোটবুক

[[email protected] ~]$ cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
[[email protected] ~]$ [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r '[email protected]*inet (.*)/.*brd.*@\[email protected]' || ip addr show dev eth0 | sed -n -r '[email protected]*inet (.*)/.*brd.*@\[email protected]'
192.168.2.221
[[email protected] ~]$

কিন্তু যদি নেটওয়ার্ক ইন্টারফেসটি অন্তত একটি আইপি থাকে তবে এটি সমস্ত আইপি এর সাথে সম্পর্কিত হবে

উদাহরণ স্বরূপ

উবুন্টু 16.10

[email protected]:~# sed -r -n '[email protected]"@@g;[email protected]^VERSION=(.*)@\[email protected]' /etc/os-release
16.04.1 LTS (Xenial Xerus)
[email protected]:~# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r '[email protected]*inet (.*)/.*brd.*@\[email protected]' || ip addr show dev eth0 | sed -n -r '[email protected]*inet (.*)/.*brd.*@\[email protected]'
178.62.236.250
[email protected]:~#

ডেবিয়ান জেসি

[email protected]:~# sed -r -n '[email protected]"@@g;[email protected]^PRETTY_NAME=(.*)@\[email protected]' /etc/os-release
Debian GNU/Linux 8 (jessie)
[email protected]:~# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r '[email protected]*inet (.*)/.*brd.*@\[email protected]' || ip addr show dev eth0 | sed -n -r '[email protected]*inet (.*)/.*brd.*@\[email protected]'
192.81.222.54
[email protected]:~# 

CentOS 6.8

[[email protected] ~]# cat /etc/redhat-release 
CentOS release 6.8 (Final)
[[email protected] ~]# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r '[email protected]*inet (.*)/.*brd.*@\[email protected]' || ip addr show dev eth0 | sed -n -r '[email protected]*inet (.*)/.*brd.*@\[email protected]'
162.243.17.224
10.13.0.5
[[email protected] ~]# ip route get 1 | awk '{print $NF;exit}'
162.243.17.224
[[email protected] ~]#

ফেডোরা ২4

[[email protected] ~]# cat /etc/redhat-release 
Fedora release 24 (Twenty Four)
[[email protected] ~]# [[ $(ip addr | grep enp0s25) != '' ]] && ip addr show dev enp0s25 | sed -n -r '[email protected]*inet (.*)/.*brd.*@\[email protected]' || ip addr show dev eth0 | sed -n -r '[email protected]*inet (.*)/.*brd.*@\[email protected]'
104.131.54.185
10.17.0.5
[[email protected] ~]# ip route get 1 | awk '{print $NF;exit}'
104.131.54.185
[[email protected] ~]#

মনে হচ্ছে কমান্ড ip route get 1 | awk '{print $NF;exit}' link দ্বারা উপলব্ধ ip route get 1 | awk '{print $NF;exit}' আরও সঠিক, আরো কি, এটি আরও ছোট।


এই সব os কাজ করে না নিশ্চিত, এটা চেষ্টা করে দেখুন।

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

এটি পড়তে সহজ: ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr: ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr:


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

এটি DNS এ নির্ভর করে না এবং এটি /etc/hosts এমনকি /etc/hosts সঠিকভাবে সেট না থাকলেও এটি কাজ করে ( 1 1.0.0.0 জন্য 1.0.0.0 ):

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

বা awk এড়ানো এবং সুস্পষ্টতার জন্য Google এর সর্বজনীন DNS ব্যবহার করে 8.8.8.8 এ:

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

একটি কম নির্ভরযোগ্য উপায়: (নীচের মন্তব্য দেখুন)

hostname -I | cut -d' ' -f1

মনে হচ্ছে আপনার বিশিষ্ট সর্বজনীন আইপির প্রয়োজন যেহেতু এটি বিশ্বের বাকি অংশ থেকে দেখা গেছে, সেগুলির মধ্যে যেকোনো চেষ্টা করুন:

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

ম্যাক, লিনাক্স এবং ডকার কনটেইনারগুলির মধ্যে কাজ করে:

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


লিনাক্স এবং ওএসএক্স-এ উভয় কাজ করে এমন আরেকটি ifconfig রূপান্তর:

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

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

hostname --ip-address

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

$ npm install --global internal-ip-cli

$ internal-ip
fe80::1

$ internal-ip --ipv4
192.168.0.3

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


grep থেকে IP ঠিকানা ফিল্টার করার জন্য grep ব্যবহার করুন:

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 -i কিন্তু মন্তব্য দেখুন)। যাইহোক, এটি শুধুমাত্র লিনাক্সে।


ifconfig | grep "inet addr:" | grep -v "127.0.0.1" | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'  | head -1

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




ifconfig