Debianとsshdを実行するサーバーがあり、サーバーを再起動する必要がある場合は、SSHセッションがTCPタイムアウトになるまでクライアント側でハングします。これは、sshd
は終了されますが、ホストへの開いているSSHセッションを明示的に閉じません。sshd
を最初に全員から切断し、次に通常どおりに終了するにはどうすればよいですか?これまでのところ、パラメーターが表示されません。 man sshd_config
これは、閉鎖された動作に関連しています。
システムをシャットダウンまたは再起動すると、systemd
はすべてのサービスをできるだけ早く停止しようとします。これには、ネットワークを停止し、まだ生きているすべてのプロセスを通常はこの順序で終了することが含まれます。そのため、systemdがSSHセッションを処理しているフォークされたSSHプロセスを強制終了すると、ネットワーク接続はすでに無効になっており、クライアント接続を正常に閉じる方法がありません。
シャットダウン時の最初のステップとして、すべてのSSHプロセスを強制終了することを最初に考えるかもしれませんが、それを行うsystemdサービスファイルはかなりたくさんあります。
しかし、当然のことながら、より適切な解決策があります(それが「想定される」方法):systemd-logind
。systemd-logind
は、アクティブなユーザーセッション(ローカルおよびSSHセッション)を追跡し、それらの中で生成されたすべてのプロセスをいわゆる「スライス」に割り当てます。このように、システムがシャットダウンすると、systemdはユーザースライス(特定のセッションを処理するフォークされたSSHプロセスを含む)内のすべてをSIGTERMして、サービスとネットワークのシャットダウンを続行できます。
systemd-logind
では、新しいユーザーセッションの通知を受け取るためにPAMモジュールが必要です。また、dbus
を使用してそのステータスを確認するには、loginctl
が必要であるため、両方をインストールします。
apt-get install libpam-systemd dbus
/etc/ssh/sshd_config
が実際にUsePAM yes
でモジュールを使用することを確認してください。
これは、サーバー側ではなくクライアント側で設定する必要があるものです。 ~/.ssh/config
含有すること
ServerAliveInterval 15
ServerAliveCountMax 5
つまり、非アクティブ状態が15秒続くと、クライアントはサーバーにメッセージを送信します。応答がない場合は、最大5回再試行し、それでも応答がない場合は、セッションを閉じます。
この動作はこれについて報告されています Debian Bug 、パッケージに付属のシャットダウンスクリプトを正しく設定する必要があるのは、デフォルトでは自動的にコピーされないためです。
cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl enable ssh-session-cleanup.service
Jenny Dが1つのsshコマンドについてだけ、彼女の回答で話していたオプションを指定できます。
ssh -t -o ServerAliveInterval=1 -o ServerAliveCountMax=1 user@Host Sudo poweroff
それを頻繁に行う場合は、スクリプトを作成できます。
悲しいことに、serverfaultは何年も前からスレッドの原因で回答することができませんでした。しかし、ロックを解除するために他のブログをスパムする必要はありません^^ ...専用の回答として:
Rfraileが述べたように
cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl enable ssh-session-cleanup.service
動作します。インスタンス/サーバーを再起動せずにそれを使用するには、追加のタスクを実行する必要があります。
systemctl daemon-reload
systemctl start ssh-session-cleanup.service
そのため、サービスは登録および開始され、systemdは再起動/シャットダウンのためにサービスを停止する必要があります。
Lshdで動作します。だから解決策は
apt install lsh-server
apt remove openssh-server