列出给不同用户的给定目录的内容,Linux

时间:2019-04-09 08:15:27

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

使用.NET Core,C#,Linux

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

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

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

以“ / opt / mydata /”为例,在那里,我将拥有许多目录,这些目录将手动创建并设置每个用户组的权限。即当我为user1做目录列表时(因为该用户在各自的权限组中,或者是所有者,或者设置为每个人都可以读取),将返回“ / opt / mydata / user_1_visible”,但对于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?

2 个答案:

答案 0 :(得分:1)

如果您在.net核心存储库Proposal: Expose POSIX functions上看到此问题,则似乎不会在.net core中实现,而只能在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;
}

答案 1 :(得分:0)

也许您想读取/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);
}