Các thách thức
Đưa ra một chuỗi biểu thị ký hiệu tượng trưng cho phép UNIX của một tệp và quyền sở hữu của nó (ID người dùng và ID nhóm), quyết định xem một người dùng nhất định A
có quyền đọc / ghi / thực thi nó hay không.
Quyền trong hệ thống UNIX
Trong UNIX, mọi tệp đều có ba loại quyền ( người dùng , nhóm và những người khác ) và quyền sở hữu, bao gồm người dùng và nhóm nào thuộc về nó.
Ký hiệu tượng trưng bao gồm mười ký tự. Nhân vật đầu tiên không quan trọng trong thử thách này. Chín ký tự còn lại nằm trong ba bộ ba ký tự, thể hiện quyền của người dùng, nhóm và các lớp khác. Các ký tự trong mỗi bộ cho biết việc đọc / viết / thực thi có được phép hay không. Nếu được phép, nó sẽ r
, w
hoặc x
. Nếu không, nó sẽ được -
.
Lưu ý rằng setuid , setgid và dính chút có thể thay đổi nhân vật thứ ba của mỗi bộ để s
, S
, t
hoặc T
. Đây là một quy tắc đơn giản: nếu ký tự là chữ thường, thì quyền được đặt; mặt khác, nó không phải là.
(Để biết chi tiết về ký hiệu tượng trưng của quyền, vui lòng tham khảo tại đây .)
Mọi người dùng đều có ID người dùng và mỗi nhóm đều có ID nhóm. Tất cả các ID sẽ là số nguyên không âm. Một người dùng sẽ thuộc về ít nhất một nhóm. Nếu người dùng A
muốn có quyền truy cập vào một tệp, hệ thống sẽ kiểm tra các quyền của họ như sau:
Nếu tệp thuộc về người dùng
A
, hãy kiểm tra quyền của lớp người dùng .Nếu tệp không thuộc về
A
, nhưngA
thuộc về nhóm mà tệp thuộc về, hãy kiểm tra quyền của lớp nhóm .Nếu không, kiểm tra quyền của lớp người khác .
Tuy nhiên, có một ngoại lệ: nếu ID người dùng bằng 0 (siêu người dùng), họ có quyền làm bất cứ điều gì !
Thông số kỹ thuật
- Chương trình / chức năng của bạn nên lấy những thứ này làm đầu vào ở bất kỳ định dạng hợp lý nào:
- Quyền trong ký hiệu tượng trưng .
- ID người dùng và ID nhóm mà tệp thuộc về.
- ID người dùng
A
và danh sách ID nhómA
thuộc về. - Loại truy cập. Bạn có thể sử dụng bất kỳ ba giá trị một chữ số hoặc một ký tự khác nhau để đọc, viết và thực thi.
- Trả về / xuất giá trị trung thực nếu
A
có quyền truy cập tệp hoặc giá trị giả nếu không. - Bạn có thể giả sử rằng ký tự đầu tiên của ký hiệu sẽ luôn là
-
(tệp thông thường). - Đây là môn đánh gôn , do đó, byte ngắn nhất sẽ thắng!
Các trường hợp thử nghiệm
Các định dạng ở đây là [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