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


20

我正在管理网络环境,昨天发生了一个有趣的情况。当普通用户要求关闭主机时,如果其他用户在本地登录,则拒绝这样做。但是,当其他用户通过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。如果我Shutdown从GDM的“操作”菜单中选择,则会收到期待已久的策略消息,通知我没有其他用户登录就无法进行身份验证。但是,如果我使用GDM本地登录并选择要关闭GNOME菜单中的框,SSH会话将像以前一样被破坏。这怎么可能?当我shutdown从GDM 发起请求时与从内发起请求时,行为是否有所不同gnome-session?那能告诉任何人什么可以帮助我解决问题的信息吗?


如果您可以提示正在运行的操作系统,可能会有所帮助。
詹妮·D

网络上有4种操作系统:Mandriva 2009,Mandriva 2010.2,Mandriva 2011和Ubuntu 11.04。我没有意识到这是特定于OS的。编辑我的问题...
Joseph R.

2
我认为与操作系统有关的更多的是SSH。在我运行的Unix中,这不是我遇到的问题。但是话又说回来,我通常以超级用户身份关机。
珍妮·D

@JennyD:一个解决方案可能是防止用户通过UI关闭;但我认为这会让他们很烦。
Joseph R.

2
与其说它不是SSH问题,不如说是PAM的配置问题(在关闭的主机上)。您是否研究过PAM如何帮助关机确定已登录的用户并向希望关闭系统的用户提供相同的警告?
罗伯·吉布森

Answers:


3

我会写一个小程序,通过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

听起来真的很好。我在想一种更健壮的方法是session使用一个程序来扩展SSH PAM 链,该程序在用户通过SSH登录时会触摸文件,并在用户注销时将其删除,然后让您建议的程序简单地检查是否存在这些文件。如果可行,我接受您的回答。
Joseph R.

1
那应该工作。一个想法:如果他们不注销就断开连接会怎样?如果SSH会话只是终止,文件是否会被触摸?您可能要确保它有效
kmort

嗯 那的确是令人深思的食物……
Joseph R.

1
也许可以通过解析输出来简化您的方法who。它显示连接了哪些用户以及从哪个主机连接。
Joseph R.

1
很可能。在我最常使用的shell上,who输出不多,但在其他大多数shell上,它却能输出。(愚蠢的嵌入式系统...)在任何情况下,如果您想使用netstat,使用即可轻松获取所需的列awk。沿着线的东西netstat -a | awk '{print $4}'(至少在我的壳。)
kmort

2

您实际上找到了正确的信息。至少它在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


0

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

像这样吗

我可能会插入一些读取变量,以便提示我,例如“您是否仍要关闭?” 和“您要关机吗?”。

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


这仅检查传入连接。刚提到。
jamadagni
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.