特殊ファイルに無効な権限があります

特殊ファイルに無効な権限があります

Linuxの多くの特殊ファイルに無効な権限があることがわかりました。

たとえば、

$ ls -l /dev/fuse 
  crw-rw-rw- 1 root root 10, 229 May 29 09:59 /dev/fuse

書くことができるように見えますが、実際にはそうではありません。

$ echo 1 > /dev/fuse
  -bash: echo: write error: Operation not permitted

たとえば、次のすべてのファイルについて同じです/proc/$pid/attr

$ ls -l /proc/1/attr/
total 0
-rw-rw-rw- 1 root root 0 May 30 11:01 current
-rw-rw-rw- 1 root root 0 May 30 11:01 exec
-rw-rw-rw- 1 root root 0 May 30 13:31 fscreate
-rw-rw-rw- 1 root root 0 May 30 11:01 keycreate
-r--r--r-- 1 root root 0 May 30 11:01 prev
-rw-rw-rw- 1 root root 0 May 30 11:01 sockcreate
$ echo 1 >| /proc/1/attr/keycreate 
-bash: echo: write error: Permission denied

これはバグですか?
(ところで、私はこれらのファイルが何をしているのかわかりません)。

答え1

私の2つのコメントが答えになると思います...

1)ファイルの用途(または使用方法)がわからない場合は、「>ファイル」を使用しないでください。回復不能なファイルを消去したり混乱させたりすることがあります。

2)2つの具体的な例の場合:

  • /dev/fuse は en.wikipedia.org/wiki/Filesystem_in_Userspace で使用されます。たとえば、「sshfs」などを使用する場合です。使用しないと何も起こりません(権限は正確ですが、現在は何も指していません)。使用すると実行可能なファイルシステムになり、「>」と入力するとシステムが壊れたり破壊されたりする可能性があります... [ymmv]

  • /proc/1 は「init」のためのものなので、これを台無しにしたくありません。

(そして怒らせたくない他の多くの人もいます... ^^)

答え2

これはext4や他のおなじみのファイルシステムのファイルだけではありません。

# mount | grep -E "on /proc |on /dev "
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
dev on /dev type devtmpfs (rw,...)

/ procの場合、カーネルで実行される作業を表す仮想ファイルシステムであるprocfsがあり、これらは実際にはファイルではなくファイルベースのカーネルインタフェースです。これは、データおよびメタデータバイトを構成する以上の機能を実行する一部のドライバでサポートされています。これらの「仮想ファイルシステム」には、ファイルシステムの一般的な理解に反しているように見えるいくつかのユニークな動作があります。

たとえば、次のように奇妙に見えます。

# echo hi > /proc/testfile
-bash: /proc/testfile: No such file or directory

/ devの場合は、tmpfs、devtmpfs(systemdを持たないArchなど)、またはdevfs(FreeBSDなど)、またはsystemdを持つ他のものです。通常のファイルシステムと同様に動作しますが(またはそうでない場合があります)、通常は「特殊ファイル」があります。通常のファイルの代わりに。これを別のファイルシステムにコピーするか、mknod または mkfifo を使用して直接作成し、どのように動作が異なるかを確認できます。特殊ファイルの場合、「echo hi> somefile」は、おそらく「ファイルを開いて切り取り、次にhiを書き込む」という意味ではなく、「hi」を一部のドライバや他のものに渡すという意味です。

# file /dev/sda /dev/mem /dev/fuse /dev/null
/dev/sda:  block special (8/0)
/dev/mem:  character special (1/1)
/dev/fuse: character special (10/229)
/dev/null: character special (1/3)

# file -s /dev/sda /dev/mem /dev/fuse /dev/null
/dev/sda:  DOS/MBR boot sector, extended partition table (last)
/dev/mem:  ERROR: cannot read `/dev/mem' (Operation not permitted)
/dev/fuse: ERROR: cannot read `/dev/fuse' (Operation not permitted)
/dev/null: empty

しかし、cpにコピーすることは(常に?)うまくいきません。 (どうするか忘れてしまったり想像したものかもしれません)

# cp /dev/null /tmp
# file -s /tmp/null
/tmp/null: empty
# echo hi > /tmp/null
# file -s /tmp/null
/tmp/null: ASCII text

# cp /dev/sda /tmp/
... it is copying the whole disk to /tmp now ... hit ctrl+c

関連情報