스크립트를 사용하여 VPN 게이트웨이를 찾는 올바른 방법

스크립트를 사용하여 VPN 게이트웨이를 찾는 올바른 방법

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'

관련 정보