Posso leggere da / dev / null; come sistemarlo?

77

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

Per questo ho creato un test_file e 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

Dato che questo mi ha dato un errore Permission denied ; Sono andato avanti e ho utilizzato sudo come faccio normalmente ogni volta che riscontro un errore di Permission denied .

$ sudo mv test_file /dev/null

Il comando è riuscito e test_file non è più presente nella directory.

Tuttavia, l'articolo di Wikipedia dice che non è possibile recuperare nulla spostato a /dev/null e dà un EOF a qualsiasi processo che tenta di leggere da esso. Ma, posso leggere da /dev/null :

$ cat /dev/null
This is written by Aditya

Che cosa ho fatto di sbagliato e come posso correggere /dev/null in modo normale? E perché ho riscontrato l'errore Permission denied in primo luogo?

    
posta Aditya 18.03.2014 - 13:23

4 risposte

141

/dev/null è un file. Un file speciale. Un file di dispositivo come / dev / sda o / dev / tty che parla con un pezzo di hardware sul tuo sistema.

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

echo "Hello World" > /dev/null

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

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

Ora, quello che devi fare è (ricostruirlo):

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

Dovresti ricostruirlo perché molti script di default inviano l'output a /dev/null . Se /dev/null non è più un buco nero ma un normale file di testo, potrebbe crescere, crescere e riempire il tuo sistema di file. E sono sicuro che vuoi evitare questo.

E molto più pericoloso, molti script presumono che la lettura da /dev/null non leggerà nulla; rompere questa ipotesi può portare a spazzatura casuale scritta in file tutto il tuo sistema ... praticamente impossibile da sistemare.

E ricorda che Linux è multi-tasking: mentre stai giocando con /dev/null , molti processi sono in esecuzione e possono causare il caos anche in alcuni secondi di "finestra di opportunità".

Se vuoi giocare con /dev/null puoi creare una copia e sperimentarla:

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

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

    
risposta data Benoit 18.03.2014 - 13:32
16

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

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

$ echo Hello > /dev/null

... viene scartato in silenzio. Per questo hai bisogno di permessi di scrittura su /dev/null , che ognuno ha:

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

Quando sovrascrivi /dev/null , come hai fatto con il comando mv , sostituisci il file speciale /dev/null con tutto ciò che hai spostato lì. Non farlo! Il motivo per cui hai bisogno dei privilegi di root è che, per sovrascrivere un file, hai bisogno delle autorizzazioni di scrittura nella directory che contiene il file , in questo case /dev :

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

Per ripristinare /dev/null , emetti i comandi

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

(Vedi anche U & amp; L StackExchange: Come creare /dev/null )

    
risposta data Malte Skoruppa 18.03.2014 - 13:35
8

Quando esegui il comando

$ sudo mv test_file /dev/null

hai sostituito il file speciale /dev/null con il tuo file di testo. Tentativi successivi di leggere da /dev/null restituiscono il contenuto del tuo file di testo e probabilmente i programmi che tentano di utilizzare /dev/null nel modo normale probabilmente si interromperanno.

La sostituzione o l'eliminazione dei file di dispositivo in /dev/ richiede i privilegi di superutente, motivo per cui il tentativo non sudo non è riuscito con un errore.

Vedi la risposta di Benoit per informazioni su come ripristinare /dev/null manualmente, ma dal momento che la maggior parte (se non tutti) del contenuto di /dev/ è gestita dinamicamente da udev, sospetto che un semplice riavvio probabilmente risolverà anche questo.

    
risposta data user21322 18.03.2014 - 13:30
6

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

rm test_file

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

    
risposta data mlv 18.03.2014 - 17:22

Leggi altre domande sui tag