Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux (FUSE)文件系统何时检查访问权限?_Linux_Unix_Linux Kernel_Filesystems_Fuse - Fatal编程技术网

Linux (FUSE)文件系统何时检查访问权限?

Linux (FUSE)文件系统何时检查访问权限?,linux,unix,linux-kernel,filesystems,fuse,Linux,Unix,Linux Kernel,Filesystems,Fuse,“Unix世界”文件系统(如ext4)在inode中为每个文件存储3种类型的可用用户所有者、组和其他的权限/访问权限列表。 我想知道什么时候进行“身份验证”我的意思是: 假设我们有一个文件 file.txt rwx rw- --- st_uid=54 st_gid=99 owner group others 用户tim拥有uid=100,gid=99 在终端中运行cat file.txt,请求到达文件系统,该文

“Unix世界”文件系统(如ext4)在inode中为每个文件存储3种类型的可用用户所有者、组和其他的权限/访问权限列表。 我想知道什么时候进行“身份验证”我的意思是:

假设我们有一个文件

file.txt     rwx     rw-     ---       st_uid=54    st_gid=99
             owner   group   others    
用户
tim
拥有
uid=100
gid=99

在终端中运行
cat file.txt
,请求到达文件系统,该文件系统将
tim
与文件的权限进行比较

tim
不是所有者:他的
uid=100
与文件的
uid=54
不一样

但是他与文件具有相同的gid(
99
),因此他得到的响应是
rw-

cat
实际上是一种读取,因此用户可以接收内容

此场景在哪个系统功能中执行?我可以通过实现自定义文件系统来修改它吗?

更新:
我的文件系统的唯一目的是对权限进行更多的修改,并作为概念的证明(这是一个研究项目),因此,如果您有任何关于我应该从哪里开始的想法,我将不胜感激。提前谢谢

对于FUSE文件系统,解决方案是直截了当的: FUSE实现为向文件系统发出的每个用户请求提供一个上下文

工作流如下所示:

  • 用户发出与文件系统相关的请求(即
    ls
  • 内核注意到特定的文件系统是使用FUSE安装的
  • 请求被转发到自定义文件系统(使用FUSE创建)。在这里,您可以访问请求的元数据,使用该元数据将返回uid、gid、pid
  • 现在关键在你:你可以(几乎)做任何你想做的事情,完全控制文件系统和用户的请求

  • 使用shell命令
    strace cat file.txt
    ,您会发现如果出现EACCES错误,这是由于文件open()系统调用导致的。就内核架构而言,如果fs模块必须自己进行(实现)权限检查,我会感到惊讶。它们可能会将“模式位”返回到内核中的公共fs例程。如果您想定制,请查看ACL。我正在创建一个定制的fuse文件系统,我可以轻松更改open/readdir/chmod的行为。。;我唯一的问题是,尽管我知道文件的所有细节,但我不知道如何找出是哪个用户提出了请求;有什么想法吗?@sawdust
    strace
    似乎是一个很好的起点;我不知道它的存在;)但是文件系统真的需要知道哪个用户正在访问该文件吗?让内核处理所有权限检查。FUSE文件系统应该只返回文件系统中存储的数据。