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_config
optionsを使用して他のものに設定できますPidFile
。
pgrep
1行に1つのPIDを出力するので、これを使用してgrep
デフォルトのPIDを持つ行を削除できます(部分一致をgrep -x
避けるために使用する必要があります)。
#!/bin/bash
mainpid=$(cat /run/sshd.pid)
pids=$(pgrep sshd | grep -vxe "$mainpid")
kill $pids
引用符なしの拡張は$pids
文字列をスペースに分割してkill
PIDを個別に取得します。
root
実際には接続ごとに2つのプロセスがあるので、次に実行する必要があります。 1 つは次のアカウントで実行され、root
もう 1 つはログインしたユーザーとして実行されます。または、sshd
ユーザー所有プロセスのみを終了するにはpgrep -u username sshd
。