programing

Linux 및 OS X에서 로컬 머신의 프라이머리 IP 주소를 취득하는 방법

padding 2023. 4. 18. 21:50
반응형

Linux 및 OS X에서 로컬 머신의 프라이머리 IP 주소를 취득하는 방법

127.0.0.1 이외의 로컬호스트의 프라이머리(첫 번째) IP 주소를 반환하는 명령줄 솔루션을 찾고 있습니다.

이 솔루션은 적어도 Linux(Debian 및 RedHat) 및 OS X 10.7 이상에서는 동작해야 합니다.

나는 알고 있다ifconfig는 양쪽 플랫폼에서 모두 사용할 수 있지만 그 출력은 이들 플랫폼 간에 그다지 일관성이 없습니다.

사용하다grepIP 주소를 필터링하다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코멘트를 참조해 주세요).단, 이것은 Linux 상에서만 가능합니다.

다음은 Linux에서는 동작하지만 OSX에서는 동작하지 않습니다.

이것은 DNS에 전혀 의존하지 않으며, 또한/etc/hosts올바르게 설정되어 있지 않다(1의 줄임말이다1.0.0.0):

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

또는 회피하고 있다awk구글의 퍼블릭 DNS를 사용하여8.8.8.8알기 쉽게:

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

신뢰성이 낮은 방법: (아래 코멘트 참조)

hostname -I | cut -d' ' -f1

Linux 머신의 경우(OS X가 아님):

hostname --ip-address

솔루션

$ 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.8Google IP. 단, 접속하고 싶은 실제 IP를 사용할 수 있습니다.

예.ip출력:

8.8.8.8 via 192.168.8.254 dev enp0s25 src 192.168.8.16 uid 1000 \   cache

를 추출하려면srcIP,sed는 regex 지원과의 호환성이 가장 높고 가장 높은 것입니다.

  • -n기본적으로는 출력 없음
  • 's/pattern/replacement/p'패턴 일치 및 인쇄 치환만
  • .*src \([0-9.]\+\).*커널에서 사용되는 src IP를 대조하여8.8.8.8

예: 최종 출력:

192.168.8.16

기타 답변

앞의 답변은 최근 기계(Gentoo 2018)에서는 동작하지 않기 때문에, 어느 쪽도 만족할 수 없다고 생각합니다.

이전 답변에서 발견한 문제:

  • 명령 출력에서의 위치 열 사용
  • 입니다.ifconfig나열하지 IP는 되지 않습니다.
  • 입니다.awkSED를 사용하세요.
  • 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신뢰할 수 없는 순서로 여러 주소를 반환할 수 있지만(manpage 참조), 나에게는 그냥 반환됩니다.192.168.1.X그게 네가 원하던 거야

편집(2014-06-01 2018-01-09 2021-07-25)

언제부터인가 새로운 것을 사용하고 있습니다. ip도구. 하지만 bash 에서, 나는 간단히 할 것이다:

read -r _{,} gateway _ iface _ ip _ < <(ip r g 1.0.0.0)

그리고나서

printf '%-12s %s\n'  gateway $gateway iface $iface ip $ip
gateway      192.168.1.1
iface        eth0
ip           192.168.1.37

여기서부터 마스크는 다음과 같습니다.

while IFS=$' /\t\r\n' read lne lip lmask _;do
    [ "$lne" = "inet" ] && [ "$lip" = "$ip" ] && mask=$lmask
done < <(ip a s dev $iface)

echo Mask is $mask bits.
Mask is 24 bits.

마스크를 IP로 표시하는 경우:

printf -v msk '%*s' $mask ''
printf -v msk %-32s ${msk// /1}
echo $((msk=2#${msk// /0},msk>>24)).$((msk>>16&255)).$((msk>>8&255)).$((msk&255))
255.255.255.0

편집(2014-06-01 2018-01-09)

각 인터페이스에 다수의 인터페이스와 다수의 IP가 설정되어 있는, 보다 강력한 설정을 위해서, 에 근거해 올바른 인터페이스와 IP를 검출하기 위한 순수 bash 스크립트를 작성합니다.이 스크립트는 이 답변의 맨 아래에 게재합니다.

도입부

두 OS 모두 기본적으로 bash가 되어 있으므로 Mac과 Linux 모두에 대한 bash 팁이 있습니다.

는, 「로케일의 문제」, 「로케일의 문제」의 사용에 되고 있습니다.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 및 줄바꿈으로 출력되며, 아무것도 출력되지 않지만 인수라는 이름의 변수가 생성되어 줄바꿈 없이 IP가 포함됩니다.

Nota2: 이것은 Debian, LaCie가 해킹한 NAS와 MaxOs에서 테스트되었습니다.만약 이것이 당신의 환경에서 작동하지 않는다면, 피드백에 매우 관심이 있을 것입니다!

이 답변의 이전 버전

( 「 」 「 」 「 」 )에 근거하고 있기 ).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
        }
    '
)

편집:

어떻게! Mac OS에서는 작동하지 않는 것 같은데...

Mac OS에서도 Linux에서와 동일하게 작동합니다.

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년 1월):

이 스크립트는 처음에 사용되는 기본 경로와 인터페이스를 찾은 후 게이트웨이의 로컬 IP 일치 네트워크를 검색하여 변수를 채웁니다.마지막 두 줄은 인쇄만 하면 됩니다.

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

우분투가 되다 '아까'라고 말할지도 127.0.0.1:

hostname  -i

또는

hostname -I

또한 Linux에서 이 명령을 사용하여 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

Linux 및 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;}'`

위에서 검출된 인터페이스를 사용하여 IP 주소를 가져옵니다.

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

Darwin 노트북 14.4.0 Darwin 커널 버전14.4.0:2015년 5월 28일 (목)11:35:04 PDT;root:xnu-2782.30.5~1/RELELEASE_X86_64 x86_64

echo $NET_IF

en5

echo $NET_IP

192.168.0.130

CentOS Linux

uname -a

Linux dev-cil.medfx.local 2.6.18-164.el5xen 1 SMP 9월 3일 목요일 04:03:03 EDT 2009 x86_64 x86_64 GNU/Linux

echo $NET_IF

eth0

echo $NET_IP

192.168.46.10

다른 방법 사용 시스템에 여러 IP 주소가 정의되어 있는 경우 경합이 발생할 수 있습니다.이 행은, 디폴트로 항상 IP 주소를 취득합니다.

ip route get 8.8.8.8 | head -1 | awk '{print $7}'
ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}'

이 답변에 대한 제 코멘트를 요약합니다.

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

그것은 @CollinAnderson의 대답에 근거하고 있지만, 내 경우에는 효과가 없었다.

다른 나라에서도 볼 수 있듯이 프라이머리 퍼블릭 IP가 필요한 경우 다음 중 하나를 시도해 보십시오.

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

기본 게이트웨이(예를 들어 모든 가상 네트워크, 도커 브리지 제외)인 네트워크에서 이 컴퓨터의 IP 주소를 찾습니다(예: 인터넷 게이트웨이, wifi 게이트웨이, 이더넷).

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

Linux에서 동작합니다.

테스트:

➜  ~ 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

Linux 시스템에서 로컬 ipv4 주소를 얻는 가장 빠른 방법은 다음과 같습니다.

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

Collin Andersons의 답변에 덧붙이자면 이 메서드는 2개의 인터페이스가 있고 둘 다 표시되었을 경우에도 고려된다고 합니다.

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

저는 라즈베리파이로 어플리케이션 작업을 하고 있는데, 업 여부에 관계없이 실제로 사용되고 있는 IP 주소가 필요했습니다.그 외의 응답의 대부분은, 양쪽 모두의 IP 주소를 반환합니다.이것은 반드시 도움이 되는 것은 아닙니다.어쨌든 제 시나리오에서는 마찬가지입니다.

프라이머리 네트워크인터페이스 IP

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
ip addr show | grep -E '^\s*inet' | grep -m1 global | awk '{ print $2 }' | sed 's|/.*||'

하나ifconfig 와 의 모두에서 :Linux osx variant 。

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

이것이 모든 OS에서 작동하는지 잘 모르겠습니다. 시험해 보십시오.

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

많은 링크(StackExchange, AskUbuntu, StackOverflow 등)를 검토하여 모든 최적의 솔루션을 하나의 셸 스크립트로 통합하기로 결정했습니다.

제 생각에는 이 두 가지 QA가 가장 훌륭합니다.

셸 스크립트로 외부 IP 주소를 취득하려면 어떻게 해야 합니까?https://unix.stackexchange.com/q/22615

내부 IP 주소를 찾으려면 어떻게 해야 하나요?https://askubuntu.com/a/604691

다음은 rsp가 그의 저장소(https://github.com/rsp/scripts/)에서 공유한 아이디어를 바탕으로 한 솔루션입니다.

이 스크립트는 간단한 작업치고는 매우 크다고 할 수 있지만, 가능한 한 쉽고 유연하게 사용할 수 있도록 하고 싶습니다.간단한 설정 파일을 지원하므로 기본값을 재정의할 수 있습니다.

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

네트워크 인터페이스 이름만 사용하고 커스텀명령어는

[[ $(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 ~]$

단, 네트워크인터페이스가 적어도1개의 IP를 소유하고 있는 경우, 모든 IP가 그 IP에 속하는 것으로 표시됩니다.

예를들면

Ubuntu 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}' 정확하고 더 짧습니다.

모든 일에는 노드 패키지가 있습니다.크로스플랫폼으로사용하기쉽습니다.

$ npm install --global internal-ip-cli

$ internal-ip
fe80::1

$ internal-ip --ipv4
192.168.0.3

이는 논란의 여지가 있는 접근 방식이지만, 좋든 싫든 간에 툴링에 npm을 사용하는 것이 점점 더 대중화되고 있습니다.

네트워크 인터페이스(eth0, wlan, tun0 등)를 알고 있는 경우:

ifconfig eth0 | grep addr: | awk '{ print $2 }' | cut -d: -f2
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 $(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]*' 

Mac, Linux 및 내부 도커 컨테이너에서 작동합니다.

$ 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 exit1; exit)

하다, 하다, 하다, 하다, 하다.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}')}

Linux의 경우 다음 명령어가 필요합니다.

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

이것을 셸에 입력하면 간단하게 IP를 알 수 있습니다.

더 쉬워요.ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr:

「 」가 npm ★★★★★★★★★★★★★★★★★」node: " " " 。npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"

언급URL : https://stackoverflow.com/questions/13322485/how-to-get-the-primary-ip-address-of-the-local-machine-on-linux-and-os-x

반응형