Чому переміщення каталогів у / dev / null небезпечно?


28

Коли я намагаюся перемістити test_dirкаталог /dev/null, я отримую повідомлення

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

Тоді чому люди кажуть "Не запускайте команду sudo mv ~ /dev/null, вона перемістить ваш домашній каталог в дірку?"

Посилання

Але /homeце також довідник.

Відповіді:


39

Тому що люди припускають. Я був одним із тих людей, поки не перевірив це . Неважко зрозуміти, чому люди припускають ... Це виглядає небезпечно ...

... але ви не можете перенести речі на /dev/null- Це спеціальний файл, який просто поглинає переадресації (і надсилає їх у небуття). Якщо ви спробуєте перенести до нього каталог, файлова система буде виразно вибухнути перед вашим обличчям, і якщо ви спробуєте перемістити файл до нього, ви, ймовірно, в кінцевому підсумку заміните його.

Перше посилання стосуватиметься каталогів, але ось окремий тест на те, щоб перезаписати його у файл. Як зазначає Рмано в коментарях, це, мабуть, те, що вам не слід робити без нагляду дорослих. Існує ризик.

$ 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
Ні, переміщення файлу в / dev / null викине ваш нульовий пристрій і замінить його на цей файл, а не позбудеться його вмісту.
psusi

2
Відповідь трохи неоднозначна. Переміщення файлу до /dev/nullне призведе до того, що дані переміщуються в небуття. Це призведе до того, що дані будуть переміщені нормально, але /dev/nullвони будуть перезаписані, і тому ви можете їх ще перемістити назад :) Також дивіться askubuntu.com/questions/435887/…
Malte Skoruppa

1
Так, адже це sudo mv file /dev/null матиме успіх і може легко призвести до абсолютно непридатної системи. Дивіться мої коментарі до питання, пов’язаного в коментарі @MalteSkoruppa. Це ще один чіткий приклад "наперед, sudoлише якщо ти тричі перевірив, що знаєш, що робиш" ;-)
Rmano

5
Ви можете експериментувати, створюючи власну копію / dev / null: sudo mknod -m 0666 /tmp/mynull c 1 3---, а потім грати з нею ;-)
Rmano

10
Звідси виходять найкращі запитання. "Шановний запитайте Ubuntu, я нещодавно помилково перемістив домашнє завдання на / dev / null, і це було всмоктано в 90% моїх файлів конфігурації системи. Тепер я бачу твори Шекспіра щоразу при завантаженні. А моя трекпад не працює. Халп! "
Олі

18

/dev/nullце лише файл, це файл "спеціального символу", але він не менш обмежений правилами, яких повинні дотримуватися файли. Це було сказано, що ви ніколи не можете виконати цю команду:

$ mv ~ /dev/null

mvКоманда не допустить цього , так як ви рухаєтеся каталог в файл, який просто не має сенсу контекстуально і mvзнає про це.

Приклад

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

Ви не можете скопіювати /dev/nullбудь-який, якщо це файл символів, якщо спробувати скопіювати на нього звичайний файл.

$ 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

Про єдине, що ви можете зробити з цим файлом, - скопіювати mvнад ним інший файл або видалити його.

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

Після цієї команди /dev/nullє звичайний файл. Найнебезпечніший ефект цієї зміни є те , що , /dev/nullяк передбачається, ніколи висновок які - або дані, тому кількість скрипта буде вважати , що

`... < /dev/null` 

рівносильно сказати "нічого". Порушення цього припущення може призвести до випадкових даних (ну, даних, які останній процес записував у `/ dev / null '), вставлених у системні файли по всій системі ---, що може призвести до абсолютно зламаної та неповерненої системи.


13

Ви можете записувати файли або інші вхідні потоки в /dev/nullкаталоги, але не в них. Якщо ви спробуєте перенести каталог до /dev/nullнього, повідомте про помилку, оскільки /dev/nullце не каталог, а файл.

Однак, оскільки ви хочете експериментувати /dev/null, вам спершу пропонується дізнатися про наслідки переміщення файлу для перезапису /dev/nullта як відновитись із цієї ситуації:

Як запропонував @Rmano у цій відповіді на це запитання, для того, щоб поекспериментувати з /dev/nullнами, слід скоріше створити його копію, а потім виконати експерименти. Отже, давайте створимо /tmp/nullта використаємо його для наших експериментальних цілей:

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

Тепер /tmp/nullми /dev/nullвсе для всіх цілей:

Давайте створимо каталог a test_fileі test_dirвсередині, який називається 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

Далі показано вміст ask_ubuntuкаталогу:

$ 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

Тепер спробуйте переміщаємо test_fileдо /tmp/nullі побачити вміст 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

Команда вдається та test_fileбільше недоступна. Тепер спробуйте перейти test_dirдо того, /tmp/nullщо не вдається:

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

test_dirвсе ще присутній всередині 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

Тепер, давайте зрозуміти , якщо ми зможемо відновити наші test_fileвід /tmp/null:

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

Отже, він все ще є і /tmp/nullякий спеціальний файл був перезаписаний, і він став як і будь-який інший звичайний файл. Ми можемо відновити наш файл, скопіювавши так /tmp/nullсамо, як і будь-який інший файл:

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

Файл відновлено.

Примітка:

Якщо ви не створили /tmp/nullта не випробували ці команди безпосередньо, використовуючи /dev/null; переконайтеся, що ви відновите файл (якщо потрібно), запустівши cp /dev/null our_test_file; і відновити /dev/nullдля цілей, які вони існують у нашій системі, якнайшвидше виконати наступні команди, як зазначено у пов'язаному питанні:

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

Висновок:

  • Отже, неможливо перемістити каталог /dev/nullі, отже, не виникає питання відновлення каталогу звідти.

  • Що стосується файлів, якщо ви безпосередньо переміщуєте файли /dev/null, ви все одно можете їх відновити, як показано вище. Однак є два винятки:

    1. Протягом періоду, який ви запускаєте, sudo mv test_file /dev/nullі cp /dev/null our_test_fileякщо будь-який кореневий скрипт у системі перезаписав його, запустивши echo "Whatever text the root script wants to send to /dev/null" > /dev/null(або інші подібні команди). Тоді у нас немає простого способу відновити наш файл.

    2. Якщо ви перезавантажите систему між виконанням цих двох команд. /dev/nullзнову створюється під час завантаження, тому наш файл втрачається, коли ми вимикаємо комп'ютер.

  • Але якщо ви хочете відновити вхідні потоки на зразок echo "Stream this line to /dev/null" > /dev/null, ви не можете відновити це, оскільки /dev/nullце спеціальний файл для видалення непотрібних файлів і потоків введення, і як згадується у статті Вікіпедії, він не надає жодних даних для процесу, який читається з нього.


Довідка: Стаття у Вікіпедії о/dev/null


4
sudo mv test_file /dev/nullзамінює /dev/nullна test_file. Тож після цього /dev/null- просто звичайний файл, і ви можете прочитати з нього все, що ви написали в нього. НЕ РОБИТИ ЦЕ
Флоріан Дієш

"Отже, неможливо відновити жоден файл, який ви перемістили в / dev / null", строго кажучи, не вірно. Якщо ви закрили систему, змонтували її та запустили відновлення даних на ній, ви, можливо, зможете відновити файл, якщо він не був перезаписаний.
pzkpfw

@FlorianDiesch: Оновлено відповідь :)
Aditya

7

Все, що надсилається /dev/null, мовчки відкидається. Якщо ви введете:

echo "Hello World"

ви потрапляєте Hello Worldна екран. Якщо ви введете:

echo "Hello World" >/dev/null

ви нічого не отримуєте на екрані.

Але у випадку команди переміщення команда mvнамагається замінити файл / dev / null каталогом, що неможливо. Оскільки все є файлом у Linux, / dev / null - це файл. Спеціальний (звичайно, файл пристрою), спеціальний файл, що дозволяє отримати доступ до обладнання (наприклад, диски, перегородки, звукові карти, послідовні порти, ...). У випадку / dev / null це не пов'язано з будь-яким обладнанням, тому дані, що надсилаються до нього, мовчки відкидаються. Ось чому "вони", можливо, назвали це чорнобривцем.


каталоги не є файлами.
Thorbjørn Ravn Andersen

1
@ ThorbjørnRavnAndersen У світі Linux каталоги - це файли!
Хабіб Первад

@HabeebPerwad лише всередині ядра.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen Вибачте, я не потрапив у ядро, тому немає ідеї :)
Habeeb Perwad

"Тому що все є файлом в Linux" - Неправильно. Є файли, а також безліч інших видів об’єктів. Не впевнений, де ти це взяв.
ggPeti
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.