Melhor maneira de remover o comando shutdown, mas continue reiniciando

27

Eu tenho um dispositivo do tipo raspi em um datacenter e, recentemente, acidentalmente gordoi e colei um comando de desligamento no terminal errado da minha tela. Existe uma maneira de manter, shutdown -rmas remover #poweroff #shutdown -P -Hopções?

Eu quero manter o shutdown -r comando. Eu gosto de colocar um timer nele se eu conseguir congelar o sistema ou me trancar com as regras da tabela ip. exemploshutdown -r +10

foxtrot22
fonte

Respostas:

39

Você deve estar usando uma distribuição Linux baseada em systemd. Nesse caso, você deve poder mascarar o destino de desligamento, para que o systemd se recuse a executá-lo (e desligue). por exemplo:

systemctl mask poweroff.target

Isso torna totalmente impossível desligar o sistema, exceto reinicializando. Veja que nada acontece:

Demonstração animada Debian9

Nesse caso, o comutador de energia virtual desta VM nem funciona mais para desligar o sistema. Mas ainda reinicia perfeitamente.

Para desfazer a mudança, é claro, basta desmascarar o alvo. Então você pode desligar o sistema.

systemctl unmask poweroff.target
Michael Hampton
fonte
2
Existe um comando systemd que lista todos os serviços / destinos / dispositivos com suas descrições (se disponíveis)? Recentemente, comecei a ler sobre isso e adoraria explorar as possibilidades.
Hjpotter92 # 4/18
1
@ hjpotter92 Corra systemctlsem argumentos. Ele listará todas as unidades ativas, seu status e descrições. Adicione --alle também listará as unidades que não estão ativas.
Michael Hampton
2
@ hjpotter92 Dê uma olhada man systemd.special.
TooTea
16

Existem algumas maneiras de conseguir isso. Alguém poderia estar trabalhando com uma conta regular não privilegiada, que exigirá executar o comando com sudo e digitar uma senha. Então você pode anexar o seguinte em / etc / sudoers (executando visudo):

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

Além disso, para desativar o cache de credenciais do sudo, adicione também o seguinte:

Defaults timestamp_timeout=0

Isso impedirá o armazenamento em cache de credenciais, caso você tenha chamado um comando com sudo antes.

Exemplo:

[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:

Observe como no exemplo acima não era necessário digitar minha senha durante a execução sudo shutdown -r +10, mas, pelo resto, era. Se você deseja remover a necessidade de digitar sudo antes do comando ( sudo shutdown -r +10), adicione o seguinte ao seu .bash_profile ou .bashrc:

alias shutdown="sudo shutdown"

Exemplo:

[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:

Observe que é uma prática recomendada trabalhar com uma conta não privilegiada e escalar com o sudo quando necessário.

John Doe
fonte
1
Isso é ótimo, exceto que sudoa configuração padrão do cache terá credenciais em cache por algum tempo após a primeira chamada. Isso pode ser conveniente quando a execução repetida de comandos rootfor necessária em uma sessão do usuário. Em uma sessão desse tipo (ou, de fato, se um rootshell estiver em execução), seria totalmente possível realizar a transação do comando shutdowne ignorar as verificações.
Ossifrage Cósmica
Obrigado pela contribuição. No entanto, neste caso, estamos configurando shutdown -rpara não solicitar senha ao executar com o sudo; portanto, se ele executar, sudo shutdown -r ...as credenciais não serão armazenadas em cache, pois não serão inseridas. Veja o exemplo que eu dei acima. Você pode ver que eu o executei, seguido por um sudo shutdown -He fui solicitada a senha.
John Doe
3
De fato, isso é entendido. Mas considere o cenário em que o último comando foi prefixado sudoe não era uma NOPASSWDoperação; por exemplo, uma chamada para editar um arquivo de configuração como root. Nesse caso, a senha será armazenada em cache e uma chamada subsequente sudo shutdown -Hserá realizada. sudoO cache de senhas da senha precisaria ser desativado para evitar isso.
Ossifrage Cósmica
2
Nesse caso, você está certo, +1 por desativar o cache de senhas. Editou meu comentário com a sugestão. Obrigado!
John Doe
2
Na verdade, eu não gosto disso, precisamente porque depende da presença do prompt de senha sudo para supostamente lembrar o usuário de não fazer o que ele não deveria estar fazendo. Mas o prompt de senha realmente não serve a esse propósito. Isso é tão solicitado sudoque basta digitar a senha e seguir em frente. Veja aqui uma abordagem alternativa usando o sudo (que provavelmente é muito melhor, apesar de não ser muito bom).
Michael Hampton
10

Existe uma ferramenta chamada molly-guard que requer que você indique o nome do host da máquina que deseja desligar ou reiniciar.

Caso você não esteja usando o Debian, deve ser trivial compilar isso a partir do código-fonte, já que o programa é bastante primitivo.

Simon Richter
fonte
9

Para evitar distribuições baseadas contratempos RHEL já criados aliás para rm, cpe mvo qual pode ser um pouco mais destrutiva quando executada pelo utilizador raiz.

Você pode adicionar o seu próprio, por exemplo:

#/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."'
HBruijn
fonte
2
Como isso mantém o shutdown -rtempo desativado shutdown -P -H?
precisa saber é o seguinte
3

Renomeie o encerramento do executável para algo impossível de invocar acidentalmente.

Então, apelido shutdownpara ser(whatever) -r

Wes Groleau
fonte
1
Você poderia explicar como renomear o executável? Poderia quebrar as atualizações de pacotes no futuro?
AL
2
@AL Poderia quebrar as atualizações de pacotes no futuro? Sim, poderia. Também pode quebrar coisas já instaladas. Em geral, mexer com partes da instalação do sistema operacional é uma péssima idéia.
Andrew Henle
1
Aceita. É suficiente alias shutdownpara /sbin/shutdown -r. Renomear não é necessário; como a expansão do alias se refere a um caminho absoluto, ela não está sujeita à expansão recursiva do alias.
precisa saber é o seguinte
Uma ressalva - Gostaria de pensar que 'nada é impossível' - apenas improvável
JosephDoggie