Список содержимого данного каталога для разных пользователей, Linux

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

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

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

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

Скажем, например, «/opt/mydata/», и там у меня будет несколько каталогов, которые я создам вручную и установлю разрешения для каждой группы пользователей. т.е. «/opt/mydata/user_1_readable» будет возвращено, когда я сделаю список каталогов для пользователя1 (поскольку этот пользователь находится в соответствующей группе разрешений, или является владельцем, или он установлен для чтения всеми), но не будет возвращен для 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 в приложении С#, работающем с Mono?

У вас есть путь к каталогу, который вам нужно посмотреть? или вам нужно разрешить домашний каталог пользователей?

Martin Ullrich 09.04.2019 10:29

Что точно вы подразумеваете под «для определенного имени пользователя»? Если вы знаете путь, почему вывод будет отличаться для разных пользователей? Или путь относителен (к домашнему каталогу указанного пользователя)?

Lasse V. Karlsen 09.04.2019 10:53

Извиняюсь! Добавил немного полезной информации. с надеждой.

PKCS12 09.04.2019 11:08
Есть ли какая-то третья библиотека или какой-то другой способ, пожалуйста? Нет, все это встроено в .net-core, вам не нужны никакие сторонние библиотеки.
Justin Lessard 11.04.2019 18:31

Непонятно, что вы спрашиваете. У вас есть проблемы с поиском/отображением содержимого каталога? Или у вас проблемы с правами доступа к файловой системе? В чем именно заключается ваша проблема?

Justin Lessard 11.04.2019 18:31

Прости прости прости. Мой вопрос, но он действительно неясен :( Я добавил к нему еще!

PKCS12 11.04.2019 18:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
214
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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);
}

Извиняюсь! Я добавил более четкую информацию. к вопросу с надеждой.

PKCS12 09.04.2019 11:09

Спасибо за редактирование, но это мало что меняет. Вы выполняете программу как root, поэтому каждый каталог будет виден.

Amir Hajiha 09.04.2019 11:11
Ответ принят как подходящий

Если вы посмотрите на эту проблему в репозитории ядра .net, Предложение: раскрыть функции POSIX, похоже, что она не будет реализована в ядре .net, а только в Mono.Posix.NETСтандарт.

Библиотека совместима с .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»? :)

PKCS12 12.04.2019 15:08

@Rollhard Все еще не уверен, какова ваша конечная цель. ls всегда будет возвращать все файлы, даже если у пользователя нет разрешения на чтение.

Justin Lessard 12.04.2019 15:38

Я нашел альтернативный подход! То есть запустить новый Process(), работающий от имени другого пользователя, и оттуда я могу запускать любые команды, которые мне нужны.

PKCS12 12.04.2019 18:23

Другие вопросы по теме