Puedo leer desde / dev / null; ¿Como arreglarlo?

77

Leí el artículo de Wikipedia sobre /dev/null y estaba jugando moviendo archivos a /dev/null .

Para esto creé un test_file y puse algunos contenidos en él:

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

A continuación, traté de mover el archivo a /dev/null :

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

Desde entonces, esto me dio un Permission denied Error; Seguí adelante y usé sudo como lo hago siempre que encuentro un Permission denied error.

$ sudo mv test_file /dev/null

El comando tuvo éxito y test_file ya no está presente en el directorio.

Sin embargo, el artículo de Wikipedia dice que no es posible recuperar nada movido a /dev/null y da un EOF a cualquier proceso que intente leer de él. Pero, puedo leer de /dev/null :

$ cat /dev/null
This is written by Aditya

¿Qué hice mal y cómo soluciono /dev/null a la normalidad? ¿Y por qué me encontré con Permission denied error en primer lugar?

    
pregunta Aditya 18.03.2014 - 13:23

4 respuestas

141

/dev/null es un archivo. Un archivo especial. Un archivo de dispositivo como / dev / sda o / dev / tty que habla con una pieza de hardware en su sistema.

La única diferencia con /dev/null es que ningún hardware está vinculado a él. Cualquier información que le envíe se descarta silenciosamente. Como el siguiente comando:

echo "Hello World" > /dev/null

que no imprimirá nada en su terminal porque envía la salida de echo a nulo, al vacío, un agujero negro por lo tanto.

Pero cuando hiciste mv test_file /dev/null , reemplazaste el archivo especial /dev/null por un archivo de texto normal, con una copia del contenido de tu test_file . En otras palabras, has perdido tu /dev/null .

Ahora, lo que tienes que hacer es (reconstruirlo):

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

Debería reconstruirlo porque muchos scripts envían por defecto la salida a /dev/null . Si /dev/null ya no es un agujero negro sino un archivo de texto normal, puede crecer, crecer y llenar el sistema de archivos. Y estoy seguro de que quieres evitar esto.

Y mucho más peligroso, muchos scripts suponen que leer desde /dev/null no leerá nada; Romper esta suposición puede llevar a la basura al azar escrita en archivos alrededor de su sistema ... prácticamente imposible de arreglar.

Y recuerda que Linux es multitarea: mientras juegas con /dev/null , muchos procesos se están ejecutando y pueden causar estragos incluso durante unos segundos "ventana de oportunidad".

Si quieres jugar con /dev/null , puedes crear una copia y experimentar con ella:

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

Creará un archivo /tmp/null que funciona exactamente de la misma manera que /dev/null pero que puede manipular y probar sin ningún riesgo para su sistema.

    
respondido por el Benoit 18.03.2014 - 13:32
16

Hay una gran diferencia entre sobrescribir un archivo y escribir en un archivo.

Cuando escribes algo para /dev/null , por ejemplo,

$ echo Hello > /dev/null

... se descarta silenciosamente. Para esto, necesita permisos de escritura para /dev/null , que todos tienen:

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

Cuando sobreescribe /dev/null , como hiciste con el comando mv , reemplazas el archivo especial /dev/null con lo que sea que hayas movido allí. ¡No hagas esto! La razón por la que necesitas privilegios de root para hacerlo es porque para sobrescribir un archivo, necesitas permisos de escritura para el directorio que contiene el archivo , en este caso /dev :

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

Para restaurar /dev/null , emita los comandos

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

(También vea U & amp; L StackExchange: Cómo crear /dev/null )

    
respondido por el Malte Skoruppa 18.03.2014 - 13:35
8

Cuando ejecuta el comando

$ sudo mv test_file /dev/null

ha reemplazado el archivo especial /dev/null con su archivo de texto. Los intentos subsiguientes de leer de /dev/null devuelven el contenido de su archivo de texto, y los programas que intentan usar /dev/null de la manera normal probablemente se rompan.

Reemplazar o eliminar archivos de dispositivo en /dev/ requiere privilegios de superusuario, por lo que su intento no sudo falló con un error.

Consulte la respuesta de Benoit para obtener información sobre cómo restaurar /dev/null manualmente, pero dado que la mayoría (si no todos) del contenido de /dev/ es administrado dinámicamente por udev, sospecho que un simple reinicio probablemente también lo arregle.

    
respondido por el user21322 18.03.2014 - 13:30
6

Para responder a su pregunta de lo que debería haber hecho, para eliminar un archivo, lo hace:

rm test_file

Como otros han declarado, / dev / null es un destino para la salida de programas.

    
respondido por el mlv 18.03.2014 - 17:22

Lea otras preguntas en las etiquetas