スクリプトを使用して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

他のもののため。

私が試した他の2つの解決策は次のとおりです。

❯ 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'

関連情報