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

25

Ao tentar mover um diretório test_dir 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 home para um buraco?"

Link

Mas /home também é um diretório.

    
por Avinash Raj 18.03.2014 / 12:45

4 respostas

36

Porque as pessoas assumem. Eu era uma dessas pessoas até que eu testei . É fácil entender por que as pessoas supõem ... Parece perigoso ...

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

O primeiro link lidará com diretórios, mas aqui está um teste separado apenas para sobrescrevê-lo com 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
    
por Oli 18.03.2014 / 13:20
17

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

$ mv ~ /dev/null

O comando mv não permitirá isso, já que você está movendo um diretório para um arquivo, isso não faz sentido contextualmente e mv sabe disso.

Exemplo

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

Você não pode copiar para /dev/null , dado que é um arquivo de caractere, se você tentar copiar um arquivo normal 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 nesse arquivo é copiar mv em outro arquivo ou excluí-lo.

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

Após este comando, /dev/null é um arquivo regular. O efeito mais perigoso dessa mudança é que /dev/null deve nunca produzir qualquer dado, então um número de script de shell irá assumir que

'... < /dev/null' 

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

    
por slm 18.03.2014 / 14:27
12

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

No entanto, como você deseja experimentar com /dev/null , sugerimos que primeiro conheça as consequências para mover um arquivo para substituir /dev/null e como recuperar-se dessa situação:

Como sugerido por @Rmano em esta resposta para essa pergunta, a fim de experimentar com /dev/null devemos antes criar uma cópia e depois fazer a nossa experimentação. Então, vamos criar /tmp/null e usá-lo para nossos experimentos:

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

A partir de agora, /tmp/null é nosso /dev/null para todos os efeitos:

Vamos criar um test_file e um test_dir dentro 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

O seguinte mostra o conteúdo do diretório ask_ubuntu :

$ 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_file para /tmp/null e ver 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 é bem-sucedido e test_file não está mais disponível. Agora, tente mover test_dir para /tmp/null , o que não é bem-sucedido:

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

test_dir ainda está presente em 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_file de /tmp/null :

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

Então, ele ainda está lá e /tmp/null , que era um arquivo especial, foi sobrescrito e se tornou como qualquer outro arquivo normal. Podemos recuperar nosso arquivo copiando /tmp/null como 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/null e 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/null para os propósitos que existem em nosso sistema, executando os seguintes comandos como fornecidos na questão 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/null e, portanto, não há como recuperar o diretório de lá.

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

    1. Durante o período, você executa sudo mv test_file /dev/null e cp /dev/null our_test_file , se algum script raiz no sistema sobrescrever 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ê reinicializar o sistema entre a execução desses dois comandos. /dev/null é recriado na inicialização, então nosso arquivo se perde quando desligamos o computador.

  • Mas se você quiser recuperar fluxos de entrada como echo "Stream this line to /dev/null" > /dev/null , não poderá recuperar isso, pois /dev/null é um arquivo especial para descartar arquivos indesejados e fluxos de entrada e, como o artigo da Wikipedia menciona, não fornecer quaisquer dados para um processo que leia a partir dele.

Referência: Artigo da Wikipédia sobre /dev/null

    
por Aditya 18.03.2014 / 12:39
7

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

echo "Hello World"

você recebe Hello World na tela. Se você digitar:

echo "Hello World" >/dev/null

você não recebe nada na tela.

Mas no caso do comando move, o comando mv tenta substituir o arquivo / dev / null pelo diretório, o que não é possível. Como tudo é um arquivo no Linux, o / dev / null é um arquivo. Um especial, claro (um arquivo de dispositivo), um arquivo especial que permite acessar partes de hardware (como discos, partições, placas de som, portas seriais, etc.). No caso de / dev / null, isso não está vinculado a qualquer parte do hardware, portanto os dados enviados a ele são descartados silenciosamente. É por isso que "eles" podem tê-lo chamado de blackhole.

    
por Benoit 18.03.2014 / 13:10