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'