如何防止SSH用户登录时关机?

如何防止SSH用户登录时关机?

我正在管理一个网络环境,昨天出现了一个有趣的情况。当普通用户要求主机关闭时,如果其他用户在本地登录,主机将拒绝这样做。但是,当其他用户通过 SSH 登录时,情况并非如此。如果一个用户在本地登录,另一个用户通过 SSH 登录,并且本地登录的用户尝试关闭,它会在没有警告的情况下成功,而另一用户的 SSH 连接会突然终止。我的问题是,有没有办法像本地用户的策略那样防止这种情况发生?我已经查看了手册页,sshd_config但找不到任何似乎相关的内容。


编辑(附加信息):

网络上有 4 个操作系统:Mandriva 2009、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 Plasma,Ubuntu 11.04 主机使用 Unity。


更新

正如我在这个问题,我查看了polkit下面的操作/usr/share/polkit-1/actions/并发现(在文件中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 登录到一台机器,并确保没有其他用户登录到任何 VT。如果我从 GDM 的“操作”菜单中选择Shutdown,我会收到期待已久的策略消息,通知我在其他用户登录时未经身份验证就无法执行此操作。然而,如果我使用 GDM 在本地登录并选择从 GNOME 菜单关闭该框,则 SSH 会话会像以前一样被破坏。这怎么可能?我从 GDM 发起请求时的行为shutdown与从 内部发起请求时的行为是否不同gnome-session?这是否告诉任何人可以帮助我解决问题?

答案1

您实际上找到了正确的信息。至少它可以在 Ubuntu 13.04 下运行。

当使用“auth_admin_keep”设置如下时,以下策略条目将防止关闭发生:

<action id="org.freedesktop.consolekit.system.stop-multiple-users">
  <description>Stop the system when multiple users are logged in</description>
  <message>System policy prevents stopping the system when other users are logged in</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>auth_admin_keep</allow_active>
  </defaults>
</action>

但不知怎的,从13.10开始,这个政策就完全被忽视了。到目前为止,没有人能够告诉我什么可以取代它(如果有的话)。

请注意,您还有这样一个用于重新启动 ( org.freedesktop.consolekit.system.restart-multiple-users) 的条目,它也应设置为auth_admin_keep

在 AskUbuntu 上也可以看到这个问题/答案:https://askubuntu.com/questions/1190/how-can-i-make-shutdown-not-require-admin-password

答案2

netstat我会编写一个小程序,通过和/或来检查任何活动的 SSH 连接ps。将其放在命令的位置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

计算 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

像这样的东西吗?

我可能会插入一些读取变量,这样它就会提示我,比如“你还是想关闭吗?”和“你想关闭吗?”。

然后您可以将其用作别名或类似名称。

相关内容