Использование .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?
Что точно вы подразумеваете под «для определенного имени пользователя»? Если вы знаете путь, почему вывод будет отличаться для разных пользователей? Или путь относителен (к домашнему каталогу указанного пользователя)?
Извиняюсь! Добавил немного полезной информации. с надеждой.
Непонятно, что вы спрашиваете. У вас есть проблемы с поиском/отображением содержимого каталога? Или у вас проблемы с правами доступа к файловой системе? В чем именно заключается ваша проблема?
Прости прости прости. Мой вопрос, но он действительно неясен :( Я добавил к нему еще!
Возможно, вы хотите прочитать файл /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, поэтому каждый каталог будет виден.
Если вы посмотрите на эту проблему в репозитории ядра .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»? :)
@Rollhard Все еще не уверен, какова ваша конечная цель. ls
всегда будет возвращать все файлы, даже если у пользователя нет разрешения на чтение.
Я нашел альтернативный подход! То есть запустить новый Process(), работающий от имени другого пользователя, и оттуда я могу запускать любые команды, которые мне нужны.
У вас есть путь к каталогу, который вам нужно посмотреть? или вам нужно разрешить домашний каталог пользователей?