IP 주소 만 가져 오는 터미널 명령은 무엇입니까?


118

내가 작성한 스크립트의 매개 변수로 IP 주소 (inet) 만 사용하려고합니다.

유닉스 터미널에서 검색하는 대신 IP 주소 만 얻을 수있는 쉬운 방법이 ifconfig있습니까?


예, 또는 내가 생각하는 기계에 대한 다른 고유 식별자.
Mason

1
호스트 이름 -i에 잘못된 옵션이 표시됩니까?

4
호스트 이름은 ifconfig만큼 신뢰할 수 없습니다
joel

2
MAC OS 다음 우분투에 대해 얘기 곳 조엘은 특별히 당신을 맞다
zackaryka

2
아래 답변을 살펴볼 때의 출력 ip -o address이의 출력보다 작업하기가 훨씬 쉽다는 점을 명심하십시오 ip address.
jlh

답변:


177

다음과 같이 IP 만 반환하는 스크립트를 작성할 수 있습니다.

/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'

MAC의 경우 :

ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d\  -f2

또는 Linux 시스템의 경우

hostname -i | awk '{print $3}' # Ubuntu 

hostname -i # Debian

4
hostname -i광산에 반환 :::1 127.0.1.1 192.168.1.100
제우스의 예약

1
데비안에서는 IP가 하나뿐입니다. 따라서 사용 hostname은 휴대용이 아닙니다.
Timofey Stolbov 2011

1
그것은 -i 및 -I 모두 불법 옵션 것을 말한다
메이슨

3
요약하면 첫 번째 방법은 어댑터에 따라 다르지만 항상 동일하지는 않습니다. 나를 위해 두 번째는 두 개의 IP 주소를 보여주고 마지막 두 개는 Mac에서 작동하지 않습니다.
Matt

4
ifconfig는 debian 9 (stretch)에서 더 이상 "inet addr : 172.17.0.4"를 출력하지 않고 "inet 172.17.0.4"만 출력하기 때문에 debian 9 (stretch)에서 실패합니다. stackoverflow.com/a/26694162/72717에 설명 된대로 대신 "ip"를 사용하십시오 .
jamshid

61

루프백 127.0.0.1을 포함한 모든 IPv4 인터페이스가 제공됩니다.

ip -4 addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}'

다음 만 표시됩니다 eth0.

ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'

이렇게하면 IPv6 주소를 얻을 수 있습니다.

ip -6 addr | grep -oP '(?<=inet6\s)[\da-f:]+'

eth0IPv6 만 :

ip -6 addr show eth0 | grep -oP '(?<=inet6\s)[\da-f:]+'

grep -oP비지 박스의 v1.24.1 실패 : 잘못된 옵션 - P
프로 백업

1
grep은 prod를 위해 거의 모든 도커 conatiner에 설치되지 않습니다. 따라서 모두 좋은 명령이지만 컨테이너에서는 유용하지 않습니다
AndyGee

1
내 특정 사례에 대한 최고의 답변입니다. -PPerl 정규식에 대한 스위치 가 필요 합니다. 그렇지 않으면 lookbehind (?<=inet\s)토큰을 사용할 수 없습니다 . grep -oe 'inet [0-9\.]\+'또는 실행하여 비슷한 결과를 얻을 수 grep -oe 'inet6 [0-9a-f:]\+'있지만 이렇게하면 첫 번째 단어를 제거 할 수 없습니다. SuSE man grep에서 -P플래그는 실험적 이라고보고합니다 .
Jorge Bellon 19 년

이것이 최고의 답변입니다. ifconfig는 대부분의 OS에서 몇 년 동안 사용되지 않습니다.
pozcircuitboy

2
두 번째 명령의 더 짧은 버전 :ip -4 a show eth0 | grep -Po 'inet \K[0-9.]*'
tukusejssirs

40

일반적으로 시스템에 하나의 IP 주소 만 있다는 보장은 없습니다. 예를 들어 이더넷과 WLAN 연결을 모두 가질 수 있으며 활성 VPN 연결이있는 경우 또 다른 IP 주소를 갖게됩니다.

리눅스

Linux에서는 hostname -I현재 IP 주소가 나열됩니다. 항상 하나의 IP 주소 만 반환하는 것에 의존하는 것은 일부 시나리오 (예 : VPN 링크가 작동 중임)에서 예상대로 작동하지 않을 가능성이 높으므로보다 안정적인 방법은 결과를 배열로 변환 한 다음 요소를 반복하는 것입니다.

ips=($(hostname -I))

for ip in "${ips[@]}"
do
    echo $ip
done

OSX

OSX 에서 인터페이스를 알고 있다면 다음을 사용할 수 있습니다.

~$ ipconfig getifaddr en0
192.168.1.123

IP 주소 반환 합니다.

또는 접미사로 시작하는 가능한 인터페이스 이름을 반복 할 수 있습니다 en.

for NUMBER in $(seq 0 5); do
    ip=`ipconfig getifaddr en$NUMBER`
    if [ -n "$ip" ]; then
        myip="$ip"
        break
    fi
done

echo $myip

또한 케이블과 Wi-Fi 연결이 모두 설정된 경우, 머신에 둘 이상의 이더넷 인터페이스가 있거나 VPN 터널이있는 경우 IP 주소를 가져 오는 것이 비 결정적이됩니다.

외부 IP 얻기

외부 IP가 필요한 경우 텍스트 모드 서비스를 쿼리 할 수 ​​있습니다. 예를 들어 curl https://ipecho.net/plain일반 텍스트 외부 IP를 반환합니다 .

그리고 외부 IP를 얻는 더 빠른 방법은 알려진 DNS 서버를 쿼리하는 것입니다.

dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short

LAN IP 주소를 얻는 방법?
diEcho

17
hostname -I  

이 명령은 Ubuntu에서 원하는 정확한 IP 주소를 제공합니다.


이미 존재하는 (고이 투표) 응답의 수와 비교하여, 나는 생각하지 돈 대답은 ... 값을 추가합니다
미샤

4
또한 CentOS의 호스트 이름 -I에 (내가 대문자)
zzapper

1
이 사실은 나에게 도움이 - 저명한 대문자 'I'키이었다
ChronoFish

2
마찬가지로, 이것은 추가 도구없이 완벽하게 작업을 수행하며 출력을 정리하기 위해 15 개의 바이너리를 연속으로 호출 할 필요가 없습니다. 감사 !
Ulrar

11

최신 Ubuntu 버전 ( 14.04-16.04 )에서이 명령이 나를 위해 트릭을 수행했습니다.

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

1
매뉴얼 페이지에서 : "[...]이 옵션은 모든 네트워크 인터페이스에 구성된 모든 주소를 열거합니다. [...] 출력 순서에 대해 어떤 가정도하지 마십시오". 마지막 문장은 print $1올바른 결과를 제공하거나 제공하지 않을 수 있음을 알려줍니다 .
0 0

7

환경이 제한된 경우 다음 명령을 사용할 수 있습니다.

ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1

3
또는 심지어 :ip -o -4 addr show dev eth0 | cut -d' ' -f7 | cut -d'/' -f1
Jose Alban 2018

네, 맞아요. 그러나 eth0에 두 개 이상의 IP 주소가있는 경우 모든 IP 주소가 표시되므로주의하십시오.
caglar

bash-4.4 # ip -4 addr show dev eth0 | grep inet | tr -s ""| 잘라 내기 -d ""-f3 | 머리 / 16 일 172.17.0.3/16 그래서 좋지 -n
AndyGee

루프에 하나 더 추가 : ip -4 addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1. v4 및 v6 :ip addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1
Sumit Murari

인터페이스 이름을 알지 못하거나 (또는 ​​플랫폼마다 ip -4 addr show eth0 | grep inetip -4 addr show | grep 192
다름)

6

Mac OS X 에서 IP 주소 만 얻으려면 다음 명령을 입력 할 수 있습니다.

ipconfig getifaddr en0

4

명령 ifconfig이 무시되고 ipLinux에서 명령을 사용해야합니다 .

또한 ip a사용하기 쉽도록 IP와 동일한 줄에 범위를 제공합니다.

이 명령은 글로벌 (외부) IP를 표시합니다.

ip a | grep "scope global" | grep -Po '(?<=inet )[\d.]+'

모든 IPv4 (또한 127.0.0.1) :

ip a | grep "scope" | grep -Po '(?<=inet )[\d.]+'

모든 IPv6 (또한 :: 1) :

ip a | grep "scope" | grep -Po '(?<=inet6 )[\da-z:]+'

4

2 개의 명령 (ifconfig + awk) 만 사용하여 원하는 IP (v4)를 얻을 수 있습니다.

Linux에서 eth0인터페이스 에서 IP 주소를 얻는다고 가정 하고 다음 명령을 실행하십시오.

/sbin/ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'

OSX에서 en0인터페이스 에서 IP 주소를 가져 오는 것으로 가정 하고 다음 명령을 실행합니다.

/sbin/ifconfig en0 | awk '/inet /{print $2}'

공개 / 외부 IP를 확인하려면이 기능을 ~/.bashrc

whatismyip () {
    curl -s "http://api.duckduckgo.com/?q=ip&format=json" | jq '.Answer' | grep --color=auto -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
}

그런 다음 실행하십시오. whatismyip


4

eth0다른 텍스트없이 의 IP 주소 만 인쇄하려면 :

ifconfig eth0 | grep -Po '(?<=inet )[\d.]+'

기본 인터페이스를 확인하려면 ( "eth0"이 아닐 수 있으므로) 다음을 사용하십시오.

route | grep ^default | sed "s/.* //"

위의 두 줄을 다음과 같이 단일 명령으로 결합 할 수 있습니다.

ifconfig `route | grep ^default | sed "s/.* //"` \
  | grep -Po '(?<=inet )[\d.]+'

3

나는 Bash 별칭으로 작동하는 간단한 것을 원했습니다. 나는 그것이 hostname -I나에게 가장 잘 작동 한다는 것을 알았 습니다 (호스트 이름 v3.15). hostname -i어떤 이유로 루프백 IP를 반환하지만 hostname -Igrep 또는 awk를 통해 출력을 파이프 할 필요없이 wlan0에 대한 올바른 IP를 제공합니다. 단점은 둘 이상의 IP가있는 경우 모든 IP hostname -I를 출력 한다는 것 입니다.


2

그것은 Mac에서 트릭을 할 것입니다.

ping $(ifconfig en0 | awk '$1 == "inet" {print $2}')

그것은 ping 192.168.1.2내 컴퓨터에서 해결되었습니다 .

프로 팁 : $(...)서브 쉘의 괄호 안에있는 모든 것을 실행하고 값으로 반환합니다.


2

에서 man hostname자동으로 전용 공간이 호스트 IP 주소에 할당 된 모든 목록을 분리 IP를 루프백 제외하고 보여주는 훨씬 더 쉬운 방법이있다 :

root@srv:~# hostname --all-ip-addresses
11.12.13.14 192.168.15.19 

root@srv:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
   inet6 ::1/128 scope host 
   valid_lft forever preferred_lft forever
2: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
  link/void 
  inet 11.12.13.14/32 scope global venet0:0
  inet 192.168.15.19/32 scope global venet0:1

2

다음 명령을 사용할 수도 있습니다.

ip route | grep src

참고 : 인터넷에 연결되어있는 경우에만 작동합니다.


2

몇몇 답변을 새로운 사용하고있는 것으로 나타 ip명령 (교체 ifconfig) 그래서 여기에 하나를 그 용도 ip addr, grepawk단지와 관련된 IPv4 주소를 인쇄하려면 wlan0인터페이스를 :

ip addr show wlan0|grep inet|grep -v inet6|awk '{print $2}'|awk '{split($0,a,"/"); print a[1]}'

가장 간결하거나 멋진 솔루션은 아니지만 이해하기 쉽고 (아래 설명 참조) 다음과 같이 MAC 주소의 마지막 3 옥텟을 가져 오는 것과 같은 다른 목적으로 수정하기 쉽습니다.

ip addr show wlan0|grep link/ether|awk '{print $2}'|awk '{split($0,mac,":"); print mac[4] mac[5] mac[6]}'

설명 : ip addr show wlan0 이름이 인 네트워크 인터페이스와 연관된 정보를 출력 wlan0하며 다음과 유사해야합니다.

4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether dc:a6:32:04:06:ab brd ff:ff:ff:ff:ff:ff
    inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::d340:5e4b:78e0:90f/64 scope link 
       valid_lft forever preferred_lft forever

다음으로 grep inet포함하지 않는 라인 걸러 "INET"(IPv4 및 IPv6 구성)하고 grep -v inet6, 나머지 라인 걸러 이와 같은 한 행 야기한다 "INET6"를 포함 :

    inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0

마지막으로 첫 번째 awk는 "172.18.18.1/24"필드를 추출하고 두 번째는 IPv4 주소 만 남기고 네트워크 마스크 속기를 제거합니다.

또한 스크립팅을하는 경우이 정보를 얻기위한 더 풍부하고 강력한 도구가 많이 있으며 대신 사용하고 싶을 수도 있다는 점을 언급 할 가치가 있다고 생각합니다. 예를 들어 Node.js를 사용하는 경우 ipaddr-linux, Ruby를 사용하는 경우 linux-ip-parser등이 있습니다.

참조 /unix/119269/how-to-get-ip-address-using-shell-script



1

다음은 우선 순위에 따라 정렬 된 인터페이스 목록을 전달할 수있는 내 버전입니다.

getIpFromInterface()
{
    interface=$1
    ifconfig ${interface}  > /dev/null 2>&1 && ifconfig ${interface} | awk -F'inet ' '{ print $2 }' | awk '{ print $1 }' | grep .
}

getCurrentIpAddress(){
    IFLIST=(${@:-${IFLIST[@]}})
    for currentInterface in ${IFLIST[@]}
    do
        IP=$(getIpFromInterface  $currentInterface)
        [[ -z "$IP" ]] && continue
    echo ${IP/*:}
    return
    done
}

IFLIST=(tap0 en1 en0)
getCurrentIpAddress $@

따라서 VPN, Wi-Fi 및 이더넷에 연결되어 있으면 VPN 주소 (인터페이스 tap0)가 반환됩니다. 이 스크립트는 Linux와 OSX에서 모두 작동하며 IFLIST를 재정의하려는 경우 인수를 사용할 수 있습니다.

IPV6를 사용하려면 'inet'를 'inet6'으로 바꿔야합니다.


1

나는 항상 예상치 못한 시간에 이것을 필요로하며, 실패하지 않고 SO에서 이와 같은 스레드를 검색하게됩니다. 내가 전화에서 netstat를 통해 IPv4 주소를 얻을 수있는 간단한 스크립트를 썼다 그래서 echoip- 당신은 여기에서 찾을 수 있습니다 . 네트워크 주소에 대한 bash는 다음과 같으며 ipecho.net에서 공개 주소도 가져옵니다.

IPV4='\d+(\.\d+){3}'
INTERFACES=`netstat -i | grep -E "$IPV4" | cut -d ' ' -f 1`
INTERFACE_IPS=`netstat -i | grep -oE "$IPV4"`

for i in "${!INTERFACES[@]}"; do
  printf "%s:\t%s\n" "${INTERFACES[$i]}" "${INTERFACE_IPS[$i]}"
done

echoip스크립트는 다음과 같은 출력을 얻을 수 :

$ echoip
public: 26.106.59.169
en0:    10.1.10.2

1

이 한 줄 스크립트를 사용하십시오 : ifconfig | grep "inet " | grep -v 127.0.0.1|awk 'match($0, /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {print substr($0,RSTART,RLENGTH)}' mac & linux (우분투에서 테스트 됨) 둘 다 작동합니다.


둘 다에서 작동한다는 것이 좋습니다. 또한 원하는 인터페이스를 알고 있다면 ifconfig en0또는 ifconfig eth1기타로 전화 할 수 있습니다. :)
jaygooby

1

나는 awk스크립트에서 사용하지 않는 것을 선호합니다 .. ipJSON으로 출력하는 옵션이 있습니다.

생략 $interface하면 모든 IP 주소를 얻습니다.

ip -json addr show $interface | \
  jq -r '.[] | .addr_info[] | select(.family == "inet") | .local'

나는 ip 명령과 같은 json 구조 형식의 명령 결과를 좋아합니다. 여기에 상기와 유사한 IP 주소를 얻을 수있는 또 다른 방법입니다 bash ip -j addr show eth0 | jp "[0].addr_info[?family== 'inet'].local | [0]"
잭 리우 Shurui

0
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

모든 IP를 보여줍니다


0

Redhat 64 비트에서는이 문제가 해결되었습니다.

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

또는 이것 : curl ifconfig.me
스테이트 햄

0
#!/bin/sh
# Tested on Ubuntu 18.04 and Alpine Linux 
# List IPS of following network interfaces:
# virtual host interfaces
# PCI interfaces
# USB interfaces
# ACPI interfaces
# ETH interfaces
for NETWORK_INTERFACE in $(ls /sys/class/net -al | grep -iE "(/eth[0-9]+$|vif|pci|acpi|usb)" | sed -E "s@.* ([^ ]*) ->.*@\1@"); do 
    IPV4_ADDRESSES=$(ifconfig $NETWORK_INTERFACE | grep -iE '(inet addr[: ]+|inet[: ]+)' | sed -E "s@\s*(inet addr[: ]+|inet[: ]+)([^ ]*) .*@\2@")
    IPV6_ADDRESSES=$(ifconfig $NETWORK_INTERFACE | grep -iE '(inet6 addr[: ]+|inet6[: ]+)' | sed -E "s@\s*(inet6 addr[: ]+|inet6[: ]+)([^ ]*) .*@\2@")
    if [ -n "$IPV4_ADDRESSES" ] || [ -n "$IPV6_ADDRESSES" ]; then
        echo "NETWORK INTERFACE=$NETWORK_INTERFACE"
        for IPV4_ADDRESS in $IPV4_ADDRESSES; do 
            echo "IPV4=$IPV4_ADDRESS"
        done
        for IPV6_ADDRESS in $IPV6_ADDRESSES; do 
            echo "IPV6=$IPV6_ADDRESS"
        done
    fi
done

0

NAT가 적용된 호스트에서 외부 IP 주소를 찾을 때 다음과 같은 HTTP 기반 방법을 사용하는 것이 좋습니다 ifconfig.me.

$ curl ifconfig.me/ip

수년 동안 이러한 많은 사이트가왔다 갔다하는 것을 보았습니다.이 DNS 기반 방법이 더 강력하다는 것을 알았습니다.

$ dig +short myip.opendns.com @resolver1.opendns.com

다음과 같은 편리한 별칭이 있습니다 ~/.bashrc.

alias wip='dig +short myip.opendns.com @resolver1.opendns.com'

0

이 두 가지 방법이 저에게 효과적이었습니다.

인터페이스 eth0의 IP 주소를 얻으려면. 아래 예에서 eth0을 인터페이스 이름으로 바꿉니다. ifconfig eth0 | grep -w "inet" | tr -s " " | cut -f3 -d" "

호스트 이름 사용 : 이것은 당신에게 당신의 etho의 inet, 즉 IPAddress를 줄 것입니다. -I 사용하면이 값이있는 모든 인터페이스의 inet 값을 제공합니다.

hostname -i


-1
curl ifconfig.co 

이것은 시스템의 IP 주소 만 반환합니다.


1
이를 위해서는 인터넷 연결이 필요하며 공개적으로 볼 수있는 IP 주소를 반환합니다. 이는 원하는 것일 수도 있고 아닐 수도 있습니다.
jlh

-2

내가 사용하는 것이 Hostname -L스크립트의 변수로 사용에 바로 IP를 얻을 수 있습니다.


아마도 당신은 hostname -i또는 hostname -I?
jlh

user@linux:~$ Hostname -L -bash: Hostname: command not found user@linux:~$ 1. 자본 H이 잘못되었습니다 2. -L
Sabrina
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.