【问题标题】:Linux/Unix check if VPN connection is Active/UpLinux/Unix 检查 VPN 连接是否激活/启动
【发布时间】:2015-07-15 03:17:46
【问题描述】:

我有一个代码可以检测 OpenVPN 连接是打开还是关闭:

if echo 'ifconfig tun0' | grep -q "00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00"
then
echo "VPN up"
else
echo "VPN down"
fi
exit 0

现在我正在尝试重新编写代码以使用 PPTP 或 IPSEC 连接。我已经尝试过:

if echo 'ifconfig ppp0' | grep -q "00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00"

或与 ipsec 相同但不起作用。有没有其他方法可以检测 PPTP 或 IPSEC 连接?

【问题讨论】:

  • echo 的用法很奇怪。这些应该是反引号吗?
  • 这里有完整的代码并不奇怪:if echo 'ifconfig tun0' | grep -q "00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00" then echo "VPN up" else echo 1 > /usr/syno/etc/synovpnclient/vpnc_connecting synovpnc reconnect --protocol=openvpn --name=XXXXXX fi exit 0
  • 所以基本上我需要在 VPN 关闭后重新连接...重新连接脚本工作正常,但我正在努力解决“如果”
  • 对于看到这个问题的任何人,if echo 'ifconfig tun0' | grep -q "00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00" 的意思是:检查字符串“ifconfig tun0”是否包含字符串“00-00-00-00-00-00-00- 00-00-00-00-00-00-00-00-00"。一个正确的例子是if ifconfig tun0 | grep -q "00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00"(没有回显,没有单引号),这意味着:运行ifconfig tun0,然后从其输出中检查字符串

标签: linux unix ubuntu ssh vpn


【解决方案1】:

echo 声明是错误的。正如@unwind 所说,单引号(')应该是反引号(`)。您当前的代码将文字值 ifconfig ppp0 发送到 grep,这没有任何用处。

但您实际上也不需要反引号。您可以将ifconfig 的输出发送到grep 目录;使用echo 不会给你任何东西:

if ifconfig ppp0 | grep -q "00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00"; then
  echo ppp connection is up
fi

【讨论】:

  • 在您的示例中,当没有 vpn 且没有 vpn 连接时,我得到“ifconfig: ppp0: error fetching interface information: Device not found”。
  • 在我的情况下是 tun0 而不是 ppp0
【解决方案2】:

以下脚本将:

  • 每 5 分钟运行一次 ISPConnectivity.sh 脚本。这意味着 VPN 隧道不会关闭超过 5 分钟。
  • 检查tun接口是否关闭,如果是则启动vpn脚本。
  • 如果 tun0 接口已启动,请检查连接性。它对 2 个公共 IP 进行 ping 测试(如果我从所测试的 1 个 IP 中得到一个响应,我认为这是成功的),并且所有人都必须无法运行 vpn 脚本。我在多台主机上运行了 ping 测试,以防止在 1 个 IP 上 ping 测试失败时启动 vpn 脚本。
  • 将所有失败输出发送到我的主目录中的一个文件。我不需要查看是否有任何测试成功。

sudo crontab 的内容:

*/5 * * * * /home/userXXX/ISPConnectivity.sh >> /home/userXXX/ISPConnectivity.log 2>&1

ISPConnectivity.sh 脚本的内容:

#!/bin/bash 

# add ip / hostname separated by white space
#HOSTS="1.2.3.4"
HOSTS="8.8.8.8 4.2.2.4"
# no ping request
totalcount=0
COUNT=4

DATE=`date +%Y-%m-%d:%H:%M:%S`

if ! /sbin/ifconfig tun0 | grep -q "00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00"
then
        echo $DATE      tun0 down
        sudo /home/userXXX/startVPN.sh start
else

        for myHost in $HOSTS;
        do
                count=`ping -c $COUNT $myHost | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }'`
                totalcount=$(($totalcount + $count))
        done

        if [ $totalcount -eq 0 ]
        then
                echo $DATE      $totalcount "fail"
                sudo /home/userXXX/startVPN.sh start
        #else
        #       echo $DATE      $totalcount "pass"
        fi
fi

【讨论】:

  • startVPN.sh 脚本中有什么内容?
【解决方案3】:

您也可以使用 nmcli 命令检查 VPN 是否正在运行。

nmcli c 显示 --active | grep vpn

【讨论】:

  • 如果使用 nmcli 很好,尽管我必须使用 grep 搜索 tun(可能是隧道)
【解决方案4】:

我实际上正在寻找更灵活的解决方案,例如:

MyIP=$(curl http://api.ipify.org/?format=text)
if [ "$MyIP" != "MYORYGINALIP" ]
then
    echo "IPSEC VPN is Running -  " $MyIP
else
    echo "IPSEC VPN is Not Running - " $MyIP
fi
exit 0

那怎么办?我可以改进它吗?

【讨论】:

  • 它只有在你有一个静态 IP 地址的情况下才有效,我不会称之为完全灵活的解决方案。
【解决方案5】:

ip 路由列表 220 如果显示 IP 地址 -> VPN 连接建立,无 -> 无 VPN

如果 [ "0" == ifconfig | grep wlan0 | wc -l ];然后回显“NO wlan0 没有 VPN”; else echo "YES wlan0 has VPN";菲

【讨论】:

    猜你喜欢
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2015-07-27
    • 1970-01-01
    • 2019-01-29
    • 2015-01-13
    • 2019-04-18
    相关资源
    最近更新 更多