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

24

En essayant de déplacer un répertoire test_dir vers /dev/null , j'obtiens le message

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

Pourquoi alors les gens disent-ils "Ne lancez pas la commande sudo mv ~ /dev/null , cela déplacera votre répertoire personnel dans un trou?"

Lien

Mais /home est aussi un répertoire.

    
posée Avinash Raj 18.03.2014 - 12:45
la source

4 réponses

35

Parce que les gens assument. J'étais l'une de ces personnes jusqu'à ce que je la teste . Il est facile de comprendre pourquoi les gens assument ... Il regarde dangereux ...

... mais vous ne pouvez pas déplacer les choses vers /dev/null - C'est un fichier spécial qui absorbe uniquement les redirections (et les envoie dans le néant). Si vous essayez d'y déplacer un répertoire, le système de fichiers va exploser 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é pour le remplacer par un fichier. Comme le fait remarquer Rmano dans les commentaires, il s’agit probablement de quelque chose que vous ne devriez pas faire sans la supervision d’un adulte. Il y a des risques.

$ 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
    
réponse donnée Oli 18.03.2014 - 13:20
la source
17

/dev/null est juste un fichier, c'est un fichier "caractère spécial" mais ce n'est pas le moins encore lié par les règles que les fichiers doivent suivre. Cela étant dit, vous ne pourriez jamais exécuter cette commande:

$ mv ~ /dev/null

La commande mv ne le permet pas car vous déplacez un répertoire vers un fichier, ce qui n'a simplement pas de sens contextuel et mv le sait.

Exemple

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

Vous ne pouvez pas copier sur /dev/null non plus, étant donné qu’il s’agit d’un fichier de caractères, si vous essayez de copier un fichier régulier sur celui-ci.

$ 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 dans ce fichier est de copier mv sur un autre fichier ou de le supprimer.

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

Après cette commande, /dev/null est un fichier normal. L'effet le plus dangereux de cette modification est que /dev/null est censé ne jamais générer de données, alors un certain nombre de scripts shell supposent que

'... < /dev/null' 

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

    
réponse donnée slm 18.03.2014 - 14:27
la source
12

Vous pouvez écrire des fichiers ou d'autres flux d'entrée dans /dev/null mais pas dans les répertoires. Si vous essayez de déplacer un répertoire vers /dev/null , une erreur serait signalée car /dev/null n'est pas un répertoire mais un fichier.

Cependant, puisque vous voulez tester /dev/null , il vous est tout d’abord suggéré de connaître les conséquences du déplacement d’un fichier pour écraser /dev/null et de savoir comment récupérer cette situation:

Comme suggéré par @Rmano dans cette réponse à cette question, afin de tester /dev/null , nous devrions plutôt en créer une copie et ensuite faire notre expérimentation. Nous allons donc créer /tmp/null et l'utiliser pour nos besoins d'expérimentation:

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

Maintenant, /tmp/null est notre /dev/null pour tous les besoins:

Créons un test_file et un test_dir dans 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 répertoire ask_ubuntu :

$ 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

Maintenant, essayez de déplacer nos test_file vers /tmp/null et de voir 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_file n'est plus disponible. Maintenant, essayez de déplacer test_dir à /tmp/null qui n'aboutit pas:

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

test_dir est toujours présent dans 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, voyons si nous pouvons récupérer notre test_file de /tmp/null :

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

Donc, il est toujours là et /tmp/null qui était un fichier spécial a été écrasé et il est devenu comme tout autre fichier normal. Nous pouvons récupérer notre fichier en copiant /tmp/null comme tout 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é.

Note:

Si vous n'avez pas créé /tmp/null et essayé ces commandes directement avec /dev/null ; assurez-vous de récupérer le fichier (si nécessaire) en exécutant cp /dev/null our_test_file ; et restaurez /dev/null aux fins pour lesquelles il existe sur notre système en exécutant les commandes suivantes telles qu'elles sont indiquées 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/null et 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 les 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, vous exécutez sudo mv test_file /dev/null et cp /dev/null our_test_file si un script racine du système le remplace en exécutant 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 ces deux commandes. /dev/null est recréé au démarrage, notre fichier est donc perdu lorsque nous éteignons l'ordinateur.

  • Mais si vous souhaitez récupérer des flux d’entrée tels que echo "Stream this line to /dev/null" > /dev/null , vous ne pouvez pas récupérer ces fichiers car /dev/null est un fichier spécial pour éliminer les fichiers indésirables et les flux d’entrée. fournir des données à un processus qui en lit le contenu.

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

    
réponse donnée Aditya 18.03.2014 - 12:39
la source
7

Tous les messages envoyés à /dev/null sont supprimés en silence. Si vous tapez:

echo "Hello World"

vous obtenez Hello World à l'écran. Si vous tapez:

echo "Hello World" >/dev/null

vous ne recevez rien à l'écran.

Mais dans le cas de la commande move, la commande mv essaie de remplacer le fichier / dev / null par le répertoire, ce qui est impossible. 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 (disques, partitions, cartes son, ports série, etc.). Dans le cas de / dev / null, ceci n'est lié à aucun matériel, de sorte que les données qui lui sont envoyées sont ignorées en silence. C'est pourquoi "ils" l'ont peut-être appelé un trou noir.

    
réponse donnée Benoit 18.03.2014 - 13:10
la source

Lire d'autres questions sur les étiquettes