我有 3 个 shell 脚本,每个脚本都包含一个 while true 循环并“调用”home 来打开反向 ssh 隧道。隧道可以正常工作。
我已经在 Google 上搜索过了,但不确定什么方法可行。我主要担心的是脚本中的循环会阻止启动并引发“即发即弃”问题。
我目前无法物理访问远程机器,所以我无法尝试看看它是否有效,我需要一些将要工作,并继续工作。
我希望这个问题是一个循序渐进的指南,因为我对如何解决这个问题所需的东西不是很有信心。
答案1
以前,您可以在 /etc/inittab 底部的“respawn”条目中调用每个脚本,然后就可以完成。很简单。但是自从 Debian 改用 upstart 代替 init 并弃用 inittab 以来,事情变得更加复杂和脆弱。您需要编写一个 upstart 配置文件;这些文件位于 /etc/init 中,而且更容易出错。
您可能要执行的操作是 grep 遍历 /etc/init/* 的内容,查找使用“respawn”关键字的现有配置,并启动一些网络守护程序 - 这些应该已经声明了依赖关系,以确保网络已启动。复制并修改每个隧道的其中一个。惯例是将您自己的配置放在 /etc/init/local/* 中。您可能能够通过在启动期间提前启动隧道来消除一些脆弱性,并在网络尚未启动时让它们挂起、死亡、超时或发生其他情况。如果它们之前重试次数过多,则“respawn”最终会重新生成它们,可能在更长的超时之后。
只要你使用“重生”,你就可以相对地避免挂起启动过程 - 但使用 upstart,一切皆有可能;其增强的灵活性意味着配置错误可能会以不太明显的方式挂起启动;目视检查不再像使用 inittab 那样可靠。
顺便说一句,您可能不需要那些“while true”脚本。我通常使用“autossh”来启动和管理这些类型的隧道。它比典型的脚本更可靠,并且 autossh 命令可以直接放在 /etc/init 配置文件中。
我不太愿意给你一个示例配置文件,因为 upstart 配置可能有很大差异,对我有用的可能对你不起作用(更多的是这种脆弱性)。但这是我的一个 autossh 配置——它可能位于 /etc/init/local/autossh-example.conf 中。你会注意到,我没有明确说明对任何网络设置的依赖性——我希望“respawn”会导致重试,直到网络可用。在远程机器上信任它之前,你需要在一台相同的机器上本地测试它:
start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]
respawn
exec /usr/bin/autossh -R 20042:127.0.0.1:22 -N foo.example.com