私はここで解決策を見つけました:http : //www.g-loaded.eu/2006/11/24/auto-closing-ssh-tunnels/
最善の方法-自動閉鎖するトンネル
前述のとおり、-f -Nスイッチの組み合わせを使用する代わりに、-fだけを使用するだけでなく、リモートマシンでコマンドを実行することもできます。しかし、トンネルを初期化するだけでよいので、どのコマンドを実行する必要がありますか?
これが、睡眠が最も有用なコマンドになるときです!この特定の状況では、睡眠には2つの利点があります。
- 何もしないので、リソースは消費されません
- ユーザーは実行時間を指定できます
これらがsshトンネルの自動クローズにどのように役立つかを以下に説明します。
リモートマシンでsleepコマンドを10秒間実行しながら、バックグラウンドでsshセッションを開始します。秒数は重要ではありません。同時に、以前とまったく同じようにvncviewerを実行します。
[me@local]$ ssh -f -L 25901:127.0.0.1:5901 me@remote.example.org sleep 10; \
vncviewer 127.0.0.1:25901:1
この場合、sshクライアントは、sshセッションをバックグラウンドにフォーク(-f)し、トンネルを作成し(-L 25901:127.0.0.1:5901)、リモートサーバーでsleepコマンドを10秒間実行するように指示されます(sleep 10)。
この方法と以前の方法(-Nスイッチ)との違いは、基本的に、この場合sshクライアントの主な目標はトンネルを作成することではなく、10秒間スリープコマンドを実行することです。トンネルの作成は、副次的な目的である何らかの副作用です。vncviewerを使用しなかった場合、sshクライアントは10秒後に終了します。これは、実行するジョブがなくなるため、同時にトンネルを破壊するためです。
スリープコマンドの実行中に、別のプロセス(この場合はvncviewer)がそのトンネルの使用を開始し、10秒を超えて占有し続けると、sshクライアントがリモートジョブ(スリープの実行)を終了しても、別のプロセスがトンネルを占有しているため、終了します。言い換えると、sshクライアントはvncviewerも殺さなければならないため、トンネルを破壊できません。vncviewerがトンネルの使用を停止すると、すでに目標を達成したため、sshクライアントも終了します。
これにより、バックグラウンドで実行されているsshプロセスがなくなります。
/tmp/session1
(それが使用してそれに名前を付けることが推奨されているが%のパターンを-見ControlPathの説明でman ssh_config
)