Linux 및 OS X에서 로컬 시스템의 기본 IP 주소를 얻는 방법은 무엇입니까? [닫은]


339

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

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

나는 ifconfig둘 다에서 사용할 수 있지만 그 플랫폼간에 그 출력이 일관성이 없다는 것을 알고 있습니다.


2
머신 로컬 네트워크 IP를 원하십니까? 즉 192.168.0.12
— 크리스 시모어

예, 로컬 IP는 둘 이상을 가질 수 있으므로 먼저 목록으로도 살 수 있습니다. 현재 해시를 생성하기 위해서만 IPv4 주소 만 지원하고 IPv6을 무시하고 기쁩니다.
— sorin

2
"기본"을 어떻게 정의합니까? "기본 경로와 동일한 서브넷에있는 IP 주소"를 생각하고 있다면 약간의 프로그래밍이 필요합니다. 그러나 시스템에 기본 경로가 없지만 여전히> 1 IP 주소가있는 경우 어떻게해야합니까?
— ghoti

4
시도하십시오 curl -4 ifconfig.co. 외부 IP4 주소로 응답합니다.
— asmaier

답변:


475

다음 grep에서 IP 주소를 필터링하는 데 사용 합니다 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에만 있습니다.


5
OSX에서 sed는 -EGNU 스타일 -r옵션이 아닌 Extended RE 옵션을 사용합니다 .
— ghoti

1
흥미있는; GNU sed가 지원한다는 것을 몰랐습니다 -E. 최신 버전의 FreeBSD는 스크립트 이식성을 용이하게하기 위해 -r별명으로 옵션을 추가 -E했지만, 업데이트는 아직 OSX로 가져 오지 않았으며, 마지막으로 몇 년 전에 FreeBSD 릴리스의 sed 버전을 사용하고 있습니다. OSX가 수년 동안 FreeBSD 소스 코드를 몇 차례 도핑했기 때문에 정확히 어느 것이 확실하지 않습니다. 나는의 사용이 의 선택에 -E필적 할 것이라고 생각했다 . 왜 GNU 사람들이 대신을 선택했는지 모르겠습니다 . grep-E-r
— ghoti

1
@ghoti 내가 사용하는 대답을 변경 -E, 당신이 그렇게 생각 거라고 확신 이동성의 수 --help와는 man pages그 사용 이전에 다른 질문에 나를 위해 약간의 혼란이 원인했다 .. 업데이트 될 것입니다-E
— 크리스 시모어에게

1
문제가 있음을 발견했지만 OS X에서 작동하지만 IP 목록 인 둘 이상의 IP를 반환합니다. 첫 번째 것이 옳은 것처럼 보이지만 여전히 이것이 내 논리를 깨뜨릴 것입니다. gist.github.com/ssbarnea/31b9dcb0f8fd528b958c를 참조하십시오 -또한 활성 상태이지만 파라이가 사용하는 vnic을 반환합니다.
— sorin

13
OSX : ipconfig getifaddr en0
— Parleer

232

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

이것은 전혀 DNS에 의존하지 않으며 /etc/hosts올바르게 설정되지 않은 경우에도 작동 합니다 (의 1약어 1.0.0.0).

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

또는 명확성 awk을 8.8.8.8위해 Google의 공개 DNS를 피하고 사용하는 행위 :

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

덜 신뢰할 수있는 방법 : (아래 주석 참조)

hostname -I | cut -d' ' -f1

8
hostname -I(문서에 따르면) 주소 순서에 대한 가정을 할 수 없기 때문에 에서 생성 한 첫 번째 주소를 얻는 방법 은 신뢰할 수 없습니다. 따라서 가상 머신이 상주하는 네트워크와 같은 내부 네트워크 일 수도 있습니다. 다른 방법은 좋은 것 같습니다.
— Adam Ryczkowski

3
RHEL 7에 더 이상 ifconfig가 포함되어 있지 않으므로이 답변이 허용됩니다.
— Andrew

10
ip route get 1 | awk '{print $(NF-2);exit}'내가 outptut에 추가 된 uid를 얻는 동안 나를 위해 일한다
— Hritik

13
이 (첫 번째) 는 유일한 올바른 솔루션 입니다. 이다 중요한 기본 경로와 관련된 인터페이스에서 특히 IP를 읽을 수 있습니다. 그렇지 않으면 쓸모없는 내부 주소를 얻을 가능성이 큽니다.
— Jan Hudec

12
그것은 나를 위해 작동하지 않았지만 그것은 충분히 폐쇄되었습니다 :ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
— estani

230

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

hostname --ip-address

10
이름이 DNS에있는 경우에만 작동합니다. 그렇지 않으면 "호스트 이름 : 이름 또는 서비스를 알 수 없습니다."라는 메시지가 나타납니다.
— Vebjorn Ljosa 5

39
hostname -i에 해당하는 짧은 형태는
— 폴 에반스

75
때로는 127.0.0.1을 반환하기도합니다. 사용 가능한 경우 매뉴얼 (Ubuntu)에서 권장하는대로 호스트 이름 -I 를 사용 하는 것이 좋습니다. "--ip-address 호스트 이름의 네트워크 주소를 표시합니다. 호스트 이름을 확인할 수있는 경우에만 작동합니다. 이 옵션; 대신 hostname --all-ip-addresses를 사용하십시오. "
— jrierab

1
적어도 hostnameGNU Coreutils 버전 8.26 에서는 Linux에서 작동하지 않습니다 .
— ack

5
내 컴퓨터에 hostname -i있는 동안, 로컬 IP를 제공합니다 hostname -I다른 모든 IP를 제공합니다
— 알렉시스 Paques

62

리눅스에서

hostname -I

macOS에서

ipconfig getifaddr en0

hostname -I신뢰할 수없는 순서 (참조에 여러 개의 주소를 반환 할 수 맨 페이지 ), 그러나 저 그것은 단지 반환을위한 , 이는 당신이 원하는 것입니다.hostname192.168.1.X


1
나를 위해 그것은 hostname -i더 낮은 I와 함께했다.
— Paul Woitaschek

2
@PaulWoitaschek 맨 페이지 맨 페이지 -i 플래그에 는 다음과 같이 말합니다 Avoid using this option; use hostname -I instead.
— 보리스

당신은 알파인 (및 비지 박스)를 실행하는 고정 표시기 컨테이너 같은에서 실행하는 경우 @Boris는 단지 -i 플래그 소문자로 받아 들일 것
— bayetovsky

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

srcip 를 추출하려면 sed가장 적고 정규식 지원과 가장 호환됩니다.

  • -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.

34

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

더 많은 구성과 각 인터페이스에 많은 IP가 구성된 더 강력한 구성을 위해 올바른 인터페이스 와 ip를 기반으로 하는 순수한 bash 스크립트를 기반으로하지 않았습니다 . 나는이 답변을 맨 아래 에이 스크립트를 게시합니다.127.0.0.1default route

소개

두 Os 모두가 기본적으로 설치되면 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 및 newline 에서 인수와 함께 출력되며 아무 것도 인쇄되지 않지만 arguments라는 변수가 만들어지고 newline 없이 IP가 포함 됩니다.

Nota2 : Debian, LaCie hacked 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에서 작동하지 않는 것 같습니다 ...

좋아, 이것은 내 리눅스 에서 와 맥 OS 에서 작동하는 것처럼 보인다 .

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

1
@sorin : 예, 이제 ifconfig로 작동합니다. ( sbin내 전체 $PATH경로가 지정 되어 있지 않아도 MacOS에도 동일한 경로가 존재해야합니다. :-)
— F. Hauri

1
이 시도 @sorin time당신이 너무 오래 사용하는 것이 어떤 선택 ...
— F. 하우리에게

빠르고 작은 솔루션이 가장 좋은 방법이었습니다. 최신 솔루션은 구문 오류를 제공합니다. 호환성은 항상 플러스입니다. 감사합니다.
— m3nda

29

우분투의 특정 빌드에만 해당합니다. 그것은 단지 당신에게 말할 수 있지만 127.0.0.1:

hostname  -i

또는

hostname -I

이 모든 경우에 작동합니까?
— AloneInTheDark

6
아니. -127.0.0.1을 알려줄 수 있습니다.
— SvenDowideit

hostname-우분투에서 작동합니다.
— Borzh

1
$ hostname --ip-address그냥 날 수 있습니다 127.0.0.1아치 리눅스에
— kristianlm

1
hostname -I 또는 hostname --all-ip-addresses를 사용하십시오
— Aydin K.

24

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

나에게 최고의 답변! 감사합니다 @Sathish! ;-)
— Samuel Phan

1
나는 이것이 eth0의 IPv4를 얻는 가장 깨끗한 방법이라는 것에 동의합니다.
— Chris Mendez 2012 년

이것은 현재 이름 지정 전략이 아니며 기본 인터페이스로 보장되지 않은 eth0을 가정합니다.
— rfay

인터페이스를 아는 경우 가장 우아한 방법입니다. 시스템에 여러 인터페이스가 있지만 특정 인터페이스에만 관심이있는 경우에 이상적입니다.
— lepe December

14

이것은 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

다윈 노트북 14.4.0 다윈 커널 버전 14.4.0 : 5 월 28 일 목요일 11:35:04 PDT 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기본 인터페이스를 얻으려면 첫 번째 줄의 끝에 a 가 필요 하고 나머지는 좋습니다.
— Endareth

12

다른 방법 중 일부 사용 시스템에 여러 IP 주소가 정의 된 경우 충돌이 발생할 수 있습니다. 이 줄은 항상 기본적으로 사용되는 IP 주소를 가져옵니다.

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

기본 경로가 없으면 실패합니다 (그러나 좋은 생각)
— FractalSpace

니스 ... 인터넷이 없어도 일을한다고 가정 해보십시오.
— Boris Churzin

8

이 답변에 대한 내 의견을 추출 중입니다.

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}'"
— Sam Houston

권리. 그러나 문제는 처음에 명령에 관한 것이 었습니다. 그래서 방금 관련 게시물을 올렸습니다. 건배!
— Faizan Noor

6

리눅스 시스템에서 로컬 ipv4 주소를 얻는 가장 짧은 방법 :

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

5
나쁜. 매뉴얼 페이지는 출력 순서에 대해 어떤 가정도하지 말라고 구체적으로 지시합니다.
— Matt

사소한 사용 사례에 적합합니다. 빠르고 더러워도 상관 없습니다! 큰!
— Nicolai Weitkemper

6

전 세계에서 볼 수있는 기본 퍼블릭 IP 가 필요하다고 가정하면 다음 중 하나를 시도하십시오.

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

6

Collin Andersons는 두 가지 인터페이스가 있고 둘 다 표시되는 경우이 방법도 고려한다는 답변을 추가해야합니다.

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

나는 Raspberry Pi의 응용 프로그램을 연구하고 있었고 실제로 작동 여부에 관계없이 실제로 사용되는 IP 주소가 필요했습니다. 다른 답변의 대부분은 내 시나리오에서 반드시 도움이되지 않는 IP 주소를 모두 반환합니다.


5

기본 네트워크 인터페이스 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

5

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

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

좋은! Taco Bell 프로그래밍 이 가장 좋습니다. 덕분입니다.
— Stevie Howard

3
ip addr show | grep -E '^\s*inet' | grep -m1 global | awk '{ print $2 }' | sed 's|/.*||'

3

ifconfigLinux와 OSX에서 모두 작동하는 또 다른 변형 :

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

1
하나의 작은 변화 :ifconfig | grep '\<inet\>' | cut -d ' ' -f2 | grep -v '127.0.0.1'
— jpbochi

왜이 답변의 절반이 전혀 효과가 없습니까?
— SurpriseDog

3

나는 많은 링크 (StackExchange, AskUbuntu, StackOverflow 등)를 거쳐 모든 최고의 솔루션을 하나의 쉘 스크립트로 결합하기로 결정했습니다.

제 생각에는이 두 가지 품질 관리가 가장 좋습니다.

쉘 스크립트에서 외부 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

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

그러나 네트워크 인터페이스가 하나 이상의 IP를 소유 한 경우 모든 IP가 자신의 IP를 나타냅니다

예를 들어

우분투 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

이것이 모든 OS에서 작동하는지 확실하지 않으면 시도하십시오.

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

CentOS 7.0
— Benoit Blanchon

@BenoitBlanchon 그런 다음 이것을 사용하십시오 ip route get 1 | awk '{print $NF;exit}'. 대부분의 시스템에서 작동합니다.
— Jotne

실제로 ip route get 1 | awk '{print $NF;exit}'작동
— Benoit Blanchon

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

macOS 10.12.6에서 작동하지 않음
— Antoine F.

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

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

$ 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이 작동하지 않음 : macOS Sierra에서 hostname --ip-address=>hostname: illegal option -- -
— JL Peyret

1

리눅스의 경우 다음 명령이 필요합니다.

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

이것을 쉘에 입력하면 IP를 알 수 있습니다.


아니요. 작동하지 않습니다.
— FractalSpace

1

이것은 읽기 쉽다 : ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr:


macOS 10.12.6에서 작동하지 않음
— Antoine F.

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.