我正在管理一个网络环境,昨天出现了一个有趣的情况。当普通用户要求主机关闭时,如果其他用户在本地登录,主机将拒绝这样做。但是,当其他用户通过 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
像这样的东西吗?
我可能会插入一些读取变量,这样它就会提示我,比如“你还是想关闭吗?”和“你想关闭吗?”。
然后您可以将其用作别名或类似名称。