SSHトンネルを確立しようとしたときに接続が失敗しても、プロセスがアクティブのままであることを確認しました。たとえば、hostname
終了時に次のコマンドを実行しようとすると、次のようになります。
/usr/bin/ssh -f -i /home/user/.ssh/id_rsa -N -R 3000:localhost:22 user@hostname
時々、次のような答えがあります。
Warning: remote port forwarding failed for listen port 3000
元のプロセス(ローカルシステムで実行されています)が終了したがリモートサーバーがまだそれを認識していない場合にのみ、このエラーメッセージが表示されます。プロセスは再起動を試みますが、サーバーはまだ3000の接続があると考えており、新しい接続を除外せずに上記の警告が発生します。
ところで、こうすればpgrep -x ssh
その過程がまだ残っていることがわかります。トンネルが設定されていることを最初に確認し、そうでない場合はリセットするbashスクリプトの一部としてcronjobでこのsshコマンドを実行したいが、スクリプトの設定方法はa)トンネルがダウンしていることを確認して試みます。 (秘密に失敗する)新しいプロセスを作成するか、b)失敗したプロセスがまだ存在していることを確認し、何もしません。その結果、失敗したプロセスが続く限り、トンネルはリセットされません。
接続が失敗した場合に警告を受けるのではなく、プロセスを直接終了する方法はありますか?
答え1
答えを見つけることができる他の人のために私が見つけたオプションを見つけました。この回答:-o ExitOnForwardFailure=True
ゾンビプロセスを作成する代わりに、ポート転送が失敗したときにsshを強制終了するコマンドを追加します。
/usr/bin/ssh -f -i /home/user/.ssh/id_rsa -N -R 3000:localhost:22 user@hostname -o ExitOnForwardFailure=True
答え2
ClientAliveIntervalを試してください。
sshd_config
ClientAliveInterval
Sets a timeout interval in seconds after which if no data has been received from the client, sshd(8) will send a message through
the encrypted channel to request a response from the client. The default is 0, indicating that these messages will not be sent
to the client.