2017-07-16 27 views
5

Próbuję dowiedzieć się, jak ustawić uprawnienia do plików w systemie Linux/Unix z .NET Core. Znalazłem już tutaj pytanie, które wskazuje mi kierunek System.IO.FileSystem, ale nie mogę znaleźć żadnej dokumentacji, jak go używać.Uprawnienia do plików w systemie Linux/Unix z .NET Core

Krótko mówiąc, chciałbym skopiować plik 644 z głównej aplikacji .net, która działa tylko na systemie Linux, ale nie mam pojęcia, jak postępować.

Dzięki.

+0

Firma Microsoft używa swojego modelu uprawnień do plików w systemie Windows i tłumaczy go na system Linux/UNIX. Więc wywołanie 'chmod' jest wewnętrzne, https://github.com/dotnet/corefx/blob/bffef76f6af208e2042a2f27bc081ee908bb390b/src/Common/src/Interop/Unix/System.Native/Interop.ChMod.cs i jest używane tylko w https://github.com/dotnet/corefx/blob/801dde95a5eac06140d0ac633ac3f9bfdd25aca5/src/System.IO.FileSystem/src/System/IO/FileSystemInfo.Unix.cs W twoim przypadku musisz przetłumaczyć 644 na odpowiednie uprawnienia do pliku Windows a następnie użyj sposobu Windows do manipulowania plikiem. –

Odpowiedz

6

W tej chwili nie ma wbudowanego API w .NET Core do tego. Jednak zespół .NET Core pracuje nad udostępnieniem Mono.Posix na .NET Core. To naraża API na wykonywanie tego rodzaju operacji w zarządzanym kodzie. Zobacz https://github.com/dotnet/corefx/issues/15289 i https://github.com/dotnet/corefx/issues/3186. Można spróbować wczesną wersję tego API tutaj: 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; 

Jeśli nie chcesz używać Mono.Posix, można zaimplementować tę samą funkcjonalność poprzez wywołanie kodu macierzystego. Używając P/Invoke, możesz wywołać funkcję chmod z libc. Więcej informacji na temat natywnego interfejsu API można znaleźć na stronie man 2 chmod.

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)); 
    } 
} 
1

I rozwiązać ten problem dopiero zaczyna nowy proces i wykonywanie poleceń bash chmod.

przykład:

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(); 
} 

, a następnie:

Exec("chmod 644 /path/to/file.txt"); 

Można również używać tej metody Exec uruchomienia innego rodzaju poleceń Bash.

Powiązane problemy