nfs挂载上奇怪的系统调用语义

Posted

技术标签:

【中文标题】nfs挂载上奇怪的系统调用语义【英文标题】:strange system call semantics on nfs mount 【发布时间】:2016-12-04 15:01:36 【问题描述】:

我正在为 C @ open SuSE jump 42.2 x64 中的 open() 函数编写一个小测试程序。

不幸的是,正在创建的文件获得了 -rwxrwxrwx 权限,尽管我在执行 umask(0);

后将 0644 交给了 open() 函数

谁能告诉我,我做错了什么? (我从一本打开的书 (link) 中获得了示例代码。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char** argv) 

    /* Zugriffsrechte 644 */
    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;

    const char *new_file;
    int file_descriptor;
    /* Alle Zugriffsrechte der Einschraenkungsmaske erlauben */
    umask(0);
    /* Argument 2 der cmd line auswerten */
    if (argv[1] == NULL) 
        fprintf(stderr, "usage: %s datei_zum_oeffnen\n", *argv);
        return EXIT_FAILURE;
    
    new_file = argv[1];
    file_descriptor = open(new_file, O_WRONLY|O_EXCL|O_CREAT, 0644);
    /* or var mode instead of (0644) */
    if (file_descriptor == -1) 
        perror("Fehler bei open ");
        return EXIT_FAILURE;
    
    return (EXIT_SUCCESS);

无论哪种方式 - 将 0644 或变量“mode”作为 open() 的第三个参数都不能按预期工作,执行程序(作为普通用户)并提交文件名时的结果是:-rwxrwxrwx 和此外:该文件属于root:root而不是执行用户?!

我需要改变什么?

【问题讨论】:

提到 root 等表明您正在查看的文件不是程序创建的文件。如果您不是以 root 身份运行,那么您的程序不太可能(基本上不可能)创建 root 拥有的文件。文件是空的吗?如果在运行程序之前删除它并确认它已经消失,它会在程序运行后重新出现吗?如果您指定不同的名称,您会得到相同的结果吗?如果您指定/tmp/test.file,您看到问题了吗?可执行文件的权限是什么? 感谢您的回答。这种行为有点奇怪——我以普通用户身份执行程序,它创建了一个属于 root 的文件,但拥有世界的所有权限。 - 所以我能够删除它。该文件是空的和 0 字节 - 它只是创建的,所以我认为这是正确的。但是 - 将可执行文件复制到我的主目录 - 改变了这种行为,使整个事情按预期工作。 - 请参阅下面的答案。 相关:How do I use 'chmod' on an NTFS (or FAT32) partition? 【参考方案1】:

已解决。

使用 NetBeans 8.2 编译失败。 NetBeans 创建的文件夹和文件属于根目录 - 在我的主目录中创建相同的 .c 文件并在那里编译它工作得很好。

添加: NetBeans 以 root 身份运行。 我的 workspace 所在的文件夹是一个 NTFS 驱动器,在引导期间以用户访问权限安装 - 但整个驱动器首先属于 root。我 99% 确信这就是导致我对 NetBeans 创建具有错误权限的文件夹和文件的错误假设的原因。

【讨论】:

很好奇。如果 NetBeans 以 root 身份运行,我将永远不会使用它。以 root 身份进行实验是不安全的。我确实想知道 IDE 是否是麻烦的一部分,但我不想不必要地进行中伤。 @user268396:很好。它怎么会被搞砸,以至于它以root身份运行?我假设它没有以sudo netbeans 或类似的方式运行,尽管这可能不是一个安全的假设。 (我不是 IDE 的粉丝,所以我不知道我自己的经验。) @JonathanLeffler 默认情况下它不会以 root 身份运行。要启动它,您调用(直接或间接通过.desktop 文件)一个启动 Java 应用程序的 shell 脚本......它是一个 Java Swing 应用程序,所以根本不需要以 root 身份运行。 @user268396:如果幸运的话,Ben 会注意到这一点,并解释他做了什么以使 NetBeans 以 root 身份运行。同时,我确信 NetBeans(通常)以调用它的用户身份运行,没有提升权限。 @msw:我现在无法解释这一点。我确实以普通用户的身份下载、安装和运行 NEtBeans,但我根本不知道为什么 NB 在单击编译时会创建 root 拥有的文件和文件夹 - 但是在写这句话时我有一个想法:创建我的工作区的文件夹是一个 NTFS 驱动器,在引导期间以用户访问权限安装 - 但是 whle 驱动器似乎属于 root 因此 - 我想这可能是我自己认为这是 NetBeans 错误的原因。我会将其添加到我的答案中。问候

以上是关于nfs挂载上奇怪的系统调用语义的主要内容,如果未能解决你的问题,请参考以下文章

centos配置NFS服务和autofs自动挂载服务

NFS(网络文件系统)

NFS服务器搭建与autofs自动挂载

Windows Server挂载NFS共享

NFS服务器搭建与autofs自动挂载

linux下配置nfs服务器以及设置自动挂载(以centos6.7为例)