Por que mover diretórios para / dev / null é perigoso?

28

Ao tentar mover um test_dirdiretório para /dev/null, recebo a mensagem

mv: cannot overwrite non-directory ‘/dev/null’ with directory ‘test_dir/’

Então, por que as pessoas dizem "Não execute o comando sudo mv ~ /dev/null, ele moverá seu diretório pessoal para um buraco?"

Ligação

Mas /hometambém é um diretório.

Avinash Raj
fonte

Respostas:

39

Porque as pessoas assumem. Eu era uma dessas pessoas até testá-lo . É fácil entender por que as pessoas assumem ... Parece perigoso ...

... mas você não pode realmente mover as coisas para /dev/null- É um arquivo especial que apenas absorve os redirecionamentos (e os envia para o nada). Se você tentar mover um diretório para ele, o sistema de arquivos explodirá verbalmente na sua cara e se você tentar mover um arquivo para ele, provavelmente acabará substituindo-o.

O primeiro link lida com diretórios, mas aqui está um teste separado apenas para substituí-lo por um arquivo. Como Rmano aponta nos comentários, isso provavelmente é algo que você não deve fazer sem a supervisão de um adulto. Existe risco envolvido.

$ echo "this is my file" > test
$ cat test
this is my file

$ sudo mv test /dev/null
$ cat /dev/null
this is my file

# Fix this!
$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null c 1 3
Oli
fonte
2
Não, mover um arquivo para / dev / null jogará fora o seu dispositivo nulo e o substituirá por esse arquivo, sem se livrar do conteúdo do arquivo.
Psusi
2
A resposta é um pouco ambígua. Mover um arquivo para /dev/nullnão resultará na movimentação desses dados para o nada. Ele irá resultar nos dados a serem movidos bem, mas /dev/nullserá substituído, e assim você pode movê-lo de volta ainda :) Veja também askubuntu.com/questions/435887/...
Malte Skoruppa
1
Sim, porque sudo mv file /dev/null terá sucesso e pode facilmente levar a um sistema completamente inutilizável. Veja meus comentários sobre a questão vinculada no comentário de @MalteSkoruppa. Este é outro exemplo claro de "preceder sudosomente se você três vezes marcada, você sabe o que está fazendo" ;-)
Rmano
5
Você pode fazer experiência criando a sua própria cópia de / dev / null: sudo mknod -m 0666 /tmp/mynull c 1 3--- e, em seguida, jogar fora com ele ;-)
Rmano
10
É daí que surgem as melhores perguntas. "Prezado Ask Ask Ubuntu, recentemente mudei minha lição de casa para / dev / null por engano e isso foi sugado em 90% dos meus arquivos de configuração do sistema. Agora vejo ensaios de Shakespeare toda vez que inicializo. E meu trackpad não funciona. Halp! "
Oli
18

/dev/nullé apenas um arquivo, é um arquivo de "caractere especial", mas ainda assim não está vinculado pelas regras que os arquivos devem seguir. Dito isto, você nunca poderá executar este comando:

$ mv ~ /dev/null

O mvcomando não permitirá isso, pois você está movendo um diretório para um arquivo, que simplesmente não faz sentido contextualmente e mvsabe disso.

Exemplo

$ mkdir dir
$ touch afile
$ mv dir afile
mv: cannot overwrite non-directory ‘afile’ with directory ‘dir’

Você também não pode copiar /dev/null, dado que é um arquivo de caractere, se tentar copiar um arquivo comum para ele.

$ cp ~/bzip2_1.0.6-4_amd64.deb /dev/null
$ ls -l |grep null
crw-rw-rw-  1 root root        1,   3 Mar 16 14:25 null

A única coisa que você pode fazer com esse arquivo é copiar mvoutro arquivo ou excluí-lo.

$ mv /path/to/afile /dev/null

Após esse comando, /dev/nullé um arquivo regular. O efeito mais perigoso desta mudança é que /dev/nullé suposto Nunca saída quaisquer dados, assim que um número de shell script irá assumir que

`... < /dev/null` 

é equivalente a dizer "nada". Quebrar essa suposição pode levar a dados aleatórios (bem, os dados que o último processo gravou em `/ dev / null ') foram inseridos nos arquivos do sistema em todo o sistema - o que poderia levar a um sistema totalmente quebrado e irrecuperável.

slm
fonte
13

Você pode gravar arquivos ou outros fluxos de entrada em /dev/nulldiretórios, mas não em. Se você tentar mover um diretório para /dev/nullele, reportará um erro, pois /dev/nullnão é um diretório, mas um arquivo.

No entanto, desde que você deseja experimentar /dev/null, primeiro é sugerido que você conheça as consequências de mover um arquivo para substituir /dev/nulle como se recuperar dessa situação:

Como sugerido por @Rmano em esta resposta para essa pergunta, a fim de experimentar /dev/nulldevemos sim criar uma cópia do mesmo e, em seguida, fazer a nossa experimentação. Então, vamos criar /tmp/nulle usá-lo para nossos propósitos de experimentação:

sudo mknod -m 0666 /tmp/null c 1 3

A partir de agora, /tmp/nullé nosso /dev/nullpara todos os fins:

Vamos criar um test_filee um test_dirdentro de um diretório chamado ask_ubuntu.

$ mkdir ask_ubuntu
$ cd ask_ubuntu
$ touch test_file
$ mkdir test_dir
$ echo "Let us test if we can recover our test_file." > test_file

A seguir, mostra o conteúdo do ask_ubuntudiretório:

$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:10 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
-rw-r--r-- 1 aditya aditya    0 Mar 18 17:10 test_file

Agora tente mover nosso test_filepara /tmp/nulle veja o conteúdo de ask_ubuntu:

$ sudo mv test_file /tmp/null   # This succeeds
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir

O comando foi bem-sucedido e test_filenão está mais disponível. Agora tente avançar test_dirpara o /tmp/nullque não for bem-sucedido:

$ sudo mv test_dir/ /tmp/null 
mv: cannot overwrite non-directory ‘/tmp/null’ with directory ‘test_dir/’

test_dirainda está presente dentro ask_ubuntu:

$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir

Agora, vamos descobrir se podemos recuperar nosso test_filede /tmp/null:

$ cat /tmp/null
Let us test if we can recover our test_file.

Portanto, ele ainda está lá e o /tmp/nullarquivo especial foi substituído e se tornou como qualquer outro arquivo normal. Podemos recuperar nosso arquivo copiando /tmp/nullcomo qualquer outro arquivo:

$ cp /tmp/null our_test_file
$ cat our_test_file
Let us test if we can recover our test_file.

Arquivo recuperado.

Nota:

Se você não criou /tmp/nulle tentou esses comandos diretamente usando /dev/null; certifique-se de recuperar o arquivo (se necessário) executando cp /dev/null our_test_file; e restaure /dev/nullpara os propósitos existentes em nosso sistema executando os seguintes comandos, conforme fornecidos na pergunta vinculada o mais rápido possível:

$ sudo rm /dev/null
$ sudo mknod /dev/null c 1 3
$ sudo chmod 666 /dev/null

Conclusão:

  • Portanto, é impossível mover um diretório para /dev/nulle, portanto, não há como recuperar o diretório a partir daí.

  • No que diz respeito aos arquivos, se você mover diretamente os arquivos /dev/null, ainda poderá recuperá-lo conforme demonstrado acima. No entanto, existem duas exceções:

    1. Durante o período em que você executa , sudo mv test_file /dev/nulle cp /dev/null our_test_file, se algum script raiz no sistema o substituir, executando echo "Whatever text the root script wants to send to /dev/null" > /dev/null(ou outros comandos semelhantes). Então não temos uma maneira fácil de recuperar nosso arquivo.

    2. Se você reiniciar o sistema entre a execução desses dois comandos. /dev/nullé recriado na inicialização, para que nosso arquivo se perca quando desligamos o computador.

  • Mas se você deseja recuperar fluxos de entrada como esse echo "Stream this line to /dev/null" > /dev/null, não é possível recuperá-lo, pois /dev/nullé um arquivo especial para descartar arquivos e fluxos de entrada indesejados e, como o artigo da Wikipedia menciona, ele não fornece dados para um processo que os lê.


Referência: Artigo da Wikipedia sobre/dev/null

Aditya
fonte
4
sudo mv test_file /dev/nullsubstitui /dev/nullpor test_file. Então, depois disso, /dev/nullé apenas um arquivo normal e você pode ler tudo o que tiver escrito nele. NÃO FAÇA ISSO
Florian Diesch 18/03/2014
"Portanto, não é possível recuperar nenhum arquivo que você tenha movido para / dev / null", estritamente falando, não é verdade. Se você tivesse que desligar o sistema, montá-lo e executar a recuperação de dados nele, seria possível recuperar o arquivo se ele não tivesse sido substituído.
PzKpfw
@FlorianDiesch: Atualizado a resposta :)
Aditya
7

Tudo o que /dev/nullé enviado é descartado silenciosamente. Se você digitar:

echo "Hello World"

você entra Hello Worldna tela. Se você digitar:

echo "Hello World" >/dev/null

você não aparece nada na tela.

Porém, no caso do comando move, o comando mvtenta substituir o arquivo / dev / null pelo diretório, o que não é possível. Como tudo é um arquivo no Linux, / dev / null é um arquivo. Um especial, é claro (um arquivo de dispositivo), um arquivo especial que permite acessar peças de hardware (como discos, partições, placas de som, portas seriais, ...). No caso de / dev / null, isso não está vinculado a nenhum hardware, portanto os dados enviados a ele são descartados silenciosamente. É por isso que "eles" podem ter chamado de buraco negro.

Benoit
fonte
diretórios não são arquivos.
Thorbjørn Ravn Andersen
1
@ ThorbjørnRavnAndersen No mundo Linux, diretórios são arquivos!
Habeeb Perwad
@HabeebPerwad apenas dentro do kernel.
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen Desculpe, eu não entrar em kernel, assim, não idéia :)
Habeeb Perwad
"Porque tudo é um arquivo no Linux" - Incorreto. Existem arquivos e também muitos outros tipos de objetos. Não tenho certeza de onde você conseguiu isso.
ggPeti