快捷搜索:  汽车  科技

为何netcore拒绝接入(如何判断.NETCore)

为何netcore拒绝接入(如何判断.NETCore)因为linux系统有一个功能:如果一个程序被设置了 setuid 位,那么它无论被哪个用户执行,都会具备 setuid 对应用户的权限,进程的 EUID 也会变成对应用户的 UID。那为什么要搞2个Id呢?linux 系统中每个进程都有2个 ID,分别为用户 ID(uid)和有效用户 ID(euid)。root的用户 ID确实是0。Console.WriteLine($"UID:{Mono.Unix.Native.Syscall.getuid()}"); Console.WriteLine($"EUID:{Mono.Unix.Native.Syscall.geteuid()}"); 我又换成demo1用户试了一下,这2个Id也是一样的。

有时候,我们需要知道当前程序是否以管理员身份运行,以便执行一些需要特殊权限的操作。

在github(https://github.com/dotnet/runtime/issues/25118#issuecomment-367407469)上找到了一个解决方案:

//需要引用nuget包Mono.Posix.NETStandard publicstaticboolIsAdministrator=> RuntimeInformation.IsOSPlatform(OSPlatform.Windows)? newWindowsPrincipal(WindowsIdentity.GetCurrent()) .IsInRole(WindowsBuiltInRole.Administrator): Mono.Unix.Native.Syscall.geteuid()==0;

好了,问题解决,文章写完了。

为何netcore拒绝接入(如何判断.NETCore)(1)

等等!Windows 下的判断很好理解 用户属于 Administrator 角色。但是 linux 下的geteuid() == 0是什么意思?

euid

linux 系统中每个进程都有2个 ID,分别为用户 ID(uid)和有效用户 ID(euid)。

root的用户 ID确实是0。

Console.WriteLine($"UID:{Mono.Unix.Native.Syscall.getuid()}"); Console.WriteLine($"EUID:{Mono.Unix.Native.Syscall.geteuid()}");

为何netcore拒绝接入(如何判断.NETCore)(2)

我又换成demo1用户试了一下,这2个Id也是一样的。

为何netcore拒绝接入(如何判断.NETCore)(3)

那为什么要搞2个Id呢?

setuid

因为linux系统有一个功能:如果一个程序被设置了 setuid 位,那么它无论被哪个用户执行,都会具备 setuid 对应用户的权限,进程的 EUID 也会变成对应用户的 UID。

Demo

我们来试验一下,默认情况下demo1用户无法操作1.txt,因为文件是由root用户创建的,如下图:

为何netcore拒绝接入(如何判断.NETCore)(4)

当我们使用root用户设置了 setuid 位后,可以发现程序的权限起了变化:

为何netcore拒绝接入(如何判断.NETCore)(5)

为何netcore拒绝接入(如何判断.NETCore)(6)

这时我们再次运行程序,发现1.txt操作成功,而且euid也变成0(root用户)了。

为何netcore拒绝接入(如何判断.NETCore)(7)

结论

综上,github 上给的解决方案非常完美,如果你要判断当前用户是否root,则需要使用getuid() == 0。

猜您喜欢: