Como desativar os comandos assustadores do terminal?

82

Como você desativa os comandos assustadores do terminal?

Eu estava usando o SSH para acessar um servidor Ubuntu remoto sem acesso ao servidor físico. Eu pensei que estava digitando ' shutdown' no servidor NoSQL em execução no Ubuntu OS, mas na verdade eu disse ao servidor Ubuntu para desligar. Então eu tive que dizer ao administrador do servidor o que fiz para que ele pudesse iniciar o servidor físico para mim. Isso foi embaraçoso!

Como posso impedir que isso aconteça novamente?

MelodiousFires
fonte
100
Isso foi discutido em detalhes, geralmente com relação aos rmquais tem piores efeitos colaterais do que shutdown. Conclusão: não há como impedir que coisas ruins aconteçam se você continuar executando comandos aleatórios como root.
Dmitry Grigoryev
5
Como outras pessoas observaram sobre o aliasing, isso pode fazer com que as pessoas "adquiram o hábito de um comando trabalhar de maneira não-padrão". Então, parece ruim para mais alguém que o tolo servidor NoSQL use esse comando?
BMB
O servidor NoSQL que eu estava usando é o Redis.
precisa
60
Só não trabalhe sob a conta root.
alk
12
Ouso dizer que você aprendeu a lição, portanto não precisará sentir a necessidade de desativar nenhum comando novamente. Eu também acrescentaria que você não é à prova de idiotas do GNU / Linux, você apenas fica melhor que o tolo.

Respostas:

204

A resposta padrão é "não faça login como root". Todos os comandos executados como root são assustadores. Se isso não for uma opção, você poderá colocar alguns comandos de alias no seu .bashrcpara desativar os comandos que achar especialmente assustadores. Por exemplo:

for scary in shutdown halt  reboot rm
do
    alias $scary="echo If you really want to do that, type: `which $scary`"
done

Em seguida, se você digitar shutdown, receberá a seguinte mensagem:

If you really want to do that, type: /sbin/shutdown

( Verifique se você .bashrccarregou primeiro, antes de tentar isso em um servidor de produção)

Sair da sshsessão atual e efetuar login novamente, ou usar . ~/.bashrcdeve carregar / executar .bashrc. Talvez tente executar rmsem argumentos para garantir que seu servidor não desabilite o carregamento automático .bashrcem logins ou similares.

Observe que se você estiver preocupado principalmente com a parada e o desligamento, considere instalar o molly-guard , o que fará com que você digite o nome do host antes de desligar a máquina. Isso é mais útil se você desligar regularmente SOs inteiros na linha de comando, mas quiser ter certeza de que está desligando o sistema correto.

Você também pode testar a tentativa com um comando menos assustador, como logout ou exit.

gmatht
fonte
70
não faça login como root : isso não ajudará se você estiver confundindo a máquina na qual está conectado. Sugiro alterar o prompt para algo que lhe dê uma dica visual.
Isanae
145
Aliasing "assustador" comandos para ter um comportamento "seguro" é, na minha experiência, uma má idéia. Isso ocorre porque as pessoas tendem a adquirir o hábito de um comando trabalhar de maneira não padronizada, o que pode fazê-las fazer coisas muito lamentáveis ​​quando estão em um sistema de baunilha. A resposta simples é seguir com muito cuidado quando estiver logado como root.
TimGJ
22
@isanae O atalho que eu usei para abrir um terminal com ssh no servidor de produção tornaria o fundo do terminal vermelho. Isso me fez prestar atenção.
Peter A. Schneider
6
sourceé um alias para .e não é suportado por todos os shells.
gronostaj
4
Observe também que, embora o Debian e, por extensão, o Ubuntu possuam a ~/.bash_profilefonte padrão .bashrc, que não é um comportamento padrão e na maioria dos sistemas, .bashrcnão é lida ao efetuar login via ssh, portanto, isso não fará diferença. É muito melhor para adicionar os aliases para ~/.profileou ~/.bash_profileem seu lugar.
terdon
73

sudoexiste por uma razão - use-o. Quando seu comando (neste caso, uma CLI interativa) é concluído, você volta ao seu shell no nível do usuário, não ao shell raiz. Existem muito poucas razões dignas para estar em um shell raiz. (Estou surpreso que isso ainda não seja uma resposta ...)

Dito isto, não seja um muppet que usa sudopara tudo . Entenda o que você está fazendo e entenda por que ele requer / não requer privilégios de root.


Além disso, você pode diferenciar sua solicitação de shell root / usuário. Isso também torna mais óbvio que você está de volta ao prompt do shell e não a " outra CLI ". O meu é muito colorido e possui muitas informações úteis (como o nome do host), o que torna muito simples saber em qual host o comando será executado, além de facilitar a visualização do histórico e a localização de prompts - uma raiz O shell usa o prompt padrão.

My PS1

Isso é mais adequado para uso na conta " sua ", mas se você estiver levando a sério a segurança / administrador de sistema, não estará compartilhando senhas / contas e não estará sentado em um shell raiz sem estar totalmente ciente.


Como as pessoas disseram repetidas vezes, " comandos alternativos para criar um ambiente seguro são uma má idéia ". Você se sentirá confortável em seu ambiente seguro, digitando os comandos 'assustadores' onde não deveria. Então, um dia, você mudará de emprego ou acessará uma nova máquina e emitirá " whoopsy, eu não pretendia, me desculpe " ...

Attie
fonte
2
Ele não teria o mesmo problema sudo shutdown? Se ele executá-lo na máquina errada, ainda será um desastre.
Barmar
2
@ Barar NoSQL entende o comando sudo?
21417 Taemyr
2
@ Taemyr sudoé um comando shell, não tem nada a ver com o banco de dados.
Barmar
4
@ Barmar: Na verdade, acho que o OP pretendia digitá-lo em um programa cmdline NoSQL, não no bash. Portanto, eles não teriam digitado sudo shutdown, pois presumo que sudonão seja um comando NoSQL. Não estar em um shell raiz teria resolvido totalmente esse problema e seria uma idéia muito boa. O mesmo ocorreria com atenção ao prompt antes de executar comandos importantes.
Peter Cordes
44

O pacote 'molly-guard' (pelo menos nos sistemas derivados do Debian) instalará um wrapper em torno do desligamento, parada, desligamento e reinicialização. Se detectar que o terminal é remoto, ele solicitará o nome do host. Se não corresponder, o comando será cancelado.

CSM
fonte
4
e quanto a outras coisas (indiscutivelmente mais assustadoras) rm -rf /?
Marcellothearcane
9
@marcellothearcane set -upode ajudar com isso em alguns casos, como ao escrever rm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT.
Alex Hall
4
@marcellothearcane Em qualquer coisa que se assemelhe a um sistema Linux moderno, é necessário --no-preserve-rootque você dificilmente digite por acidente.
um CVn
3
quem é Molly, eu me pergunto ... provavelmente o gato de alguém.
the0ther
7
@ the0ther, um garoto de 2 anos que acionou o interruptor SCRAM em uma máquina de dinossauro, duas vezes no mesmo dia. O pessoal da sala colocou uma tampa no interruptor. catb.org/jargon/html/M/molly-guard.html
CSM
4

Aceitei uma resposta de que gosto muito, no entanto, se alguém mais estiver lendo e quiser uma resposta mais simples, aqui está a minha.

Encontre o arquivo .bashrc e coloque como a última linha:

alias shutdown=notforuse

Então, quando você digita shutdown, obtém algo como ~bash: notforuse is not a command

Isso pode ser bobo, mas é simples e funciona. Eu aprecio respostas com melhores maneiras de fazer isso, no entanto!

MelodiousFires
fonte
4
Hm, eu costumava fazer isso com rmtroll pessoas -alias rm='echo "You can't use rm!" #'
MD XF
52
Eu acho que é uma péssima idéia, por três razões. Primeiro, é confuso para qualquer pessoa que tenha acesso root à máquina. Segundo, ele ensina que não há problema em digitar "shutdown" e pressionar enter, o que significa que você provavelmente cometerá o mesmo erro no próximo sistema ao qual tiver acesso root. Terceiro, isso se tornará extremamente confuso se houver um comando válido chamado notforuseno caminho.
David Richerby
5
Estou com @DavidRicherby neste. Não é uma boa ideia.
Tico
Se você realmente deseja usar os aliases, pode pelo menos colocar todos esses aliases de comando assustadores em um arquivo, digamos ~/.SaveMyReputatione adicionar a última linha da sua .bashrclinha como [ -f ~/.SaveMyReputation ] && source ~/,SaveMyReputation. Você pode adicionar eventualmente uma linha extra echo "#Scaring command protected shell, comment the last line of .bashrc and log again to have a full working shell"dentro desse arquivo. Pelo menos você pode trazer esse arquivo de alias em outra máquina (deveria ser .bash_aliases, mas nesse caso "obsoleto" é melhor usar outro nome).
precisa
Se você quiser fazer isso, torne menos confuso usando um nome como alias shutdown=shutdown-disabled-by-an-alias. (Isso aborda apenas o terceiro e o menor problema apontado por @DavidRicherby.) Embora ainda seja provável que demore apenas 2 segundos para a próxima pessoa deixar de ver, notforuse is not a commandexecutar type -a shutdowne localizar o alias, digitando sudo \shutdownpara desativar a expansão do alias. (Supondo que eles tenham um sudoalias para sudo='sudo 'que ele expanda aliases em seu primeiro argumento).
Peter Cordes
1

Para shutdown( reboot, halte afins): Eu tenho uma cópia com me perguntam se eu sou realmente certo (e ele não faz nada de qualquer maneira). Eu guardo esses scripts em /usr/local/sbin. No Debian, isso tem outra prioridade /sbin(é o primeiro diretório do PATH).

Os scripts do sistema usam o caminho completo; portanto, esse hack me impede de parar um servidor remoto em vez da máquina local (um mau comportamento do Awesome WM), mas não tem outro efeito indireto, e ainda posso usá-los como / sbin / shutdown quando realmente necessário .

Giacomo Catenazzi
fonte
Esses hacks só funcionam se você aplicá-los a todos os computadores nos quais você faz login ... isso geralmente é bastante impraticável e você não descobrirá até que seja tarde demais: digitando shutdownem um sistema crítico que não possui seu hack.
jpaugh
@jpaugh: sim, é um hack, e eu o uso apenas para meus servidores pessoais, onde geralmente faço login, e os terminais permanecem abertos por muito tempo. [Nota: também uso prompts de cores diferentes para minhas máquinas pessoais: raiz remota, usuário remoto, raiz local, usuário local]. Para servidores reais e máquinas remotas, evito root e vou root o mínimo possível, e com certeza, sem esquecer de sair deles. Só estou usando os meus controles remotos como "nuvem" (antes do hype da nuvem, tão tratado da maneira antiga).
Giacomo Catenazzi
1

O arquivo Sudoers permite um nível de granularidade muito mais fino do que apenas * 'pode usar o sudo' *; em particular, você pode usar aliases de comando para criar listas brancas de grupos de comandos aos quais um usuário ou grupo específico está restrito. Trabalhei com servidores remotos restritos ao acesso ssh e permitia o sudo sem senha (exigimos chaves ssh protegidas por senha). Existem algumas boas razões para fazer isso, mas ele tem perigos, então usamos aliases de comando para permitir acesso irrestrito às coisas que eles precisam fazer (reiniciar servidores etc.) sem conceder privilégios a eles por coisas que não eram.

Também existe uma sintaxe para dizer 'não é possível executar este comando' . Ele pode ser contornado, portanto não deve ser usado como uma medida de segurança real, mas funcionaria para o cenário que você descreveu.

Man sudoers tem alguns bons exemplos de como configurar tudo isso.

Claro que isso requer o uso do sudo, mas isso não é necessário dizer.

Tallus
fonte
1

Você pode ter sido vítima de alguma nova estupidez do Ubuntu.

O Ubuntu costumava ter o shutdowncomando clássico normal, que requer um argumento de tempo obrigatório.

Aqui está o que acontece no Ubuntu 12 se eu digitar shutdown, mesmo como um usuário comum:

$ shutdown
shutdown: time expected
Try `shutdown --help' for more information.

Então

$ shutdown +100
shutdown: need to be root.

Agora, aqui está o Ubuntu 16.10. Eu não sou root:

$ date ; /sbin/shutdown
Fri Jun 23 16:00:16 PDT 2017
Shutdown scheduled for Fri 2017-06-23 16:01:16 PDT, use 'shutdown -c' to   cancel.

Sem argumentos, ele agenda o desligamento por 60 segundos depois, e mesmo se você não for root, apenas uma conta criada com privilégios de administrador.

Culpa canônica.

Kaz
fonte
6
/sbin/shutdown é fornecido por systemd-sysvpacote por padrão, então não é estupidez do Ubuntu, é systemdestupidez, e não vem do Ubuntu, mas pelo menos do Debian, o que, por sua vez, parece levar todo o systemdmovimento da Red Hat. Ao culpar, culpe a entidade correta - não apenas a que você não gosta.
Ruslan
1
@Ruslan Ninguém que empacota essa porcaria em sua distro escapa à culpa da estupidez.
Kaz
0

Para desligamento, há molly-guard. Você só precisa instalá-lo e quando você tenta desligar via ssh, ele solicita que você digite o nome do host.

Para excluir arquivos, existem soluções como a libtrash, que emula uma lixeira por meio de uma LD_PRELOADbiblioteca.

E você pode testar quais arquivos você está alterando / excluindo / ... com o programa talvez . Isso é muito legal ao testar algo.

todos
fonte
1
Isso maybeparece ter sido interrompido pelo design: remover alguns syscalls com no-ops travará qualquer programa não trivial que dependa desses syscalls para ter sucesso.
Dmitry Grigoryev
-2

Tente o seguinte: quando você estiver em um shell remoto, toda vez que estiver digitando a tecla "return", pare por 5 segundos, com o dedo pairando na tecla "return" e reler o comando que está prestes a enviar. Tudo bem? Você tem certeza?

Isso parece duro, mas, por outro lado, não devemos gastar muito tempo com projéteis remotos. Devemos encontrar todas as maneiras de automatizar nosso trabalho de manutenção, para que raramente, se é que alguma vez, precisamos efetuar login em um servidor remoto.

xpmatteo
fonte
Tentei isso, não está funcionando. Entrei shutdown, parei por 5 segundos, reli o comando (em voz alta!) E tenho certeza de que estava correto. Em seguida, pressione enter e o comando acabou de ser executado. Portanto, isso não desabilitou os comandos assustadores. Vou tentar com essa coisa pairando no dedo, talvez a distância fosse muito pequena / grande.
Wojciech_rak