我有许可吗?


10

挑战

给定一个指示文件的UNIX权限及其所有权(用户ID和组ID)的符号表示形式的字符串,请确定给定的用户是否A具有读取/写入/执行该文件的权限。

相关的

UNIX系统中的权限

在UNIX中,每个文件都有三类权限(usergroupothers)和所有权,包括文件所属的用户和组。

符号表示法由十个字符组成。在这个挑战中,第一个角色并不重要。其余的9个字符位于三个字符集的三个集合中,分别代表用户,组和其他类的权限。每组中的字符表示是否允许读/写/执行。如果允许的话,这将是rwx。否则,它将为-

注意的setuidsetgid的粘滞位可每一组的第三个字符改变为sStT。这是一个简单的规则:如果字符是小写字母,则设置权限;否则,事实并非如此。

(有关权限的符号表示法的详细信息,请参阅此处。)

每个用户都有其用户ID,每个组都有其组ID。所有ID将为非负整数。一个用户将至少属于一个组。如果用户A想要访问文件,则系统将按以下方式检查其权限:

  • 如果文件属于user A,请检查用户类的权限。

  • 如果文件不属于A,但A属于文件所属的组,请检查类的权限。

  • 否则,请检查其他类的权限。

但是,有一个例外:如果用户ID为0(超级用户),则他们有权执行任何操作

技术指标

  • 您的程序/函数应该以任何合理的格式将它们作为输入:
    • 以符号表示的权限。
    • 文件所属的用户标识和组标识。
    • 的用户ID AA所属的组ID列表。
    • 访问类型。您可以使用任何三个不同的一位数或一个字符的值进行读取,写入和执行。
  • 如果A有权访问文件,则返回/输出一个真实值;否则,返回/输出一个虚假值。
  • 您可以假定符号的第一个字符将始终为-(常规文件)。
  • 这是,因此最短的字节为准!

测试用例

格式为[permissions, user ID of file, group ID of file, user ID of A, group IDs of A, type(r/w/x)]

[-rwx------, 13, 15, 13, [15, 24], r]: True   # user
[-rwxr-xr-x, 13, 24, 24, [15, 24], w]: False  # group 
[-rwxr-Sr-T, 13, 15, 24, [15, 35], x]: False  # group
[-rwsr-xr-t, 13, 15, 24, [24, 35], x]: True   # others
[----------, 13, 15, 0, [0, 1, 2], r]: True   # superuser
[----------, 13, 15, 1, [0, 1, 2], r]: False  # others
[----rwxrwx, 13, 15, 13, [15, 24], r]: False  # user

Answers:


6

JavaScript(ES6),61 51 50字节

按照挑战中描述的顺序,以6个不同的参数作为输入。预计最后一个参数是1用于读取2用于3用于执行。返回01

(p,u,g,a,G,P)=>!a|p[u-a?6-3*G.includes(g)+P:P]>'Z'

测试用例




1

珀斯,22 21字节

|!Q}@@c3tw*nEQ-2}EEEG

在线尝试。 测试套件。

输入为六行:

user id
permissions
file user id
file group
user groups
permission (0 = read, 1 = write, 2 = execute)

说明

|!Q}@@c3tw*nEQ-2}EEEG     Implicit: read user id to Q
 !Q                       True if user id is 0, false otherwise
|                         If true, just return it
         w                Read permission string
        -                 Omit first -
      c3                  Split in 3 parts
            E             Read file user id
           n Q            See if it doesn't equal Q
                          -> False (0) if user matches, true (1) otherwise
                 E        Read file group
                  E       Read user groups
                }         -> True (1) if group matches, false (0) otherwise
              -2          Subtract from 2
                          -> 1 if group matches, 2 otherwise
          *               Multiply the two numbers
                          -> 0 if user matches, 1 if group matches, 2 otherwise
     @                    Take correct part of permission string
    @                     Take correct character of that part
   }                G     See if it is in lowercase alphabet
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.