sudo 無法寫入臨時文件

sudo 無法寫入臨時文件

我試圖理解為什麼 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_CREATnot打開只是因為它不屬於嘗試開啟它的使用者 ( root),也因為它的擁有者 ( ) 與目錄 ( ) 的tom擁有者 ( ) 不同。如果照原樣擁有,將會是root/tmp/tmp/tom/tmp/mehroot有能力的用 來打開它O_CREAT

另請參閱這次提交在 systemd 中,它可以對採用它的發行版進行「保護」:

# sysctl fs.protected_regular
fs.protected_regular = 1

注意相關的sysctls也可以設定2(或0

相關內容