【发布时间】:2023-04-05 13:07:01
【问题描述】:
由于我的节点程序使用的模块,它需要 root 才能运行。这是因为它必须在端口 80 上运行 HTTP 服务器(如您所知,像这样的较低端口需要 root 才能使用)。
但是,该程序还使用fs 方法来创建文件。只要我可以更改权限,我不介意root是否是所有者......但这正是我遇到的问题。
我正在使用fs.mkdir 函数来创建一个目录,如下所示:
(假设这个文件名为create.js)
fs.mkdir(__dirname + "/.loud", 0777, function(err){
if (err) console.log("Failed to create file at " + __dirname + "/.loud");
});
当执行它时(记住,通过 sudo,sudo node create.js)它实际上创建了文件夹...但是提供的权限(0777)是错误的!...
如果我没记错的话,7 表示读、写和执行。将它用于 3 个字段(777 + 前导 0 将其表示为八进制)应该意味着每个人都可以在此文件夹中读取、写入和执行...但这是我在检查文件夹时得到的权限:
[imac] jamen : ~/Tests/mkdir $ ls -a -l .
...
drwxr-xr-x 2 root root 4096 Jun 12 22:27 .loud
所以,让我们分开开始权限部分:
d, rwx, r-x, r-x
所以,我不知道 d 是什么意思(请随时在 cmets 中告诉我),所以我想我们可以把它扔掉。这是另一个意思:
- 所有者可以读取、写入和执行(如预期)
- 该组可以读取和执行(什么?!我们指定
7,这意味着它也应该可以写入???) - 其他人都可以读和执行(再次……我们还指定了
7,应该每个人也可以写吗?)
所以,为了解决这个问题,我去冒险了found this post on SE.Unix,看了之后觉得还不如尝试指定十进制格式的权限,而不是八进制格式...
这是我更改 create.js 文件的方式:
fs.mkdir(__dirname + "/.loud", 511, function(err){
if (err) console.log("Failed to create file at " + __dirname + "/.loud");
});
(由于八进制的 0777 表示为十进制的 511)
但是,不幸的是,这给出了完全相同的结果(是的,我确实在再次运行之前删除了该文件夹,否则 NodeJS 会在回调中传递一个错误):
[imac] jamen : ~/Tests/mkdir $ ls -a -l .
...
drwxr-xr-x 2 root root 4096 Jun 12 22:35 .loud
我对 Unix 的权限方案有什么误解,还是我在 NodeJS 中犯了一个错误?
我将如何解决此问题,以便文件夹获得权限0777,这意味着所有者为 rwx 权限,该组具有 rwx 权限,其他所有人都具有 rwx 权限...?
【问题讨论】:
标签: node.js unix permissions fs