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

또는 명확성 awk8.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

당신이있는 경우 npmnode설치 :npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.