Comando “sudo rm \\” trava - quer garantir que nenhum dano foi feito ao sistema

0

Estou tentando descobrir o que aconteceu. Cerca de uma hora atrás eu estava editando um arquivo em / root usando o sudo, mas quando fui salvar e sair acidentalmente acertei a tecla barra invertida e acabei com um arquivo no meu próprio diretório chamado "\" de propriedade do root com 640 permissões. Sabendo que não consegui remover o arquivo usando o nome que recebi, tentei me livrar dele, escapando da barra invertida com outra barra invertida sudo rm \ , mas isso pareceu fazer com que o sistema travasse, ponto em que entrei em pânico e tentei primeiro um < kbd> Control-C (que obviamente não funcionou) e então um Control-Z que (depois de acertar a combinação algumas vezes) retornou meu prompt.

Depois de garantir que estava no meu diretório inicial quando emiti o comando original, decidi procurar o processo e, com certeza, ele ainda estava na lista, apenas pausado. Eu tive que emitir um kill -9 para finalmente me livrar dele, mas eu só quero ter certeza de que ele não iria a lugar algum no sistema, excluindo arquivos. Não consigo pensar em outro motivo pelo qual o comando teria sido suspenso.

    
por J Telep 09.09.2017 / 00:33

3 respostas

4

Estou assumindo que o usuário tentou executar sudo rm \ .

Digitando qualquer comando, então \ e Enter não farão nada.

Não faria nada, porque você acabou de escapar de uma nova linha. Provavelmente você recebeu um novo prompt parecido com > , certo? Esse é o prompt secundário ( $PS2 ) e o shell o usa quando precisa de mais dados para concluir o comando atual.

Você receberá, se acidentalmente (ou de propósito), não fechar uma cotação, como em

$ echo 'hello
>

Continuando de lá:

$ echo 'hello
> world'
hello
world

Digitando \ no final de uma linha, você introduz uma linha de continuação:

$ ls -l \
>

De lá, podemos continuar a linha anterior:

$ ls -l \
> /usr \
> /bin

Quando você pressionar Enter , as novas linhas serão convertidas em espaços e o comando executado (como se você tivesse digitado ls -l /usr /bin neste caso).

Então, em conclusão: você digitou

$ sudo rm \

Então você pressionou o retorno. Isso significa que o comando ainda não foi executado pelo shell, porque ainda está esperando que você termine o comando. Neste ponto, basta pressionar Ctrl + C para cancelar o comando.

A próxima pergunta é: Como excluir um arquivo chamado \ ? (possuído pelo root)

Assim:

$ sudo rm \

ou assim:

$ sudo rm '\'
    
por 09.09.2017 / 00:55
0

Esta resposta resolve a questão no título - e no texto pré-renderizado da pergunta - sobre a execução de sudo rm \ . Com base no que você realmente digitou aqui no Unix.SE, parece que foi isso que você executou. No entanto, com base no comportamento observado, talvez você não tenha realmente executado esse comando, ou mesmo qualquer comando, como Kusalananda explica . Então eu recomendo que você leia também essa resposta. De qualquer forma, acho que ambas as respostas devem ajudar a aliviar sua preocupação (e talvez a de outros leitores) de que você possa ter excluído outros arquivos. Afinal, parte da preocupação é não saber exatamente o que foi executado.

I just want to make sure that it wasn't going anywhere else on the system deleting files

A menos que você tenha passado , a opção -r , -R ou --recursive para rm , ele não tentará excluir mais de um arquivo por operando de nome de arquivo que você forneceu. A execução de rm \ em um shell passa \ como um operando de nome de arquivo.

Às vezes, você pode passar algo parecido com um único operando, mas se expande para vários operandos. Isso pode acontecer, por exemplo, se você usou caracteres globbing como * ou ? . Isso não é algo com que você precise se preocupar com \ .

Às vezes, os nomes de arquivos começam com - e podem ser interpretados como opções, e é por isso que alguns comandos, incluindo rm , suportam uma opção -- para indicar as opções de fim. Mas isso não é uma preocupação neste caso também. \ começa com \ , não - .

É possível - embora improvável e também uma idéia muito ruim - que rm poderia ser uma função de alias ou shell que passa uma opção para operação recursiva para /bin/rm em vez de apenas executando /bin/rm . Você provavelmente saberia se você tivesse feito isso. Você provavelmente não fez isso. Você pode verificar, no entanto. Na maioria dos shells estilo Bourne, incluindo Bash, que é o que você provavelmente está usando no RHEL (também, você marcou ), você pode executar:

type rm

Isso provavelmente mostrará um destes:

rm is /bin/rm
rm is hashed (/bin/rm)

Ele também pode mostrar que rm é um alias que passa opções como -i ou -I a rm . Contanto que não passe -r , -R ou --recursive , ele não terá tentado excluir vários arquivos além dos que você disse para excluir.

A versão de rm fornecida em sistemas GNU / Linux, incluindo o Red Hat Enterprise Linux (você marcou ) é o único no GNU Coreutils. Você pode ler a documentação do Coreutils rm aqui. Algumas distribuições aplicam correções downstream mas esse patch não deve alterar a operação básica de rm ou adicionar novas maneiras de remover arquivos acidentalmente de forma recursiva. O comportamento de rm é basicamente o mesmo em diferentes sistemas operacionais do tipo Unix, e mesmo se você não tivesse dito qual SO estava executando, o que precede deve ser aplicado.

    
por 09.09.2017 / 00:55
0

Para remover um nome de arquivo "complicado", prefixe-o com ./ :

sudo rm ./\

Isso também pode ser usado se um teaser tiver adicionado um arquivo engraçado em sua raiz / , como um arquivo chamado -rf * :

cd /
sudo rm ./-rf\ \*

Sem o ./ , todos os seus arquivos desapareceriam.

    
por 09.09.2017 / 07:48

Tags