すべての着信SSH接続を終了/終了する方法は?

すべての着信SSH接続を終了/終了する方法は?

SSH経由でPCとRaspberry Piの間で通信するコードを開発中です。 PCがRPiへのSSH接続を開くと、RPi画面に短いメッセージを含むウィンドウが表示されます。開いているSSH接続がない場合、ウィンドウは自動的に閉じます。今まではそんなに良くなった。

今、すべての着信SSH接続を終了するためにRPiの対応するウィンドウにボタンを追加したいと思います。これを行うUnixコマンドはありますか? RPiのコードがPythonで書かれているので、これを行うPythonモジュールや方法も良いでしょう。

私の研究では、PIDを介してそのプロセスを終了してSSH接続を終了できます。すべてのSSHプロセス/接続を自動的に終了したいので、より簡単なソリューションを探しています。

ご協力ありがとうございます!

(Raspbian 8で動作するRaspberry Pi(jessie))

答え1

pkill/がある場合、すべてのSSHサーバープロセスを終了するのは難しくありませんpgrep。ただ実行してくださいpkill sshd。問題は、プライマリSSHデーモンを接続固有のデーモンから分離し、そのデーモンをアクティブに保つことです。

簡単な回避策は、サーバーをシャットダウンし、残りの各接続プロセスを終了してからサーバーを再起動することです(例:systemdシステムなど)。

systemctl stop sshd
pkill sshd
systemctl start sshd

sshdあるいは、PIDファイルに書き込むように設定されている場合は、そこから基本プロセスのPIDを読み取ってスキップできます。 systemdのあるDebianでは/run/sshd.pid作成されていますが、/etc/ssh/sshd_configoptionsを使用して他のものに設定できますPidFile

pgrep1行に1つのPIDを出力するので、これを使用してgrepデフォルトのPIDを持つ行を削除できます(部分一致をgrep -x避けるために使用する必要があります)。

#!/bin/bash
mainpid=$(cat /run/sshd.pid)
pids=$(pgrep sshd | grep -vxe "$mainpid")
kill $pids

引用符なしの拡張は$pids文字列をスペースに分割してkillPIDを個別に取得します。

root実際には接続ごとに2つのプロセスがあるので、次に実行する必要があります。 1 つは次のアカウントで実行され、rootもう 1 つはログインしたユーザーとして実行されます。または、sshd ユーザー所有プロセスのみを終了するにはpgrep -u username sshd

関連情報