Introduction

前回は、System.IO.DirectoryInfoを使って、ファイルの一覧を列挙してみました。

今回はファイルへのアクセス可否についてです。

May I open this file?

Windows上のC#なら、ファイルに書き込みできるかどうか等は、実際にファイルへのストリームを作成してみたりします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private bool CanRead(string path)
{
FileStream stream = null;

try
{
stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None);
}
catch
{
return false;
}
finally
{
stream?.Dispose();
}

return true;
}

では、Linuxでこれを実施するとどうなるでしょう? ありがちなのは、所有者がrootになっていて、root以外が読み込みも出来ないパターンです。
例えば、**/etc/sudo.conf** がそうです。

1
2
3
4
$ ls -la /etc/sudo.conf
-rw-r-----. 1 root root 1786 11月 24 2016 /etc/sudo.conf
$ cat /etc/sudo.conf
cat: sudo.conf: 許可がありません

なので、こんなソースを用意してみました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System;
using System.IO;

namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
if (args.Length != 1)
{
Console.WriteLine("Must specify full path!!");
return;
}

var path = args[0];
if (!File.Exists(path))
{
Console.WriteLine("Specified path does not exist!!");
return;
}

FileStream stream = null;

try
{
stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None);
Console.WriteLine($"'{path}' can be opened!!");
}
catch (Exception ex)
{
Console.WriteLine($"Can not open file. Reason: {ex.Message}!!");
}
finally
{
stream?.Dispose();
}
}
}
}

引数で指定したファイルを開くことが出来れば、**’’ can be opened!!** と表示されます。
ファイルを開こうとして、例外を投げれば、開けなかった理由が表示される、というシンプルなテストです。

ソースを記述したら、プロジェクトフォルダで

1
2
$ dotnet restore
$ dotnet build

を実行します。
これでビルドが成功するはずです。

まずは、一般ユーザで確認します。
which でdotnetコマンドの場所を調べているのは、rootユーザで dotnet までのパスが通っていなかったので、実施しているだけです。
パスが通っているなら不要です。
引数のファイルパスは dotnet run の直後に追記することで指定できます。

1
2
3
4
5
6
# dotnetコマンドの場所を調べます
$ which dotnet
/opt/rh/rh-dotnetcore11/root/usr/bin/dotnet

$ /opt/rh/rh-dotnetcore11/root/usr/bin/dotnet run /etc/sudo.conf
Can not open file. Reason: Access to the path '/etc/sudo.conf' is denied.!!

アクセスが拒否されています。
続いて、rootで確認します。

1
2
$ sudo /opt/rh/rh-dotnetcore11/root/usr/bin/dotnet run /etc/sudo.conf
'/etc/sudo.conf' can be opened!!

無事にアクセスできました。

Conclusion

基本的なアクセス権も.NET Coreで対処できそうです。
次回は、もう少し高度な方法で読み書きできるかを調べてみたいと思います。