web-dev-qa-db-ja.com

SSHユーザーがログインしているときにシャットダウンを防ぐ方法は?

私はネットワーク環境を管理していて、昨日興味深い状況が発生しました。ホストが通常のユーザーによってシャットダウンする必要がある場合、他のユーザーがローカルにログインしているとシャットダウンを拒否します。ただし、他のユーザーが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内から開始したときの動作は異なりますか?それは私が問題を解決するのに役立つ何かを誰かに伝えますか?

20
Joseph R.

netstatpsを介したアクティブな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
3
kmort

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

このようなもの?

おそらくいくつかの読み取り変数を挿入して、「それでもシャットダウンしますか?」のようにプロンプ​​トを表示します。 「シャットダウンしますか?」.

次に、エイリアスまたは同様のものとして使用できます。

0
Adionditsak