(制御ソケットを介して)接続共有のためにバックグラウンドで実行されているbashプロファイルスクリプトからSSHを生成しようとしています。私が経験している問題は、TTYが閉じられた後(またはより直接的に親bashシェルが終了した後)、SSHがまだ実行されないようにする安定した方法です。
私はシェルが正常にシャットダウンしたとき(SSHを終了するために)コマンドを実行できることを知っていますが、シェルが閉じる機会がない可能性のあるすべてのシナリオを処理しようとしています。
これを行う賢明な方法はありますか?
私の最高のアイデアは
ssh -o PermitLocalCommand=yes -o LocalCommand='cat >/dev/null; kill $PPID' $HOST &
ただし、成功した実行後にバックグラウンドに移動するコマンドのみが必要なため、これは機能しません。または、SSHが完了した後はバックグラウンドでのみ機能するため、シェルは-fN
代わりに使用できません。&
-f
LocalCommand
また、リモートホストでコマンドを実行しないようにしています。そうでなければ、私は次のことをすることができますssh -fN $HOST 'cat >/dev/null'
答え1
シェルがログインシェルの場合は、~/.bash_logoutファイルでデフォルトのSSH接続を停止できます。
ssh -O exit hostname
シェルがログインシェルでない場合は、SSHを作成した直後に〜/ .bashrcファイルにトラップを設定できます。
ssh -fN hostname
trap 'ssh -O exit hostname' EXIT
答え2
私自身の質問に答えると、私はそれを嫌います。
私が思いついた解決策は、ControlPersist=3600
マスターSSHプロセスを開始するときに使用することです。これにより、シェルが正常にシャットダウンされず、sshをシャットダウンしない限り、1時間アクティビティがないと自動的に閉じます。シャットダウン時にSSHを完全にシャットダウンするためにまだトラップを使用していますが。
ssh -o ControlMaster=yes -o ControlPersist=3600 -o ControlPath=/tmp/ssh-%u-%h-%p-%r -Nf $HOST
trap "ssh -o ControlPath=/tmp/ssh-%u-%h-%p-%r $HOST -O exit" exit
答え3
これがあなたが探しているものかどうかはわかりませんが、SSHシェルを終了した後でもプログラムを実行し続けるのに役立ちます。