Так,
Я заметил, что в 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
Примечание:Можете называть сценарий как угодно.