ifconfig 명령에서 첫 번째 IP 주소를 캡처하는 방법은 무엇입니까?


9

ifconfig명령 에서 오는 첫 번째 IP 주소를 캡처하는 방법은 무엇입니까?

ifconfig -a
enw178032: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 100.14.22.12  netmask 255.255.0.0  broadcast 100.14.255.255
        inet6 fe80::250:56ff:fe9c:158a  prefixlen 64  scopeid 0x20<link>
        ether 00:10:56:9c:65:8a  txqueuelen 1000  (Ethernet)
        RX packets 26846250  bytes 12068811576 (11.2 GiB)
        RX errors 0  dropped 58671  overruns 0  frame 0
        TX packets 3368855  bytes 1139160934 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

예상 결과:

IP=100.14.22.12

3
이 질문은 awk 또는 grep / cut 등을 사용하여 답변되었습니다. 그러나 여전히 ifconfig에서 grep을 사용하고 grep하는 것은 여전히 ​​나쁜 생각입니다. ip는 최신 Linux 빌드에서 더 적합하고 더 잘 지원됩니다.
Pedro

1
이것은 XY 문제처럼 들립니다. 어떤 정보를 정말로 원하십니까? 기기의 주요 네트워크 연결 IP 주소? 기기의 네트워크 연결 IP 주소가 있습니까? 첫 번째 네트워크 어댑터의 IP 주소? IP 주소가 무엇이든 상관 없습니다. 필요한 정보를 얻는보다 직접적이고 정확하며 이식 가능한 방법이있을 것입니다.
alex.forencich

답변:


20

ifconfig스크립트에서 IP 주소를 가져 오는 데 사용하지 않는 것이 좋습니다 . 일부 배포에서는 더 이상 사용되지 않습니다 (예 : CentOS 및 기타), 더 이상 기본적으로 설치하지 마십시오).

다른 시스템에서 ifconfig의 출력은 배포 릴리스에 따라 다릅니다 (예 : 출력 / 간격 / 필드는 ifconfig데비안 8과 데비안 9에서 다릅니다).

ip와 비슷한 방법으로 IP 주소를 얻으려면 다음과 같이 요청하십시오.

ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '

아니면 더 나은 :

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '
192.168.1.249

또는 "IP ="를 물어 보면

#!/bin/bash
echo -n "IP="
ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '

@Roman의 아이디어를 뻔뻔스럽게 적용

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print "IP="$4 } ' 
IP=192.168.1.249

정상 출력 :

 $ ip -o -4  address show 
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
2: eth0    inet 192.168.1.249/24 brd 192.168.1.255 scope global eth0\       valid_lft forever preferred_lft forever

보낸 사람 man ip:

-o, -oneline은
각 레코드를 한 줄로 출력하여 줄 바꿈을 '\'문자로 바꿉니다. 이것은 wc (1)로 레코드를 세거나 출력을 grep (1) 할 때 편리합니다.

ifconfig권장되지 않는 이유의 한 가지 예를보십시오 . BBB :`bbb-conf --check` IP 주소를`inet`로 표시-ifconfig woes

ifconfig나가는 이유를 이해 하려면 'ifconfig'와 'ip'명령의 차이점을 참조하십시오.

ifconfignet-tools에서 왔으며 오랫동안 Linux 네트워크 스택을 완전히 따라갈 수 없었습니다. 또한 네트워크 구성에 여전히 ioctl을 사용하는데, 이는 커널과 상호 작용하는 추악하고 덜 강력한 방법입니다.

2005 년경 네트워크 스택을 제어하기위한 새로운 메커니즘 인 netlink 소켓이 도입되었습니다.

네트워크 인터페이스를 구성하려면 iproute2전이중 네트워크 링크 소켓 메커니즘을 ifconfig사용하고 ioctl 시스템 호출을 사용합니다.


기계에서이 이름이 바뀌기 때문에 eth0을 기본값으로 설정하지 않는 것을 선호합니다. 유연한 구문을 제공 할 수 있습니다
yael

@yael 변경됨, eth0을 가져 왔습니다. 그러나 Roman은 "IP ="inside 인쇄하는 것보다 나을 것 awk입니다. 나를 위해 너무 많은 두뇌 능력, 여전히 깨어 있습니다. 피하십시오 ifconfig. 미래가 아니며 IP 주소의 위치가 변경되면 Linux에 대해 적어도 두 가지 버전 / 구현 (?)이 있습니다.
Rui F Ribeiro

참고로 최신 버전의 iproute2 (예 : CentOS7 및 Debian8에는 없음)에서 ip는 -brief매개 변수를 사용할 수 있으며 출력을 구문 분석하기가 더 쉬워집니다 (2015-08-31 : git.kernel.org/pub/scm/network/iproute2 /iproute2.git/commit/… )
AB

@AB도 -o 도움을 줄 때 감사합니다. ou를 확인합니다
Rui F Ribeiro

1
아, 나는 -o스크립트 에 어떤 것이 실제로 유용한 지 몰랐다
AB


-3
ip addr | grep -v 127.0.0.1 | grep 'inet ' | \
awk {'print $2'} | awk -F "/" {'print "IP="$1'}

1
ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '
Rui F Ribeiro

1
localhost IP 127.0.0.1을 왜 그리 집니까?
Jeff Schaller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.