104.5 Bài 1
Chứng chỉ: |
LPIC-1 |
---|---|
Phiên bản: |
5.0 |
Chủ đề: |
104 Thiết bị, Hệ thống tệp Linux, Tiêu chuẩn phân cấp hệ thống Tệp |
Mục tiêu: |
104.5 Quản lý Quyền và Quyền sở hữu Tệp |
Bài: |
1 trên 1 |
Giới thiệu
Là một hệ thống đa người dùng, Linux cần một số cách để theo dõi người dùng nào sở hữu từng tệp nào và liệu họ có được phép thực hiện các thao tác trên tệp hay không. Điều này nhằm đảm bảo quyền riêng tư của những người dùng có thể muốn giữ bí mật nội dung tệp của họ cũng như để đảm bảo sự cộng tác bằng cách cho phép nhiều người dùng truy cập một số tệp nhất định.
Điều này được thực hiện thông qua hệ thống quyền ba cấp. Mỗi tệp trên đĩa đều thuộc quyền sở hữu của một người dùng và một nhóm người dùng và có ba bộ quyền: một dành cho chủ sở hữu của nó, một dành cho nhóm sở hữu tệp và một dành cho những người khác. Trong bài học này, chúng ta sẽ tìm hiểu cách truy vấn các quyền đối với một tệp, ý nghĩa của các quyền này và cách thao tác với chúng.
Truy vấn Thông tin về Tệp và Thư mục
Lệnh ls
được sử dụng để lấy danh sách nội dung của bất kỳ một thư mục nào. Ở dạng cơ bản này, tất cả những gì ta sẽ nhận được là tên tệp:
$ ls Another_Directory picture.jpg text.txt
Tuy nhiên, mỗi tệp đều sẽ có nhiều thông tin hơn thế, bao gồm loại, kích thước, quyền sở hữu và nhiều thông tin khác. Để xem thông tin này, ta phải yêu cầu ls
cung cấp danh sách "chi tiết" bằng cách sử dụng tham số -l
:
$ ls -l total 536 drwxrwxr-x 2 carol carol 4096 Dec 10 15:57 Another_Directory -rw------- 1 carol carol 539663 Dec 10 10:43 picture.jpg -rw-rw-r-- 1 carol carol 1881 Dec 10 15:57 text.txt
Mỗi cột ở đầu ra ở trên đều mang một ý nghĩa. Chúng ta hãy cùng xem xét các cột liên quan tới bài học này.
-
Cột đầu tiên trên danh sách hiển thị loại tệp và quyền. Ví dụ: trên
drwxrwxr-x
:-
Ký tự đầu tiên,
d
, cho biết loại tệp. -
Ba ký tự tiếp theo,
rwx
, biểu thị quyền của chủ sở hữu tệp hay còn được gọi là người dùng (user) hoặcu
. -
Ba ký tự tiếp theo,
rwx
, cho biết quyền của nhóm (group) hoặcg
sở hữu tệp . -
Ba ký tự cuối cùng,
r-x
, biểu thị quyền dành cho những người khác (others) hoặco
.
-
Tip
|
Chúng ta cũng sẽ thường thấy các nhóm quyền khác được gọi là quyền thế giới, tức là "Tất cả mọi người trên thế giới đều có những quyền này". |
-
Cột thứ ba và thứ tư hiển thị thông tin quyền sở hữu: tương ứng là người dùng và nhóm sở hữu tệp.
-
Cột thứ bảy và cột cuối cùng hiển thị tên tệp.
Cột thứ hai cho biết số lượng liên kết cứng trỏ đến tệp đó. Cột thứ năm hiển thị kích thước tệp. Cột thứ sáu hiển thị ngày và giờ tệp được sửa đổi lần cuối. Nhưng những cột này không liên quan đến chủ đề hiện tại.
Còn Thư mục thì sao?
Nếu cố gắng truy vấn thông tin về một thư mục bằng cách sử dụng ls -l
, nó sẽ hiển thị cho ta danh sách nội dung của thư mục:
$ ls -l Another_Directory/ total 0 -rw-r--r-- 1 carol carol 0 Dec 10 17:59 another_file.txt
Để tránh điều này và để truy vấn thông tin về chính thư mục đó, hãy thêm tham số -d
vào ls
:
$ ls -l -d Another_Directory/ drwxrwxr-x 2 carol carol 4096 Dec 10 17:59 Another_Directory/
Xem Tệp ẩn
Danh sách thư mục mà chúng ta đã truy xuất bằng ls -l
trước đây chưa đầy đủ:
$ ls -l total 544 drwxrwxr-x 2 carol carol 4096 Dec 10 17:59 Another_Directory -rw------- 1 carol carol 539663 Dec 10 10:43 picture.jpg -rw-rw-r-- 1 carol carol 1881 Dec 10 15:57 text.txt
Có ba tệp khác trong thư mục đó nhưng chúng bị ẩn. Trên Linux, các tệp có tên bắt đầu bằng dấu chấm (.
) sẽ tự động bị ẩn. Để xem chúng, ta cần thêm tham số -a
vào ls
:
$ ls -l -a total 544 drwxrwxr-x 3 carol carol 4096 Dec 10 16:01 . drwxrwxr-x 4 carol carol 4096 Dec 10 15:56 .. drwxrwxr-x 2 carol carol 4096 Dec 10 17:59 Another_Directory -rw------- 1 carol carol 539663 Dec 10 10:43 picture.jpg -rw-rw-r-- 1 carol carol 1881 Dec 10 15:57 text.txt -rw-r--r-- 1 carol carol 0 Dec 10 16:01 .thisIsHidden
Tệp .thisIsHidden
bị ẩn đơn giản là vì tên của nó bắt đầu bằng .
.
Tuy nhiên, các thư mục .
và ..
là các thư mục đặc biệt. .
là một con trỏ tới thư mục hiện tại và ..
là một con trỏ tới thư mục mẹ - thư mục chứa thư mục hiện tại. Trong Linux, mọi thư mục đều chứa ít nhất hai thư mục này.
Tip
|
Ta có thể kết hợp nhiều tham số cho |
Tìm hiểu về loại Tệp
Chúng ta đã đề cập tới việc chữ cái đầu tiên trong mỗi đầu ra của ls -l
được dùng để mô tả loại tệp. Ba loại tệp phổ biến nhất là:
-
(tệp bình thường)-
Một tệp có thể chứa bất kỳ loại dữ liệu nào và giúp quản lý dữ liệu này. Các tệp có thể được sửa đổi, di chuyển, sao chép và xóa.
d
(thư mục)-
Một thư mục chứa các tệp hoặc thư mục khác và giúp tổ chức hệ thống tệp. Về mặt kỹ thuật, thư mục là một loại tệp đặc biệt.
l
(liên kết tượng trưng)-
"Tệp" này là một con trỏ tới một tệp hoặc thư mục khác ở nơi khác trong hệ thống tệp.
Ngoài những loại này còn có ít nhất ba loại tệp khác mà chúng ta nên biết nhưng nằm ngoài phạm vi của bài học này:
b
(thiết bị khối)-
Tệp này là viết tắt của một thiết bị ảo hoặc vật lý, thường là đĩa hoặc các loại thiết bị lưu trữ khác (chẳng hạn như đĩa cứng đầu tiên có thể được biểu thị bằng
/dev/sda
). c
(thiết bị ký tự)-
Tệp này là viết tắt của một thiết bị ảo hoặc vật lý. Cửa sổ dòng lệnh (như cửa sổ dòng lệnh chính trên
/dev/ttyS0
) và các cổng nối tiếp là những ví dụ phổ biến về thiết bị ký tự. s
(ổ nối)-
Ổ nối đóng vai trò là "ống dẫn" truyền thông tin giữa hai chương trình.
Warning
|
Đừng thay đổi bất kỳ quyền nào trên thiết bị khối, thiết bị ký tự hoặc ổ nối trừ khi bạn biết chắc chắn mình đang làm gì. Điều này có thể khiến hệ thống dừng hoạt động! |
Hiểu về Quyền
Trong đầu ra của ls -l
, các quyền đối với tệp được hiển thị ngay sau loại tệp dưới dạng ba nhóm, mỗi nhóm có ba ký tự, theo thứ tự r
, w
và x
. Dưới đây là ý nghĩa của chúng. Hãy nhớ rằng dấu gạch ngang -
thể hiện việc thiếu quyền.
Quyền trên Tệp
r
-
Viết tắt của read (đọc) và có giá trị bát phân là
4
(đừng lo, chúng ta sẽ sớm thảo luận về khái niệm bát phân). Điều này đại diện cho quyền mở một tệp và đọc nội dung của nó. w
-
Viết tắt của write (ghi) và có giá trị bát phân là
2
. Điều này đại diện cho quyền chỉnh sửa hoặc xóa một tệp. x
-
Viết tắt của execute (thực thi) và có giá trị bát phân là
1
. Điều này đại diện cho việc tệp có thể được chạy dưới dạng tệp thực thi hoặc tệp lệnh.
Vì vậy, ví dụ: một tệp có quyền rw-
có thể được đọc và ghi vào nhưng không thể được thực thi.
Quyền trên Thư mục
r
-
Viết tắt của read (đọc) và có giá trị bát phân là
4
. Nó đại diện cho quyền đọc nội dung của thư mục (ví dụ như tên tệp) nhưng nó không đại diện cho quyền đọc các tệp. w
-
Viết tắt của write (ghi) và có giá trị bát phân là
2
. Nó đại diện cho quyền tạo hoặc xóa các tệp trong một thư mục.Hãy nhớ rằng chúng ta không thể thực hiện những thay đổi này chỉ với quyền ghi mà còn cần có quyền thực thi (
x
) để thay đổi thư mục. x
-
Viết tắt của execute (thực thi) và có giá trị bát phân là
1
. Nó đại diện cho quyền truy cập vào một thư mục nhưng không liệt kê các tệp của nó (để làm được việc này ta cần cór
).
Phần cuối cùng về thư mục nghe có vẻ hơi khó hiểu. Ví dụ, hãy tưởng tượng rằng chúng ta có một thư mục có tên là Another_Directory
với các quyền sau:
$ ls -ld Another_Directory/ d--x--x--x 2 carol carol 4,0K Dec 20 18:46 Another_Directory
Cũng hãy tưởng tượng rằng bên trong thư mục này, chúng ta có một tệp lệnh vỏ tên là hello.sh
:
-rwxr-xr-x 1 carol carol 33 Dec 20 18:46 hello.sh
Nếu chúng ta là người dùng carol
và đang cố gắng liệt kê nội dung của Another_Directory
, ta sẽ nhận được thông báo lỗi vì người dùng của chúng ta thiếu quyền đọc đối với thư mục đó:
$ ls -l Another_Directory/ ls: cannot open directory 'Another_Directory/': Permission denied
Tuy nhiên, người dùng carol
có quyền thực thi, có nghĩa là ta có thể truy cập vào thư mục. Do đó, người dùng carol
có thể truy cập các tệp trong thư mục, miễn là người dùng này có quyền chính xác đối với tệp tương ứng. Giả sử người dùng có toàn quyền (rwx
) đối với tệp lệnh hello.sh
, họ sẽ có thể chạy tệp lệnh dù không thể đọc nội dung của thư mục chứa nó nếu họ biết tên tệp đầy đủ:
$ sh Another_Directory/hello.sh Hello LPI World!
Như đã nói trước đây, các quyền được chỉ định theo trình tự: đầu tiên là cho chủ sở hữu tệp, sau đó là cho nhóm sở hữu và cuối cùng là những người dùng khác. Bất cứ khi nào có ai đó cố gắng thực hiện một hành động trên tệp, các quyền sẽ được kiểm tra theo thứ tự trên.
Trước tiên, hệ thống sẽ kiểm tra xem người dùng hiện tại có sở hữu tệp hay không, và nếu điều này đúng thì hệ thống chỉ áp dụng nhóm quyền đầu tiên. Nếu không, nó sẽ kiểm tra xem người dùng hiện tại có thuộc nhóm sở hữu tệp hay không. Trong trường hợp đó, nó sẽ chỉ áp dụng nhóm quyền thứ hai. Trong mọi trường hợp khác, hệ thống sẽ áp dụng nhóm quyền thứ ba.
Điều này có nghĩa là nếu người dùng hiện tại là chủ sở hữu của tệp thì chỉ có quyền của chủ sở hữu mới có hiệu lực ngay cả khi quyền nhóm hoặc quyền của những người khác mạnh hơn quyền của chủ sở hữu.
Sửa đổi Quyền của Tệp
Lệnh chmod
được sử dụng để sửa đổi các quyền cho một tệp và có ít nhất hai tham số: tham số đầu tiên mô tả những quyền cần thay đổi và tham số thứ hai trỏ đến tệp hoặc thư mục nơi thay đổi sẽ được thực hiện. Hãy nhớ rằng chỉ chủ sở hữu tệp hoặc quản trị viên hệ thống (root) mới có thể thay đổi quyền trên tệp.
Quyền sửa đổi có thể được mô tả theo hai cách, hoặc "chế độ", khác nhau.
Chế độ đầu tiên được gọi là chế độ tượng trưng. Nó cung cấp khả năng kiểm soát chi tiết hơn, cho phép ta thêm hoặc thu hồi một quyền duy nhất mà không sửa đổi các quyền khác. Chế độ còn lại được gọi là chế độ bát phân. Nó dễ nhớ hơn và nhanh hơn nếu ta muốn đặt tất cả các giá trị quyền cùng một lúc.
Cả hai chế độ sẽ dẫn đến cùng một kết quả cuối cùng. Vì vậy, các lệnh:
$ chmod ug+rw-x,o-rwx text.txt
và
$ chmod 660 text.txt
đều sẽ tạo ra cùng một đầu ra là một tệp có nhóm quyền như sau:
-rw-rw---- 1 carol carol 765 Dec 20 21:25 text.txt
Bây giờ, hãy xem mỗi chế độ hoạt động như thế nào.
Chế độ Tượng trưng
Khi mô tả những quyền nào cần thay đổi trong chế độ tượng trưng, các ký tự đầu tiên sẽ cho biết các quyền mà ta cần thay đổi: quyền cho người dùng (u
), cho nhóm (g
), cho những người khác (o
) và/hoặc cho tất cả mọi người (a
).
Sau đó, ta cần cho lệnh biết phải làm gì: có thể cấp quyền (+
), thu hồi quyền (-
) hoặc đặt nó thành một giá trị cụ thể (=
).
Cuối cùng, ta sẽ chỉ định quyền nào mình muốn đặt: đọc (r
), ghi (w
) hoặc thực thi (x
).
Ví dụ: hãy tưởng tượng chúng ta có một tệp có tên text.txt
với bộ quyền sau:
$ ls -l text.txt -rw-r--r-- 1 carol carol 765 Dec 20 21:25 text.txt
Nếu muốn cấp quyền ghi cho các thành viên trong nhóm sở hữu tệp, chúng ta sẽ sử dụng tham số g+w
. Sẽ dễ dàng hơn nếu ta nghĩ về nó theo cách này: "Đối với nhóm (g
), cấp (+
) quyền ghi (w
)". Vì vậy, lệnh sẽ là:
$ chmod g+w text.txt
Hãy cùng kiểm tra kết quả với ls
:
$ ls -l text.txt -rw-rw-r-- 1 carol carol 765 Dec 20 21:25 text.txt
Nếu muốn xóa quyền đọc của chủ sở hữu của chính tệp đó, hãy nghĩ về nó như sau: "Đối với người dùng (u
), thu hồi (-
) quyền đọc (r
)". Vậy tham số sẽ là u-r
như sau:
$ chmod u-r text.txt $ ls -l text.txt --w-rw-r-- 1 carol carol 765 Dec 20 21:25 text.txt
Nếu muốn đặt quyền chính xác là rw-
cho tất cả mọi người dùng? Hãy nghĩ về nó như sau: “Đối với tất cả mọi người (a
), đặt chính xác (=
) quyền đọc (r
), quyền ghi (w
), và không thực thi (-
)”. Vì thế:
$ chmod a=rw- text.txt $ ls -l text.txt -rw-rw-rw- 1 carol carol 765 Dec 20 21:25 text.txt
Tất nhiên, ta cũng có thể sửa đổi nhiều quyền cùng một lúc. Trong trường hợp này, hãy phân tách chúng bằng dấu phẩy (,
):
$ chmod u+rwx,g-x text.txt $ ls -lh text.txt -rwxrw-rw- 1 carol carol 765 Dec 20 21:25 text.txt
Ví dụ trên có thể được đọc là: “Đối với người dùng (u
), cấp (+
) quyền đọc, ghi và thực thi (rwx
); đối với nhóm (g
), thu hồi (-
) quyền thực thi (x
)”.
Khi chạy trên một thư mục, chmod
sẽ chỉ sửa đổi các quyền của thư mục. chmod
cũng có chế độ đệ quy rất hữu ích khi ta muốn thay đổi quyền cho "tất cả các tệp trong một thư mục và các thư mục con của nó". Để sử dụng lệnh này, hãy thêm tham số -R
sau tên lệnh và trước quyền cần thay đổi:
$ chmod -R u+rwx Another_Directory/
Lệnh này có thể được đọc là: "Đệ quy (-R
), dành cho người dùng (u
), cấp quyền (+
) đọc, ghi và thực thi (rwx
)".
Warning
|
Hãy cẩn thận và suy nghĩ kỹ trước khi sử dụng khóa chuyển |
Chế độ Bát phân
Trong chế độ bát phân, các quyền sẽ được chỉ định theo một cách khác: dưới dạng giá trị ba chữ số trên ký hiệu bát phân - hệ thống cơ số 8.
Mỗi quyền đều có một giá trị tương ứng và chúng được chỉ định theo thứ tự sau: đầu tiên là đọc (r
) được biểu thị bằng 4
, sau đó là ghi (w
) được biểu thị bằng 2
và cuối cùng là thực thi (x
) được biểu thị bằng 1
. Nếu không có quyền, hãy sử dụng giá trị 0 (0
). Vì vậy, quyền của rwx
sẽ là 7
(4+2+1
) và r-x
sẽ là 5
(4+0+1
).
Chữ số đầu tiên trong ba chữ số trên bộ quyền thể hiện các quyền dành cho người dùng (u
), chữ số thứ hai dành cho nhóm (g
) và chữ số thứ ba dành cho những người khác (o
). Nếu muốn đặt quyền cho một tệp thành rw-rw----
, giá trị bát phân sẽ là 660
:
$ chmod 660 text.txt $ ls -l text.txt -rw-rw---- 1 carol carol 765 Dec 20 21:25 text.txt
Ngoài ra, cú pháp trong chế độ bát phân cũng giống như trong chế độ tượng trưng, tham số đầu tiên thể hiện các quyền ta muốn thay đổi và tham số thứ hai trỏ đến tệp hoặc thư mục nơi thay đổi sẽ được thực hiện.
Tip
|
Nếu một giá trị quyền là số lẻ thì tệp chắc chắn có thể thực thi được! |
Ta nên sử dụng cú pháp nào? Nếu muốn thay đổi quyền thành một giá trị cụ thể như 640
(rw- r-- ---
), hãy sử dụng chế độ bát phân.
Nếu chỉ muốn thay đổi một giá trị cụ thể bất kể các quyền hiện tại đối với tệp là gì, chế độ tượng trưng sẽ hữu ích hơn. Ví dụ: ta có thể thêm quyền thực thi cho người dùng chỉ bằng cách sử dụng chmod u+x script.sh
mà không cần quan tâm đến hoặc thậm chí chạm vào các quyền hiện tại cho nhóm và những người khác.
Sửa đổi Quyền sở hữu Tệp
Lệnh chown
được sử dụng để sửa đổi quyền sở hữu của một tệp hoặc thư mục. Cú pháp của lệnh khá đơn giản:
chown USERNAME:GROUPNAME FILENAME
Ví dụ: chúng ta cùng xem một tệp có tên text.txt
:
$ ls -l text.txt -rw-rw---- 1 carol carol 1881 Dec 10 15:57 text.txt
Người dùng sở hữu tệp là carol
và nhóm cũng là carol
. Bây giờ, chúng ta sẽ thay đổi nhóm sở hữu tệp thành một nhóm khác là students
:
$ chown carol:students text.txt $ ls -l text.txt -rw-rw---- 1 carol students 1881 Dec 10 15:57 text.txt
Hãy nhớ rằng người dùng sở hữu tệp không cần phải thuộc nhóm sở hữu tệp. Trong ví dụ trên, người dùng carol
không cần phải là thành viên của nhóm students
.
Bộ quyền của người dùng hoặc nhóm có thể được bỏ qua nếu ta không muốn thay đổi chúng. Vì vậy, để chỉ thay đổi nhóm sở hữu một tệp, ta sẽ sử dụng chown :students text.txt
. Để chỉ thay đổi người dùng, lệnh sẽ là chown carol: text.txt
hoặc chown carol text.txt
. Ngoài ra, ta cũng có thể sử dụng lệnh chgrp students text.txt
.
Trừ khi là quản trị viên hệ thống (root), chúng ta sẽ không thể thay đổi quyền sở hữu tệp cho người dùng hoặc nhóm khác mà mình không thuộc về. Nếu cố gắng thực hiện việc này, ta sẽ nhận được thông báo lỗi Operation not permitted
(Hoạt động không được phép).
Truy vấn Nhóm
Trước khi thay đổi quyền sở hữu một tệp, việc biết nhóm nào tồn tại trên hệ thống, người dùng nào là thành viên của nhóm và người dùng thuộc nhóm nào có thể sẽ rất hữu ích.
Để xem nhóm nào tồn tại trên hệ thống, hãy nhập getent group
. Đầu ra sẽ tương tự như sa (đầu ra đã được tóm gọn):
$ getent group root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog,rigues tty:x:5:rigues disk:x:6: lp:x:7: mail:x:8: news:x:9: uucp:x:10:rigues
Nếu muốn biết một người dùng thuộc nhóm nào, hãy thêm tên người dùng làm tham số cho groups
:
$ groups carol carol : carol students cdrom sudo dip plugdev lpadmin sambashare
Để làm ngược lại (xem những người dùng nào thuộc về một nhóm), hãy sử dụng groupmems
. Tham số -g
chỉ định nhóm và -l
sẽ liệt kê tất cả các thành viên của nhóm:
# groupmems -g cdrom -l carol
Tip
|
|
Quyền mặc định
Hãy cùng thử một thí nghiệm: mở một cửa sổ dòng lệnh và tạo một tệp trống bằng lệnh sau:
$ touch testfile
Bây giờ, hãy xem các quyền cho tệp này. Tuỳ từng hệ thống mà kết quả có thể sẽ khác, nhưng chúng ta hãy giả sử chúng trông giống như sau:
$ ls -lh testfile -rw-r--r-- 1 carol carol 0 jul 13 21:55 testfile
Các quyền là rw-r—r--
: đọc và ghi cho người dùng và đọc cho nhóm và những người khác (hoặc 644
ở chế độ bát phân). Bây giờ, hãy thử tạo một thư mục:
$ mkdir testdir $ ls -lhd testdir drwxr-xr-x 2 carol carol 4,0K jul 13 22:01 testdir
Bây giờ, các quyền là rwxr-xr-x
: đọc, ghi và thực thi cho người dùng, đọc và thực thi cho nhóm và những người khác (755
ở chế độ bát phân).
Bất kể là đang ở đâu trong hệ thống tệp, mọi tệp hoặc thư mục chúng ta tạo ra đều sẽ nhận được các quyền tương tự. Bạn có bao giờ tự hỏi xem chúng đến từ đâu không?
Chúng đến từ usermask hoặc umask
dùng để đặt quyền mặc định cho mọi tệp được tạo. Ta có thể kiểm tra các giá trị hiện tại bằng lệnh umask
:
$ umask 0022
Nhưng nó trông không giống như rw-r—r--
hay thậm chí là 644
. Có lẽ chúng ta nên thử với tham số -S
để có được đầu ra ở chế độ tượng trưng:
$ umask -S u=rwx,g=rx,o=rx
Đó là những quyền tương tự mà thư mục ví dụ của chúng ta. Nhưng tại sao khi chúng ta tạo một tệp thì các quyền lại khác nhau?
Theo mặc định, thật vô nghĩa khi đặt quyền thực thi chung cho tất cả mọi người trên bất kỳ một tệp nào. Các thư mục cần có quyền thực thi (nếu không thì người dùng không thể truy cập chúng) nhưng các tệp thì không nên, vì thế mà chúng sẽ không có các quyền thực thi. Do đó mà ta có rw-r—r--
.
Bên cạnh việc hiển thị các quyền mặc định, umask
cũng có thể được sử dụng để thay đổi chúng cho phiên vỏ hiện tại. Ví dụ: nếu chúng ta sử dụng lệnh:
$ umask u=rwx,g=rwx,o=
Mọi thư mục mới sẽ kế thừa các quyền rwxrwx---
và mọi tệp rw-rw----
(vì chúng không có quyền thực thi). Nếu lặp lại các ví dụ trên để tạo một testfile
và testdir
và kiểm tra các quyền, ta sẽ nhận được:
$ ls -lhd test* drwxrwx--- 2 carol carol 4,0K jul 13 22:25 testdir -rw-rw---- 1 carol carol 0 jul 13 22:25 testfile
Và nếu kiểm tra umask
mà không có tham số -S
(chế độ tượng trưng) đi kèm, ta sẽ nhận được:
$ umask 0007
Kết quả trông hơi lạ vì các giá trị được sử dụng là khác nhau. Dưới đây là bảng gồm tất cả các giá trị và ý nghĩa tương ứng của chúng:
Giá trị | Quyền cho Tệp | Quyền cho Thư mục |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Như có thể thấy được, 007
tương ứng với rwxrwx---
, chính xác như những gì chúng ta đã yêu cầu. Số 0 đứng đầu có thể được bỏ qua.
Quyền đặc biệt
Ngoài các quyền đọc, ghi và thực thi cho người dùng, nhóm và những người khác, mỗi tệp có thể có ba quyền đặc biệt khác có thể thay đổi cách hoạt động của một thư mục hoặc cách một chương trình chạy. Chúng có thể được chỉ định ở chế độ tượng trưng hoặc bát phân như sau:
Bit dính
Bit dính (còn được gọi là cờ xóa hạn chế) có giá trị bát phân là 1
và ở chế độ tượng trưng được biểu thị bằng t
trong phạm vi quyền của những người khác. Điều này chỉ áp dụng cho các thư mục và không ảnh hưởng đến các tệp thông thường. Trên Linux, nó sẽ ngăn người dùng xóa hoặc đổi tên tệp trong một thư mục trừ khi họ sở hữu tệp hoặc thư mục đó.
Các thư mục có bộ bit dính sẽ hiển thị t
thay thế x
ở quyền cho những người khác trên đầu ra của ls -l
:
$ ls -ld Sample_Directory/ drwxr-xr-t 2 carol carol 4096 Dec 20 18:46 Sample_Directory/
Ở chế độ bát phân, các quyền đặc biệt được chỉ định bằng ký hiệu 4 chữ số với chữ số đầu tiên thể hiện quyền đặc biệt cần thay đổi. Ví dụ: để đặt bit dính (giá trị 1
) cho thư mục Another_Directory
ở chế độ bát phân với quyền 755
, lệnh sẽ là:
$ chmod 1755 Another_Directory $ ls -ld Another_Directory drwxr-xr-t 2 carol carol 4,0K Dec 20 18:46 Another_Directory
Set GID
Set GID (còn được gọi là bit SGID hoặc Thiết lập ID Nhóm) có giá trị bát phân là 2
và ở chế độ tượng trưng được biểu thị bằng s
trên quyền nhóm. Nó có thể được áp dụng cho các tệp hoặc thư mục thực thi. Trên các tệp, nó sẽ làm cho tiến trình chạy với các đặc quyền của nhóm sở hữu tệp. Khi áp dụng cho các thư mục, nó sẽ làm cho mọi tệp hoặc thư mục được tạo trong đó kế thừa nhóm từ thư mục mẹ.
Các tệp và thư mục có bit SGID sẽ hiển thị s
thay thế x
trên các quyền cho nhóm trên đầu ra của ls -l
:
$ ls -l test.sh -rwxr-sr-x 1 carol root 33 Dec 11 10:36 test.sh
Để thêm quyền SGID vào tệp ở chế độ tượng trưng, lệnh sẽ là:
$ chmod g+s test.sh $ ls -l test.sh -rwxr-sr-x 1 carol root 33 Dec 11 10:36 test.sh
Ví dụ sau sẽ giúp ta hiểu rõ hơn về tác dụng của SGID trên một thư mục. Giả sử chúng ta có một thư mục tên là Sample_Directory
được sở hữu bởi người dùng carol
và nhóm users
với cấu trúc quyền sau:
$ ls -ldh Sample_Directory/ drwxr-xr-x 2 carol users 4,0K Jan 18 17:06 Sample_Directory/
Bây giờ, hãy thay đổi thư mục này và sử dụng lệnh touch
để tạo một tệp trống bên trong nó. Kết quả sẽ là:
$ cd Sample_Directory/ $ touch newfile $ ls -lh newfile -rw-r--r-- 1 carol carol 0 Jan 18 17:11 newfile
Như chúng ta có thể thấy, tệp này thuộc sở hữu của người dùng carol
và nhóm carol
. Tuy nhiên, nếu thư mục có quyền SGID thì kết quả sẽ khác. Đầu tiên, chúng ta thêm bit SGID vào Sample_Directory
và kiểm tra kết quả:
$ sudo chmod g+s Sample_Directory/ $ ls -ldh Sample_Directory/ drwxr-sr-x 2 carol users 4,0K Jan 18 17:17 Sample_Directory/
Ký tự s
trên quyền của nhóm cho biết bit SGID đã được thiết lập. Bây giờ, chúng ta sẽ thay đổi thư mục này và một lần nữa tạo một tệp trống bằng lệnh touch
:
$ cd Sample_Directory/ $ touch emptyfile $ ls -lh emptyfile -rw-r--r-- 1 carol users 0 Jan 18 17:20 emptyfile
Nhóm sở hữu tệp là users
. Điều này là do bit SGID đã làm cho tệp kế thừa chủ sở hữu nhóm của thư mục mẹ của nó là users
.
Set UID
SUID (còn được gọi là Thiết lập ID Người dùng) có giá trị bát phân là 4
và được biểu thị bằng s
trên quyền người dùng ở chế độ tượng trưng. Nó chỉ áp dụng cho các tệp và không có tác dụng đối với các thư mục. Hành vi của nó tương tự như bit SGID nhưng tiến trình sẽ chạy với đặc quyền của người dùng sở hữu tệp. Các tệp có bit SUID sẽ hiển thị s
thay thế x
trên các quyền cho người dùng ở đầu ra của ls -l
:
$ ls -ld test.sh -rwsr-xr-x 1 carol carol 33 Dec 11 10:36 test.sh
Ta có thể kết hợp nhiều quyền đặc biệt trên một tham số. Vì vậy, để đặt SGID (giá trị 2
) và SUID (giá trị 4
) ở chế độ bát phân cho tệp lệnh test.sh
có quyền 755
, ta sẽ gõ:
$ chmod 6755 test.sh
Và kết quả sẽ là:
$ ls -lh test.sh -rwsr-sr-x 1 carol carol 66 Jan 18 17:29 test.sh
Tip
|
Nếu cửa sổ dòng lệnh của bạn hỗ trợ màu (ngày nay hầu hết các hệ thống đều có hỗ trợ), bạn có thể nhanh chóng xem được liệu các quyền đặc biệt này có được thiết lập hay không bằng cách xem lướt qua đầu ra của |
Bài tập Hướng dẫn
-
Hãy tạo một thư mục có tên
emptydir
bằng lệnhmkdir Emptydir
. Bây giờ, bằng cách sử dụngls
, hãy liệt kê các quyền cho thư mụcemptydir
. -
Hãy tạo một tệp trống có tên
emptyfile
bằng lệnhtouch Emptyfile
. Bây giờ, bằng cách sử dụngchmod
ở chế độ tượng trưng, hãy thêm quyền thực thi cho chủ sở hữu tệpemptyfile
, đồng thời xóa quyền ghi và thực thi đối với những người khác. Hãy thực hiện việc này chỉ bằng lệnhchmod
. -
Các quyền mặc định cho một tệp sẽ là gì nếu giá trị
umask
được đặt thành027
? -
Giả sử một tệp có tên
test.sh
là tệp lệnh vỏ có các quyền và quyền sở hữu sau:-rwxr-sr-x 1 carol root 33 Dec 11 10:36 test.sh
-
Quyền của chủ sở hữu tệp là gì?
-
Sử dụng ký hiệu bát phân, cú pháp của
chmod
sẽ là gì để "bỏ thiết lập" quyền đặc biệt được cấp cho tệp này?
-
-
Hãy xem tệp sau:
$ ls -l /dev/sdb1 brw-rw---- 1 root disk 8, 17 Dec 21 18:51 /dev/sdb1
sdb1
là loại tệp nào? Ai có thể ghi vào nó? -
Hãy xem 4 tệp sau:
drwxr-xr-t 2 carol carol 4,0K Dec 20 18:46 Another_Directory ----r--r-- 1 carol carol 0 Dec 11 10:55 foo.bar -rw-rw-r-- 1 carol carol 1,2G Dec 20 18:22 HugeFile.zip drwxr-sr-x 2 carol users 4,0K Jan 18 17:26 Sample_Directory
Hãy viết ra các quyền tương ứng cho từng tệp và thư mục bằng chế độ bát phân sử dụng ký hiệu 4 chữ số.
Another_Directory
foo.bar
HugeFile.zip
Sample_Directory
Bài tập Mở rộng
-
Hãy thử điều này trên cửa sổ dòng lệnh: tạo một tệp trống có tên
emptyfile
bằng lệnhtouchemptyfile
. Bây giờ, hãy "loại hết" các quyền đối với tệp cóchmod 000 Emptyfile
. Điều gì sẽ xảy ra nếu bạn thay đổi quyền choemptyfile
bằng cách chỉ truyền một giá trị chochmod
ở chế độ bát phân (nhưchmod 4 Emptyfile
)? Và nếu bạn sử dụng hai chữ số (như trongchmod 44emptyfile
) thì sao? Chúng ta có thể hiểu được điều gì về cáchchmod
đọc giá trị số? -
Hãy xem xét các quyền cho thư mục tạm thời trên một hệ thống Linux,
/tmp
:$ ls -l /tmp drwxrwxrwt 19 root root 16K Dec 21 18:58 tmp
Người dùng, nhóm và những người khác có toàn quyền nhưng người dùng thông thường có thể xóa bất kỳ một tệp nào trong thư mục này không? Tại sao lại như vậy?
-
Một tệp có tên
test.sh
có các quyền-rwsr-xr-x
, nghĩa là bit SUID được thiết lập. Bây giờ, hãy chạy các lệnh sau:$ chmod u-x test.sh $ ls -l test.sh -rwSr-xr-x 1 carol carol 33 Dec 11 10:36 test.sh
Chúng ta đã làm gì? Chữ hoa
S
có nghĩa là gì? -
Làm cách nào để có thể tạo một thư mục có tên
Box
mà trong đó tất cả các tệp đều được tự động sở hữu bởi nhómusers
và chỉ người dùng đã tạo ra chúng mới có thể xóa chúng?
Tóm tắt
Trong bài học này, chúng ta đã học cách sử dụng ls
để lấy (và giải mã) thông tin về quyền truy cập tệp, cách kiểm soát hoặc thay đổi người có thể tạo, xóa hoặc sửa đổi tệp bằng chmod
cả ở chế độ bát phân và tượng trưng, cách để thay đổi quyền sở hữu các tệp bằng chown
và chgrp
cũng như cách truy vấn và thay đổi mặt nạ quyền mặc định cho các tệp và thư mục bằng umask
.
Các lệnh sau đã được thảo luận trong bài học này:
l
-
Liệt kê các tệp, có thể tùy chọn bao gồm các chi tiết như quyền.
chmod
-
Thay đổi quyền của một tệp hoặc thư mục.
chown
-
Thay đổi người dùng và/hoặc nhóm sở hữu tệp hoặc thư mục.
chgrp
-
Thay đổi nhóm sở hữu của một tệp hoặc thư mục.
umask
-
Truy vấn hoặc thiết lập mặt nạ quyền mặc định cho tệp và thư mục
Đáp án Bài tập Hướng dẫn
-
Hãy tạo một thư mục có tên
emptydir
bằng lệnhmkdir Emptydir
. Bây giờ, bằng cách sử dụngls
, hãy liệt kê các quyền cho thư mụcemptydir
.Thêm tham số
-d
vàols
để xem thuộc tính tệp của một thư mục thay vì liệt kê nội dung của nó. Vì vậy, câu trả lời sẽ là:ls -l -d emptydir
Một điểm cộng nếu bạn hợp nhất hai tham số thành một (như trong
ls -ld Emptydir
). -
Hãy tạo một tệp trống có tên
emptyfile
bằng lệnhtouch Emptyfile
. Bây giờ, bằng cách sử dụngchmod
ở chế độ tượng trưng, hãy thêm quyền thực thi cho chủ sở hữu tệpemptyfile
, đồng thời xóa quyền ghi và thực thi đối với những người khác. Hãy thực hiện việc này chỉ bằng lệnhchmod
.Hãy nghĩ theo cách sau:
-
"Đối với người dùng sở hữu tệp (
u
) hãy thêm (+
) quyền thực thi (x
)", vì vậy nên ta cóu+x
. -
"Đối với nhóm (
g
) và những người dùng khác (o
), hãy xóa (-
) quyền ghi (w
) và thực thi (x
)", vì vậy nên ta cógo-wx
.Để kết hợp hai bộ quyền này, ta sẽ thêm dấu phẩy vào giữa chúng. Vì vậy, kết quả cuối cùng là:
chmod u+x,go-wx emptyfile
-
-
Các quyền mặc định cho một tệp sẽ là gì nếu giá trị
umask
được đặt thành027
?Các quyền sẽ là
rw-r------
-
Giả sử một tệp có tên
test.sh
là tệp lệnh vỏ có các quyền và quyền sở hữu sau:-rwxr-sr-x 1 carol root 33 Dec 11 10:36 test.sh
-
Quyền của chủ sở hữu tệp là gì?
Các quyền dành cho chủ sở hữu (ký tự thứ 2 đến thứ 4 trong đầu ra của
ls -l
) làrwx
. Vì vậy, câu trả lời sẽ là: "đọc, ghi và thực thi tệp". -
Sử dụng ký hiệu bát phân, cú pháp của chmod để "huỷ thiết lập" quyền đặc biệt được cấp cho tệp này là gì?
Chúng ta có thể "huỷ thiết lập" các quyền đặc biệt bằng cách truyền chữ số thứ 4,
0
chochmod
. Các quyền hiện tại là755
. Vì vậy, lệnh phải làchmod 0755
.
-
-
Hãy xem tệp sau:
$ ls -l /dev/sdb1 brw-rw---- 1 root disk 8, 17 Dec 21 18:51 /dev/sdb1
sdb1
là loại tệp nào? Ai có thể ghi vào nó?Ký tự đầu tiên ở đầu ra của
ls -l
sẽ hiển thị loại tệp.b
là một thiết bị khối, thường là một đĩa (cục bộ hoặc ngoại vi) được kết nối với máy. Chủ sở hữu (root
) và bất kỳ người dùng nào trong nhómdisk
đều có thể ghi vào đó. -
Hãy xem 4 tệp sau:
drwxr-xr-t 2 carol carol 4,0K Dec 20 18:46 Another_Directory ----r--r-- 1 carol carol 0 Dec 11 10:55 foo.bar -rw-rw-r-- 1 carol carol 1,2G Dec 20 18:22 HugeFile.zip drwxr-sr-x 2 carol users 4,0K Jan 18 17:26 Sample_Directory
Hãy viết ra các quyền tương ứng cho từng tệp và thư mục bằng chế độ bát phân sử dụng ký hiệu 4 chữ số.
Các quyền tương ứng ở chế độ bát phân như sau:
Another_Directory
1755
.1
cho bit dính,755
cho các quyền thông thường (rwx
cho người dùng,r-x
cho nhóm và những người khác).foo.bar
0044
. Không có quyền đặc biệt (vì vậy nên chữ số đầu tiên là0
), không có quyền cho người dùng (---
) và chỉ có quyền đọc (r—r--
) cho nhóm và những người khác.HugeFile.zip
0664
. Không có quyền đặc biệt nên chữ số đầu tiên là0
.6
(rw-
) cho người dùng và nhóm,4
(r--
) cho những người khác.Sample_Directory
2755
.2
cho bit SGID,7
(rwx
) cho người dùng,5
(r-x
) cho nhóm và những người khác.
Đáp án Bài tập Mở rộng
-
Hãy thử điều này trên cửa sổ dòng lệnh: tạo một tệp trống có tên
emptyfile
bằng lệnhtouchemptyfile
. Bây giờ, hãy "loại hết" các quyền đối với tệp cóchmod 000 Emptyfile
. Điều gì sẽ xảy ra nếu bạn thay đổi quyền choemptyfile
bằng cách chỉ truyền một giá trị chochmod
ở chế độ bát phân (nhưchmod 4 Emptyfile
)? Và nếu bạn sử dụng hai chữ số (như trongchmod 44emptyfile
) thì sao? Chúng ta có thể hiểu được điều gì về cáchchmod
đọc giá trị số?Hãy nhớ rằng chúng tađã "bỏ hết" các quyền đối với
emptyfile
. Vì vậy, trạng thái ban đầu của nó sẽ là:---------- 1 carol carol 0 Dec 11 10:55 emptyfile
Bây giờ, chúng ta hãy thử lệnh đầu tiên là
chmod 4 Emptyfile
:$ chmod 4 emptyfile $ ls -l emptyfile -------r-- 1 carol carol 0 Dec 11 10:55 emptyfile
Quyền của những người khác đã được thay đổi. Và điều gì sẽ xảy ra nếu chúng ta thử hai chữ số (như trong
chmod 44emptyfile
)?$ chmod 44 emptyfile $ ls -l emptyfile ----r--r-- 1 carol carol 0 Dec 11 10:55 emptyfile
Bây giờ, quyền của nhóm và những người khác đã bị ảnh hưởng. Từ đó, chúng ta có thể kết luận rằng ở chế độ bát phân,
chmod
sẽ đọc giá trị "ngược", từ chữ số có ít ý nghĩa nhỏ nhất (những người khác) đến chữ số có nhiều ý nghĩa nhất (người dùng). Nếu truyền một chữ số, bạn sẽ sửa đổi quyền cho những người khác. Với hai chữ số, bạn sẽ sửa đổi quyền cho nhóm và những người khác. Với ba chữ số, bạn sẽ sửa đổi quyền cho người dùng, nhóm và những người khác. Với bốn chữ số, bạn sẽ sửa đổi quyền cho người dùng, nhóm, những người khác và các quyền đặc biệt. -
Hãy xem xét các quyền cho thư mục tạm thời trên một hệ thống Linux,
/tmp
:$ ls -l /tmp drwxrwxrwt 19 root root 16K Dec 21 18:58 tmp
Người dùng, nhóm và những người khác có toàn quyền nhưng người dùng thông thường có thể xóa bất kỳ một tệp nào trong thư mục này không? Tại sao lại như vậy?
/tmp
là cái mà chúng ta gọi là thư mục cả thể giới có thể ghi được, nghĩa là bất kỳ người dùng nào cũng có thể ghi vào đó. Nhưng chúng ta không muốn một người dùng nào đó làm xáo trộn các tệp do những người khác tạo ra, vì vậy nên bit dính sẽ được đặt (như được biểu thị bằngt
trên các quyền dành cho những người khác). Điều này có nghĩa là người dùng có thể xóa các tệp trên/tmp
(nhưng chỉ những tệp do chính họ tạo ra). -
Một tệp có tên
test.sh
có các quyền-rwsr-xr-x
, nghĩa là bit SUID được thiết lập. Bây giờ, hãy chạy các lệnh sau:$ chmod u-x test.sh $ ls -l test.sh -rwSr-xr-x 1 carol carol 33 Dec 11 10:36 test.sh
Chúng ta đã làm gì? Chữ hoa
S
có nghĩa là gì?Chúng ta đã xóa quyền thực thi đối với người dùng sở hữu tệp.
s
(hoặct
) sẽ thay thếx
trên đầu ra củals -l
, vì vậy nên hệ thống cần một cách để hiển thị xem người dùng có quyền thực thi hay không. Nó thực hiện điều này bằng cách thay đổi kiểu chữ của ký tự đặc biệt.Chữ
s
trong nhóm quyền đầu tiên có nghĩa là người dùng sở hữu tệp có quyền thực thi và bit SUID đã được thiết lập. ChữS
có nghĩa là người dùng sở hữu tệp thiếu (-
) quyền thực thi và bit SUID đã được thiết lập.Điều tương tự cũng có thể xảy ra với SGID. Chữ
s
trên nhóm quyền thứ hai có nghĩa là nhóm sở hữu tệp có quyền thực thi và bit SGID đã được thiết lập. ChữS
có nghĩa là nhóm sở hữu tệp thiếu (-
) quyền thực thi và bit SGID đã được thiết lập.Điều này cũng đúng với bit dính được biểu thị bằng
t
trên nhóm quyền thứ ba. Chữt
có nghĩa là bộ bit dính và những người khác có quyền thực thi. ChữT
có nghĩa là bit dính đã được thiết lập và những người khác không có quyền thực thi. -
Làm cách nào để có thể tạo một thư mục có tên
Box
mà trong đó tất cả các tệp đều được sở hữu tự động bởi nhómusers
và chỉ người dùng đã tạo ra chúng mới có thể xóa chúng?Đây là một quá trình gồm nhiều bước. Bước đầu tiên là tạo thư mục:
$ mkdir Box
Chúng ta muốn mọi tệp được tạo trong thư mục này sẽ được tự động gán cho nhóm
users
. Ta có thể thực hiện điều này bằng cách đặt nhóm này làm chủ sở hữu của thư mục và sau đó bằng cách thiết lập bit SGID trên đó. Chúng ta cũng cần đảm bảo rằng bất kỳ thành viên nào trong nhóm cũng đều có thể ghi vào thư mục đó.Vì không quan tâm đến các quyền khác là gì và chỉ muốn "thay đổi" các bit đặc biệt nên chúng ta sẽ sử dụng chế độ tượng trưng:
$ chown :users Box/ $ chmod g+wxs Box/
Hãy lưu ý rằng nếu người dùng hiện tại của bạn không thuộc nhóm
users
, bạn sẽ phải sử dụng lệnhsudo
trước các lệnh trên để thực hiện thay đổi với quyền gốc.Bây giờ là bước cuối cùng, hãy đảm bảo rằng chỉ người dùng đã tạo tệp mới được phép xóa tệp đó. Điều này được thực hiện bằng cách thiết lập bit dính (được biểu thị bằng
t
) trên thư mục. Hãy nhớ rằng nó được đặt trên các quyền dành cho người khác (o
).$ chmod o+t Box/
Các quyền trên thư mục
Box
phải như sau:drwxrwsr-t 2 carol users 4,0K Jan 18 19:09 Box
Tất nhiên, bạn có thể chỉ định SGID và bit dính chỉ bằng một lệnh
chmod
:$ chmod g+wxs,o+t Box/
Một điểm cộng nếu bạn đã nghĩ đến điều này.