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

80

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

Para esto creé un test_filey 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 partir de entonces intenté 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 deniederror; Seguí adelante y usé sudocomo lo hago normalmente cuando encuentro un Permission deniederror.

$ sudo mv test_file /dev/null

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

Sin embargo, el artículo de Wikipedia dice que no es posible recuperar nada movido /dev/nully da un paso EOFa cualquier proceso que intente leerlo. Pero, puedo leer de /dev/null:

$ cat /dev/null
This is written by Aditya

¿Qué hice mal y cómo puedo /dev/nullvolver a la normalidad? ¿Y por qué me encontré con un Permission deniederror en primer lugar?

Aditya
fuente

Respuestas:

147

/dev/nulles 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/nulles que ningún hardware está vinculado a él. Cualquier dato 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 echonulo, al vacío, un agujero negro por lo tanto.

Pero cuando lo hizo mv test_file /dev/null, reemplazó el archivo especial /dev/nullpor un archivo de texto normal, que contiene una copia del contenido de su archivo test_file. En otras palabras, has perdido tu /dev/null.

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

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

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

Y mucho más peligroso, muchos guiones suponen que leer de /dev/nullnada leerá nada; romper esta suposición puede llevar a basura aleatoria escrita en archivos en todo su sistema ... prácticamente imposible de arreglar.

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

Si quieres jugar /dev/nullpuedes crear una copia y experimentar con ella:

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

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

Benoit
fuente
16

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

Cuando escribes algo /dev/null , por ejemplo,

$ echo Hello > /dev/null

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

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

Cuando sobrescribe /dev/null , como lo hizo con el mvcomando, reemplaza el archivo especial /dev/nullcon lo que haya movido allí. ¡No hagas esto! La razón por la que necesitaba privilegios de root para hacerlo es porque para sobrescribir un archivo, necesita permisos de escritura en 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

(Consulte también U&L StackExchange: Cómo crear/dev/null )

Malte Skoruppa
fuente
8

Cuando ejecutas el comando

$ sudo mv test_file /dev/null

ha reemplazado el archivo especial /dev/nullcon su archivo de texto. Los intentos posteriores de lectura /dev/nulldevuelven el contenido de su archivo de texto, y los programas que intentan usar /dev/nullde la manera normal probablemente se rompan.

Reemplazar o eliminar archivos del dispositivo /dev/requiere privilegios de superusuario, razón por la cual su intento de no sudo falló con un error.

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


fuente
6

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

rm test_file

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

mlv
fuente
2
No voté en contra, pero la pregunta no es sobre la eliminación de archivos ... Sé que usamos rmpara eliminar archivos / directorios ... Acabo de leer /dev/nully para entender más al respecto, intenté mover archivos /dev/nully ver el efecto ... Esta pregunta se trata de entender qué hice mal al mover archivos /dev/nullcomo resultado de lo cual puedo leer ahora ... La pregunta no es sobre cómo eliminar archivos del sistema ... Espero que sea claro ... Pero su respuesta sigue siendo bienvenida y lo suficientemente buena como para ser mantenida como respuesta ... :-)
Aditya
77
Para ser justos, preguntar "¿Qué hice mal?" Requiere una explicación de lo que debería haberse hecho. Probablemente sea trivial para la mayoría de los usuarios, pero ninguna de las otras respuestas lo mencionó.
kapex