【问题标题】:List the content of a given directory for different users, Linux列出不同用户给定目录的内容,Linux
【发布时间】:2019-04-09 08:15:27
【问题描述】:

使用 .NET Core、C#、Linux

我搜索了一下,似乎找不到任何东西。也许这是不可能的,我需要一种不同的方法?

有人可以向我指出如何获取特定用户名的给定路径的目录列表吗?

我正在以 Root 身份运行 Web 应用程序服务,但需要检查并返回给定用户名的目录和文件(没有密码可用) - 以报告给定用户名具有读取权限的目录和文件。

比如说“/opt/mydata/”,在那里我将有许多目录,我将手动创建并为每个用户组设置权限。 IE。 “/opt/mydata/user_1_readable”在我为user1做目录列表时会返回(因为这个用户在各自的权限组中,或者是所有者,或者设置为每个人都可以阅读)但不会返回user2(此用户不在正确的组中)。

本质上,我想“模拟”或在 Linux 中执行“sudo su user1”的等效操作,并报告给定用户在“/opt/mydata/”中可以读取哪些目录/文件。

我可以让目录列表和文件以 Root 身份正常运行。我不能做/不知道如何获取特定用户的目录列表。我找到并尝试过的示例都是特定于 Windows 身份和 Windows 安全的。

例如我找到了这个例子,但它似乎适用于我没有运行的“Mono”,但基本上我真的想做一些类似的事情:

// Impersonate a user
using (WindowsIdentity newId = new WindowsIdentity("user1"))
using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
{
      var content = _fileProvider.GetDirectoryContents(uri); 
}

请问有第三方库或其他方式吗?

资源: Change current Linux user in a C# application running with Mono?

【问题讨论】:

  • 你有需要看的目录路径吗?还是需要解析用户的主目录?
  • “针对特定用户名”究竟是什么意思?如果您知道路径,为什么不同用户的输出会有所不同?还是相对路径(相对于所述用户的主目录)?
  • 对不起!添加了一些有用的信息。希望。
  • 请问有第三方库或者其他方式吗?没有,都是内置的.net-core,应该不需要第三方库。
  • 不清楚你在问什么。您在查找/列出目录内容时遇到问题吗?还是您对文件系统权限有疑问?你到底是什么问题?

标签: c# linux asp.net-core .net-core


【解决方案1】:

如果您在 .net 核心存储库 Proposal: Expose POSIX functions 上查看此问题,它似乎不会在 .net 核心中实现,而只能在 Mono.Posix.NETStandard 中实现。

该库与 .net core 2.0 兼容,自己实现应该不会太难。

您可以尝试对包进行类似操作,以过滤用户可以阅读的文件。

public UserHasReadPermission(string username, string file)
{
    var user = new UnixUserInfo(username);
    var file = new UnixFileInfo(file);

    // Everyone has read permission
    if (file.FileAccessPermissions.HasFlag(FileAccessPermissions.OtherRead))
        return true;

    // User owns the file and has read permission
    if (file.OwnerUser == user && file.FileAccessPermissions.HasFlag(FileAccessPermissions.UserRead))   
        return true;

    // User group owns the file and has read permission
    if (file.OwnerGroup == user.Group && file.FileAccessPermissions.HasFlag(FileAccessPermissions.GroupRead))   
        return true;

    return false;
}

【讨论】:

  • 嗨贾斯汀,这是一个绝妙的发现和建议。谢谢你。不幸的是,我被限制这样做,需要通过使用 Process() 来获得结果——我现在需要去调查一下。再次感谢您的回答,希望它仍然对其他人有所帮助。一会儿就奖励。任何想法如何使用 Process() 执行“sudo su username”并同时执行“ls”? :)
  • @Rollhard 仍然不确定您的最终目标是什么。 ls 将始终返回所有文件,即使用户没有读取权限。
  • 我找到了另一种方法!那就是启动一个新的 Process() 作为不同的用户运行,我可以从那里运行我需要的任何命令。
【解决方案2】:

也许您想读取/etc/passwd 文件以获取用户的目录?

一旦你有了它,你就可以得到文件夹中的所有子目录:

List<string> AllFiles = new List<string>();
void ParsePath(string path)
{
    string[] SubDirs = Directory.GetDirectories(path);
    AllFiles.AddRange(SubDirs);
    AllFiles.AddRange(Directory.GetFiles(path));
    foreach (string subdir in SubDirs)
        ParsePath(subdir);
}

【讨论】:

  • 对不起!我添加了更清晰的信息。希望能回答这个问题。
  • 感谢您的编辑,但差别不大。您正在以 root 身份执行程序,因此每个目录都是可见的。
猜你喜欢
  • 2021-05-29
  • 1970-01-01
  • 2019-12-04
  • 2013-08-04
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 2019-09-05
  • 2019-03-17
相关资源
最近更新 更多