我需要找到我的 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'