所以,
我注意到在 manjaro 上,如果只有一个用户,则reboot
无需输入须藤,只会失败并要求输入 sudo 密码,而在 ubuntu 服务器上,输入此命令不会要求输入 sudo 密码并成功重启系统。我的问题是,我该如何做到当我输入重启/关机/停止即使当前只有一个用户登录,ubuntu 也总是要求输入 sudo 密码?这可能与 polkit 有关吗?如果是,我该如何更改?
我问这个问题的原因是我想确保每个可以物理访问我的服务器的人都无法重新启动(当然,除非拔掉电源线,这是不同的事情,哈哈)
谢谢
答案1
我这样做的一个方法是掩盖systemd
目标,这会阻止执行某些操作,无论是谁输入命令。例如,要防止系统关闭,您可以执行以下操作:
sudo systemctl mask poweroff.target
sudo shutdown
现在,任何通过或关闭系统的尝试都sudo systemctl shutdown
将失败。停止和重启也可以这样做:
sudo systemctl mask runlevel0.target
sudo systemctl mask halt.target
sudo systemctl mask runlevel6.target
sudo systemctl mask reboot.target
笔记: runlevel6
等价于reboot
,且runlevel0
等价于shutdown
和halt
。
要撤消此操作,可以再次运行这些命令,但需要使用unmask
:
sudo systemctl unmask runlevel0.target
sudo systemctl unmask shutdown.target
sudo systemctl unmask halt.target
sudo systemctl unmask runlevel6.target
sudo systemctl unmask reboot.target
考虑到这一点,现在您可以编写一个可执行的脚本仅有的对于有sudo
访问权限的人:
#!/bin/bash
## Determine the operation to run (mask | unmask)
op=mask
if [[ $1 = unmask ]]
then
op=unmask
fi
## Set the targets we want to mask
declare -a arr=("runlevel0" "runlevel6" "shutdown" "reboot" "halt")
## Run the commands
for i in "${arr[@]}"
do
cmd=$( sudo systemctl $op $i.target )
echo "$i :: $op"
done
警告:此代码可以运行,但还不够完善。在生产环境中运行之前,请务必使用虚拟机或其他“安全”的地方对其进行完整性检查。
现在您可以运行此脚本来在启动后屏蔽目标,然后像这样关闭/重启:
sudo ~./setTargetMask.sh unmask
sudo shutdown now
笔记:您可以随意命名该脚本。