【问题标题】:How to test file permissions using node.js?如何使用 node.js 测试文件权限?
【发布时间】:2012-06-20 18:13:02
【问题描述】:

如何查看正在运行的 node.js 进程对给定文件的权限(读/写/执行)?

我希望fs.Stats object 有一些关于权限的信息,但我没有看到任何信息。是否有一些内置功能可以让我进行此类检查?例如:

var filename = '/path/to/some/file';
if (fs.canRead(filename)) // OK...
if (fs.canWrite(filename)) // OK...
if (fs.canExecute(filename)) // OK...

当然,我不必尝试在每种模式下打开文件并将错误作为否定肯定处理,对吧?一定有更简单的方法...

【问题讨论】:

  • 我认为没有api功能。
  • 实际上,继续尝试打开文件并处理任何出现的错误通常是正确的方法。您可以测试该文件是否可读,但这需要更多的努力(即使它隐藏在核心库中,工作仍然执行)。

标签: file node.js permissions


【解决方案1】:

很好地提到了fs.accessSync(path[, mode])

同步测试用户对路径指定的文件或目录的权限。 mode 参数是一个可选整数,它指定要执行的可访问性检查。检查文件访问常量以获取可能的模式值。可以创建由两个或多个值的按位或组成的掩码(例如 fs.constants.W_OK | fs.constants.R_OK)。

如果任何可访问性检查失败,将引发错误。否则,该方法将返回 undefined。

嵌入式示例:

try {
  fs.accessSync('etc/passwd', fs.constants.R_OK | fs.constants.W_OK);
  console.log('can read/write');
} catch (err) {
  console.error('no access!');
}

【讨论】:

    【解决方案2】:

    我迟到了,但是,我正在寻找与您相同的原因并了解到这一点。

    fs.access 是您需要的。它可从节点 v0.11.15 获得。

    function canWrite(path, callback) {
      fs.access(path, fs.W_OK, function(err) {
        callback(null, !err);
      });
    }
    
    canWrite('/some/file/or/folder', function(err, isWritable) {
      console.log(isWritable); // true or false
    });
    

    【讨论】:

      【解决方案3】:

      使用child process 怎么样?

      var cp = require('child_process');
      
      cp.exec('ls -l', function(e, stdout, stderr) {
        if(!e) {
          console.log(stdout);
          console.log(stderr);
          // process the resulting string and check for permission
        }
      });
      

      不确定 process 和 *child_process* 是否共享相同的权限。

      【讨论】:

      • fs.Stats 对象已经提供了mode 属性,无需执行外部进程;此外,文件的权限不会因查看对象而神奇地改变
      • @lanzz,如果该进程在不同的用户上下文下运行,它将具有不同的文件访问权限
      • 子进程如何在不同的用户上下文下运行?
      【解决方案4】:

      检查可读性并不像 PHP 这样的语言通过将其抽象到单个库函数中来使其看起来那么简单。一个文件可能对所有人可读,或者仅对其组或仅对其所有者可读;如果不是所有人都可以阅读,您需要检查您是否真的是该组的成员,或者您是否是该文件的所有者。尝试打开文件并处理错误通常更容易、更快捷(不仅是编写代码,还包括执行检查)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 2012-09-28
        • 2014-03-21
        • 2021-05-26
        • 2017-02-12
        • 2014-09-30
        • 2016-10-04
        相关资源
        最近更新 更多