我正在尝试在/ tmp目录中创建一个文件(在Linux UBUNTU 7.10上工作),该文件具有任何用户的读/写/执行访问权限。所以我使用“open(fileName,O_CREAT | O_RDWR,0777)”函数在user1帐户中创建文件(来自C程序),我希望user2能够写入特定文件。 但是,当我检查/ tmp目录(使用ls -l)时,我看到我没有user2的写访问权限(考虑到user1创建它的事实,我有user1的写访问权限,但是user2,被认为是成为“其他人”没有任何访问权限。 我试图在open函数中使用模式0766(以及模式的7和6的这种组合),这样我可以获得user2的写访问权限,但我仍然没有所需的访问权限。
答案 0 :(得分:8)
您必须将umask设置为000. umask上的位将从您选择的权限中删除,默认的umask通常为022或002。
请注意,默认ACL和SELinux标签之类的内容也可能会影响文件的可读性和可写性。使用getfacl查看ACL和ls -Z以查看SELinux标签;对于SELinux,您还必须知道哪些策略处于活动状态以及它们具有哪些效果。在权限之后,ls -l上也可以看到ACL的存在作为+字符。
答案 1 :(得分:3)
正如CesarB所说,Unix取消了进程的umask中设置的位,因此为了获得完全访问权限,你必须暂时取消设置umask。
mode_t oldmask = umask(0);
fd = open(...);
oldmask = umask(oldmask);
assert(oldmask == 0);
(好的;你不必做断言;它不会触发。)
正如Pistos所说,在/ tmp中创建文件是一个充满挑战的过程。如果您认为该文件不存在,请添加O_EXCL以防止符号链接到意外的位置。
最后一点 - 为什么要让文件可执行?我认为你的目标应该只是666,而不是777或766.你当然不应该执行其他人可以随时更改的程序(因此所有者不应该对其他人可以写入的文件具有执行权限),以及该组织的成员可能也不会非常欣赏这种慷慨。其他人可能会在他们执行文件时获得他们应得的东西 - 但它仍然不是很好。
答案 2 :(得分:2)
FWIW,使用固定名称在/ tmp(或/ var / tmp等)中创建任何内容都存在安全风险。可以在/ tmp中设置一个符号链接,其名称指向任何名称,如果运行程序的用户有权这样做,程序将销毁目标文件。
在/ tmp中以编程方式创建的东西应该是随机名称,但最好不要使用该目录,除非整个系统是安全的(没有潜在的恶意用户)。
答案 3 :(得分:2)
我假设你正在尝试执行一些IPC。您是否考虑使用其他方法实现此目的,例如使用dbus或som为此目的设计的其他系统?
答案 4 :(得分:1)
你唯一能做的就是在创建文件后chmod该文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main() {
creat("/tmp/foo", 0);
chmod("/tmp/foo", 0666);
}
无论如何,拥有这种文件是不安全的。