¿Por qué es peligroso mover directorios a / dev / null?

28

Cuando intento mover un test_dirdirectorio a /dev/null, recibo el mensaje

mv: cannot overwrite non-directory ‘/dev/null’ with directory ‘test_dir/’

Entonces, ¿por qué la gente dice "No ejecute el comando sudo mv ~ /dev/null, moverá su directorio de inicio a un agujero"?

Enlazar

Pero /hometambién es un directorio.

Avinash Raj
fuente

Respuestas:

39

Porque la gente asume. Fui una de esas personas hasta que lo probé . Es fácil entender por qué la gente asume ... Parece peligroso ...

... pero en realidad no puedes mover las cosas /dev/null: es un archivo especial que simplemente absorbe los redireccionamientos (y los envía a la nada). Si intenta mover un directorio a él, el sistema de archivos explotará de manera vergonzosa en su cara y si intenta mover un archivo a él, probablemente terminará reemplazándolo.

El primer enlace tratará con directorios, pero aquí hay una prueba separada solo para sobrescribirlo con un archivo. Como Rmano señala en los comentarios, esto es probablemente algo que no deberías hacer sin la supervisión de un adulto. Hay riesgos involucrados.

$ 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
Oli
fuente
2
No, mover un archivo a / dev / null arrojará su dispositivo nulo y lo reemplazará con ese archivo, no eliminará el contenido del archivo.
psusi
2
La respuesta es un poco ambigua. Mover un archivo a /dev/nullno dará como resultado que esos datos se muevan a la nada. El resultado será que los datos /dev/nullse moverán correctamente
Malte Skoruppa
1
Sí, porque sudo mv file /dev/null tendrá éxito y puede conducir fácilmente a un sistema completamente inutilizable. Vea mis comentarios sobre la pregunta vinculada en el comentario de @MalteSkoruppa. Este es otro ejemplo claro de "anteponer sudosolo si ha verificado tres veces que sabe lo que está haciendo" ;-)
Rmano
55
Puedes experimentar creando tu propia copia de / dev / null: sudo mknod -m 0666 /tmp/mynull c 1 3--- y luego jugar con ella ;-)
Rmano
10
De aquí provienen las mejores preguntas. "Estimado Ask Ubuntu, recientemente moví mi tarea a / dev / null por error y eso fue absorbido en el 90% de los archivos de configuración de mi sistema. Ahora veo ensayos de Shakespeare cada vez que arranco. Y mi trackpad no funciona. ¡Halp! "
Oli
18

/dev/nulles solo un archivo, es un archivo de "caracteres especiales" pero no obstante está sujeto a las reglas que los archivos deben seguir. Dicho esto, nunca podrías ejecutar este comando:

$ mv ~ /dev/null

El mvcomando no permitirá esto ya que está moviendo un directorio a un archivo, eso simplemente no tiene sentido contextualmente y lo mvsabe.

Ejemplo

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

No puede copiar en /dev/nullninguno, dado que es un archivo de caracteres, si intenta copiar un archivo normal en él.

$ 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

Lo único que puede hacer con este archivo es copiar mvsobre él otro archivo o eliminarlo.

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

Después de este comando, /dev/nulles un archivo normal. El efecto más peligroso de este cambio es que /dev/nullse supone que nunca generará ningún dato, por lo que una serie de scripts de shell supondrá que

`... < /dev/null` 

es equivalente a decir "nada". Tener esta suposición rota puede conducir a datos aleatorios (bueno, los datos que el último proceso escribió en '/ dev / null') insertados en los archivos del sistema en todo el sistema, lo que podría conducir a un sistema completamente roto e irrecuperable.

slm
fuente
13

Puede escribir archivos u otras secuencias de entrada en /dev/nulldirectorios, pero no en ellos. Si intenta mover un directorio a /dev/nulleste, se informará un error, ya /dev/nullque no es un directorio sino un archivo.

Sin embargo, dado que desea experimentar /dev/null, primero se le sugiere conocer las consecuencias de mover un archivo para sobrescribir /dev/nully cómo recuperarse de esa situación:

Según lo sugerido por @Rmano en esta respuesta a esa pregunta, para experimentar con /dev/nullnosotros deberíamos crear una copia y luego hacer nuestra experimentación. Entonces, creémoslo /tmp/nully usémoslo para nuestros propósitos de experimentación:

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

Ahora en adelante, /tmp/nulles nuestro /dev/nullpara todos los propósitos:

Vamos a crear ay test_fileun test_dirdentro de un directorio llamado 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

A continuación se muestran los contenidos del ask_ubuntudirectorio:

$ 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

Ahora trata de mover nuestro test_filea /tmp/nully ver los contenidos 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

El comando tiene éxito y test_fileya no está disponible. Ahora intenta pasar test_dira lo /tmp/nullque no tiene éxito:

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

test_dirsigue presente en el interior 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

Ahora, vamos a averiguar si podemos recuperar nuestra test_filepartir de /tmp/null:

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

Por lo tanto, todavía está allí y /tmp/nullse sobrescribió un archivo especial y se convirtió en cualquier otro archivo normal. Podemos recuperar nuestro archivo copiando /tmp/nullcomo cualquier otro archivo:

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

Archivo recuperado.

Nota:

Si no creó /tmp/nully probó esos comandos directamente usando /dev/null; asegúrese de recuperar el archivo (si es necesario) ejecutando cp /dev/null our_test_file; y restaurar /dev/nullpara los fines que existen en nuestro sistema ejecutando los siguientes comandos como se indica en la pregunta vinculada lo antes posible:

$ sudo rm /dev/null
$ sudo mknod /dev/null c 1 3
$ sudo chmod 666 /dev/null

Conclusión:

  • Por lo tanto, es imposible mover un directorio /dev/nully, por lo tanto, no se trata de recuperar el directorio desde allí.

  • En lo que respecta a los archivos, si mueve los archivos directamente a /dev/null, aún puede recuperarlos como se demostró anteriormente. Sin embargo, hay dos excepciones:

    1. Durante el período que ejecuta sudo mv test_file /dev/nully cp /dev/null our_test_file, si algún script raíz en el sistema lo sobrescribe ejecutando echo "Whatever text the root script wants to send to /dev/null" > /dev/null(u otros comandos similares). Entonces no tenemos ninguna manera fácil de recuperar nuestro archivo.

    2. Si reinicia el sistema entre la ejecución de esos dos comandos. /dev/nullse vuelve a crear en el arranque, por lo que nuestro archivo se pierde cuando apagamos la computadora.

  • Pero si desea recuperar flujos de entrada como echo "Stream this line to /dev/null" > /dev/null, no puede recuperarlo ya que /dev/nulles un archivo especial para deshacerse de archivos no deseados y flujos de entrada y, como menciona el artículo de Wikipedia, no proporciona ningún dato a un proceso que lo lea.


Referencia: artículo de Wikipedia sobre/dev/null

Aditya
fuente
44
sudo mv test_file /dev/nullreemplaza /dev/nullcon test_file. Entonces, después de eso, /dev/nulles solo un archivo normal y puede leer de él cualquier cosa que haya escrito en él. NO
HAGAS
"Por lo tanto, no es posible recuperar ningún archivo que haya movido a / dev / null" estrictamente hablando, no es cierto. Si tuviera que apagar el sistema, montarlo y ejecutar la recuperación de datos en él, es muy posible que pueda recuperar el archivo si no se ha sobrescrito.
pzkpfw
@FlorianDiesch: Actualización de la respuesta :)
Aditya
7

Todo lo enviado a /dev/nullse descarta en silencio. Si escribes:

echo "Hello World"

entras Hello Worlden la pantalla. Si escribes:

echo "Hello World" >/dev/null

no obtienes nada en la pantalla.

Pero en el caso del comando mover, el comando mvintenta reemplazar el archivo / dev / null por el directorio, lo que no es posible. Como todo es un archivo en Linux, / dev / null es un archivo. Uno especial, por supuesto (un archivo de dispositivo), un archivo especial que permite acceder a una pieza de hardware (como discos, particiones, tarjetas de sonido, puertos serie, ...). En el caso de / dev / null, esto no está vinculado a ninguna pieza de hardware, por lo que los datos que se le envían se descartan en silencio. Es por eso que "ellos" pueden haberlo llamado un agujero negro.

Benoit
fuente
Los directorios no son archivos.
Thorbjørn Ravn Andersen
1
@ ThorbjørnRavnAndersen En el mundo Linux, ¡los directorios son archivos!
Habeeb Perwad
@HabeebPerwad solo dentro del núcleo.
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen Lo siento, no me metí en el núcleo, así que no
tengo
"Porque todo es un archivo en Linux" - Incorrecto. Hay archivos y también muchos otros tipos de objetos. No estoy seguro de dónde sacaste esto.
ggPeti