使用脚本查找VPN网关的正确方法

使用脚本查找VPN网关的正确方法

我需要找到我的 VPN 接口 ( vpn0) 用于连接的 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 的 GNUgrep你可以使用这样的东西

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'

相关内容