
所以,
我注意到在 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
筆記:您可以隨意稱呼該腳本。