`fs.mkdir` 正在创建具有与指定权限不同的权限的目录

6 unix permissions fs node.js

由于我的节点程序使用的模块,它需要 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");
});
Run Code Online (Sandbox Code Playgroud)

当执行它时(记住,通过 sudo,sudo node create.js)它实际上创建了文件夹...但是提供的权限(0777)是错误的!...

如果我没记错的话,7意味着读、写和执行。将它用于 3 个字段(777+ a 前导0将其表示为八进制)应该意味着每个人都可以在该文件夹内读取、写入和执行...但是这是我在检查文件夹权限时得到的结果:

fs.mkdir(__dirname + "/.loud", 0777, function(err){
  if (err) console.log("Failed to create file at " + __dirname + "/.loud");
});
Run Code Online (Sandbox Code Playgroud)

因此,让我们分开开始的权限部分:

[imac] jamen : ~/Tests/mkdir $ ls -a -l .
...
drwxr-xr-x 2 root  root  4096 Jun 12 22:27 .loud
Run Code Online (Sandbox Code Playgroud)

所以,我不知道这d意味着什么(请随时在评论中告诉我),所以我认为我们可以把它扔掉。这是另一个的意思:

  1. 所有者可以读取、写入和执行(如预期)
  2. 该组可以读取和执行(什么?!我们指定了7,这意味着它也应该能够写入???)
  3. 其他人都可以读取和执行(同样......我们还指定了7,每个人都应该能够写入吗?)

因此,为了解决这个问题,我冒险在 SE.Unix 上找到了这篇文章,读完后,我想我不妨尝试以十进制格式指定权限,而不是八进制格式......

这是我更改文件的方法create.js

fs.mkdir(__dirname + "/.loud", 511, function(err){
  if (err) console.log("Failed to create file at " + __dirname + "/.loud");
});
Run Code Online (Sandbox Code Playgroud)

(因为八进制的 0777 表示为十进制的 511)

但是,不幸的是,这给出了相同的确切结果(是的,我在再次运行之前删除了该文件夹,否则 NodeJS 会在回调中传递错误):

d, rwx, r-x, r-x
Run Code Online (Sandbox Code Playgroud)

我是否误解了 Unix 的权限方案,或者我在 NodeJS 中犯了错误?

我该如何解决这个问题,以便文件夹获得权限0777,这意味着所有者具有 rwx 权限,该组具有 rwx 权限,而其他人都具有 rwx 权限...?

Pie*_*ert 4

因为它会在您的模式上应用umaskumask在控制台中输入,您将看到 022 或 0022。

您可以使用以下命令覆盖您的节点进程process.umask(newmask);