82 votes

Je peux lire à partir de /dev/null ; comment le réparer ?

J'ai lu le Article de Wikipedia sur /dev/null et j'ai joué en déplaçant des fichiers vers /dev/null .

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

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

Par la suite, 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é un Permission denied Erreur ; je me suis lancé et j'ai utilisé sudo comme je le fais habituellement lorsque je rencontre un Permission denied erreur.

$ 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 Wikipédia indique qu'il n'est pas possible de récupérer ce qui a été déplacé à /dev/null et cela 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 fait de mal et comment puis-je réparer /dev/null retour à la normale ? Et pourquoi ai-je rencontré Permission denied l'erreur en premier lieu ?

150voto

Benoit Points 7337

/dev/null est un fichier. Un fichier spécial. Un fichier de périphérique comme /dev/sda ou /dev/tty qui communique avec une pièce de matériel sur votre système.

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

echo "Hello World" > /dev/null

qui n'imprimera rien sur votre terminal parce que vous envoyez la sortie de echo à la nullité, au vide, un trou noir donc.

Mais quand vous l'avez fait 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 (de le reconstruire) :

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

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

Et bien plus dangereux encore, beaucoup de scripts supposent que la lecture à partir de /dev/null ne lira rien ; briser cette hypothèse peut conduire à des déchets aléatoires écrits dans des fichiers tout autour de votre système... pratiquement impossible à réparer.

Et rappelez-vous que Linux est multitâche : pendant que vous jouez avec /dev/null En effet, 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 créer une copie et l'expérimenter :

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

Créera un /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.

18voto

Malte Skoruppa Points 12096

Il y a une grande différence entre écrasement un fichier et écrire à un fichier.

Quand vous écrire quelque chose pour /dev/null par exemple,

$ echo Hello > /dev/null

...il est éliminé en silence. Pour cela, vous devez avoir les droits d'écriture sur /dev/null que tout le monde a :

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

Quand vous écraser /dev/null comme vous l'avez fait avec le mv vous remplacez le fichier spécial /dev/null avec ce que vous avez déplacé là. Ne faites pas ça ! La raison pour laquelle vous avez eu besoin des privilèges de root pour le faire est que pour écraser un fichier, vous avez besoin des droits d'écriture. dans le répertoire qui contient 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 U&L StackExchange : Comment créer /dev/null )

8voto

Lorsque vous exécutez la commande

$ sudo mv test_file /dev/null

vous avez a remplacé le dossier spécial /dev/null avec votre fichier texte. Les tentatives ultérieures de lecture de /dev/null renvoie le contenu de votre fichier texte, et les programmes qui tentent d'utiliser la fonction /dev/null de la manière habituelle se brisera probablement.

Remplacer ou supprimer des fichiers de l'appareil en /dev/ nécessite les privilèges du super-utilisateur, c'est pourquoi votre tentative non-Sudo a échoué avec une erreur.

Voir la réponse de Benoît pour des informations sur la façon de restaurer le système. /dev/null manuellement, mais comme la plupart (si ce n'est la totalité) du contenu du site de l /dev/ est géré dynamiquement par udev, je pense qu'un simple redémarrage le réparera probablement aussi.

6voto

mlv Points 179

Pour répondre à votre question sur ce que vous auriez dû faire, pour supprimer un fichier, vous le faites :

rm test_file

Comme d'autres l'ont dit, /dev/null est une destination pour la sortie des programmes.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X