web-dev-qa-db-ja.com

/ dev / nullから読み取ることができます。修正方法

/dev/nullに関するウィキペディアの記事 を読み、ファイルを/dev/nullに移動して遊んでいました。

このためにtest_fileを作成し、その中にいくつかのコンテンツを入れました:

$ touch test_file
$ echo "This is written by Aditya" > test_file
$ cat test_file
This is written by Aditya

その後、ファイルを/dev/nullに移動しようとしました:

$ mv test_file /dev/null
mv: inter-device move failed: ‘test_file’ to ‘/dev/null’; unable to remove target: Permission denied

以来、これによりPermission deniedエラーが発生しました。先に進み、Permission deniedエラーが発生したときはいつものようにSudoを使用しました。

$ Sudo mv test_file /dev/null

コマンドは成功し、test_fileはディレクトリに存在しなくなりました。

ただし、Wikipediaの記事には、/dev/nullに移動したものを復元することは不可能であり、そこから読み取ろうとするプロセスにEOFが与えられると書かれています。しかし、私は/dev/nullから読むことができます:

$ cat /dev/null
This is written by Aditya

何を間違えたのか、/dev/nullを通常に戻すにはどうすればよいですかそもそもなぜPermission deniedエラーに遭遇したのですか?

80
Aditya

/dev/nullはファイルです。特別なファイル。システムのハードウェアと通信する/ dev/sdaや/ dev/ttyなどのデバイスファイル。

/dev/nullとの唯一の違いは、ハードウェアがリンクされていないことです。送信したデータはすべて静かに破棄されます。次のコマンドのように:

echo "Hello World" > /dev/null

echoの出力をnullに送信するため、端末には何も印刷されません。

ただし、mv test_file /dev/nullを実行したときは、/dev/nullの内容のコピーを保持して、特殊ファイルtest_fileを通常のテキストファイルに置き換えました。つまり、あなたは/dev/nullを失いました。

今、あなたがしなければならないことは(それを再構築するため)です:

Sudo rm /dev/null
Sudo mknod -m 0666 /dev/null c 1 3

多くのスクリプトがデフォルトで/dev/nullに出力を送信するため、再構築する必要があります。 /dev/nullがブラックホールではなく通常のテキストファイルである場合、ファイルシステムが大きくなり、大きくなり、いっぱいになる可能性があります。そして、あなたはこれを避けたいと確信しています。

さらに危険なのは、多くのスクリプトが/dev/nullからの読み取りは何も読み取らないと想定していることです。この仮定を破ると、システム全体のファイルにランダムなゴミが書き込まれる可能性があります。修正するのは事実上不可能です。

Linuxはマルチタスクであることを忘れないでください。/dev/nullで遊んでいる間、多くのプロセスが実行されており、数秒の「機会の窓」でも大混乱を引き起こす可能性があります。

/dev/nullで遊びたい場合は、コピーを作成して試してください:

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

/tmp/nullとまったく同じように機能する/dev/nullファイルを作成しますが、システムを危険にさらすことなく操作およびテストできます。

147
Benoit

ファイルの上書きファイルへの書き込みには大きな違いがあります。

何かを/dev/nullに書き込むとき、例えば

$ echo Hello > /dev/null

...静かに破棄されます。このためには、誰もが持っている/dev/nullへの書き込み権限が必要です。

$ ls -l /dev/null 
crw-rw-rw- 1 root root 1, 3 Mar 18 13:17 /dev/null

mvコマンドで行ったように/dev/nulloverwriteすると、特別なファイル/dev/nullをそこに移動したもので置き換えます。 これをしないでください!ルート権限が必要な理由は、ファイルを上書きするには、ファイルを含むディレクトリへの書き込み権限が必要だからです 、この場合は/dev

$ ls -ld /dev
drwxr-xr-x 16 root root 4640 Mar 18 13:17 /dev

/dev/nullを復元するには、コマンドを発行します

$ Sudo rm /dev/null
$ Sudo mknod -m 0666 /dev/null c 1 3

&L StackExchange:/dev/nullの作成方法 も参照してください)

16
Malte Skoruppa

コマンドを実行するとき

$ Sudo mv test_file /dev/null

replaced特殊ファイル/dev/nullがテキストファイルに含まれています。 /dev/nullから読み取ろうとすると、テキストファイルの内容が返され、通常の方法で/dev/nullを使用しようとするプログラムはおそらく壊れます。

/dev/のデバイスファイルの置換または削除にはスーパーユーザー権限が必要です。これが、Sudo以外の試みがエラーで失敗した理由です。

/dev/nullを手動で復元する方法については、Benoitの回答を参照してください。ただし、/dev/のコンテンツのほとんど(すべてではないにしても)はudevによって動的に管理されるため、単純な再起動でもおそらく修正されると思われます。

8
user21322

何をすべきかという質問に答え、ファイルを削除するには、次のようにします。

rm test_file

他の人が述べたように、/ dev/nullはプログラムの出力先です。

6
mlv