【问题标题】:Node.js File Permissions are set at 000 when I create a File. How can I create a file with read write permissions, or change permissions?创建文件时,Node.js 文件权限设置为 000。如何创建具有读写权限或更改权限的文件?
【发布时间】:2021-01-17 16:07:05
【问题描述】:

我正在尝试通过 Node.js 创建一个文件,如果可能的话,我想专门使用 FS.openSync() 方法。目前我有一个非常简单的类来创建文件。该课程将进一步发展,但我只能在解决我的问题后才能继续上课;如何为节点通过“FS.writeSync() 方法”创建的文件设置文件用户权限,以便可以访问该文件。创建文件后,我认为权限设置为 001 或 000,这是一些荒谬且不需要的用户权限设置。 我在下面复制粘贴了我的小类,下面是我用来创建类实例并运行创建文件的方法的文件。

  • 我的文件类
/** @format */

/* eslint-disable */
const fs = require('fs');
const {O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC, O_APPEND} = require('fs').constants;
const {Buffer} = require('buffer');
/* eslint-enable */

class TextBasedFile {
    constructor(path) {
        this.path = path;
        this.buf = Buffer.allocUnsafe(400000000); // 40MB (Should be more than enough)
    }

    create() {
        const fd = fs.openSync(this.path, O_CREAT, O_WRONLY);
        console.log('\n\n\n\nRESULT: ' + fd);
        return fd;
    }

    truncate() {
        const fd = fs.openSync(this.path, O_TRUNC);
        console.log('\n\n\n\nRESULT: ' + fd);
        return fd;
    }
}

module.exports.TextBasedFile = TextBasedFile;
  • 我用来创建新文本文件的代码

/** @format */

const {TextBasedFile} = require('./unity/iof');

const sumfile = new TextBasedFile('./someFile.txt');

sumfile.create();



如您所见,我的设置非常简单,唯一的问题是如果没有 sudo 命令,我将无法访问我创建的文件。我什至无法从我的 Ubuntu 用户访问该文件。下面是我的应用程序目录中所有文件的打印输出,以及每个文件的用户权限。您可以看到“someFile.txt”的用户权限对我不起作用。

drwxrwxr-x   7 ajay ajay  4096 Oct  1 10:43 .
drwxrwxr-x   4 ajay ajay  4096 Sep 30 20:03 ..
-rwxrwxr-x   1 ajay ajay   533 Sep 30 22:16 app.js
-rwxrwxr-x   1 ajay ajay   858 Sep 30 22:52 .developerNotes.txt
-rwxrwxr-x   1 ajay ajay  1005 Sep 30 22:43 .eslintrc.json
drwxrwxr-x   8 ajay ajay  4096 Sep 30 23:38 .git
-rwxrwxr-x   1 ajay ajay   551 Oct  1 09:26 .gitignore
-rwxrwxr-x   1 ajay ajay  1075 Sep 30 20:03 LICENSE
-rwxrwxr-x   1 ajay ajay  1115 Sep 26 13:32 localhost-cert.pem
-rwxrwxr-x   1 ajay ajay  1704 Sep 26 13:32 localhost-privkey.pem
drwxrwxr-x 107 ajay ajay  4096 Sep 30 20:32 node_modules
-rwxrwxr-x   1 ajay ajay   980 Sep 30 20:31 package.json
-rwxrwxr-x   1 ajay ajay 36991 Sep 30 20:31 package-lock.json
-rwxrwxr-x   1 ajay ajay   466 Sep 30 22:11 .prettierrc
drwxrwxr-x   7 ajay ajay  4096 Sep 30 19:36 public
-rwxrwxr-x   1 ajay ajay   335 Sep 30 20:03 README.md
---------x   1 ajay ajay     0 Oct  1 10:43 someFile.txt
drwxrwxr-x   2 ajay ajay  4096 Sep 30 19:33 unity
drwxrwxr-x   2 ajay ajay  4096 Sep 30 20:05 .vscode

如果有人知道如何创建一个文件,并且权限设置允许我从内部节点访问该文件并使用它,那么......

...那太棒了。

【问题讨论】:

    标签: node.js linux file-permissions


    【解决方案1】:

    所以我弄清楚发生了什么。它与我使用的标志有关,它们对权限有影响。单独使用 O_CREATE 标志,可以按预期创建文件,但是它不会创建具有任何读取或写入权限的文件;如果您使用打开文件进行读取或读取和写入的标志来创建文件,则文件在创建时开始附加用户权限。下面是我正在使用的,它提供了我所需要的,一个具有读/写权限的新文件。

            const fd = fs.openSync(this.path, O_RDWR | O_CREAT);
    

    似乎没有多少人遇到过这个问题,所以也许它是节点的新东西,或者我正在做的一些奇怪的事情。我将继续研究该主题,并希望更好地理解它。如果以及何时获得更多信息,我将更新我的答案。以上解释了如何创建具有所需权限的文件,但也有一种方法可以通过本机 Node.js API、文件系统或更常见的“FS”来更改权限。

    以下是一些可用的方法:

    fs.chmod(); // Change Mode
    fs.chown(); // Change Owner
    

    现在我知道这些在 Linux 上的工作,作为一个“生死攸关”的 Ubuntu 用户,我显然可以查看这些方法并确切地知道它们是做什么的。 Windows 用户可能不会,因为它们是 Linux shell 的命令。我相信可以使用 Power-Shell 安装 Node.js 来运行它。我不知道这些命令是否适用于 Windows。如果有人知道,请告诉我们。

    可以找到各种类似命令的列表HERE on the official Node.js Documentation Site.

    【讨论】:

      【解决方案2】:

      不知道为什么/如何---------x 1 ajay ajay 0 Oct 1 10:43 someFile.txt 来了(你玩过你的umask 还是什么?),但是从你的代码中修复它们应该可以工作:

      create() {
          const fd = fs.openSync(this.path, O_CREAT, O_WRONLY);
          fs.fchmodSync(fd, 0o777);
          console.log('\n\n\n\nRESULT: ' + fd);
          return fd;
      }
      

      【讨论】:

      • 不,我没有,事实上我正在安装全新的 20.04 Ubuntu GUI。除非它可能是 v20.04 问题?它很奇怪,因为没有人问过它。
      • 在这种情况下,我会采取行动,并假设我正在做的事情可能很愚蠢,但我会发布我所做的一切,当我假设它是我造成的它。
      猜你喜欢
      • 2013-10-30
      • 2012-05-31
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 2011-08-15
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多