내가 작성한 스크립트의 매개 변수로 IP 주소 (inet) 만 사용하려고합니다.
유닉스 터미널에서 검색하는 대신 IP 주소 만 얻을 수있는 쉬운 방법이 ifconfig
있습니까?
ip -o address
이의 출력보다 작업하기가 훨씬 쉽다는 점을 명심하십시오 ip address
.
내가 작성한 스크립트의 매개 변수로 IP 주소 (inet) 만 사용하려고합니다.
유닉스 터미널에서 검색하는 대신 IP 주소 만 얻을 수있는 쉬운 방법이 ifconfig
있습니까?
ip -o address
이의 출력보다 작업하기가 훨씬 쉽다는 점을 명심하십시오 ip address
.
답변:
다음과 같이 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
hostname -i
광산에 반환 :::1 127.0.1.1 192.168.1.100
hostname
은 휴대용이 아닙니다.
루프백 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:]+'
eth0
IPv6 만 :
ip -6 addr show eth0 | grep -oP '(?<=inet6\s)[\da-f:]+'
grep -oP
비지 박스의 v1.24.1 실패 : 잘못된 옵션 - P
-P
Perl 정규식에 대한 스위치 가 필요 합니다. 그렇지 않으면 lookbehind (?<=inet\s)
토큰을 사용할 수 없습니다 . grep -oe 'inet [0-9\.]\+'
또는 실행하여 비슷한 결과를 얻을 수 grep -oe 'inet6 [0-9a-f:]\+'
있지만 이렇게하면 첫 번째 단어를 제거 할 수 없습니다. SuSE man grep
에서 -P
플래그는 실험적 이라고보고합니다 .
ip -4 a show eth0 | grep -Po 'inet \K[0-9.]*'
일반적으로 시스템에 하나의 IP 주소 만 있다는 보장은 없습니다. 예를 들어 이더넷과 WLAN 연결을 모두 가질 수 있으며 활성 VPN 연결이있는 경우 또 다른 IP 주소를 갖게됩니다.
Linux에서는 hostname -I
현재 IP 주소가 나열됩니다. 항상 하나의 IP 주소 만 반환하는 것에 의존하는 것은 일부 시나리오 (예 : VPN 링크가 작동 중임)에서 예상대로 작동하지 않을 가능성이 높으므로보다 안정적인 방법은 결과를 배열로 변환 한 다음 요소를 반복하는 것입니다.
ips=($(hostname -I))
for ip in "${ips[@]}"
do
echo $ip
done
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가 필요한 경우 텍스트 모드 서비스를 쿼리 할 수 있습니다. 예를 들어 curl https://ipecho.net/plain
일반 텍스트 외부 IP를 반환합니다 .
그리고 외부 IP를 얻는 더 빠른 방법은 알려진 DNS 서버를 쿼리하는 것입니다.
dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
hostname -I
이 명령은 Ubuntu에서 원하는 정확한 IP 주소를 제공합니다.
환경이 제한된 경우 다음 명령을 사용할 수 있습니다.
ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1
ip -o -4 addr show dev eth0 | cut -d' ' -f7 | cut -d'/' -f1
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
ip -4 addr show eth0 | grep inet
ip -4 addr show | grep 192
명령 ifconfig
이 무시되고 ip
Linux에서 명령을 사용해야합니다 .
또한 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:]+'
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
eth0
다른 텍스트없이 의 IP 주소 만 인쇄하려면 :
ifconfig eth0 | grep -Po '(?<=inet )[\d.]+'
기본 인터페이스를 확인하려면 ( "eth0"이 아닐 수 있으므로) 다음을 사용하십시오.
route | grep ^default | sed "s/.* //"
위의 두 줄을 다음과 같이 단일 명령으로 결합 할 수 있습니다.
ifconfig `route | grep ^default | sed "s/.* //"` \
| grep -Po '(?<=inet )[\d.]+'
그것은 Mac에서 트릭을 할 것입니다.
ping $(ifconfig en0 | awk '$1 == "inet" {print $2}')
그것은 ping 192.168.1.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
몇몇 답변을 새로운 사용하고있는 것으로 나타 ip
명령 (교체 ifconfig
) 그래서 여기에 하나를 그 용도 ip addr
, grep
및 awk
단지와 관련된 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
등이 있습니다.
다음 명령을 사용하십시오.
/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' '
다음은 우선 순위에 따라 정렬 된 인터페이스 목록을 전달할 수있는 내 버전입니다.
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'으로 바꿔야합니다.
나는 항상 예상치 못한 시간에 이것을 필요로하며, 실패하지 않고 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
나는 awk
스크립트에서 사용하지 않는 것을 선호합니다 .. ip
JSON으로 출력하는 옵션이 있습니다.
생략 $interface
하면 모든 IP 주소를 얻습니다.
ip -json addr show $interface | \
jq -r '.[] | .addr_info[] | select(.family == "inet") | .local'
bash ip -j addr show eth0 | jp "[0].addr_info[?family== 'inet'].local | [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
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'
curl ifconfig.co
이것은 시스템의 IP 주소 만 반환합니다.