Linux C/C++ 有
open
或 fopen
API,但创建的文件属于进程 uid。
如果我们想更改此文件的所有者/组,我们可以在文件创建后使用
chown
或 fchown
API。
但是,是否有一个 API 可以作为另一用户创建文件,而不是两个 API ?
没有专门用于此目的的 Unix api,但您可以将当前用户更改为 创建文件之前的其他用户,例如:
确保您已获得许可。当前有效用户必须是“root”或在可执行文件上设置用户或组ID。
呼叫
setgid
和 setuid
给其他用户。创建文件。
如有需要,请致电
setuid
和 setgid
给老用户。因为用户是进程范围的,如果你的程序是多线程的,你可能 需要分叉一个子进程来执行我之前列出的步骤。
但是如果你想让非root用户(比如nobody)运行你的程序,你可以给 您的可执行文件的权限:
sudo chown root:root ./your_app && sudo chmod gu+s ./you_app
现在您可以调用
setuid(0)
和setgid(0)
来获取root权限。
这在 Linux 中是不可能的。
允许这样做可能会导致一些微妙的安全错误(远程代码执行、破坏其他用户的文件等),因此是不允许的。
相反,请在
sudo
下运行该过程。
Linux 有一个文件系统 uid,通常与有效用户 ID 具有相同的值,但可以通过 setfsuid() 系统调用进行更改。您可以在创建文件之前更改 fsuid。并根据需要将其改回来。
setfsuid(1000);
creat("helloworld", 0644);
结果:
$ sudo ./a.out
$ ls helloworld -l
-rw-r--r-- 1 yuan root 0 Sep 26 19:29 helloworld
新创建的文件拥有元所有者(uid 1000)。