编辑问题,因为根据下面的评论似乎没有理解该问题。 我最初相当模糊地写了这个问题,希望有人能提供一个与我开始的解决方案完全不同的解决方案,但似乎要求太多,所以根据我到目前为止所拥有的内容重写。 还删除了对权限的引用,因为我找到了答案(将包含在底部)。
我正在编写一个程序,打算使用守护程序/服务/无登录用户运行它
aaa
。
用户 aaa
是组 shareabc
和 sharedef
的成员。
该程序的配置文件如下所示:
{
... other config ...
"locations": [
{
"id": "workflow1",
"location": "/shr/abc",
"group": "shareabc"
},
{
"id": "workflow2",
"location": "/shr/def",
"group": "sharedef"
},
],
... other config ...
}
/shr/abc
属于root:shareabc
/shr/def
属于root:sharedef
如果在我的程序中调用
Directory.CreateDirectory("/shr/abc/myfolder1");
,那么 /shr/abc/myfolder1
将与所有者 aaa:aaa
一起创建。
我需要什么 C# 代码才能创建所有者为
aaa:shareabc
而不是 aaa:aaa
的文件夹?
以用户
aaa
组shareabc
运行程序不是解决方案,如下:
aaa:aaa
,还有一些文件应该是 aaa:shareabc
。 更改正在运行的用户/组,或更改文件系统默认值,只会转移问题而不是解决问题。/shr/def
写入文件夹aaa:sharedef
时,我会遇到同样的问题。至于设置权限,他们似乎几年前就更新了C# API。 我可以调用以下命令来使用 775 创建它:
Directory.CreateDirectory("/shr/abc/myfolder1", UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute | UnixFileMode.GroupRead | UnixFileMode.GroupWrite | UnixFileMode.GroupExecute | UnixFileMode.OtherRead | UnixFileMode.OtherExecute);
由于没有权限问题,可以直接运行
chown
命令。
Process.Start("chown", $"aaa:shareabc {directoryPath}").WaitForExit();
Mono.Posix.NETStandard
nuget 包来完成这项工作。
using Mono.Unix;
var d = UnixFileSystemInfo.GetFileSystemEntry(directoryPath);
f.SetOwner("abc", "shareabc");
这个方法实际上调用了libc的chown函数,所以你也可以这样做:
[DllImport("libc", SetLastError = true)]
static extern int chown(string path, int owner, int group);
chown(directoryPath, -1, group_id_of_shareabc);