web-dev-qa-db-ja.com

ディレクトリを/ dev / nullに移動するのはなぜ危険なのですか?

test_dirディレクトリを/dev/nullに移動しようとすると、メッセージが表示されます

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

では、なぜ「Sudo mv ~ /dev/nullコマンドを実行しないでください。ホームディレクトリを穴に移動しますか?」と言うのはなぜですか?

リンク

ただし、/homeもディレクトリです。

26
Avinash Raj

人々が仮定するため。私はそれらの人々の一人でした テストするまで 。人々が仮定する理由を理解するのは簡単です...それlooks危険...

...しかし、あなたは実際に/dev/nullに物事を移動することはできません—それは単にリダイレクトを吸収する(そしてそれらを無に送る)特別なファイルです。ディレクトリをそのディレクトリに移動しようとすると、ファイルシステムが顔面で爆発的に爆発し、ファイルをそのディレクトリに移動しようとすると、おそらくファイルが置き換えられてしまいます。

最初のリンクはディレクトリを扱いますが、ファイルで上書きするための別のテストがあります。 Rmanoがコメントで指摘しているように、これはおそらく大人の監督なしにすべきではないことです。リスクが伴います。

$ 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
38
Oli

/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/nullneverにデータを出力することになっているため、多くのシェルスクリプトが

`... < /dev/null` 

「何もない」と言うのと同じです。この仮定を破ると、ランダムなデータ(最後のプロセスが `/ dev/null 'に書き込んだデータ)がシステム全体のシステムファイルに挿入される可能性があります。

18
slm

ファイルやその他の入力ストリームを/dev/nullに書き込むことはできますが、ディレクトリに書き込むことはできません。 /dev/nullはディレクトリではなくファイルであるため、ディレクトリを/dev/nullに移動しようとするとエラーが報告されます。

ただし、/dev/nullを試してみたいので、最初にファイルを移動して/dev/nullを上書きした場合の結果と、その状況から回復する方法を知っておくことをお勧めします。

@ Rmano in この回答 で示唆されているように、/dev/nullを試すには、コピーを作成してから実験を行う必要があります。それでは、/tmp/nullを作成して、実験目的で使用してみましょう。

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

今後は、/tmp/nullがすべての目的のための/dev/nullです:

test_fileというディレクトリ内にtest_dirask_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_dirask_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に直接移動しても、上記のようにファイルを回復できます。ただし、次の2つの例外があります。

    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. これらの2つのコマンドを実行する間にシステムを再起動する場合。 /dev/nullはブート時に再作成されるため、コンピューターをシャットダウンするとファイルが失われます。

  • しかし、echo "Stream this line to /dev/null" > /dev/nullのような入力ストリームを回復したい場合、/dev/nullは不要なファイルと入力ストリームを破棄する特別なファイルであり、Wikipediaの記事で言及されているように、それから読み取るプロセスへのデータ。


参照: Wikipedia Article on /dev/null

12
Aditya

/dev/nullに送信されたものはすべて静かに破棄されます。入力した場合:

echo "Hello World"

画面にHello Worldが表示されます。入力した場合:

echo "Hello World" >/dev/null

画面には何も表示されません。

しかし、moveコマンドの場合、コマンドmvは、/ dev/nullファイルをディレクトリで置き換えようとしますが、これは不可能です。 Linuxではすべてがファイルであるため、/ dev/nullはファイルです。もちろん特別なもの(デバイスファイル)、ハードウェア(ディスク、パーティション、サウンドカード、シリアルポートなど)にアクセスできる特別なファイル。/dev/nullの場合、これはどのハードウェアにもリンクされていないため、送信されたデータは静かに破棄されます。これが「彼ら」がそれをブラックホールと呼んだ理由です。

7
Benoit