web-dev-qa-db-ja.com

まだ使用されている場合でも、X分後にSSHトンネルを強制終了しますか?

いくつかのバックアップ手順のために、いくつかのバックグラウンドSSHトンネルを設定しています。しかし、私はただ座っているだけでsshプロセスが心配です。スクリプトの最後にPIDを強制終了しますが、スクリプトに何かが発生して終了しない場合はどうなりますか。もう少し頑丈なものが欲しいです。

X秒/分後にSSHトンネルを自殺させる方法はありますか?

現時点ではこのように始めています

ssh -f -N -L 14880:internalserver:3306 gateway.example.com

次に、lsofを使用して、そのポートを開いたPIDを取得します。

3
Rory

これは、以前に提案された、よりクリーンな方法です。

ssh -f -N -L 14880:internalserver:3306 gateway.example.com &
PIDSSH=$!
( sleep 600 ; echo "Timeout." ; kill $PIDSSH ) &
PIDSLEEP=$!
wait $PIDSSH
kill $PIDSLEEP && echo "Session ended before timeout"
wait

ただし、sshからエラーコードを取得することはありませんが、それを調整することはできます。

2
niXar

Expectパッケージには、その例の1つとしてtimeoutコマンドがあります。それを呼び出すことで、スクリプト全体をラップすることができます。

または次のようなもの:

ssh -f -N -L 14880:internalserver:3306 gateway.example.com &
PID=$!
Nohup "sleep 600; kill $PID" &

2
James

これを見てください:

ssh -f -L 14880:internalserver:3306 gateway.example.com sleep 3m

これによりトンネルが設定され、3分で接続できるようになります。接続すると、アイドル状態になるまで利用できます。ただし、これによって実行中のバックアッププロセスが強制終了されることはありません(これが必要なものであることを願っています)。

2
cstamas

これを行う別の方法は、セッションでアイドルタイムアウト値を設定することです。これは、サーバー上で「IdleTimeout」値を使用してsshd_configで実行するか、authorized_keysファイルで「idle-timeout = 6m ... key ...」としてユーザーが実行できます。または時間。または秒。 oreillyの「SSSHTheSecureShell」ブックのセクション8.2.7。上記の量の非アクティブ(入力なし)の後、プロセスは強制終了されます。それがどれだけきれいかは、彼らがハップにどれだけうまく反応するかに依存します:)

1
James