Posso leggere da / dev / null; come sistemarlo?


80

Ho letto l' articolo su Wikipedia/dev/null e stavo giocando spostando i file in /dev/null.

Per questo ho creato un test_filee ho inserito alcuni contenuti:

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

Successivamente ho provato a spostare il file in /dev/null:

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

Da allora, questo mi ha dato un Permission deniederrore; Sono andato avanti e usato sudocome faccio normalmente ogni volta che si verifica un Permission deniederrore.

$ sudo mv test_file /dev/null

Il comando è riuscito e test_filenon è più presente nella directory.

Tuttavia, l'articolo di Wikipedia afferma che non è possibile recuperare nulla a cui è stato spostato /dev/nulle fornisce una descrizione EOFdi qualsiasi processo che tenti di leggerlo. Ma posso leggere da /dev/null:

$ cat /dev/null
This is written by Aditya

Cosa ho fatto di sbagliato e come posso /dev/nulltornare alla normalità? E perché ho riscontrato Permission deniederrori in primo luogo?

Risposte:


147

/dev/nullè un file. Un file speciale. Un file di dispositivo come / dev / sda o / dev / tty che parla a un componente hardware del tuo sistema.

L'unica differenza /dev/nullè che nessun hardware è collegato ad esso. Tutti i dati che ci invii vengono silenziosamente scartati. Come il seguente comando:

echo "Hello World" > /dev/null

che non stamperà nulla sul tuo terminale perché invii l'output di echoa null, al vuoto, quindi un buco nero.

Ma quando lo hai fatto mv test_file /dev/nullhai sostituito il file speciale /dev/nullcon un normale file di testo, in possesso di una copia del contenuto del tuo test_file. In altre parole, hai perso il tuo /dev/null.

Ora, quello che devi fare è (per ricostruirlo):

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

Dovresti ricostruirlo perché molti script per impostazione predefinita inviano output a /dev/null. Se /dev/nullnon è più un buco nero ma un normale file di testo, può crescere, crescere e riempire il tuo file system. E sono sicuro che vuoi evitare questo.

E molto più pericoloso, molti script assumono che leggere da /dev/nullnon leggerà nulla; rompere questa ipotesi può portare a spazzatura casuale scritta in file in tutto il sistema ... praticamente impossibile da risolvere.

E ricorda che Linux è multi-tasking: mentre stai giocando /dev/null, molti processi sono in esecuzione e possono creare scompiglio anche in pochi secondi "finestra di opportunità".

Se vuoi giocare con /dev/nullpuoi crearne una copia e sperimentare:

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

Creerà un /tmp/nullfile che funziona esattamente allo stesso modo /dev/nullma che puoi manipolare e testare senza alcun rischio per il tuo sistema.


16

C'è una grande differenza tra sovrascrivere un file e scrivere su un file.

Quando scrivi qualcosa su /dev/null , ad es.

$ echo Hello > /dev/null

... viene scartato silenziosamente. Per questo è necessario disporre delle autorizzazioni di scrittura /dev/null, a cui tutti hanno:

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

Quando si sovrascrive /dev/null , come è stato fatto con il mvcomando, si sostituisce il file speciale /dev/nullcon tutto ciò che è stato spostato lì. Non farlo! Il motivo per cui sono necessari i privilegi di root per farlo è perché per sovrascrivere un file, è necessario disporre delle autorizzazioni di scrittura per la directory che contiene il file , in questo caso /dev:

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

Per ripristinare /dev/null, emettere i comandi

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

(Vedi anche U&L StackExchange: come creare/dev/null )


8

Quando si esegue il comando

$ sudo mv test_file /dev/null

hai sostituito il file speciale /dev/nullcon il tuo file di testo. I tentativi successivi di lettura /dev/nullrestituiscono il contenuto del file di testo e /dev/nullprobabilmente i programmi che tentano di utilizzare in modo normale si interromperanno.

La sostituzione o l'eliminazione dei file del dispositivo /dev/richiede i privilegi di superutente, motivo per cui il tentativo di non sudo ha avuto esito negativo con un errore.

Vedi la risposta di Benoit per informazioni su come ripristinare /dev/nullmanualmente, ma poiché la maggior parte (se non tutto) del contenuto di /dev/è gestito in modo dinamico da udev, sospetto che probabilmente anche un semplice riavvio lo risolverà.


6

Per rispondere alla tua domanda su cosa avresti dovuto fare, per rimuovere un file, fai:

rm test_file

Come altri hanno già affermato, / dev / null è una destinazione per l'output dei programmi.


2
Non ho effettuato il downvote, ma la domanda non riguarda la rimozione di file ... So che usiamo rmper rimuovere file / directory ... Ho appena letto /dev/nulle per capire di più, ho cercato di spostare i file /dev/nulle vedere l'effetto .. Questa domanda riguarda la comprensione di cosa ho fatto di sbagliato spostando i file in /dev/nullseguito ai quali posso leggere da esso ora ... La domanda non riguarda come rimuovere i file dal sistema ... Spero che lo sia chiara ... Ma la tua risposta è ancora benvenuta e abbastanza buona da essere conservata come risposta ... :-)
Aditya

7
Ad essere sinceri, chiedendo "Cosa ho fatto di sbagliato" si chiedono spiegazioni su cosa avrebbe dovuto essere fatto. Probabilmente è banale per la maggior parte degli utenti, ma nessuna delle altre risposte lo ha nemmeno menzionato.
Kapex
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.