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

80

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

Para isso, criei um test_filee 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 Permission deniederro; Fui em frente e usei sudocomo normalmente quando encontro um Permission deniederro.

$ sudo mv test_file /dev/null

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

No entanto, o artigo da Wikipedia diz que não é possível recuperar nada movido /dev/nulle fornece um EOFprocesso para qualquer tentativa de leitura. Mas posso ler em /dev/null:

$ cat /dev/null
This is written by Aditya

O que fiz de errado e como faço /dev/nullpara voltar ao normal? E por que encontrei Permission deniederros em primeiro lugar?

Aditya
fonte

Respostas:

147

/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 /dev/nullé que nenhum hardware está vinculado a ele. Todos os dados que você envia são descartados 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 echopara null, para o vazio, um buraco negro.

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

Agora, o que você precisa fazer é (para reconstruí-lo):

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

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

E muito mais perigoso, muitos scripts supõem que a leitura de /dev/nullnão lerá nada; quebrar essa suposição pode levar a um lixo aleatório escrito em arquivos em todo o sistema ... praticamente impossível de corrigir.

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

Se você quiser brincar, /dev/nullcrie uma cópia e experimente:

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

Criará um /tmp/nullarquivo que funciona exatamente da mesma maneira, /dev/nullmas que você pode manipular e testar sem nenhum risco para o seu sistema.

Benoit
fonte
16

Há uma grande diferença entre substituir um arquivo e gravar 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 /dev/null, às quais todos têm:

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

Quando você substitui /dev/null , como fez com o mvcomando, substitui o arquivo especial /dev/nullpelo que você moveu para lá. Não faça isso! A razão pela qual você precisou de privilégios de root para fazer isso é porque, para substituir um arquivo, você precisa de permissões de gravação no diretório que contém o arquivo , neste caso /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&L StackExchange: como criar/dev/null )

Malte Skoruppa
fonte
8

Quando você executa o comando

$ sudo mv test_file /dev/null

você substituiu o arquivo especial /dev/nullpelo seu arquivo de texto. Tentativas subseqüentes de ler /dev/nullretornam o conteúdo do seu arquivo de texto e os programas que tentam usar /dev/nullda maneira normal provavelmente serão interrompidos.

Substituir ou excluir arquivos de dispositivo /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/nullmanualmente, mas como a maioria (se não todo) do conteúdo /dev/é gerenciado dinamicamente pelo udev, suspeito que uma reinicialização simples provavelmente também o conserte.


fonte
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 já declararam, / dev / null é um destino para a saída de programas.

mlv
fonte
2
Não diminuí a votação, mas a pergunta não é sobre a remoção de arquivos ... Eu sei que usamos rmpara remover arquivos / diretórios ... Acabei de ler sobre /dev/nulle, para entender mais sobre isso, tentei mover os arquivos /dev/nulle ver o efeito .. Esta questão é sobre a compreensão do que fiz de errado movendo os arquivos para /dev/nullque eu possa ler agora ... A questão não é sobre como remover arquivos do sistema ... Espero que seja claro ... Mas sua resposta ainda é bem-vindo e bom o suficiente para ser mantido como uma resposta ... :-)
Aditya
7
Para ser justo, perguntar "O que eu fiz de errado" pede uma explicação do que deveria ter sido feito? Provavelmente é trivial para a maioria dos usuários, mas nenhuma das outras respostas mencionou isso.
Kapex