No outro dia, eu estava fazendo algumas tarefas de manutenção no meu servidor web. Eu estava com pressa e com sono, então fiz tudo usando o sudo
comando.
E então, pressionei acidentalmente Ctrl+ V, enviando este comando para o meu servidor web:
sudo rm -rf /*
Para aqueles que se perguntam o que o comando acima faz: Isso excluiu todo o meu servidor web
Felizmente, eu tinha backups e, infelizmente, tive que passar mais duas horas acordado para corrigir esse erro impressionante. Mas desde então, eu tenho me perguntado:
Existe uma maneira de sempre impor a senha do sudo para um comando específico?
Se o servidor me pedisse uma senha, eu me salvaria de muitos problemas. Não foi, porque eu executei cerca de 5 sudo
comandos antes desse erro majestoso.
Então, existe uma maneira de fazer isso? Eu só preciso da senha com o rm
comando para sempre ser aplicada. Outros comandos que estou usando são geralmente nano
ou cp
quais são (até certo ponto) reversíveis.
fonte
/*
é expandido antes de ser passado para o comando rm. Portanto, o comando não vê um único argumento, mas uma lista de argumentos (/bin /boot /cdrom /dev /etc /home
...) #rm
comando tenha uma senha. Eles só queremsudo
solicitar um a cada vez que o comando rm é usado. A solução para a pergunta que você vinculou se tornaria um pouco irritante quando seu primeiro comando forsudo rm
. Como solicitará duas senhas, uma porsudo
umarm
.Respostas:
Você pode definir o
timestamp_timeout
que0
para os comandos específicos em/etc/sudoers
. Crie um arquivovisudo -f /etc/sudoers.d/pduck
com o seguinte conteúdo:Agora,
pduck
sempre é solicitada uma senha ao usuário durante a execuçãosudo rm
(não importa quais parâmetros adicionais sejam fornecidos), mesmo que o usuário seja membro dosudo
grupo e sesudo
lembre da senha para outros comandos.A desvantagem é que você não pode adicionar parâmetros facilmente à
/bin/rm
linha do arquivo para restringir ainda mais isso. Bem ... você pode, como:mas você será solicitado exatamente
sudo rm -f
e não (novamente)sudo rm -rf
, por exemplo.fonte
Um método seria usar o safe-rm . Isso abordará APENAS o uso de "rm" e impedirá que versões específicas de "rm" sejam executadas. Isso inclui remover o sistema raiz, mas também pode ser usado para impedir a remoção de diretórios relacionados ao sistema, como "/ usr /" ou "/ var /". No link:
fonte
sudo
fornece uma opção-k, --reset-timestamp
, consulteman sudo
:Você pode escrever um invólucro simples para
sudo
testarrm -rf /*
e executarem vez disso, por exemplo:
Exemplo de uso
Testando
echo a
aqui.Se você desejar ser solicitado sempre que executar
rm
em geral, poderá adaptar a função acima da seguinte maneira:Se você deseja combinar chamadas de comando gerais e linhas de comando específicas, recomendo usar
case
, por exemplo:Note-se que essas abordagens não vai funcionar se você executar
sudo
com opções - possíveis soluções são[[ "$*" =~ " rm " ]]
para verificar se a string “rm” rodeado por espaços ou*" rm "*)
comcase
a pegar qualquer linha de comando contendo “rm”.fonte
[[ "$1" == "rm" ]] && opt="-k";
e quanto/bin/rm
?case
abordagem.Esta resposta não aborda a
sudo
parte da sua pergunta, mas, por outro lado, trata de uma maneira de atenuar o perigo derm
invocações acidentais para qualquer usuário.Você pode alternar
rm
para orm -I
qual-f
que substitui as-I
opções anteriores .--one-file-system
é outra possível salvaguarda contra exclusão não intencional que eu uso no meurm
alias.Configuração
Para criar um alias, use o comando:
Você pode colocá-lo no seu
~/.bashrc
ou até mesmo/etc/bash.bashrc
.Uso
Para confirmar o tipo
yes
ou sua tradução no seu código de idioma ou na primeira letra de uma das palavras e pressione Enter. Qualquer outra entrada, incluindo nenhuma, interrompe a operação.fonte