私はネットワーク環境を管理していて、昨日興味深い状況が発生しました。ホストが通常のユーザーによってシャットダウンする必要がある場合、他のユーザーがローカルにログインしているとシャットダウンを拒否します。ただし、他のユーザーがSSH経由でログインしている場合は、この限りではありません。 1人のユーザーがローカルでログインし、1人のユーザーがSSH経由でログインし、ローカルでログインしたユーザーがシャットダウンを試みた場合、警告なしで成功し、他のユーザーのSSH接続が突然終了します。私の質問は、ポリシーがローカルユーザーに対して行うように、これを防ぐ方法はありますか?私はすでにsshd_config
のmanページを見て、関連しているように見えるものを見つけることができませんでした。
EDIT(追加情報):
ネットワークには4つのOSがあります。Mandriva2009、Mandriva 2010.2、Mandriva 2011、Ubuntu 11.04です。私が言及している特定のケースでは、Mandriva 2009ホストにSSHユーザーがあり、Mandriva 2011ホストにローカルユーザーがありました。
Mandriva 2009ホストはGNOME 2.28環境を使用し、2010.2ホストはGNOME 2.32を使用し、2011ホストはKDEプラズマを使用し、Ubuntu 11.04ホストはUnityを使用します。
更新
この質問 で述べたように、/usr/share/polkit-1/actions/
の下のpolkit
アクションを調べて、メッセージをスローするorg.freedesktop.consolekit.policy
というアクションを(ファイルorg.freedesktop.consolekit.system.stop-multiple-users
で)見つけました
System policy prevents stopping the system when other users are logged in
(org.freedesktop.*
命名規則により)これは、D-BUS経由でDMに送信されるある種の信号であると考えています。どの信号がこれをトリガーするかを見つけることができれば、polkit
アクション、その動作を変更できるはずです。
更新2
今日はちょっと実験してみたところ、とても奇妙な結果が出ました。 SSH経由で1つのボックスにログインして、他のユーザーがどのVTにもログインしていないことを確認しました。 GDMの[アクション]メニューからShutdown
を選択すると、他のユーザーがログインしているため、認証なしでは実行できないことを通知する待望のポリシーメッセージが表示されます。ただし、GDMを使用してローカルにログインし、GNOMEのメニューからボックスをシャットダウンすることを選択した場合、以前と同様にSSHセッションが破壊されます。これはどのようにして可能ですか? GDMからshutdown
リクエストを開始したときとgnome-session
内から開始したときの動作は異なりますか?それは私が問題を解決するのに役立つ何かを誰かに伝えますか?
netstat
やps
を介したアクティブなSSH接続をチェックする小さなプログラムを作成します。 shutdown
コマンドの代わりにドロップします。
他のユーザーがマシンを使用していない場合は、ユーザーが使用しようとしたときにshutdown
を呼び出します。誰かがマシンを使用している場合は、shutdown
コマンドを発行したユーザーに警告するだけです。
Netstatはこのような出力を提供し、出力で.ssh
を探すのは非常に簡単です。
netstat -a
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 52 10.5.6.xx.ssh 10.6.6.yy.51400 ESTABLISHED
tcp 0 0 *.ssh *.* LISTEN
udp 0 0 *.syslog *.*
ps
を指定すると、このような出力が得られますが、送信接続を気にしないように注意する必要があるため、少し難しくなります。 Netstat
はおそらく正しい方法です。
ps -e | grep ssh
10084366 ? 00:00:07 /opt/sbin/sshd
282647 ? 00:00:00 /opt/sbin/sshd
SSH接続をカウントし、それ以上の場合はシャットダウンします。
SSH_CONS=$(ps x | grep 'sshd:' | grep -v 'grep' | wc -l)
if [ "$SSH_CONS" -gt 1 ]
then
echo "More than 1 SSH connection..."
else
echo "Shutting down..."
# halt
fi
このようなもの?
おそらくいくつかの読み取り変数を挿入して、「それでもシャットダウンしますか?」のようにプロンプトを表示します。 「シャットダウンしますか?」.
次に、エイリアスまたは同様のものとして使用できます。