Melhor maneira de remover o comando shutdown, mas mantenha o reboot

28

Eu tenho um dispositivo do tipo raspi em um data center e, recentemente, acidentalmente digitalizei e colei um comando de desligamento no terminal errado na tela. Existe uma maneira de manter shutdown -r , mas remover #poweroff #shutdown -P -H opções?

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

    
por foxtrot22 03.09.2018 / 16:48

5 respostas

40

Você deve estar usando uma distribuição Linux baseada em systemd. Neste caso, você deve ser capaz de mascarar o alvo de poweroff, para que o systemd se recuse a executá-lo (e desligar). por exemplo:

systemctl mask poweroff.target

Isso torna totalmente impossível desligar o sistema, exceto pela reinicialização. Veja que nada acontece:

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

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

systemctl unmask poweroff.target
    
por 03.09.2018 / 18:53
16

Existem algumas maneiras de conseguir isso. Uma pessoa estaria trabalhando com uma conta regular sem privilégios que exigiria a execução do comando com o sudo e a inserção de uma senha. Então você pode acrescentar o seguinte ao / etc / sudoers (executando o visudo):

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

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

Defaults timestamp_timeout=0

Isso impedirá o armazenamento em cache de credenciais caso você invoque um comando com o 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 precisei inserir minha senha ao executar sudo shutdown -r +10 , mas para o resto eu estava. Se você quiser 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 sem privilégios e escalonar com o sudo quando necessário.

    
por 03.09.2018 / 17:55
10

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

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

    
por 04.09.2018 / 14:01
9

Para evitar percalços, as distribuições baseadas no RHEL já configuram aliases para rm , cp e mv , que podem ser um pouco mais destrutivos quando executados pelo usuário root.

Você pode adicionar seus próprios, 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."'
    
por 03.09.2018 / 17:54
3

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

Em seguida, apelido shutdown para ser (whatever) -r

    
por 04.09.2018 / 06:02