Pourquoi déplacer des répertoires vers / dev / null est-il dangereux?

28

Lorsque j'essaie de déplacer un test_dirrépertoire vers /dev/null, je reçois le message

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

Alors pourquoi les gens disent "N'exécutez pas la commande sudo mv ~ /dev/null, cela déplacera votre répertoire personnel dans un trou?"

Lien

Mais /homec'est aussi un répertoire.

Avinash Raj
la source

Réponses:

39

Parce que les gens supposent. J'étais une de ces personnes jusqu'à ce que je le teste . Il est facile de comprendre pourquoi les gens supposent ... Cela semble dangereux ...

... mais vous ne pouvez pas réellement déplacer les choses vers /dev/null- C'est un fichier spécial qui absorbe simplement les redirections (et les envoie dans le néant). Si vous essayez de déplacer un répertoire vers celui-ci, le système de fichiers explosera verbalement et si vous essayez d'y déplacer un fichier, vous finirez probablement par le remplacer.

Le premier lien traitera des répertoires, mais voici un test séparé juste pour l'écraser avec un fichier. Comme le souligne Rmano dans les commentaires, c'est probablement quelque chose que vous ne devriez pas faire sans la surveillance d'un adulte. Il y a un risque.

$ 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
la source
2
Non, déplacer un fichier vers / dev / null supprimera votre périphérique null et le remplacera par ce fichier, sans se débarrasser du contenu du fichier.
psusi
2
La réponse est un peu ambiguë. Le déplacement d'un fichier vers /dev/nulln'entraînera pas le déplacement de ces données dans le néant. Cela entraînera le déplacement correct des données, mais /dev/nullsera écrasé, et vous pouvez donc les reculer encore :) Voir également askubuntu.com/questions/435887/…
Malte Skoruppa
1
Oui, car sudo mv file /dev/null cela réussira et peut facilement conduire à un système complètement inutilisable. Voir mes commentaires sur la question liée dans le commentaire de @MalteSkoruppa. Ceci est un autre exemple clair de "pré-ajout sudouniquement si vous avez vérifié trois fois que vous savez ce que vous faites" ;-)
Rmano
5
Vous pouvez faire des expériences en créant votre propre copie de / dev / null: sudo mknod -m 0666 /tmp/mynull c 1 3--- puis jouer avec ;-)
Rmano
10
C'est de là que viennent les meilleures questions. "Cher Ask Ubuntu, j'ai récemment déplacé mes devoirs vers / dev / null par erreur et cela a été aspiré dans 90% de mes fichiers de configuration système. Je vois maintenant les essais de Shakespeare à chaque démarrage. Et mon trackpad ne fonctionne pas. Halp! "
Oli
18

/dev/nulln'est qu'un fichier, c'est un fichier "caractère spécial" mais il n'en est pas moins lié par les règles que les fichiers doivent suivre. Cela étant dit, vous ne pourrez jamais exécuter cette commande:

$ mv ~ /dev/null

La mvcommande ne le permettra pas puisque vous déplacez un répertoire vers un fichier, cela n'a tout simplement pas de sens contextuellement et le mvsait.

Exemple

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

Vous ne pouvez pas copier sur l'un /dev/nullou l'autre, étant donné qu'il s'agit d'un fichier de caractères, si vous essayez de copier un fichier normal dessus.

$ 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

La seule chose que vous pouvez faire avec ce fichier est de copier mvdessus un autre fichier ou de le supprimer.

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

Après cette commande, /dev/nullest un fichier normal. L'effet le plus dangereux de ce changement est qu'il /dev/nullest censé ne jamais produire de données, donc un certain nombre de scripts shell supposeront que

`... < /dev/null` 

équivaut à dire "rien". Avoir cette hypothèse cassée peut conduire à des données aléatoires (enfin, les données écrites par le dernier processus dans `/ dev / null ') insérées dans les fichiers système tout autour du système --- ce qui pourrait conduire à un système complètement cassé et irrécupérable.

slm
la source
13

Vous pouvez écrire des fichiers ou d'autres flux d'entrée dans, /dev/nullmais pas dans des répertoires. Si vous essayez de déplacer un répertoire vers /dev/nullcelui-ci, il signalera une erreur car il /dev/nullne s'agit pas d'un répertoire mais d'un fichier.

Cependant, puisque vous voulez expérimenter /dev/null, il vous est d'abord suggéré de connaître les conséquences du déplacement d'un fichier à écraser /dev/nullet comment récupérer de cette situation:

Comme suggéré par @Rmano dans cette réponse à cette question, afin d'expérimenter avec /dev/nullnous devrions plutôt en créer une copie puis faire notre expérimentation. Alors, créons-le /tmp/nullet utilisons-le à des fins d'expérimentation:

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

A partir de maintenant, /tmp/nullest notre /dev/nullà toutes fins:

Créons un test_fileet un test_dirdans un répertoire appelé 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

Ce qui suit montre le contenu du ask_ubunturépertoire:

$ 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

Essayez maintenant de déplacer notre test_filepour /tmp/nullvoir le contenu 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

La commande réussit et test_filen'est plus disponible. Essayez maintenant de passer test_dirà /tmp/nullce qui ne réussit pas:

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

test_direst toujours présent à l'intérieur 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

Maintenant, laissez - nous figurons si nous pouvons récupérer notre test_filede /tmp/null:

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

Donc, il est toujours là et /tmp/nullqui était un fichier spécial a été écrasé et il est devenu comme n'importe quel autre fichier normal. Nous pouvons récupérer notre fichier en copiant /tmp/nullcomme n'importe quel autre fichier:

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

Fichier récupéré.

Remarque:

Si vous n'avez pas créé /tmp/nullet essayé ces commandes directement en utilisant /dev/null; assurez-vous de récupérer le fichier (si vous en avez besoin) en exécutant cp /dev/null our_test_file; et restaurer /dev/nullpour les fins qu'il existe sur notre système en exécutant les commandes suivantes comme indiqué dans la question liée dès que possible:

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

Conclusion:

  • Il est donc impossible de déplacer un répertoire vers /dev/nullet il n'est donc pas question de récupérer le répertoire à partir de là.

  • En ce qui concerne les fichiers, si vous déplacez directement des fichiers vers /dev/null, vous pouvez toujours les récupérer comme indiqué ci-dessus. Cependant, il existe deux exceptions:

    1. Pendant la période que vous exécutez sudo mv test_file /dev/nullet cp /dev/null our_test_file, si un script racine du système le remplace par l'exécution echo "Whatever text the root script wants to send to /dev/null" > /dev/null(ou d'autres commandes similaires). Ensuite, nous n'avons aucun moyen facile de récupérer notre fichier.

    2. Si vous redémarrez le système entre l'exécution de ces deux commandes. /dev/nullest recréé au démarrage, donc notre fichier est perdu lorsque nous éteignons l'ordinateur.

  • Mais si vous souhaitez récupérer des flux d'entrée comme echo "Stream this line to /dev/null" > /dev/null, vous ne pouvez pas le récupérer car il /dev/nulls'agit d'un fichier spécial pour éliminer les fichiers et les flux d'entrée indésirables et, comme le mentionne l'article Wikipedia, il ne fournit aucune donnée à un processus qui le lit.


Référence: article Wikipedia sur/dev/null

Aditya
la source
4
sudo mv test_file /dev/nullremplace /dev/nullpar test_file. Donc, après c'est /dev/nulljuste un fichier normal et vous pouvez y lire tout ce que vous y avez écrit. NE FAITES PAS CELA
Florian Diesch
"Donc, il n'est pas possible de récupérer un fichier que vous avez déplacé vers / dev / null" à vrai dire pas vrai. Si vous deviez arrêter le système, le monter et exécuter la récupération de données dessus, vous pourriez très bien pouvoir récupérer le fichier s'il n'avait pas été écrasé.
pzkpfw
@FlorianDiesch: Mise à jour de la réponse :)
Aditya
7

Tout ce qui est envoyé /dev/nullest jeté en silence. Si vous tapez:

echo "Hello World"

vous obtenez Hello Worldsur l'écran. Si vous tapez:

echo "Hello World" >/dev/null

vous n'obtenez rien à l'écran.

Mais dans le cas de la commande move, la commande mvessaie de remplacer le fichier / dev / null par le répertoire, ce qui n'est pas possible. Parce que tout est un fichier sous Linux, / dev / null est un fichier. Un fichier spécial bien sûr (un fichier de périphérique), un fichier spécial permettant d'accéder à du matériel (comme des disques, des partitions, des cartes son, des ports série, ...). Dans le cas de / dev / null, cela n'est lié à aucun matériel, de sorte que les données qui lui sont envoyées sont supprimées en silence. C'est pourquoi "ils" ont peut-être appelé cela un trou noir.

Benoit
la source
les répertoires ne sont pas des fichiers.
Thorbjørn Ravn Andersen
1
@ ThorbjørnRavnAndersen Dans le monde Linux, les répertoires sont des fichiers!
Habeeb Perwad
@HabeebPerwad uniquement à l'intérieur du noyau.
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen Désolé, je ne suis pas entré dans le noyau, donc aucune idée :)
Habeeb Perwad
"Parce que tout est un fichier sous Linux" - Incorrect. Il y a des fichiers et aussi beaucoup d'autres types d'objets. Je ne sais pas où tu l'as trouvé.
ggPeti