ディレクトリを/ 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—それは単にリダイレクトを吸収する(そしてそれらを無に送る)特別なファイルです。ディレクトリをそのディレクトリに移動しようとすると、ファイルシステムが顔面で爆発的に爆発し、ファイルをそのディレクトリに移動しようとすると、おそらく置き換えられてしまいます。

最初のリンクはディレクトリを処理しますが、ファイルで上書きするための個別のテストがあります。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

2
いいえ、ファイルを/ dev / nullに移動すると、nullデバイスが破棄され、そのファイルに置き換えられます。ファイルの内容は削除されません。
psusi

2
答えは少し曖昧です。ファイルを/dev/nullに移動しても、そのデータは無に移動しません。それは大丈夫移動中のデータになりますが、/dev/null上書きされます、そして、あなたが戻って、まだそれを動かすことができるように:)も参照してくださいaskubuntu.com/questions/435887/...
マルタSkoruppa

1
うん、ためsudo mv file /dev/null になる成功し、簡単に完全にシステムが使用不能につながることができます。@MalteSkoruppaのコメントにリンクされている質問に関する私のコメントを参照してください。これは、「sudo自分何をしているかを3回確認した場合にのみ追加する」という別の明確な例です
;

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はすべての目的のために:

というディレクトリ内に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_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、上記のようにファイルを回復できます。ただし、次の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不要なファイルと入力ストリームを破棄する特別なファイルであり、ウィキペディアの記事で言及されているように、それから読み取るプロセスにデータを提供しません。


参照:ウィキペディアの記事/dev/null


4
sudo mv test_file /dev/null置き換え /dev/nulltest_file。したがって、その後/dev/nullは通常のファイルになり、そこに書き込んだものは何でも読むことができます。しないでください
フローリアンディーシュ14年

「そのため、/ dev / nullに移動したファイルを回復することはできません」厳密に言えばそうではありません。システムをシャットダウンしてマウントし、データ回復を実行する場合、ファイルが上書きされていなければ、ファイルを回復できる可能性が非常に高くなります。
pzkpfw

@FlorianDiesch:回答を更新しました:)
アディティア14年

7

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

echo "Hello World"

あなたが得るHello World画面上に。入力した場合:

echo "Hello World" >/dev/null

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

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


ディレクトリはファイルではありません。
トールビョーンラヴンアンデルセン14年

1
@ThorbjørnRavnAndersenLinuxの世界では、ディレクトリはファイルです!
ハビーブパーワッド14年

@HabeebPerwadはカーネル内のみ。
トールビョーンラヴンアンデルセン14年

@ThorbjørnRavnAndersen申し訳ありませんが、カーネルに
アクセス

「すべてがLinuxのファイルだから」-不正解。ファイルがあり、他にも多くの種類のオブジェクトがあります。どこで入手したかわかりません。
ggPeti
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.