我正在用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个不同的可执行文件? (例如sudo
和myprog_bootstrap
,只需运行第一个myprog
}
答案 0 :(得分:5)
您需要root权限才能在/etc
中创建文件。使用前面的sudo
运行您的可执行文件:
sudo executable_name
答案 1 :(得分:3)
另一种可能性是制作可执行文件setuid。然后,您的程序将非常适当地调用setreuid(2)系统调用。
但是,要非常小心。像/bin/login
(或/usr/bin/sudo
本身)这样的程序以这种方式编码,但程序中的任何细微错误都会打开一堆安全漏洞。所以在编写这样的代码时请偏执,并让其他人审阅。
也许更好的方法可能是让你的安装程序使/etc/yourfile
一些符号链接(在安装时创建一次到其他地方的某个可写文件)....
/etc/yourfile
可写入组,并使您的程序setgid。
甚至,为您的计划投入一个用户,并让/etc/yourfile
属于该用户。
或者,在安装时,创建/etc/myprog/
目录并属于相应的用户(或组)并且可写入该用户(或组)。
PS。另请阅读Advanced Linux Programming,capabilities(7),credentials(7)和execve(2)