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

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

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

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



답변

다음 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에만 있습니다.


답변

다음은 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


답변

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

hostname --ip-address


답변

리눅스에서

hostname -I

macOS에서

ipconfig getifaddr en0

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


답변

해결책

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

답변

편집 됨 ( 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


답변

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

hostname  -i

또는

hostname -I