如何使用C语言在Linux的`/etc`文件夹中创建一个文件?

3
我正在使用C语言编写程序,每次启动时都需要检查一个配置文件来设置一些变量。由于程序第一次启动时,我假定没有任何配置文件,因此需要创建它(带有默认设置)。据说程序的配置文件属于/etc文件夹,更具体地说是专门为该程序创建的特定文件夹(即/etc/myprog)。这里出现了我本应该问的第一个问题:这是真的吗?为什么要用/etc?在任何情况下,我尝试使用以下命令来创建该文件:
open("/etc/myprog/myprog.conf", O_WRONLY | O_CREAT, 0644);
open函数返回-1并将全局变量errno设置为2(即文件夹不存在),如果我尝试直接在/etc中创建文件(因此open的第一个参数为"/etc/myprog.conf"),则errno被设置为13(即权限被拒绝)。
有没有办法授予我的程序写入/etc的权限? 编辑: 我看到大多数用户建议使用sudo。 如果可能,我希望避免使用此选项,因为该文件只需在第一次启动时创建。也许我应该制作两个不同的可执行文件?(例如myprog_bootstrapmyprog,只需要使用sudo运行第一个可执行文件)

你是否以拥有该目录写入权限的身份运行程序? - Chris Turner
sudo your_exec ....? - LPs
1
如果调用您的程序的人没有访问/etc/的权限,那么您的程序也不应该有(这将是一个巨大的安全漏洞...)。您需要使用sudo运行(自从我开始输入这个问题以来已经提到了五次 :-) )。 - blackghost
@BasileStarynkevitch 那肯定是一个“XY问题”!您建议我关闭这个问题并创建一个新的问题吗?我想要做的是在/etc文件夹内为程序创建一个配置文件(正如有人建议我的那样,尽管我不太清楚为什么是/etc!)此文件只需在程序第一次启动时创建,或在用户手动删除时创建...在所有其他情况下,我只需要读取它! - Robb1
@Robb1:不,我建议您再次编辑您的问题,并用几段话解释一下您的程序实际上在做什么,以及那个“/etc/myfile”到底是用来做什么的。 - Basile Starynkevitch
显示剩余7条评论
2个回答

7

创建位于/etc目录下的文件需要root权限。请在可执行程序前加上sudo运行:

sudo executable_name

3
另一个可能的选择是使你的可执行文件setuid。然后,你的程序将适当地调用setreuid(2)系统调用。
但是,一定要非常小心。像/bin/login(或/usr/bin/sudo本身)这样的程序都是这样编码的,但你程序中的任何微小错误都会引发安全漏洞问题。因此,请在编写此类代码时保持警惕,并请其他人对其进行审核。
也许更好的方法是让安装过程使/etc/yourfile成为某个符号链接(在安装时创建到其他可写文件),......
顺便说一下,你可以为你的程序创建一个组,并在安装时将/etc/yourfile写为该组,然后让你的程序setgid。 甚至,专用于你的程序的用户,并让这个/etc/yourfile归属于该用户。
或者,在安装时,创建/etc/myprog/目录并将其归属于相应的用户(或组),并对该用户(或组)具有可写权限。
PS. 还请阅读Advanced Linux Programmingcapabilities(7)credentials(7)execve(2)

2
我不确定为什么你建议创建符号链接 - 在你无法创建文件的地方,你很可能也无法创建符号链接。 - tofro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接