vpn0
스크립트를 사용하여 라우팅을 올바르게 설정할 수 있도록 내 VPN 인터페이스( )가 연결에 사용하는 IP를 찾아야 합니다 .
이를 수행하는 올바른 방법은 무엇입니까?
내가 시도한 첫 번째 솔루션
❯ ip r | sed -rn "s/.*dev vpn0 proto kernel scope link src ([0-9.]+) .*/\1/p"
10.8.231.186
ip r
그러나 이것은 반환하기 때문에 두 컴퓨터 모두에서 작동하지 않습니다.
10.8.224.0/20 dev vpn0 proto kernel scope link src 10.8.231.186 metric 50
그 중 하나를 위해 그리고
10.8.224.0/20 dev vpn0 scope link
다른 것을 위해.
내가 시도한 다른 두 가지 솔루션은 다음과 같습니다.
❯ ip a s dev vpn0 | sed -rn 's/.*inet (([0-9]+\.){3}[0-9]+).*/\1/p'
10.8.231.186
❯ ifconfig vpn0 | sed -rn "s/.*destination ([0-9.]+)/\1/p"
10.8.231.186
어떻게 해야 합니까?
편집하다(현재 제가 가지고 있는 것입니다)
get-endpoint() {
if hash jq 2>/dev/null; then
ip -4 -j a | jq -r ".[] | select(.ifname == \"${1}\").addr_info[0].local"
else
ip -4 a s dev "${1}" | sed -rn 's/.*inet (([0-9]+\.){3}[0-9]+).*/\1/p'
fi
}
답변1
PCRE를 지원하는 GNU가 있다면 grep
다음과 같이 사용할 수 있습니다
ip r | grep -oP ' vpn0 .* src \K[0-9.]+'
\K
"일치해야 하지만 표시하지 않음" 조건을 "이 일치 표시" 패턴에서 분리합니다 .
실제 사례
printf "%s\n%s\n" '10.8.224.0/20 dev vpn0 proto kernel scope link src 10.8.231.186 metric 50' '10.8.224.0/20 dev vpn0 scope link' |
grep -oP ' vpn0 .* src \K[0-9.]+'
10.8.231.186
ip route
아니면 왜 인터페이스 주소를 찾고 있는지 전혀 모르겠으므로 ip address
이를 사용하고 구문 분석하세요.
ip a |
awk -v netif='vpn0' '
$2 == netif ":" { this=1 }
this && $1 == "inet" { gsub("/[[:digit:]]+", "", $2); print $2; exit }
'
아니면 라인으로
ip a | awk -v netif='vpn0' '$2==netif":" {this=1} this && $1=="inet" {gsub("/[[:digit:]]+","",$2); print $2; exit}'
또 다른 옵션은 제공할 수 있는 JSON을 구문 분석하는 것입니다 ip
(스크립트가 있다고 가정하면 스크립트에 더 나은 옵션일 수 있음 jq
).
ip -j address |
jq -r '.[] | select(.ifname | contains("vpn0")) | .addr_info[0].local'