Список содержимого данного каталога для разных пользователей Linux - PullRequest
0 голосов
/ 09 апреля 2019

Использование .NET Core, C #, Linux

Я немного обыскал и не могу ничего найти. Может быть, это невозможно, и мне нужен другой подход?

Может ли кто-нибудь указать мне, как получить список каталогов для заданного пути для определенного имени пользователя?

Я использую службу веб-приложений как Root, но мне нужно проверить и вернуть каталоги и файлы для данного имени пользователя (пароль не доступен) - чтобы сообщить о каталогах и файлах, к которым данное имя пользователя имеет доступ для чтения.

Скажите, например, "/ opt / mydata /", и там у меня будет несколько каталогов, которые я буду создавать вручную и устанавливать разрешения для каждой группы пользователей. То есть «/ opt / mydata / user_1_readable» будет возвращено, когда я создаю список каталогов для user1 (потому что этот пользователь находится в соответствующей группе разрешений, или является владельцем, или он установлен для всех для чтения), но не будет возвращен для user2 (этот пользователь не в правильной группе).

По сути, я хочу «выдать себя за» или в Linux, сделать эквивалент «sudo su user1» и сообщить, какие каталоги / файлы доступны для чтения в «/ opt / mydata /» для данного пользователя.

Я могу получить список каталогов и файлы, работающие как Root. Что я не могу сделать / не знаю, как получить список каталогов для конкретного пользователя. Все примеры, которые я нашел и попробовал, относятся только к Windows Identity и Windows Security.

например. Я нашел этот пример, но он, кажется, относится к «Mono», который я не запускаю, но по сути я действительно хочу сделать что-то вроде этого:

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

Есть какая-нибудь сторонняя библиотека или другой способ, пожалуйста?

Ресурс: Изменить текущего пользователя Linux в приложении C #, работающем с Mono?

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Если вы посмотрите на эту проблему в репозитории ядра .net, Предложение: Предоставьте функции POSIX , похоже, что оно не будет реализовано в ядре .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;
}
0 голосов
/ 09 апреля 2019

Возможно, вы хотите прочитать файл /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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...