web-dev-qa-db-fra.com

Je peux lire dans / dev / null; comment le réparer?

J'ai lu le article de Wikipedia sur /dev/null et je jouais en déplaçant des fichiers vers /dev/null.

Pour cela, j'ai créé un test_file et y ai ajouté du contenu:

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

Ensuite, j'ai essayé de déplacer le fichier vers /dev/null:

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

Depuis, cela m'a donné une Permission denied Error; Je suis allé de l'avant et utilisé Sudo comme je le fais normalement chaque fois que je rencontre une erreur Permission denied.

$ Sudo mv test_file /dev/null

La commande a réussi et test_file n'est plus présent dans le répertoire.

Cependant, l'article de Wikipedia indique qu'il n'est pas possible de récupérer quoi que ce soit déplacé vers /dev/null et donne un EOF à tout processus qui tente de le lire. Mais je peux lire à partir de /dev/null:

$ cat /dev/null
This is written by Aditya

Qu'est-ce que j'ai mal fait et comment corriger /dev/null de nouveau à la normale? Et pourquoi ai-je rencontré l'erreur Permission denied en premier lieu?

80
Aditya

/dev/null est un fichier. Un fichier spécial. Un fichier de périphérique tel que/dev/sda ou/dev/tty qui communique avec un élément matériel de votre système.

La seule différence avec /dev/null est qu'aucun matériel n'y est associé. Toutes les données que vous lui envoyez sont éliminées en silence. Comme la commande suivante:

echo "Hello World" > /dev/null

ce qui n'imprimera rien sur votre terminal car vous envoyez la sortie de echo à null, au vide, un trou noir donc.

Mais lorsque vous avez utilisé mv test_file /dev/null, vous avez remplacé le fichier spécial /dev/null par un fichier texte normal contenant une copie du contenu de votre test_file. En d'autres termes, vous avez perdu votre /dev/null.

Maintenant, ce que vous devez faire est (pour le reconstruire):

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

Vous devriez le reconstruire car beaucoup de scripts envoient par défaut la sortie à /dev/null. Si /dev/null n'est plus un trou noir mais un fichier texte standard, il peut grossir, grossir et remplir votre système de fichiers. Et je suis sûr que vous voulez éviter cela.

Et beaucoup plus dangereux, beaucoup de scripts supposent que lire dans /dev/null ne lira rien; briser cette hypothèse peut entraîner des ordures aléatoires écrites dans des fichiers tout autour de votre système ... pratiquement impossible à corriger.

Et rappelez-vous que Linux est multi-tâches: pendant que vous jouez avec /dev/null, de nombreux processus sont en cours d'exécution et peuvent causer des ravages même pendant une "fenêtre d'opportunité" de quelques secondes.

Si vous voulez jouer avec /dev/null, vous pouvez en créer une copie et l’essayer:

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

Crée un fichier /tmp/null qui fonctionne exactement de la même manière que /dev/null mais que vous pouvez manipuler et tester sans aucun risque pour votre système.

147
Benoit

Il y a une grande différence entre écraser un fichier et écrire dans un fichier.

Lorsque vous écrivez quelque chose dans /dev/null, par exemple,

$ echo Hello > /dev/null

... il est jeté silencieusement. Pour cela, vous devez disposer d'autorisations d'écriture sur /dev/null, dont tout le monde dispose:

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

Lorsque vous écrasez /dev/null, comme vous l'avez fait avec la commande mv, vous remplacez le fichier spécial /dev/null par tout ce que vous y avez déplacé. Ne faites pas cela! La raison pour laquelle vous aviez besoin de privilèges root pour le faire est que, pour écraser un fichier, vous avez besoin d'autorisations en écriture dans le répertoire contenant le fichier , dans ce cas /dev:

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

Pour restaurer /dev/null, lancez les commandes

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

(Voir aussi & L StackExchange: Comment créer /dev/null )

16
Malte Skoruppa

Lorsque vous exécutez la commande

$ Sudo mv test_file /dev/null

vous avez remplacé le fichier spécial /dev/null avec votre fichier texte. Les tentatives ultérieures de lecture à partir de /dev/null renvoient le contenu de votre fichier texte et les programmes qui tentent d’utiliser /dev/null de manière normale s’arrêteront probablement.

Le remplacement ou la suppression de fichiers de périphérique dans /dev/ requiert des privilèges de superutilisateur. C'est pourquoi votre tentative non-Sudo a échoué avec une erreur.

Voir la réponse de Benoit pour des informations sur la façon de restaurer /dev/null manuellement, mais étant donné que la plupart (sinon la totalité) du contenu de /dev/ est géré de manière dynamique par udev, je suspecte qu'un simple redémarrage le résoudra probablement aussi.

8
user21322

Pour répondre à votre question sur ce que vous auriez dû faire, pour supprimer un fichier, vous procédez comme suit:

rm test_file

Comme d'autres l'ont déjà indiqué,/dev/null est une destination pour la sortie des programmes.

6
mlv