Dlaczego przenoszenie katalogów do / dev / null jest niebezpieczne?

28

Podczas próby przeniesienia test_dirkatalogu pojawia /dev/nullsię komunikat

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

Dlaczego więc ludzie mówią „Nie uruchamiaj polecenia sudo mv ~ /dev/null, spowoduje to przeniesienie twojego katalogu domowego do dziury?”

Połączyć

Ale /homejest także katalogiem.

Avinash Raj
źródło

Odpowiedzi:

39

Ponieważ ludzie zakładają. Byłem jedną z tych osób, dopóki tego nie przetestowałem . Łatwo zrozumieć, dlaczego ludzie zakładają ... Wygląda niebezpiecznie ...

... ale tak naprawdę nie można przenieść rzeczy do /dev/null- To specjalny plik, który po prostu pochłania przekierowania (i wysyła je w nicość). Jeśli spróbujesz przenieść do niego katalog, system plików eksploduje na twoją twarz i jeśli spróbujesz przenieść do niego plik, prawdopodobnie skończysz go zastępując.

Pierwszy link będzie dotyczył katalogów, ale tutaj jest osobny test tylko nadpisania go plikiem. Jak zauważa Rmano w komentarzach, prawdopodobnie nie należy tego robić bez nadzoru osoby dorosłej. Istnieje ryzyko.

$ 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
Oli
źródło
2
Nie, przeniesienie pliku do / dev / null spowoduje wyrzucenie urządzenia zerowego i zastąpienie go tym plikiem, a nie pozbycie się jego zawartości.
psusi
2
Odpowiedź jest nieco dwuznaczna. Przeniesienie pliku do /dev/nullnie spowoduje, że dane zostaną przeniesione w nicość. Spowoduje to przeniesienie danych w porządku, ale /dev/nullzostanie nadpisane, dzięki czemu można je jeszcze cofnąć :) Zobacz także askubuntu.com/questions/435887/...
Malte Skoruppa
1
Tak, ponieważ sudo mv file /dev/null odniesie sukces i może z łatwością doprowadzić do całkowicie bezużytecznego systemu. Zobacz moje komentarze do pytania połączone w komentarzu @MalteSkoruppa. To kolejny wyraźny przykład „prepend sudotylko, jeśli trzykrotnie sprawdziłeś, czy wiesz, co robisz” ;-)
Rmano,
5
Możesz eksperymentować, tworząc własną kopię / dev / null: sudo mknod -m 0666 /tmp/mynull c 1 3---, a następnie pobaw się nią ;-)
Rmano
10
Stąd pochodzą najlepsze pytania. „Drogi Zapytaj Ubuntu, niedawno przez pomyłkę przeniosłem pracę domową do / dev / null i to zostało wessane do 90% moich plików konfiguracyjnych systemu. Teraz za każdym razem, gdy uruchamiam, widzę eseje Szekspira. A mój gładzik nie działa. Halp! „
Oli
18

/dev/nullto tylko plik, jest to plik „znaków specjalnych”, ale mimo to nadal jest związany zasadami, których muszą przestrzegać pliki. Biorąc to pod uwagę, nigdy nie można uruchomić tego polecenia:

$ mv ~ /dev/null

mvKomenda nie pozwoli na to, ponieważ jesteś w ruchu katalog do pliku, który po prostu nie ma sensu kontekstowo i mvwie o tym.

Przykład

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

Nie możesz kopiować do /dev/nullżadnego z nich, biorąc pod uwagę, że jest to plik znakowy, jeśli spróbujesz skopiować do niego zwykły plik.

$ 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

Jedyne, co możesz zrobić z tym plikiem, to skopiować mvna niego inny plik lub go usunąć.

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

Po tym poleceniu /dev/nulljest zwykłym plikiem. Najbardziej niebezpiecznym efektem tej zmiany jest to, że nigdy nie/dev/null powinna generować żadnych danych, więc szereg skryptów powłoki to założy

`... < /dev/null` 

jest równoznaczne z powiedzeniem „nic”. Złamanie tego założenia może prowadzić do losowych danych (no cóż, danych, które ostatni proces zapisał do `/ dev / null ') wstawionych do plików systemowych w całym systemie --- co może prowadzić do całkowicie zepsutego i niemożliwego do odzyskania systemu.

slm
źródło
13

Możesz zapisywać pliki lub inne strumienie wejściowe do /dev/nullkatalogów, ale nie do nich. Próba przeniesienia katalogu do /dev/nullniego spowoduje zgłoszenie błędu, ponieważ /dev/nullnie jest to katalog, ale plik.

Ponieważ jednak chcesz poeksperymentować /dev/null, najpierw sugeruje się znać konsekwencje przeniesienia pliku do zastąpienia /dev/nulli sposób odzyskania po tej sytuacji:

Jak sugeruje @Rmano w tej odpowiedzi na to pytanie, w celu eksperymentowania z nim /dev/nullpowinniśmy raczej utworzyć jego kopię, a następnie przeprowadzić nasze eksperymenty. Stwórzmy /tmp/nullgo i wykorzystajmy do naszych celów eksperymentalnych:

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

Teraz /tmp/nulljest nasz /dev/nulldo wszystkich celów:

Stwórzmy test_fileai test_dirwewnątrz katalogu o nazwie 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

Poniżej przedstawiono zawartość ask_ubuntukatalogu:

$ 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

Teraz starają się przenieść nasze test_filedo /tmp/nulli zobaczyć zawartość 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

Polecenie się powiodło i test_filenie jest już dostępne. Teraz spróbuj przejść test_dirdo tego, /tmp/nullco się nie powiedzie:

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

test_dirjest nadal obecny w środku 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

Teraz, niech nam dowiedzieć, czy możemy odzyskać nasze test_fileod /tmp/null:

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

Tak więc nadal tam jest i /tmp/nullktóry był specjalnym plikiem został nadpisany i stał się jak każdy inny zwykły plik. Możemy odzyskać nasz plik, kopiując /tmp/nulltak jak każdy inny plik:

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

Plik odzyskany.

Uwaga:

Jeśli nie utworzyłeś /tmp/nulli nie wypróbowałeś tych poleceń bezpośrednio za pomocą /dev/null; upewnij się, że odzyskałeś plik (jeśli potrzebujesz), uruchamiając cp /dev/null our_test_file; i przywróć /dev/nulldo celów, jakie istnieje w naszym systemie, uruchamiając następujące polecenia, jak podano w połączonym pytaniu, tak szybko jak to możliwe:

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

Wniosek:

  • Dlatego nie można przenieść katalogu do katalogu /dev/nulli dlatego nie ma mowy o odzyskaniu katalogu z tego miejsca.

  • Jeśli chodzi o pliki, jeśli przeniesiesz je bezpośrednio /dev/null, nadal możesz je odzyskać, jak pokazano powyżej. Istnieją jednak dwa wyjątki:

    1. W okresie uruchamiania sudo mv test_file /dev/nulli cp /dev/null our_test_file, jeśli skrypt korzeń w systemie zastąpienie go systemem echo "Whatever text the root script wants to send to /dev/null" > /dev/null(lub innych podobnych poleceń). W takim razie nie mamy łatwego sposobu na odzyskanie naszego pliku.

    2. Jeśli zrestartujesz system między uruchomieniem tych dwóch poleceń. /dev/nullzostanie ponownie utworzony podczas rozruchu, więc nasz plik zostanie utracony po wyłączeniu komputera.

  • Ale jeśli chcesz odzyskać strumienie wejściowe echo "Stream this line to /dev/null" > /dev/null, nie możesz tego odzyskać, ponieważ /dev/nulljest to specjalny plik do usuwania niechcianych plików i strumieni wejściowych, a jak wspomina artykuł w Wikipedii, nie dostarcza żadnych danych do procesu, który z niego odczytuje.


Odniesienie: Artykuł w Wikipedii na temat/dev/null

Aditya
źródło
4
sudo mv test_file /dev/nullzastępuje /dev/nullsię test_file. Po tym /dev/nulljest to zwykły plik i możesz z niego odczytać wszystko, co do niego napisałeś. NIE
Rób tego
„Zatem nie można odzyskać żadnego pliku, który został przeniesiony do / dev / null”, ściśle mówiąc, nieprawda. Jeśli zamkniesz system, zamontujesz go i uruchomisz na nim odzyskiwanie danych, bardzo dobrze możesz odzyskać plik, jeśli nie został nadpisany.
pzkpfw
@FlorianDiesch: Zaktualizowano odpowiedź :)
Aditya
7

Wszystko wysłane do /dev/nulljest po cichu odrzucane. Jeśli wpiszesz:

echo "Hello World"

Hello Worldpojawi się na ekranie. Jeśli wpiszesz:

echo "Hello World" >/dev/null

nic nie wyświetla się na ekranie.

Ale w przypadku polecenia move polecenie mvpróbuje zastąpić plik / dev / null katalogiem, co nie jest możliwe. Ponieważ w Linuksie wszystko jest plikiem, / dev / null jest plikiem. Oczywiście jeden specjalny (plik urządzenia), specjalny plik umożliwiający dostęp do sprzętu (takiego jak dyski, partycje, karty dźwiękowe, porty szeregowe, ...). W przypadku / dev / null nie jest to powiązane z żadnym sprzętem, więc dane do niego wysyłane są dyskretnie odrzucane. Właśnie dlatego „oni” mogli nazwać to blackhole.

Benoit
źródło
katalogi nie są plikami.
Thorbjørn Ravn Andersen
1
@ ThorbjørnRavnAndersen W świecie Linuksa katalogi są plikami!
Habeeb Perwad
@HabeebPerwad tylko w jądrze.
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen Przepraszam, nie dostałem się do jądra, więc nie mam pojęcia :)
Habeeb Perwad
„Ponieważ w systemie Linux wszystko jest plikiem” - niepoprawnie. Istnieją pliki, a także wiele innych obiektów. Nie jestem pewien, skąd to masz.
ggPeti