Perché spostare le directory in / dev / null è pericoloso?


28

Quando provo a spostare una test_dirdirectory in /dev/null, ricevo il messaggio

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

Allora perché la gente dice "Non eseguire il comando sudo mv ~ /dev/null, sposterà la tua home directory in una buca?"

collegamento

Ma /homeè anche una directory.

Risposte:


39

Perché la gente assume. Ero una di quelle persone fino a quando non l'ho provato . È facile capire perché le persone assumono ... Sembra pericoloso ...

... ma in realtà non puoi spostare le cose in /dev/null- È un file speciale che assorbe i reindirizzamenti (e li invia nel nulla). Se provi a spostare una directory in esso, il filesystem esploderà verbalmente in faccia e se provi a spostare un file in esso, probabilmente finirai per sostituirlo.

Il primo collegamento tratterà le directory, ma ecco un test separato solo per sovrascriverlo con un file. Come sottolinea Rmano nei commenti, questo è probabilmente qualcosa che non dovresti fare senza la supervisione di un adulto. C'è rischio.

$ 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

2
No, lo spostamento di un file in / dev / null eliminerà il tuo dispositivo null e lo sostituirà con quel file, non eliminando il contenuto del file.
psusi

2
La risposta è un po 'ambigua. Lo spostamento di un file in /dev/nullnon comporterà il trasferimento dei dati nel nulla. Ciò comporterà /dev/nulllo spostamento corretto
Malte Skoruppa

1
Sì, perché sudo mv file /dev/null avrà successo e può facilmente portare a un sistema completamente inutilizzabile. Vedi i miei commenti sulla domanda collegata nel commento di @MalteSkoruppa. Questo è un altro chiaro esempio di "anteporre sudosolo se tre volte hai controllato sai cosa stai facendo" ;-)
Rmano

5
Puoi fare esperimenti creando la tua copia di / dev / null: sudo mknod -m 0666 /tmp/mynull c 1 3--- e poi
giocaci

10
Ecco da dove vengono le domande migliori. "Cara Ask Ubuntu, recentemente ho spostato i miei compiti su / dev / null per errore e questo è stato risucchiato nel 90% dei miei file di configurazione del sistema. Ora vedo i saggi di Shakespeare ogni volta che avvio. E il mio trackpad non funziona. Halp! "
Oli

18

/dev/nullè solo un file, è un file di "caratteri speciali" ma non è ancora vincolato dalle regole che i file devono seguire. Detto questo, non potresti mai eseguire questo comando:

$ mv ~ /dev/null

Il mvcomando non lo consentirà poiché stai spostando una directory in un file, questo non ha senso contestualmente e lo mvsa.

Esempio

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

Non è possibile copiare su /dev/nullnessuno dei due, dato che si tratta di un file di caratteri, se si tenta di copiare un file normale su di esso.

$ 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

L'unica cosa che puoi fare su questo file è copiare mvsu di esso un altro file o eliminarlo.

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

Dopo questo comando, /dev/nullè un file normale. L'effetto più pericoloso di questa modifica è che non /dev/nulldovrebbe mai generare alcun dato, quindi un certo numero di script di shell lo supporranno

`... < /dev/null` 

equivale a dire "niente". Avere questo presupposto rotto può portare a dati casuali (beh, i dati che l'ultimo processo ha scritto su `/ dev / null ') inseriti in file di sistema in tutto il sistema --- che potrebbero portare a un sistema completamente rotto e irrecuperabile.


13

È possibile scrivere file o altri flussi di input in /dev/nullma non nelle directory. Se si tenta di spostare una directory in /dev/nullessa, si segnalerebbe un errore poiché /dev/nullnon è una directory ma un file.

Tuttavia, poiché si desidera sperimentare /dev/null, si consiglia innanzitutto di conoscere le conseguenze sullo spostamento di un file da sovrascrivere /dev/nulle su come recuperare da tale situazione:

Come suggerito da @Rmano in questa risposta a quella domanda, per sperimentare /dev/nulldovremmo piuttosto crearne una copia e poi fare la nostra sperimentazione. Quindi, creiamolo /tmp/nulle usiamolo per i nostri scopi di sperimentazione:

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

Ora in poi, /tmp/nullè nostro /dev/nullper tutti gli scopi:

Creiamo a test_filee a test_dirall'interno di una directory chiamata 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

Quanto segue mostra il contenuto della ask_ubuntudirectory:

$ 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

Ora provate a spostare la nostra test_fileper /tmp/nullvedere il contenuto di 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

Il comando ha esito positivo e test_filenon è più disponibile. Ora prova a passare test_dira /tmp/nullquale non riesce:

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

test_dirè ancora presente all'interno 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

Ora, cerchiamo di capire se possiamo recuperare il nostro test_fileda /tmp/null:

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

Quindi, è ancora lì e /tmp/nullquale era un file speciale è stato sovrascritto ed è diventato come qualsiasi altro file normale. Possiamo recuperare il nostro file copiandolo /tmp/nullcome qualsiasi altro file:

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

File recuperato.

Nota:

Se non hai creato /tmp/nulle provato quei comandi direttamente usando /dev/null; assicurati di recuperare il file (se necessario) eseguendolo cp /dev/null our_test_file; e ripristinare /dev/nullper gli scopi esistenti sul nostro sistema eseguendo i seguenti comandi come indicato nella domanda collegata il più presto possibile:

$ sudo rm /dev/null
$ sudo mknod /dev/null c 1 3
$ sudo chmod 666 /dev/null

Conclusione:

  • Quindi, è impossibile spostare una directory in /dev/nulle quindi non c'è dubbio di recuperare la directory da lì.

  • Per quanto riguarda i file, se si spostano direttamente i file in /dev/null, è ancora possibile ripristinarli come dimostrato sopra. Tuttavia, ci sono due eccezioni:

    1. Durante il periodo in cui si esegue sudo mv test_file /dev/nulle cp /dev/null our_test_file, se uno script root nel sistema lo sovrascrive eseguendolo echo "Whatever text the root script wants to send to /dev/null" > /dev/null(o altri comandi simili). Quindi non abbiamo alcun modo semplice per recuperare il nostro file.

    2. Se si riavvia il sistema tra l'esecuzione di questi due comandi. /dev/nullviene ricreato all'avvio, quindi il nostro file si perde quando spegniamo il computer.

  • Ma se si desidera ripristinare flussi di input come echo "Stream this line to /dev/null" > /dev/null, non è possibile recuperarli poiché si /dev/nulltratta di un file speciale per eliminare file e flussi di input indesiderati e, come menzionato nell'articolo di Wikipedia, non fornisce alcun dato a un processo che legge da esso.


Riferimento: Articolo di Wikipedia su/dev/null


4
sudo mv test_file /dev/nullsostituisce /dev/nullcon test_file. Quindi dopo questo /dev/nullè solo un file normale e puoi leggere da esso tutto ciò che hai scritto. NON FARLO
Florian Diesch,

"Quindi, non è possibile ripristinare alcun file che è stato spostato in / dev / null" in senso stretto non vero. Se si dovesse spegnere il sistema, montarlo ed eseguire il ripristino dei dati su di esso, si potrebbe benissimo essere in grado di recuperare il file se non fosse stato sovrascritto.
pzkpfw,

@FlorianDiesch: aggiornata la risposta :)
Aditya

7

Tutto ciò che viene inviato /dev/nullviene scartato in silenzio. Se digiti:

echo "Hello World"

si arriva Hello Worldsullo schermo. Se digiti:

echo "Hello World" >/dev/null

non ottieni nulla sullo schermo.

Ma nel caso del comando move, il comando mvtenta di sostituire il file / dev / null con la directory, cosa impossibile. Poiché tutto è un file in Linux, / dev / null è un file. Uno speciale ovviamente (un file dispositivo), un file speciale che consente di accedere a un componente hardware (come dischi, partizioni, schede audio, porte seriali, ...). Nel caso di / dev / null, questo non è collegato ad alcun componente hardware, quindi i dati inviati ad esso vengono silenziosamente scartati. Questo è il motivo per cui "loro" potrebbero averlo definito un buco nero.


le directory non sono file.
Thorbjørn Ravn Andersen,

1
@ ThorbjørnRavnAndersen Nel mondo Linux, le directory sono file!
Habeeb Perwad,

@HabeebPerwad solo all'interno del kernel.
Thorbjørn Ravn Andersen,

@ ThorbjørnRavnAndersen Siamo spiacenti, non sono entrato nel kernel, quindi non ne ho idea :)
Habeeb Perwad,

"Perché tutto è un file in Linux" - Errato. Ci sono file e anche molti altri tipi di oggetti. Non sono sicuro di dove l'hai preso.
ggPeti,
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.