Khái niệm quyền truy cập là cốt lõi của hệ thống tệp Unix/Linux. Quyền truy cập xác định ai có thể truy cập một tệp và cách mà người đó có thể truy cập tệp. Quyền tệp trong Linux được điều chỉnh bởi chmod command , có thể được chạy trong terminal Linux. PHP cung cấp chmod() function mà bạn có thể sử dụng để xử lý quyền tệp một cách lập trình.
Hàm chmod() của PHP chỉ có hiệu quả khi bạn làm việc trên hệ điều hành Linux. Nó không hoạt động trên Windows, vì hệ điều hành Windows có cơ chế khác để kiểm soát quyền truy cập tệp.
Để xem các quyền được bật trên một tệp, hãy lấy danh sách các tệp bằng cách sử dụng lệnh " ls -l " (danh sách dài).
mvl@GNVBGL3:~$ ls -l -rwxr-xr-x 1 mvl mvl 16376 May 5 21:52 a.out -rw-r--r-- 1 mvl mvl 83 May 5 21:52 hello.cpp -rwxr-xr-x 1 mvl mvl 43 Oct 11 14:50 hello.php -rwxr-xr-x 1 mvl mvl 43 May 8 10:01 hello.py drwxr-xr-x 5 mvl mvl 4096 Apr 20 21:52 myenv
Cột đầu tiên chứa các cờ quyền của từng tệp. Cột thứ ba và thứ tư chỉ ra chủ sở hữu và nhóm của từng tệp, tiếp theo là kích thước, ngày và giờ, và tên tệp.
Chuỗi quyền có mười ký tự, ý nghĩa của chúng được mô tả như sau −
Position | Meaning |
---|---|
1 | "d" if a directory, "-" if a normal file |
2, 3, 4 | read, write, execute permission for user (owner) of file |
5, 6, 7 | read, write, execute permission for group |
8, 9, 10 | read, write, execute permission for other (world) |
Các ký tự trong chuỗi quyền có ý nghĩa như sau −
Value | Meaning |
---|---|
- | Flag is not set. |
r | File is readable. |
w | File is writable. For directories, files may be created or removed. |
x | File is executable. For directories, files may be listed. |
Nếu bạn xem xét mục đầu tiên trong danh sách trên −
-rwxr-xr-x 1 mvl mvl 16376 May 5 21:52 a.out
Tập tin "a.out" thuộc sở hữu của người dùng "mvl" và nhóm "mvl". Đây là một tập tin bình thường với quyền "đọc/ghi/thực thi" cho chủ sở hữu, và quyền "đọc/thực thi" cho nhóm cũng như cho những người khác.
Biểu diễn nhị phân và bát phân của các cờ quyền có thể được hiểu qua bảng sau −
Octal Digit | Binary Representation (rwx) | Permission |
---|---|---|
0 | 000 | none |
1 | 001 | execute only |
2 | 010 | write only |
3 | 011 | write and execute |
4 | 100 | read only |
5 | 101 | read and execute |
6 | 110 | read and write |
7 | 111 | read, write, and execute (full permissions) |
Hàm chmod() có thể thay đổi quyền của một tệp được chỉ định. Nó trả về true khi thành công, nếu không sẽ trả về false khi thất bại.
chmod(string $filename, int $permissions): bool
Hàm chmod() cố gắng thay đổi chế độ của tệp được chỉ định ( $filename ) thành chế độ được chỉ định trong permissions.
Tham số thứ hai $permissions là một số bát phân với bốn chữ số bát phân. Chữ số đầu tiên luôn là số không, chữ số thứ hai chỉ định quyền cho chủ sở hữu, chữ số thứ ba cho nhóm người dùng của chủ sở hữu và chữ số thứ tư cho mọi người khác. Mỗi chữ số là tổng của các giá trị cho mỗi loại quyền.
1 | Execute Permission |
2 | Write Permission |
4 | Read Permission |
Giá trị mặc định của $permissions là 0777 , có nghĩa là thư mục được tạo ra với quyền thực thi, ghi và đọc được bật.
Hãy xem ví dụ sau −
<?php // Read and write for owner, nothing for everybody else chmod("/PhpProject/sample.txt", 0600); // Read and write for owner, read for everybody else chmod("/PhpProject/sample.txt", 0644); // Everything for owner, read and execute for everybody else chmod("/PhpProject/sample.txt", 0755); // Everything for owner, read for owner's group chmod("/PhpProject/sample.txt", 0740); ?>
Hàm chown() cố gắng thay đổi chủ sở hữu của tệp filename thành một người dùng mới. Lưu ý rằng chỉ có người dùng siêu cấp (superuser) mới có thể thay đổi chủ sở hữu của một tệp.
chown(string $filename, string|int $user): bool
Hãy xem ví dụ sau −
<?php // File name and username to use $file_name= "index.php"; $path = "/PhpProject/backup: " . $file_name ; $user_name = "root"; // Set the user chown($path, $user_name); // Check the result $stat = stat($path); print_r(posix_getpwuid(fileowner($path))); ?>
Hàm chgrp() cố gắng thay đổi nhóm của tệp filename thành group.
chgrp(string $filename, string|int $group): bool
Chỉ có một superuser có thể thay đổi nhóm của một tệp một cách tùy ý; người dùng khác có thể thay đổi nhóm của một tệp thành bất kỳ nhóm nào mà người dùng đó là thành viên.
Hãy xem ví dụ sau −
<?php $filename = "/PhpProject/sample.txt"; $format = "%s's Group ID @ %s: %d\n"; printf($format, $filename, date('r'), filegroup($filename)); chgrp($filename, "admin"); clearstatcache(); // do not cache filegroup() results printf($format, $filename, date('r'), filegroup($filename)); ?>
Nó sẽ tạo ra output −
/PhpProject/sample.txt's Group ID @ Fri, 13 Oct 2023 07:42:21 +0200: 0 /PhpProject/sample.txt's Group ID @ Fri, 13 Oct 2023 07:42:21 +0200: 0