
我試圖理解為什麼 sudo 沒有這裡的權限
touch fred.txt
/tmp$ ls -la fred.txt
-rw-rw-r-- 1 me me 0 Dec 12 15:40 fred.txt
/tmp$ sudo -i
~# cd /tmp
/tmp# echo hi >> fred.txt
-bash: fred.txt: Permission denied
/tmp# chmod 666 fred.txt
/tmp# ls -la fred.txt
-rw-rw-rw- 1 me me 0 Dec 12 15:40 fred.txt
/tmp# echo hi >> fred.txt
-bash: fred.txt: Permission denied
id
uid=0(root) gid=0(root) groups=0(root)
據我了解,權限 666 應該授予所有者、群組和其他對檔案進行讀取/寫入的權限。 id 指令證明,sudo 充當 root 角色,可以在「其他」權限下存取該檔案。
我在這裡誤解了什麼?
答案1
這與這次提交在Linux核心中。通常/tmp
是“世界可寫的”(“世界”在這裡意味著“其他”)並且是“粘性的”:
$ stat /tmp/
...
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
...
chmod(2)
:
...
S_ISVTX (01000) sticky bit (restricted deletion flag, as described in unlink(2))
...
S_IWOTH (00002) write by others
...
正如提交訊息中所提到的,它並不完全阻止您寫入受影響的文件,而是阻止您使用 來開啟這樣的文件O_CREAT
,這是一個標誌open()
通常設定為在目標尚不存在時觸發文件建立。因此,您仍然可以在未設定標誌的情況下寫入受影響的檔案(可以使用 完成dd
):
# ls -l /tmp/meh
-rwxrwxrwx 1 tom tom 0 Dec 12 17:33 /tmp/meh
# id
uid=0(root) gid=0(root) groups=0(root)
# echo test | dd of=/tmp/meh oflag=append conv=notrunc
dd: failed to open '/tmp/meh': Permission denied
# echo test | dd of=/tmp/meh oflag=append conv=notrunc,nocreat
0+1 records in
0+1 records out
5 bytes copied, 9.4981e-05 s, 52.6 kB/s
#
請注意,這純粹是關於是否設置了標誌,而不是是否需要創建文件,因為在關注的情況下,文件始終存在。
另請注意,正如提交訊息中提到的,該文件無法使用O_CREAT
not打開只是因為它不屬於嘗試開啟它的使用者 ( root
),也因為它的擁有者 ( ) 與目錄 ( ) 的tom
擁有者 ( ) 不同。如果照原樣擁有,將會是root
/tmp
/tmp/
tom
/tmp/meh
root
有能力的用 來打開它O_CREAT
。
另請參閱這次提交在 systemd 中,它可以對採用它的發行版進行「保護」:
# sysctl fs.protected_regular
fs.protected_regular = 1
注意相關的sysctls也可以設定2
(或0
)。