等待 SSH 隧道 (ssh -w) 设置后再运行命令

等待 SSH 隧道 (ssh -w) 设置后再运行命令

使用 SSH VPN 隧道(-w 选项)时,有没有办法知道隧道何时实际启动?我想在一个脚本中使用它,通过运行 ssh -w 然后运行 ​​ifup [1] 自动设置隧道。

-f 选项没有帮助,因为它在连接到服务器之后但在隧道建立之前返回。睡几秒钟确实有用,但感觉太老套了。

LocalCommand 选项似乎有效,例如:

ssh -w 0:1 "-oLocalCommand=ifup tun0" "-oPermitLocalCommand=yes" myserver.example.org true

然而,手册页显示:“该命令是同步运行的,无法访问生成它的 ssh(1) 会话。”上述调用是否保证有效,或者只是运气好,在隧道建立后执行了 LocalCommand?

更重要的是,是否有在脚本中使用 ssh -w 的标准方法?

[1] 我在 Fedora 上,ifup 可以工作,因为我已经设置 /etc/sysconfig/network-scripts/ifcfg-tun0/etc/sysconfig/network-scripts/route-tun0

答案1

所以,我发现这里有两个问题:1)如何等待隧道实际启动,或者如何知道它实际上已启动。 2) 是否有在 Fedora 中配置 ssh 隧道的标准方法。

关于1):我个人会使用类似的东西:

timeout=2 # Wait for two seconds for a reply.
ip=192.168.0.1 # Use IP address assigned to tunnel endpoint.
while ! ping -W "$timeout" -c 1 "$ip" &>/dev/null; do
  echo "Waiting for tunnel to be up..."
  sleep 0.5
done
echo "Tunnel is up."

您可以通过使用for具有配置的尝试次数的循环来获得更高级的效果,或者将类似的内容传递-I tun0给 ping 命令以强制使用 tun 设备。

我更喜欢这种方法的一个原因是,隧道本身的建立并不一定意味着会发生通信。可能会有数据包丢失、iptables 规则、路由配置错误……我会小心确保脚本在挂起时会被终止,并确保所有需要隧道的命令都有超时/重试策略。

关于 2):我不知道任何发行版中配置 ssh 隧道的开箱即用机制。这并不意味着它们不存在。过去我曾用过自动SSH

相关内容