Один из способов, которым я это сделал, - это маскировка системад
цели, что предотвращает выполнение определенных действий независимо от того, кто вводит команду. Например, чтобы предотвратить выключение системы, вы можете сделать это:
sudo systemctl маска poweroff.target
Теперь любая попытка выключить систему через sudo завершение работы
или же sudo systemctl выключение
молча провалится. То же самое можно сделать с остановкой и перезагрузкой:
Маска sudo systemctl runlevel0.target
маска sudo systemctl halt.target
Маска sudo systemctl runlevel6.target
Маска sudo systemctl reboot.target
Примечание: уровень выполнения6
эквивалентно перезагрузка
, и уровень запуска0
эквивалентно неисправность
и останавливаться
.
Чтобы отменить это, эти команды можно запустить снова, но с разоблачать
:
sudo systemctl размаскировать runlevel0.target
sudo systemctl размаскировать shutdown.target
sudo systemctl размаскировать halt.target
sudo systemctl размаскировать runlevel6.target
sudo systemctl размаскировать reboot.target
Имея это в виду, теперь вы можете написать исполняемый скрипт. Только для людей с судо
доступ:
#!/бин/баш
## Определить выполняемую операцию (маскировать | размаскировать)
op=маска
если [[ $1 = снять маску ]]
тогда
op=разоблачить
фи
## Установите цели, которые мы хотим замаскировать
объявить -a arr=("уровень запуска0" "уровень запуска6" "выключение" "перезагрузка" "остановка")
## Запускаем команды
для i в "${arr[@]}"
делать
cmd=$(sudo systemctl $op $i.target)
эхо "$i :: $op"
сделано
ПРЕДУПРЕЖДЕНИЕ: Этот код будет работать, но он довольно грубый. Обязательно проверьте его работоспособность с помощью виртуальной машины или где-нибудь в «безопасном месте», прежде чем запускать его на рабочей машине.
Теперь вы можете запустить этот скрипт для маскировки целей после загрузки и выключения/перезагрузки следующим образом:
sudo ~./setTargetMask.sh снять маску
sudo выключить сейчас
Примечание: Не стесняйтесь называть скрипт как хотите.