使用.NET Core的Linux/Unix上的文件权限

Ste*_*eve 16 .net c# .net-core asp.net-core

我正在尝试学习如何使用.NET Core在Linux/Unix上设置文件权限.我已经在这里找到了一个问题,指向System.IO.FileSystem的方向,但我似乎找不到任何关于如何使用它的文档.

简而言之,我想从仅在Linux上运行的.net核心应用程序chmod一个文件644,但是如何继续操作却不知所措.

nat*_*ter 21

目前,.NET Core中没有内置的API.但是,.NET Core团队正在努力Mono.Posix在.NET Core上提供.这暴露了API在托管代码中执行此类操作.请参阅https://github.com/dotnet/corefx/issues/15289https://github.com/dotnet/corefx/issues/3186.您可以在此处尝试此API的早期版本:https://www.nuget.org/packages/Mono.Posix.NETStandard/1.0.0-beta1

    var unixFileInfo = new Mono.Unix.UnixFileInfo("test.txt");
    // set file permission to 644
    unixFileInfo.FileAccessPermissions =
        FileAccessPermissions.UserRead | FileAccessPermissions.UserWrite
        | FileAccessPermissions.GroupRead
        | FileAccessPermissions.OtherRead;
Run Code Online (Sandbox Code Playgroud)

如果您不想使用Mono.Posix,则可以通过调用本机代码来实现相同的功能.使用P/Invoke,您可以从中调用该chmod函数libc.有关man 2 chmod本机API的更多详细信息,请参阅.

using System;
using System.IO;
using System.Runtime.InteropServices;
using static System.Console;

class Program
{
    [DllImport("libc", SetLastError = true)]
    private static extern int chmod(string pathname, int mode);

    // user permissions
    const int S_IRUSR = 0x100;
    const int S_IWUSR = 0x80;
    const int S_IXUSR = 0x40;

    // group permission
    const int S_IRGRP = 0x20;
    const int S_IWGRP = 0x10;
    const int S_IXGRP = 0x8;

    // other permissions
    const int S_IROTH = 0x4;
    const int S_IWOTH = 0x2;
    const int S_IXOTH = 0x1;

    static void Main(string[] args)
    {
        WriteLine("Setting permissions to 0755 on test.sh");
        const int _0755 =
            S_IRUSR | S_IXUSR | S_IWUSR
            | S_IRGRP | S_IXGRP
            | S_IROTH | S_IXOTH;
        WriteLine("Result = " + chmod(Path.GetFullPath("test.sh"), (int)_0755));

        WriteLine("Setting permissions to 0644 on sample.txt");
        const int _0644 =
            S_IRUSR | S_IWUSR
            | S_IRGRP
            | S_IROTH;
        WriteLine("Result = " + chmod(Path.GetFullPath("sample.txt"), _0644));

        WriteLine("Setting permissions to 0600 on secret.txt");
        const int _0600 = S_IRUSR | S_IWUSR;
        WriteLine("Result = " + chmod(Path.GetFullPath("secret.txt"), _0600));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 注意 - NuGet 包已结束测试版:https://www.nuget.org/packages/Mono.Posix.NETStandard/ (2认同)

Sud*_*ara 13

我知道这个问题有点老了,但是对于 .NET 7 及更高版本,有一个更简单的 API。

File.SetUnixFileMode(path, UnixFileMode.UserRead | UnixFileMode.UserWrite);
Run Code Online (Sandbox Code Playgroud)


ksp*_*rin 5

我通过开始一个新进程并执行bash chmod命令解决了这个问题。

例:

public static void Exec(string cmd)
{
    var escapedArgs = cmd.Replace("\"", "\\\"");

    var process = new Process
    {
        StartInfo = new ProcessStartInfo
        {
            RedirectStandardOutput = true,
            UseShellExecute = false,
            CreateNoWindow = true,
            WindowStyle = ProcessWindowStyle.Hidden,
            FileName = "/bin/bash",
            Arguments = $"-c \"{escapedArgs}\""
        }
    };

    process.Start();
    process.WaitForExit();
}
Run Code Online (Sandbox Code Playgroud)

然后:

Exec("chmod 644 /path/to/file.txt");
Run Code Online (Sandbox Code Playgroud)

您也可以使用此Exec方法运行任何其他类型的bash命令。