Eu posso ler de / dev / null; como corrigi-lo?

76

Eu li o artigo da Wikipedia sobre /dev/null e estava brincando movendo os arquivos para /dev/null .

Para isso eu criei um test_file e coloquei alguns conteúdos nele:

$ touch test_file
$ echo "This is written by Aditya" > test_file
$ cat test_file
This is written by Aditya

Depois disso, tentei mover o arquivo para /dev/null :

$ mv test_file /dev/null
mv: inter-device move failed: ‘test_file’ to ‘/dev/null’; unable to remove target: Permission denied

Desde então, isso me deu um erro Permission denied ; Fui em frente e usei sudo como normalmente faço sempre que encontro um erro Permission denied .

$ sudo mv test_file /dev/null

O comando foi bem-sucedido e test_file não está mais presente no diretório.

No entanto, o artigo da Wikipedia diz que não é possível recuperar nada movido para /dev/null e dá um EOF para qualquer processo que tente ler a partir dele. Mas eu posso ler a partir de /dev/null :

$ cat /dev/null
This is written by Aditya

O que fiz de errado e como corrijo o /dev/null de volta ao normal? E por que eu encontrei Permission denied erro em primeiro lugar?

    
por Aditya 18.03.2014 / 13:23

4 respostas

138

/dev/null é um arquivo. Um arquivo especial. Um arquivo de dispositivo como / dev / sda ou / dev / tty que fala com uma peça de hardware no seu sistema.

A única diferença com /dev/null é que nenhum hardware está vinculado a ele. Qualquer dado enviado a ele é descartado silenciosamente. Como o seguinte comando:

echo "Hello World" > /dev/null

que não imprime nada no seu terminal porque você envia a saída de echo para null, para o vazio, um buraco negro assim.

Mas quando você fez mv test_file /dev/null , substituiu o arquivo especial /dev/null por um arquivo de texto normal, mantendo uma cópia do conteúdo de seu test_file . Em outras palavras, você perdeu seu /dev/null .

Agora, o que você precisa fazer é (reconstruir):

sudo rm /dev/null
sudo mknod -m 0666 /dev/null c 1 3

Você deve reconstruí-lo porque muitos scripts, por padrão, enviam a saída para /dev/null . Se /dev/null não for mais um buraco negro, mas um arquivo de texto normal, ele poderá crescer, aumentar e preencher seu sistema de arquivos. E tenho certeza que você quer evitar isso.

E muito mais perigoso, muitos scripts assumem que ler /dev/null não lerá nada; Quebrar essa suposição pode levar a lixo aleatório escrito em arquivos ao redor do seu sistema ... praticamente impossível de consertar.

E lembre-se que o Linux é multi-tarefa: enquanto você está jogando com /dev/null , muitos processos estão rodando e podem causar estragos mesmo durante alguns segundos "janela de oportunidade".

Se você quiser jogar com /dev/null , crie uma cópia e experimente:

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

Criará um arquivo /tmp/null que funcione exatamente da mesma maneira que /dev/null , mas que você pode manipular e testar sem qualquer risco para o seu sistema.

    
por Benoit 18.03.2014 / 13:32
16

Existe uma grande diferença entre sobrescrever um arquivo e escrever em um arquivo.

Quando você escreve algo para /dev/null , por exemplo,

$ echo Hello > /dev/null

... é descartado silenciosamente. Para isso, você precisa de permissões de gravação para /dev/null , que todos têm:

$ ls -l /dev/null 
crw-rw-rw- 1 root root 1, 3 Mar 18 13:17 /dev/null

Quando você sobrescreve /dev/null , como fez com o comando mv , substitui o arquivo especial /dev/null pelo que quer que você tenha movido para lá. Não faça isso! O motivo pelo qual você precisou de privilégios de root para fazer isso é porque para sobrescrever um arquivo, você precisa de permissões de gravação no diretório que contém o arquivo , neste case /dev :

$ ls -ld /dev
drwxr-xr-x 16 root root 4640 Mar 18 13:17 /dev

Para restaurar /dev/null , emita os comandos

$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null c 1 3

(Consulte também U & amp; L StackExchange: como criar /dev/null )

    
por Malte Skoruppa 18.03.2014 / 13:35
8

Quando você executa o comando

$ sudo mv test_file /dev/null

você substituiu o arquivo especial /dev/null pelo seu arquivo de texto. Tentativas subseqüentes de ler /dev/null retornam o conteúdo de seu arquivo de texto e programas que tentam usar /dev/null da maneira normal provavelmente quebrarão.

Substituir ou excluir arquivos do dispositivo em /dev/ requer privilégios de superusuário, e é por isso que sua tentativa não-sudo falhou com um erro.

Veja a resposta de Benoit para obter informações sobre como restaurar /dev/null manualmente, mas como a maioria (senão todas) do conteúdo de /dev/ é gerenciada dinamicamente pelo udev, suspeito que uma simples reinicialização provavelmente também será corrigida. / p>     

por user21322 18.03.2014 / 13:30
6

Para responder à sua pergunta sobre o que você deveria ter feito, para remover um arquivo, faça o seguinte:

rm test_file

Como outros afirmaram, / dev / null é um destino para a saída de programas.

    
por mlv 18.03.2014 / 17:22

Tags