簡體   English   中英

如何在 UNIX /tmp 目錄中創建一個文件,以便所有用戶都可以對其進行讀寫?

[英]How do I create a file in UNIX /tmp directory so that all users can read and write to it?

我正在嘗試在/tmp目錄中創建一個文件(在 Linux UBUNTU 7.10 上工作),該文件對任何用戶都具有讀/寫/執行訪問權限。

所以我正在使用

open(fileName,O_CREAT|O_RDWR,0777)

user1帳戶中創建文件(從 C 程序)的函數,我希望user2能夠寫入特定文件。

但是,當我檢查/tmp目錄時,使用

ls -l

我看到我沒有user2寫訪問權限(考慮到user1創建了它,我對user1有寫訪問權限,但被認為是“其他人”的user2沒有任何訪問權限)。

我嘗試在open函數中使用模式0766 (以及模式76這種組合),以便我可以獲得對user2寫訪問權限,但我仍然沒有所需的訪問權限。

您必須將您的 umask 設置為 000。 umask 上的位從您選擇的權限中刪除,默認的 umask 通常是 022 或 002。

請注意,默認 ACL 和 SELinux 標簽等內容也可能會影響文件的可讀性和可寫性。 使用 getfacl 查看 ACL,使用 ls -Z 查看 SELinux 標簽; 對於 SELinux,您還必須知道哪些策略處於活動狀態以及它們具有什么效果。 也可以在 ls -l 上看到 ACL 的存在,作為權限后的 + 字符。

正如 CesarB 指出的那樣,Unix 會取消設置進程 umask 中設置的位,因此要獲得完全訪問權限,您必須暫時取消設置 umask。

 mode_t oldmask = umask(0);
 fd = open(...);
 oldmask = umask(oldmask);
 assert(oldmask == 0);

(好的;您不必執行斷言;它不會觸發。)

正如 Pistos 所指出的,在 /tmp 中創建文件是一個充滿挑戰的過程。 如果您認為該文件不應該存在,請添加 O_EXCL 以防止跟隨符號鏈接到意外位置。

最后一點 - 為什么要使文件可執行? 我認為您的目標應該是 666 權限,而不是 777 或 766。您絕對不應該執行其他人可以隨時更改的程序(因此所有者不應該對其他人可以寫入的文件具有執行權限),並且小組成員可能也不會真正欣賞這種慷慨。 如果其他人執行該文件,他們可能會得到他們應得的東西——但這仍然不好。

FWIW,在/tmp(或/var/tmp 等)中使用固定名稱創建任何內容都存在安全風險。 可以在 /tmp 中設置一個指向任何內容的同名符號鏈接,如果運行您的程序的用戶有權這樣做,您的程序將銷毀目標文件。

在 /tmp 中以編程方式創建的東西應該被賦予隨機名稱,但最好不要使用該目錄,除非您的整個系統是安全的(沒有潛在的惡意用戶)。

您唯一可以做的就是在創建文件后對其進行 chmod:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main() {
  creat("/tmp/foo", 0);
  chmod("/tmp/foo", 0666);
}

無論如何,擁有這種文件是不安全的。

我假設您正在嘗試執行一些 IPC。 您是否考慮過使用其他方法來實現這一點,例如使用 dbus 或為此目的設計的其他系統?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM