Лучший способ удалить команду выключения, но продолжайте перезагрузку


27

У меня есть устройство типа raspi в центре обработки данных, и недавно я случайно нажал и вставил команду отключения в неправильный терминал на моем экране. Есть ли способ сохранить, shutdown -rно удалить #poweroff #shutdown -P -Hварианты?

Я хочу сохранить shutdown -r командование. Мне нравится устанавливать таймер, если мне удастся заморозить систему или заблокировать себя с помощью правил таблицы ip. примерshutdown -r +10

Ответы:


39

Вы должны использовать системный дистрибутив Linux. В этом случае вы должны иметь возможность замаскировать цель отключения питания, чтобы systemd отказался ее выполнить (и отключить питание). например:

systemctl mask poweroff.target

Это делает невозможным выключение системы, кроме как перезагрузкой. Видите, ничего не происходит

Демонстрационная версия Debian9

В этом случае виртуальный выключатель питания виртуальной машины больше не работает даже для выключения системы. Но все равно перезагружается на отлично.

Конечно, чтобы отменить изменение, просто снимите маску с цели. Затем вы можете выключить систему.

systemctl unmask poweroff.target

2
Есть ли команда systemd, которая перечисляет все сервисы / цели / устройства с их описанием (если доступно)? Я недавно начал читать об этом и хотел бы изучить возможности.
hjpotter92

1
@ hjpotter92 Запуск systemctlбез аргументов. В нем будут перечислены все активные юниты, их статус и описания. Добавьте, --allи он также перечислит единицы, которые не активны.
Майкл Хэмптон

2
@ hjpotter92 Посмотрите на man systemd.special.
TooTea

16

Есть несколько способов добиться этого. Можно было бы работать с обычной непривилегированной учетной записью, для которой потребуется выполнить команду с sudo и ввести пароль. Затем вы можете добавить следующее в / etc / sudoers (запустив visudo):

## user is allowed to execute reboot -r only
jdoe ALL=NOPASSWD: /sbin/shutdown -r *

Кроме того, чтобы отключить кэширование учетных данных sudo, добавьте также следующее:

Defaults timestamp_timeout=0

Это предотвратит кэширование учетных данных, если вы ранее вызывали команду с sudo.

Пример:

[root@ops ~]# su - jdoe
[jdoe@ops ~]$ sudo shutdown -c
[sudo] password for jdoe:
[jdoe@ops ~]$ sudo shutdown -r +10
Shutdown scheduled for Mon 2018-09-03 18:51:13 IDT, use 'shutdown -c' to cancel.
[jdoe@ops ~]$ sudo shutdown -H
[sudo] password for jdoe:
^[[A[jdoe@ops ~]$ sudo shutdown -c
[sudo] password for jdoe:

Обратите внимание, как в приведенном выше примере мне не нужно было вводить свой пароль при запуске sudo shutdown -r +10, но в остальном я был. Если вы хотите убрать необходимость вводить sudo перед командой ( sudo shutdown -r +10), добавьте следующее в ваш .bash_profile или .bashrc:

alias shutdown="sudo shutdown"

Пример:

[jdoe@ops ~]$ source ~/.bash_profile
[jdoe@ops ~]$ shutdown -r +10
Shutdown scheduled for Mon 2018-09-03 19:03:14 IDT, use 'shutdown -c' to cancel.
[jdoe@ops ~]$ shutdown -c
[sudo] password for jdoe:

Обратите внимание, что рекомендуется работать с непривилегированной учетной записью и расширяться с помощью sudo, когда это необходимо.


1
Это замечательно, за исключением того, sudoчто в конфигурации по умолчанию будут храниться учетные данные в течение некоторого времени после первого вызова. Это может быть удобно при повторном выполнении команд, как того rootтребует пользовательский сеанс. В таком сеансе (или действительно, если rootзапущена оболочка) было бы вполне возможно выполнить команду shutdownи обойти проверки.
Космическое Оссифрадж

Спасибо за вклад. Однако, в данном случае, мы настройка shutdown -rдля не Запрашивать пароль при запуске с Судом, поэтому, если он работает sudo shutdown -r ...учетные данные не кэшируются , так как они не будут введены. Посмотрите на пример, который я привел выше. Вы можете видеть, что я запустил его, после чего sudo shutdown -Hмне предложили ввести пароль.
Джон Доу

3
Действительно, это понято. Но рассмотрим сценарий, в котором последней команде был префикс, sudoа не NOPASSWDоперация; например, вызов для редактирования файла конфигурации от имени root. В этом случае пароль будет кэширован, и последующий вызов sudo shutdown -Hбудет выполнен. sudoЧтобы избежать этого, необходимо отключить кеширование паролей.
Космическое Оссифраж

2
В этом случае вы правы, +1 за отключение кеширования пароля. Отредактировал мой комментарий с предложением. Благодарность!
Джон Доу

2
На самом деле мне это совсем не нравится, именно потому, что оно опирается на наличие приглашения sudo password, которое якобы напоминает пользователю не делать то, что он не должен делать. Но запрос пароля действительно не подходит для этой цели. Это так часто просят, sudoчто мы просто вводим пароль и идем дальше. Смотрите здесь для альтернативного подхода с использованием sudo (что, вероятно, намного лучше, хотя и не очень хорошо).
Майкл Хэмптон

10

Существует инструмент под названием molly-guard, который требует от вас указать имя хоста машины, которую вы хотите выключить или перезагрузить.

Если вы не используете Debian, скомпилировать это из исходного кода должно быть тривиально, учитывая, что программа довольно примитивна.


9

Для предотвращения распределения на основе казусов RHEL уже настроили псевдонимы rm, cpи mvкоторые могут быть несколько более разрушительным , когда выполняются корневым пользователем.

Вы можете добавить свой собственный, например:

#/root/.bashrc
alias poweroff='echo  "poweroff: Command disabled - THINK before you type.
  Use /usr/sbin/poweroff if you really want to drive to the DC to restore power."'

2
Как это удерживает shutdown -rвремя отключения shutdown -P -H?
MSalters

3

Переименуйте исполняемый файл shutdown на что-то, что невозможно вызвать случайно.

Тогда псевдоним shutdownбудет(whatever) -r


1
Не могли бы вы объяснить, как переименовать исполняемый файл? Может ли это сломать обновления пакетов в будущем?
AL

2
@AL Может ли это нарушить обновления пакетов в будущем? Да, это может. Это также может сломать уже установленные вещи. В общем, возиться с частями установки ОС - очень плохая идея.
Эндрю Хенле

1
Согласен. Это достаточно для псевдонима shutdownк /sbin/shutdown -r. Переименование не обязательно; поскольку расширение псевдонима относится к абсолютному пути, оно не подлежит рекурсивному расширению псевдонима.
MSalters

Одно предостережение - я думаю, что «нет ничего невозможного» - просто маловероятно
JosephDoggie
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.