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
내 두 댓글이 답이 될 것 같아요 ...
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