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

时间:2017-06-01 15:58:29

标签: c linux permissions

我正在用C编写一个程序,每次开始设置一些变量时都必须检查配置文件

在程序的第一次启动时,我想不会有任何配置文件,所以我需要创建它(使用默认设置)。

我曾经说过程序的配置文件属于文件夹function RunAPI (x) { var sheet = SpreadsheetApp .openById('1d_p_aHD0Nc7LpvI5P72XQ7a-LA4SkOh4T4zyJwFsrzE') .getSheetByName('Lunch'); var results = sheet.getSheetValues(3, 2, sheet.getLastRow(), 1) results.reduce(function(a, b) {return a.concat(b);}); var resultsstring = JSON.stringify(results); Logger.log(resultsstring); if (resultsstring =! '"'); { for (var x = 0; x < resultsstring.length; x++) { var url = UrlFetchApp.fetch('https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&mode=walking&origins=253+Broadway+New+York+10007&destinations=' +encodeURIComponent(resultsstring[x]) +'&key=KEY'); var response = UrlFetchApp.fetch(url); return response } } } function runTest(){ response = RunAPI("https://maps.googleapis.com/maps/api/distancematrix/json?") Logger.log(response) } ,更具体地说是为程序本身创建的特定文件夹(即/etc)。这是我应该问的第一个问题:这是真的吗?为什么/etc/myprog

在任何情况下,我都尝试使用以下方法创建该文件:

/etc

open("/etc/myprog/myprog.conf", O_WRONLY | O_CREAT, 0644); 返回open并将-1全局变量设置为errno(即文件夹不存在)。 如果我尝试在2内直接创建文件(因此/etc作为"/etc/myprog.conf"的第一个参数),我会将open设置为errno(即许可被拒绝)。

有没有办法授予我的程序权限以写入13

编辑:我看到大多数用户建议使用/etc。如果可能的话,我宁愿避免使用此选项,因为此文件只需创建一次(在第一次启动时)。也许我应该制作2个不同的可执行文件? (例如sudomyprog_bootstrap,只需运行第一个myprog}

2 个答案:

答案 0 :(得分:5)

您需要root权限才能在/etc中创建文件。使用前面的sudo运行您的可执行文件:

sudo executable_name

答案 1 :(得分:3)

另一种可能性是制作可执行文件setuid。然后,您的程序将非常适当地调用setreuid(2)系统调用。

但是,要非常小心。像/bin/login(或/usr/bin/sudo本身)这样的程序以这种方式编码,但程序中的任何细微错误都会打开一堆安全漏洞。所以在编写这样的代码时请偏执,并让其他人审阅。

也许更好的方法可能是让你的安装程序使/etc/yourfile一些符号链接(在安装时创建一次到其他地方的某个可写文件)....

顺便说一句,您可以为您的程序创建一个组,并使-at安装时间 - /etc/yourfile可写入组,并使您的程序setgid。 甚至,为您的计划投入一个用户,并让/etc/yourfile属于该用户。

或者,在安装时,创建/etc/myprog/目录并属于相应的用户(或组)并且可写入该用户(或组)。

PS。另请阅读Advanced Linux Programmingcapabilities(7)credentials(7)execve(2)