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

时间:2015-06-13 04:40:51

标签: node.js unix permissions fs

由于我的节点程序使用的模块,它需要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意味着什么(随意在评论中告诉我),所以我认为我们可以抛弃它。这是另一个意思:

  1. 所有者可以读取,写入和执行(按预期方式)
  2. 该组可以读取并执行(什么?!我们指定7,这意味着它也应该能够写出来?)
  3. 其他人都可以阅读和执行(再次......我们还指定了7,是否每个人都能写?)
  4. 所以,在尝试解决时,我继续冒险并found this post on SE.Unix,在阅读之后,我想我也可以尝试以十进制格式指定权限,而不是八进制格式... < / p>

    以下是我更改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 permissoins,该组具有rwx permissoins,其他所有人都拥有rwx权限......?

1 个答案:

答案 0 :(得分:2)

因为它适用于您的模式umask。在控制台中输入umask,您将看到022或0022。

您可以使用process.umask(newmask);

为您的节点进程覆盖它