eth0 인터페이스에 IP 주소 표시


24

스크립트를 사용하여 eth0에 표시된 IP 주소를 어떻게 표시 할 수 있습니까?

답변:


28

이것을 파일에 저장하고 실행하십시오. bash <filename>

#!/bin/bash
ifconfig eth0 | grep "inet addr"

IP 주소를 보여주는 숫자 만 얻는 것이 더 정확합니다.

#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1

업데이트 : 이것이 효과가 없다면 다른 대답을 시도하십시오.


2
물론 이것은 최신 우분투에서는 작동하지 않습니다. "INET <IP>"대신 "INET 요지 <IP>"의 최신 ifconfig를 반환

당신은 그냥 사용할 수 있습니다grep "inet"
Andrei Radulescu

26

다른 옵션을 제공하기 위해 다음과 같은 ip addr명령을 사용 하여 IP 주소를 얻을 수 있습니다.

ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
  • ip addr show eth0 에 대한 정보를 보여줍니다 eth0
  • grep "inet\b"IPv4 주소가있는 행만 표시합니다 (IPv6 주소를 원하는 경우로 변경 "inet6\b").
  • awk '{print $2}' ipaddress / mask가있는 두 번째 필드에 인쇄합니다 (예 : 172.20.20.15/25
  • cut -d/ -f1 IP 주소 부분 만 사용합니다.

스크립트에서 :

#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)

이 솔루션은 실제로 작동합니다!
thang

ip -4 ... 및 ip -6 ...! 고맙습니다!
TamusJRoyce

17

/programming//a/14910952/1695680 에서 가져온

hostname -i

그러나 로컬 IP 주소 (127.0.0.1)를 반환 할 수 있으므로 다음을 사용하고 필터링해야 할 수도 있습니다.

hostname -I

호스트 이름 맨 페이지에서 :

-i, --ip-address

호스트 이름의 네트워크 주소를 표시하십시오. 호스트 이름을 확인할 수있는 경우에만 작동합니다. 이 옵션을 사용하지 마십시오. 대신 hostname --all-ip-addresses를 사용하십시오.

-I, --all-ip-addresses

호스트의 모든 네트워크 주소를 표시하십시오. 이 옵션은 모든 네트워크 인터페이스에서 구성된 모든 주소를 열거합니다. 루프백 인터페이스 및 IPv6 링크 로컬 주소는 생략되었습니다. 옵션 -i와 달리이 옵션은 이름 확인에 의존하지 않습니다. 출력 순서에 대해 어떤 가정도하지 마십시오.


기록을 위해, 내가 좋아하는 ip addr show label 'enp*'더 나은,하지만 성가신 구문 분석, 같은 것입니다 ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2방법 꽤 캔 작업 ...
ThorSummoner

5

@ markus-lindberg의 답변은 제가 가장 좋아하는 것입니다. -o -4ip 플래그에 추가 하면 훨씬 더 쉽게 파싱 가능하고 일관된 출력을 얻을 수 있습니다.

ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'

-o--oneline이러한 종류의 상황에서 정확히 도움을주기위한 것입니다. 는 -4다른 모든 응답이 의미하는 것입니다 IPv4 주소에 한계에 추가됩니다.


ip깃발을 사랑하십시오 . cut고급 awk마법사 대신 사용 :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
DuffJ

@DuffJ 아마 개인적인 취향의 문제 일 것입니다. 에 cut대해 알게 된 후 "발견" awk되었으며 파이프 라인의 명령 수를 최소화하는 것을 좋아합니다. 어쨌든 좋은 제안.
Amos Shapira

전적으로 동의합니다, 아모스 솔루션 주셔서 감사합니다!
DuffJ

3

여기에 하나의 라이너가 있습니다 .....

어 wk

ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'

위 awk 명령의 split 함수는 구분 기호를 기준으로 두 번째 열을 :분할하고 분할 된 값을 연관 배열에 저장합니다 a. a[2]두 번째 부분의 가치도 마찬가지 입니다.

sed

ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'

기본 sed \(...\)에서 문자를 캡처하는 데 사용되는 캡처 그룹이라고합니다. 우리는 역 참조를 통해 캡처 된 캐릭터를 참조 할 수 있습니다. \([^[:space:]]\+\)한 번 이상 공백이 아닌 문자를 캡처합니다.

grep

ifconfig eth0 | grep -oP 'inet addr:\K\S+'

\K이전에 일치 한 문자가 최종 인쇄시 인쇄 \S+되지 않고 하나 이상의 공백이 아닌 문자 와 일치합니다.

ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'

inet addr:문자열 옆에있는 하나 이상의 공백이 아닌 문자 가 캡처되고 마지막으로 캡처 된 문자 만 인쇄합니다.


@edwardtorvalds가 설명을 추가했습니다. 나는 이것이 미래 독자들에게 도움이 될 것이라고 생각합니다. 위의 명령에서 질문을 주시기 바랍니다 ... :)
Avinash Raj

2

다음은 좋은 방법입니다. grep 만 보조 명령으로 사용합니다.

ip addr show eth0 | grep -oP 'inet \ K \ S [0-9.] +'

왜 필요한 것보다 많은 명령을 사용해야하는지 모르겠습니다


2

당신은 사용해야합니다 ip(대신 ifconfig그것은 일관성 및 분석 할 수있는 출력을 생성, 스크립팅을 위해 가장 중요한 것은 아마도 유지 그것의 현재로)합니다. 다음은 몇 가지 유사한 접근법입니다.

이더넷 인터페이스에 IPv4 주소를 원하는 경우 eth0:

$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24  

스크립트로 :

$ INTFC=eth0  
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}') 
$ echo $MYIPV4
192.168.1.166/24

위에서 생성 된 출력은 CIDR 표기법으로되어 있습니다. CIDR 표기법을 원하지 않으면 제거 할 수 있습니다.

$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1 
192.168.1.166  

IMHO가 "가장 우아하다"는 다른 옵션은 지정된 원격 호스트 (이 경우 8.8.8.8)에 연결하는 데 사용되는 모든 인터페이스의 IPv4 주소를 가져옵니다. 이 답변 에서 @gatoatigrado의 예의 :

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

스크립트로 :

$ RHOST=8.8.8.8  
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166

이는 단일 인터페이스가있는 호스트에서 완벽하게 작동하지만 여러 인터페이스 및 / 또는 경로 사양이있는 호스트에서도 더 유리하게 작동합니다.

하지만 ip내 선호 된 접근을 할 것, 그것은 확실히이 고양이를 피부 할 수있는 유일한 방법이 아니다. hostname더 쉽고 간결한 것을 선호하는 경우 사용 하는 또 다른 방법이 있습니다.

$ hostname --all-ip-addresses | awk '{print $1}'  

또는 IPv6 주소를 원하는 경우 :

$ hostname --all-ip-addresses | awk '{print $2}'  

스크립트로 :

$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}') 
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166 
$ echo $MYV6IP 
2601:7c1:103:b27:352e:e151:c7d8:3379

1

이 목적을 위해 특별히 설계된 netifaces 와 같은 Python 라이브러리를 사용하는 것이 좋습니다 .

sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"

사용중인 기본 네트워크 인터페이스를 가져옵니다.

default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]


1

awk가없는 경우 유용 할 수있는 옵션이 하나 더 있습니다 (일부 임베디드 장치의 경우와 같이).

ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"


1

여기에 대한의 IPv4의 :

ip -f inet a|grep -oP "(?<=inet ).+(?=\/)"

다음은 IPv4 및 특정 개발자 (eth0)를위한 것입니다.

ip -f inet a show eth0|grep -oP "(?<=inet ).+(?=\/)"

에 대한 IPv6를 :

ip -6 -o a|grep -oP "(?<=inet6 ).+(?=\/)"


0

일반 사용자도 사용할 수 있습니다.

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6

그는 eth0을 요청합니다.이 버전의 스크립트는 도움이 될 수도 있습니다 (루프백 표시)ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
TiloBunt

이것은 거의 같은 대답 askubuntu.com/a/560466/367990 만 사용하여, cut대신의 조합으로 두 번 awkcut출력을 구문 분석 할 수 있습니다. 다음에 다른 모든 답변을 먼저 확인하고 중복 된 솔루션을 게시하지 않아야합니다. 이 경우에는 중복인지 또는 비슷한 지 논쟁의 여지가 있으므로 일반적인 힌트로 사용하십시오. 감사.
바이트 사령관

0

이것이 내가 찾을 수있는 가장 짧은 방법입니다.

ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'

$1네트워크 인터페이스로 교체하십시오 .

ip -f inet ip에게 inet (ipv4) 제품군의 값만 반환하도록 지시합니다.

grep -Po grep에게 다음 값을 perl-regex로 해석하고 일치하는 값만 인쇄하도록 지시합니다.

정규 표현식 \K[\d.]+은 "이 시점까지 모든 것을 버리고 (\ K) 가능한 한 많은 숫자 값과 한 행의 점을 찾습니다"라고 말합니다. 따라서 이것은 IP 주소와 만 일치하며 짧은 \ XX 서브넷 마스크를 포함하여 그 이후의 모든 것을 무시합니다.


0

요즘에는 다중 인터페이스 (예 : 도커를 사용하는 경우)가 있고 ETH의 인터페이스 이름 지정은 더 이상 표준이 아닙니다.

이 명령을 사용하여 IP / Mask를 추출합니다.

IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)

따라서 내가 가진 인터페이스 수와 이름에 관계없이 GREP은 MULTICAST 옵션을 가진 첫 번째 인터페이스 만 가져옵니다.

이 명령을 사용하여 마스크없이 IP 만 추출합니다.

IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)

나는 다른 BDS & NIX 에서이 명령을 사용합니다.


의 출력을 구문 분석 ip하려면 -o옵션을 사용하십시오 .
muru

0

내 스크립트에서 나는 다음과 같은 것을 사용하고 있습니다 :

re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
    echo ${BASH_REMATCH[1]}
else
    echo "Cannot determin IP" 1>&2
fi

프로세스를 생성하지 않습니다.


0

또 다른 방법 ( CIDR주소를 원하지 않고 원하는 경우 IPv4) :

$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
  • ip아닌 명령을 사용합니다deprecated
  • 필터링을 위해 하나의 명령 만 사용
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.