Hệ thống phân quyền tệp cơ bản của Linux nổi tiếng với sự đơn giản nhưng vô cùng mạnh mẽ, và việc nó tồn tại nguyên vẹn trong hơn 50 năm qua là minh chứng rõ ràng nhất. Tuy nhiên, bit thực thi (execute bit) là một yếu tố thường gây nhầm lẫn, nhưng lại cực kỳ quan trọng và đáng để người dùng Linux hiểu rõ chi tiết. Nó không chỉ quyết định khả năng chạy một chương trình hay tập lệnh, mà còn ảnh hưởng sâu sắc đến cách bạn tương tác với các thư mục và quản lý quyền truy cập trong hệ thống. Việc nắm vững khái niệm này không chỉ giúp bạn vận hành hệ thống hiệu quả hơn mà còn tăng cường đáng kể tính bảo mật, đảm bảo rằng chỉ những hành động được phép mới có thể diễn ra.
Bit Thực Thi Là Gì Và Cách Xem Trạng Thái Của Nó?
Mỗi tệp tin trên hệ thống Linux đều có một bộ quyền hạn được thiết lập để kiểm soát các hành động có thể thực hiện trên đó: liệu tệp đó có thể được đọc, ghi hay thực thi? Có ba cấp độ người dùng, mỗi cấp độ đều có bộ quyền riêng: chủ sở hữu của tệp (user), các thành viên của nhóm sở hữu tệp (group), và tất cả những người khác (other). Ba hành động này kết hợp với ba loại người dùng tạo ra tổng cộng chín quyền hạn cho mỗi tệp:
Biểu đồ minh họa Chế độ quyền hạn tệp Linux hiển thị bằng lệnh ls, với chín ký tự chia thành ba nhóm đại diện cho quyền đọc, ghi và thực thi của người dùng, nhóm và những người khác.
Hãy nhớ rằng, trên Unix và Linux, các thư mục cũng được coi là tệp tin. Chúng có cùng dữ liệu quyền hạn như các tệp khác, mặc dù ý nghĩa của các quyền này có chút khác biệt.
Trong khi các quyền đọc (read) và ghi (write) khá dễ hiểu, thì “bit thực thi” lại có vẻ bí ẩn và thậm chí mang tính “phép thuật” hơn. Tuy nhiên, một khi đã hiểu rõ, nó trở nên khá đơn giản và đặc biệt hữu ích khi bạn cần đến.
Bạn có thể kiểm tra quyền hạn của một tệp bằng các công cụ như lệnh ls
hoặc stat
. Hãy thử chạy lệnh ls -l
với một tệp trên hệ thống của bạn, và bạn sẽ thấy kết quả tương tự như sau:
Ảnh chụp màn hình Kết quả lệnh ls -l trên Linux hiển thị chi tiết quyền hạn, chủ sở hữu, nhóm, kích thước và thời gian sửa đổi của một tệp tin.
Có rất nhiều thông tin về tệp được hiển thị ở đây, nhưng các quyền hạn chỉ là tập hợp các chữ cái ở đầu dòng. Trong trường hợp này, “rwxr-xr-x” có nghĩa là, trong khi chỉ chủ sở hữu của tệp mới có thể ghi vào nó, thì tất cả những người khác đều có thể đọc và thực thi tệp. Bạn sẽ nghe thuật ngữ “execute bit” (bit thực thi), nhưng thực tế, mỗi tệp có ba bit thực thi, tương ứng với ba cấp độ người dùng (chủ sở hữu, nhóm, người khác).
Chức Năng Của Bit Thực Thi Đối Với Tệp Tin
Mục đích chính của bit thực thi là kiểm soát liệu bạn có thể chạy một tệp dưới dạng chương trình hoặc tập lệnh (script) hay không. Nếu bạn nhập tên một tệp vào dòng lệnh, shell của bạn sẽ cố gắng thực thi nó. Việc cố gắng thực thi một tệp dữ liệu như tài liệu hoặc hình ảnh sẽ tạo ra lỗi quyền truy cập:
Ảnh chụp màn hình Lỗi "Permission denied" khi cố gắng thực thi một tệp hình ảnh không có quyền thực thi trên Linux.
Điều này xảy ra vì bit thực thi không được đặt trên một tệp như vậy. Tuy nhiên, bit thực thi không phải là phép thuật; bạn không thể sử dụng lệnh chmod
để “biến” một tệp hình ảnh thành một chương trình thực thi:
Ảnh chụp màn hình Lỗi hiển thị ký tự lạ và thông báo lỗi khi thực thi một tệp hình ảnh đã được thêm quyền thực thi, chứng tỏ bit thực thi không tạo ra chương trình.
Bạn chỉ có thể thực thi một tệp nếu nó thuộc một loại nhất định. Nói chung, có hai loại tệp bạn có thể chạy trực tiếp trên Linux:
- Tệp nhị phân thực thi (Binary executable): Đây là một tệp đã được biên dịch từ mã nguồn và đóng gói cho một kiến trúc cụ thể, sử dụng các lệnh mã máy để thực hiện nhiệm vụ của nó. Bạn có thể biên dịch chương trình như vậy từ mã nguồn, tải xuống hoặc cài đặt bằng trình quản lý gói.
- Tệp tập lệnh (Script file): Đây là một tệp văn bản được viết bằng ngôn ngữ dễ đọc mà có thể chạy bằng một chương trình khác, gọi là trình thông dịch (interpreter). Nó có thể là một tập lệnh shell hoặc một chương trình trong các ngôn ngữ kịch bản như Perl hoặc PHP.
Khi bạn chạy một tệp script trực tiếp bằng cách gõ đường dẫn của nó, shell sẽ quyết định sử dụng trình thông dịch nào dựa trên dòng shebang (hashbang) của script. Ví dụ, một script Python có thể bắt đầu bằng dòng này:
#!/usr/bin/python
Điều này khẳng định rằng bit thực thi chỉ liên quan đến quyền hạn chứ không phải là một chức năng “biến đổi”. Nó cho phép shell quyết định liệu bạn có được phép cố gắng chạy một tệp dưới dạng chương trình hay không, chứ không phải liệu việc chạy nó có thực sự có ý nghĩa gì hay không.
Điều quan trọng cần hiểu là bit thực thi không phải là một cách tuyệt đối để ngăn chặn việc thực thi. Lấy ví dụ tập lệnh shell sau:
#!/bin/sh
echo "pretend this script does something dangerous like rm -rf / ..."
Bạn có thể nghĩ rằng việc loại bỏ quyền thực thi sẽ giữ an toàn cho bạn:
Ảnh chụp màn hình Lỗi "Permission denied" khi cố gắng chạy một script shell đã bị loại bỏ quyền thực thi.
Tuy nhiên, hãy xem xét trường hợp sau:
Ảnh chụp màn hình Một script shell nguy hiểm được chạy thành công thông qua lệnh sh, bỏ qua quyền thực thi của chính script.
Thảm họa! Tập lệnh bây giờ vẫn chạy được vì:
- Mọi người đều có thể thực thi chương trình
/bin/sh
. - Chương trình
sh
sẽ cố gắng chạy tệp được truyền làm đối số, mà không kiểm tra bit thực thi của chính tệp đó.
Vì vậy, việc chạy một chương trình liên quan đến hai khía cạnh riêng biệt. Quyền hạn của tệp xác định liệu bạn có thể cố gắng chạy nó bằng cách nhập đường dẫn của nó hay không. Nội dung của tệp xác định liệu nó có thực sự làm gì đó khi được thực thi hay không. Cuối cùng, bit thực thi là một cơ chế an toàn để ngăn bạn vô tình chạy một tệp.
Chức Năng Của Bit Thực Thi Đối Với Thư Mục
Bit thực thi hoạt động rất khác khi bạn thiết lập nó trên một thư mục. Rốt cuộc, một thư mục không thể là một chương trình, vì vậy việc thực thi nó không có ý nghĩa gì. Thay vào đó, bit thực thi quyết định liệu bạn có thể đi vào một thư mục và truy cập các tệp bên trong nó hay không.
Với bit thực thi được đặt trên một thư mục, bạn có thể sử dụng lệnh cd
để vào thư mục đó và lệnh ls
để hiển thị chi tiết nội dung của nó:
Ảnh chụp màn hình Ví dụ về việc sử dụng lệnh cd để truy cập thư mục và lệnh ls -l để liệt kê nội dung khi thư mục có quyền thực thi.
Tuy nhiên, nếu bạn loại bỏ quyền này, bạn sẽ không còn có thể vào thư mục đó hoặc hiển thị chi tiết các tệp bên trong nó:
Ảnh chụp màn hình Lỗi khi cố gắng truy cập hoặc xem chi tiết tệp trong thư mục đã bị loại bỏ quyền thực thi, thể hiện sự giới hạn truy cập.
Lưu ý rằng lệnh ls
vẫn hiển thị danh sách dài, nhưng nó thay thế hầu hết dữ liệu bằng dấu hỏi, cho biết rằng nó không thể đọc được. Tên thực tế của các tệp bên trong một thư mục được lưu trữ như một phần của thư mục đó, vì vậy quyền đọc cấp quyền truy cập vào chúng. Nhưng bất kỳ dữ liệu nào khác, như kích thước tệp hoặc ngày sửa đổi, đều không thể truy cập được nếu không có quyền thực thi trên thư mục.
Điều này có thể dẫn đến các lỗi khó hiểu nếu bạn có một lệnh được alias. Ví dụ, trên hệ thống Ubuntu của tôi, ls
được alias thành ls --color
, sử dụng một số dữ liệu tệp nhất định để tô màu đầu ra. Trên một thư mục không thể thực thi, điều này tạo ra lỗi:
Ảnh chụp màn hình Các thông báo lỗi quyền truy cập hiển thị khi chạy lệnh ls đã được alias (ví dụ: ls –color) trên một thư mục không có quyền thực thi.
Nhưng, nếu không có tùy chọn --color
, lệnh ls
hoạt động tốt trên thư mục đó vì tất cả những gì nó cần hiển thị chỉ là tên tệp.
Cách Sử Dụng Và Thay Đổi Bit Thực Thi
Nếu bạn cần tập trung vào quyền hạn của một tệp, bạn có thể sử dụng lệnh stat
để có kết quả chi tiết hơn so với ls
. Tùy chọn -c
của chương trình stat
cho phép bạn chỉ định định dạng để trích xuất chính xác siêu dữ liệu bạn cần. Ví dụ, để chỉ hiển thị quyền hạn của tệp cùng với tên của nó, hãy sử dụng định dạng này trên Linux:
stat -c "%a %n"
Bạn sẽ cần điều chỉnh lệnh này trên macOS vì nó sử dụng phiên bản stat
của BSD thay vì phiên bản GNU của Linux:
stat -f "%Sp %N"
Nếu bạn chỉ muốn chuỗi quyền hạn, bạn có thể bỏ “%n”, tức là:
stat -c "%a"
Điều này có thể hữu ích cho việc viết tập lệnh. Ví dụ, bạn có thể sử dụng dòng lệnh đơn này để lấy thông tin tóm tắt về các cài đặt quyền khác nhau cho tất cả các tệp trong một thư mục:
stat -c "%a" ~/home/projects/all/*/* | sort | uniq -c | sort
Ảnh chụp màn hình Một cửa sổ terminal trên Ubuntu Linux hiển thị kết quả tổng hợp quyền hạn tệp tin bằng lệnh stat và các bộ lọc.
Bạn có thể thay đổi quyền hạn của một tệp bằng lệnh chmod
. Cú pháp đầy đủ của chmod
khá phức tạp vì nó là một công cụ mạnh mẽ. Tuy nhiên, nếu bạn nhớ các hành động cơ bản dựa trên chữ cái và các từ viết tắt (u=user/owner, g=group, o=other, a=all) thì việc sử dụng nó khá dễ dàng.
Để làm cho một tệp có thể thực thi bởi bất kỳ ai, hãy sử dụng lệnh này:
chmod a+x file
Để loại bỏ quyền thực thi khỏi tất cả người dùng, hãy nhập lệnh này:
chmod a-x file
Ảnh chụp màn hình Giao diện dòng lệnh Linux minh họa việc sử dụng lệnh chmod để thay đổi quyền thực thi của một tệp tin.
Kết Luận
Bit thực thi, hay execute bit, là một thành phần không thể thiếu trong hệ thống phân quyền tệp của Linux. Mặc dù ban đầu có thể gây khó hiểu, việc nắm vững chức năng của nó đối với cả tệp tin và thư mục là chìa khóa để quản lý hệ thống Linux một cách hiệu quả và an toàn. Nó đóng vai trò là một cơ chế an toàn quan trọng, giúp ngăn chặn việc thực thi vô tình các tệp không mong muốn và kiểm soát quyền truy cập vào các thư mục.
Hiểu rõ cách xem, kiểm tra và thay đổi bit thực thi bằng các lệnh như ls
, stat
và chmod
sẽ giúp bạn tối ưu hóa bảo mật và quyền hạn trên hệ thống của mình. Hãy áp dụng những kiến thức này để đảm bảo các tệp và thư mục của bạn luôn được bảo vệ đúng cách, đồng thời các chương trình và tập lệnh có thể hoạt động trơn tru.
Nếu bạn có bất kỳ thắc mắc nào hoặc muốn chia sẻ kinh nghiệm về việc quản lý quyền hạn tệp trong Linux, đừng ngần ngại để lại bình luận bên dưới. Hãy tiếp tục khám phá thêm các bài viết chuyên sâu khác của Thời Báo Công Nghệ về chủ đề Linux và quản trị hệ thống để nâng cao kiến thức của bạn.