HỌC LINUX CHO NGƯỜI MỚI BẮT ĐẦU
Chào mừng bạn đến với hành trình khám phá thế giới Linux! Học Linux là một trong những kỹ năng giá trị nhất trong ngành công nghệ hiện nay. Nó không chỉ giúp bạn hoàn thành công việc nhanh hơn, hiệu quả hơn mà còn mở ra cánh cửa đến nhiều cơ hội nghề nghiệp hấp dẫn như DevOps, An ninh mạng, và Điện toán đám mây. Hãy cùng nhau tìm hiểu về hệ điều hành mạnh mẽ này, nơi mà phần lớn các máy chủ và siêu máy tính trên thế giới đang vận hành.
Trong cuốn cẩm nang này, chúng ta sẽ bắt đầu từ những điều cơ bản nhất của dòng lệnh Linux, sau đó tiến tới các chủ đề nâng cao hơn như lập trình shell script và quản trị hệ thống. Dù bạn là người hoàn toàn mới hay đã có kinh nghiệm sử dụng Linux, chắc chắn bạn sẽ tìm thấy nhiều điều hữu ích ở đây.
Lưu ý quan trọng: Tất cả các ví dụ trong sách này được thực hiện trên Ubuntu 22.04.2 LTS (Jammy Jellyfish). Hầu hết các công cụ dòng lệnh đều tương tự ở các bản phân phối khác. Tuy nhiên, một số ứng dụng GUI và lệnh có thể khác nếu bạn đang làm việc trên bản phân phối Linux khác.
Mục lục
-
Phần 1: Giới thiệu về Linux
-
1.1. Bắt đầu với Linux
-
-
Phần 2: Giới thiệu về Bash Shell và các lệnh hệ thống
-
2.1. Bắt đầu với Bash shell
-
2.2. Cấu trúc lệnh
-
2.3. Các lệnh Bash và phím tắt
-
2.4. Xác định danh tính của bạn: Lệnh whoami
-
-
Phần 3: Hiểu về hệ thống Linux của bạn
-
3.1. Khám phá hệ điều hành và thông số kỹ thuật
-
-
Phần 4: Quản lý tệp từ dòng lệnh
-
4.1. Cấu trúc hệ thống tệp Linux
-
4.2. Điều hướng hệ thống tệp Linux
-
4.3. Quản lý tệp và thư mục
-
4.5. Các lệnh cơ bản để xem tệp
-
-
Phần 5: Những điều cần thiết khi chỉnh sửa văn bản trong Linux
-
5.1. Thành thạo Vim: Hướng dẫn đầy đủ
-
5.2. Thành thạo Nano
-
-
Phần 6: Lập trình Bash Script
-
6.1. Định nghĩa lập trình Bash script
-
6.2. Ưu điểm của lập trình Bash script
-
6.3. Tổng quan về Bash Shell và giao diện dòng lệnh
-
6.4. Cách tạo và thực thi Bash script
-
6.5. Các kiến thức cơ bản về Bash Scripting
-
-
Phần 7: Quản lý các gói phần mềm trong Linux
-
7.1. Gói và quản lý gói
-
7.2. Cài đặt gói qua dòng lệnh
-
7.3. Cài đặt gói qua phương pháp đồ họa nâng cao – Synaptic
-
7.4. Cài đặt các gói đã tải xuống từ một trang web
-
-
Phần 8: Các chủ đề Linux nâng cao
-
8.1. Quản lý người dùng
-
8.2. Kết nối đến máy chủ từ xa qua SSH
-
8.3. Phân tích và xử lý log nâng cao
-
8.4. Quản lý các tiến trình Linux qua dòng lệnh
-
8.5. Các luồng nhập và xuất chuẩn trong Linux
-
8.6. Tự động hóa trong Linux – Tự động hóa các tác vụ với Cron Jobs
-
8.7. Các kiến thức cơ bản về mạng Linux
-
8.8. Khắc phục sự cố Linux: Các công cụ và kỹ thuật
-
8.9. Chiến lược khắc phục sự cố chung cho máy chủ
-
8.10. Chẩn đoán sự cố phần cứng
-
-
Kết luận
Phần 1: Giới thiệu về Linux
1.1. Bắt đầu với Linux
Linux là gì?
Linux là một hệ điều hành mã nguồn mở, được phát triển dựa trên hệ điều hành Unix. Nó được Linus Torvalds tạo ra vào năm 1991. Mã nguồn mở có nghĩa là mã nguồn của hệ điều hành được công khai. Điều này cho phép bất kỳ ai cũng có thể sửa đổi mã gốc, tùy chỉnh và phân phối hệ điều hành mới cho người dùng tiềm năng.
Tại sao bạn nên học Linux?
Trong bối cảnh trung tâm dữ liệu ngày nay, Linux và Microsoft Windows là hai đối thủ chính, trong đó Linux chiếm phần lớn thị phần. Dưới đây là một số lý do hấp dẫn để bạn học Linux:
- Với sự phổ biến của hosting Linux, khả năng cao ứng dụng của bạn sẽ được lưu trữ trên Linux. Vì vậy, việc học Linux trở nên ngày càng giá trị đối với một nhà phát triển.
- Với điện toán đám mây đang trở thành tiêu chuẩn, các máy chủ đám mây của bạn rất có thể sẽ dựa trên Linux.
- Linux là nền tảng cho nhiều hệ điều hành dành cho Internet of Things (IoT) và ứng dụng di động.
- Trong lĩnh vực IT, có rất nhiều cơ hội cho những người có kỹ năng về Linux.
Mã nguồn mở có ý nghĩa gì đối với Linux?
Đầu tiên, mã nguồn mở là gì? Phần mềm mã nguồn mở là phần mềm có mã nguồn được truy cập tự do, cho phép bất kỳ ai sử dụng, sửa đổi và phân phối nó. Bất cứ khi nào mã nguồn được tạo, nó sẽ tự động được coi là có bản quyền, và việc phân phối của nó được kiểm soát bởi chủ sở hữu bản quyền thông qua các giấy phép phần mềm.
Ngược lại với mã nguồn mở, phần mềm độc quyền hoặc mã nguồn đóng hạn chế quyền truy cập vào mã nguồn của nó. Chỉ những người tạo ra mới có thể xem, sửa đổi hoặc phân phối nó.
Linux chủ yếu là mã nguồn mở, có nghĩa là mã nguồn của nó được cung cấp miễn phí. Bất kỳ ai cũng có thể xem, sửa đổi và phân phối nó. Các nhà phát triển từ khắp nơi trên thế giới có thể đóng góp vào việc cải thiện nó. Điều này tạo nền tảng cho sự hợp tác, một khía cạnh quan trọng của phần mềm mã nguồn mở. Cách tiếp cận hợp tác này đã dẫn đến việc Linux được áp dụng rộng rãi trên các máy chủ, máy tính để bàn, hệ thống nhúng và thiết bị di động.
Khía cạnh thú vị nhất của việc Linux là mã nguồn mở là bất kỳ ai cũng có thể điều chỉnh hệ điều hành theo nhu cầu cụ thể của mình mà không bị hạn chế bởi các giới hạn độc quyền. Chrome OS được Chromebook sử dụng dựa trên Linux. Android, cung cấp năng lượng cho nhiều điện thoại thông minh trên toàn cầu, cũng dựa trên Linux.
Kernel Linux là gì?
Kernel là thành phần trung tâm của một hệ điều hành, quản lý máy tính và các hoạt động phần cứng của nó. Nó xử lý các hoạt động bộ nhớ và thời gian CPU. Kernel đóng vai trò cầu nối giữa các ứng dụng và việc xử lý dữ liệu cấp phần cứng bằng cách sử dụng giao tiếp liên tiến trình (inter-process communication) và các cuộc gọi hệ thống (system calls).
Kernel tải vào bộ nhớ đầu tiên khi một hệ điều hành khởi động và vẫn ở đó cho đến khi hệ thống tắt máy. Nó chịu trách nhiệm cho các tác vụ như quản lý đĩa, quản lý tác vụ và quản lý bộ nhớ.
Nếu bạn tò mò về hình dạng của kernel Linux, bạn có thể tìm trên GitHub.
Bản phân phối Linux là gì?
Đến đây, bạn đã biết rằng mình có thể tái sử dụng mã nguồn kernel Linux, sửa đổi nó và tạo ra một kernel mới. Bạn có thể kết hợp thêm các tiện ích và phần mềm khác nhau để tạo ra một hệ điều hành hoàn toàn mới.
Một bản phân phối hoặc "distro" của Linux là một phiên bản của hệ điều hành Linux bao gồm kernel Linux, các tiện ích hệ thống và các phần mềm khác. Là mã nguồn mở, một bản phân phối Linux là nỗ lực hợp tác liên quan đến nhiều cộng đồng phát triển mã nguồn mở độc lập.
Ý nghĩa của việc một bản phân phối được "phát triển từ"? Khi bạn nói rằng một bản phân phối được "phát triển từ" một bản phân phối khác, bản phân phối mới hơn được xây dựng trên nền tảng của bản gốc. Sự phát triển này có thể bao gồm việc sử dụng cùng một hệ thống quản lý gói (chúng ta sẽ tìm hiểu thêm về điều này sau), phiên bản kernel và đôi khi là cùng các công cụ cấu hình.
Ngày nay, có hàng nghìn bản phân phối Linux để lựa chọn, cung cấp các mục tiêu và tiêu chí khác nhau để lựa chọn và hỗ trợ phần mềm được cung cấp bởi bản phân phối của họ. Các bản phân phối khác nhau, nhưng chúng thường có một số đặc điểm chung:
- Một bản phân phối bao gồm một kernel Linux.
- Nó hỗ trợ các chương trình không gian người dùng.
- Một bản phân phối có thể nhỏ và có một mục đích duy nhất hoặc bao gồm hàng nghìn chương trình mã nguồn mở.
- Nên có phương tiện để cài đặt và cập nhật bản phân phối và các thành phần của nó.
Nếu bạn xem Lịch sử phát triển các bản phân phối Linux, bạn sẽ thấy hai bản phân phối chính: Slackware và Debian. Nhiều bản phân phối khác được phát triển từ chúng. Ví dụ, Ubuntu và Kali được phát triển từ Debian.
Những lợi ích của việc phát triển từ các bản phân phối khác? Có nhiều lợi ích của việc phát triển. Các bản phân phối phát triển có thể tận dụng sự ổn định, bảo mật và kho phần mềm lớn của bản phân phối gốc. Khi xây dựng trên một nền tảng hiện có, các nhà phát triển có thể tập trung hoàn toàn vào các tính năng chuyên biệt của bản phân phối mới. Người dùng các bản phân phối phát triển có thể hưởng lợi từ tài liệu, hỗ trợ cộng đồng và tài nguyên đã có sẵn cho bản phân phối gốc.
Một số bản phân phối Linux phổ biến là:
- Ubuntu: Một trong những bản phân phối Linux được sử dụng rộng rãi và phổ biến nhất. Nó thân thiện với người dùng và được khuyến nghị cho người mới bắt đầu. Tìm hiểu thêm về Ubuntu tại trang chủ của họ.
- Linux Mint: Dựa trên Ubuntu, Linux Mint cung cấp trải nghiệm thân thiện với người dùng tập trung vào hỗ trợ đa phương tiện. Tìm hiểu thêm về Linux Mint tại trang chủ của họ.
- Arch Linux: Phổ biến trong số những người dùng có kinh nghiệm, Arch là một bản phân phối nhẹ và linh hoạt dành cho những người dùng thích phương pháp tự làm. Tìm hiểu thêm về Arch Linux tại trang chủ của họ.
- Manjaro: Dựa trên Arch Linux, Manjaro cung cấp trải nghiệm thân thiện với người dùng với phần mềm được cài đặt sẵn và các công cụ quản lý hệ thống dễ dàng. Tìm hiểu thêm về Manjaro tại trang chủ của họ.
- Kali Linux: Kali Linux cung cấp một bộ công cụ bảo mật toàn diện và chủ yếu tập trung vào an ninh mạng và hacking. Tìm hiểu thêm về Kali Linux tại trang chủ của họ.
Cách cài đặt và truy cập Linux
Cách tốt nhất để học là áp dụng các khái niệm ngay khi bạn học. Trong phần này, chúng ta sẽ tìm hiểu cách cài đặt Linux trên máy tính của bạn để bạn có thể thực hành theo. Bạn cũng sẽ học cách truy cập Linux trên máy tính Windows.
Tôi khuyên bạn nên làm theo một trong các phương pháp được đề cập trong phần này để có quyền truy cập vào Linux để có thể làm theo.
Cài đặt Linux làm hệ điều hành chính
Cài đặt Linux làm hệ điều hành chính là cách hiệu quả nhất để sử dụng Linux, vì bạn có thể sử dụng toàn bộ sức mạnh của máy tính.
Trong phần này, bạn sẽ học cách cài đặt Ubuntu, một trong những bản phân phối Linux phổ biến nhất. Tôi đã bỏ qua các bản phân phối khác vì muốn mọi thứ đơn giản. Bạn luôn có thể khám phá các bản phân phối khác sau khi bạn đã quen với Ubuntu.
- Bước 1 – Tải xuống tệp ISO Ubuntu: Truy cập trang web chính thức của Ubuntu và tải xuống tệp ISO. Đảm bảo chọn bản phát hành ổn định được gắn nhãn "LTS". LTS là viết tắt của Hỗ trợ Dài hạn (Long Term Support), có nghĩa là bạn có thể nhận được các bản cập nhật bảo mật và bảo trì miễn phí trong một thời gian dài (thường là 5 năm).
- Bước 2 – Tạo USB có khả năng khởi động: Có một số phần mềm có thể tạo USB có khả năng khởi động. Tôi khuyên bạn nên sử dụng Rufus, vì nó khá dễ sử dụng. Bạn có thể tải xuống từ trang web của Rufus.
- Bước 3 – Khởi động từ USB: Sau khi USB có khả năng khởi động của bạn đã sẵn sàng, hãy cắm nó vào và khởi động từ USB. Menu khởi động phụ thuộc vào máy tính xách tay của bạn. Bạn có thể tìm kiếm trên Google menu khởi động cho mẫu máy tính xách tay của mình.
- Bước 4 – Làm theo hướng dẫn. Sau khi quá trình khởi động bắt đầu, chọn "try or install ubuntu".
Quá trình này sẽ mất một chút thời gian. Khi giao diện đồ họa (GUI) xuất hiện, bạn có thể chọn ngôn ngữ, bố cục bàn phím và tiếp tục. Nhập tên đăng nhập và tên của bạn. Hãy nhớ các thông tin đăng nhập này vì bạn sẽ cần chúng để đăng nhập vào hệ thống và truy cập đầy đủ các quyền. Đợi quá trình cài đặt hoàn tất.
- Bước 5 – Khởi động lại: Nhấp vào "restart now" và rút USB ra.
- Bước 6 – Đăng nhập: Đăng nhập bằng các thông tin bạn đã nhập trước đó.
Vậy là xong! Bây giờ bạn có thể cài đặt ứng dụng và tùy chỉnh màn hình của mình.
Để cài đặt nâng cao, bạn có thể tìm hiểu các chủ đề sau:
- Phân vùng đĩa.
- Thiết lập bộ nhớ swap để bật chế độ ngủ đông.
Truy cập Terminal
Một phần quan trọng của cẩm nang này là học về terminal, nơi bạn sẽ chạy tất cả các lệnh và chứng kiến điều kỳ diệu xảy ra. Bạn có thể tìm kiếm terminal bằng cách nhấn phím "Windows" và gõ "terminal". Bạn có thể ghim Terminal vào thanh dock nơi các ứng dụng khác được đặt để dễ dàng truy cập.
Phím tắt để mở terminal là Ctrl + Alt + T
.
Bạn cũng có thể mở terminal từ bên trong một thư mục. Nhấp chuột phải vào vị trí bạn đang ở và nhấp vào "Open in Terminal". Điều này sẽ mở terminal trong cùng đường dẫn.
Cách sử dụng Linux trên máy tính Windows
Đôi khi bạn có thể cần chạy cả Linux và Windows song song. May mắn thay, có một số cách để bạn có thể tận dụng cả hai hệ điều hành mà không cần phải có các máy tính khác nhau. Trong phần này, bạn sẽ khám phá một vài cách để sử dụng Linux trên máy tính Windows. Một số cách là dựa trên trình duyệt hoặc đám mây và không cần cài đặt hệ điều hành trước khi sử dụng.
Tùy chọn 1: "Dual-boot" Linux + Windows
Với dual boot, bạn có thể cài đặt Linux cùng với Windows trên máy tính của mình, cho phép bạn chọn hệ điều hành nào sẽ sử dụng khi khởi động. Điều này yêu cầu phân vùng ổ cứng và cài đặt Linux trên một phân vùng riêng biệt. Với cách tiếp cận này, bạn chỉ có thể sử dụng một hệ điều hành tại một thời điểm.
Tùy chọn 2: Sử dụng Windows Subsystem for Linux (WSL)
Windows Subsystem for Linux cung cấp một lớp tương thích cho phép bạn chạy các tệp thực thi nhị phân Linux nguyên bản trên Windows. Sử dụng WSL có một số lợi thế. Việc thiết lập WSL đơn giản và không tốn thời gian. Nó nhẹ hơn so với các máy ảo (VM) nơi bạn phải phân bổ tài nguyên từ máy chủ. Bạn không cần cài đặt bất kỳ tệp ISO hoặc ảnh đĩa ảo nào cho máy Linux, vốn thường là các tệp nặng. Bạn có thể sử dụng Windows và Linux song song.
Cách cài đặt WSL2
Đầu tiên, hãy bật tùy chọn Windows Subsystem for Linux trong cài đặt.
-
- Vào Start. Tìm kiếm "Turn Windows features on or off".
- Chọn tùy chọn "Windows Subsystem for Linux" nếu chưa được chọn.
-
- Tiếp theo, mở Command Prompt với quyền quản trị viên.
- Chạy lệnh dưới đây:
wsl --install
Đây là kết quả:
Lưu ý: Theo mặc định, Ubuntu sẽ được cài đặt.
- Sau khi cài đặt hoàn tất, bạn cần khởi động lại máy tính Windows của mình. Vì vậy, hãy khởi động lại máy tính Windows của bạn.
Sau khi khởi động lại, bạn có thể thấy một cửa sổ như thế này:
Sau khi cài đặt Ubuntu hoàn tất, bạn sẽ được nhắc nhập tên người dùng và mật khẩu của mình.
Và, thế là xong! Bạn đã sẵn sàng sử dụng Ubuntu. Khởi chạy Ubuntu bằng cách tìm kiếm từ menu bắt đầu.
Và đây là phiên bản Ubuntu của bạn đã được khởi chạy.
Tùy chọn 3: Sử dụng Máy ảo (VM)
Máy ảo (VM) là một mô phỏng phần mềm của một hệ thống máy tính vật lý. Nó cho phép bạn chạy nhiều hệ điều hành và ứng dụng trên một máy vật lý duy nhất cùng lúc. Bạn có thể sử dụng phần mềm ảo hóa như Oracle VirtualBox hoặc VMware để tạo một máy ảo chạy Linux trong môi trường Windows của bạn. Điều này cho phép bạn chạy Linux như một hệ điều hành khách bên cạnh Windows.
Phần mềm VM cung cấp các tùy chọn để phân bổ và quản lý tài nguyên phần cứng cho mỗi VM, bao gồm lõi CPU, bộ nhớ, dung lượng đĩa và băng thông mạng. Bạn có thể điều chỉnh các phân bổ này dựa trên yêu cầu của hệ điều hành khách và ứng dụng. Dưới đây là một số tùy chọn phổ biến có sẵn cho ảo hóa: Oracle Virtual Box, Multipass, VMware workstation player.
Tùy chọn 4: Sử dụng Giải pháp dựa trên trình duyệt
Các giải pháp dựa trên trình duyệt đặc biệt hữu ích để kiểm tra nhanh, học tập hoặc truy cập môi trường Linux từ các thiết bị chưa cài đặt Linux. Bạn có thể sử dụng các trình chỉnh sửa mã trực tuyến hoặc các terminal dựa trên web để truy cập Linux. Lưu ý rằng bạn thường không có đầy đủ quyền quản trị trong các trường hợp này.
Trình chỉnh sửa mã trực tuyến
Các trình chỉnh sửa mã trực tuyến cung cấp các trình chỉnh sửa với terminal Linux tích hợp. Mặc dù mục đích chính của chúng là lập trình, bạn cũng có thể sử dụng terminal Linux để thực thi các lệnh và thực hiện các tác vụ. Replit là một ví dụ về trình chỉnh sửa mã trực tuyến, nơi bạn có thể viết mã và truy cập shell Linux cùng lúc.
Terminal Linux dựa trên web:
Các terminal Linux trực tuyến cho phép bạn truy cập giao diện dòng lệnh Linux trực tiếp từ trình duyệt của mình. Các terminal này cung cấp giao diện dựa trên web cho shell Linux, cho phép bạn thực thi các lệnh và làm việc với các tiện ích Linux. Một ví dụ điển hình là JSLinux. Ảnh chụp màn hình dưới đây cho thấy một môi trường Linux sẵn sàng sử dụng:
Tùy chọn 5: Sử dụng Giải pháp dựa trên đám mây
Thay vì chạy Linux trực tiếp trên máy tính Windows của bạn, bạn có thể cân nhắc sử dụng môi trường Linux dựa trên đám mây hoặc máy chủ riêng ảo (VPS) để truy cập và làm việc với Linux từ xa. Các dịch vụ như Amazon EC2, Microsoft Azure hoặc DigitalOcean cung cấp các phiên bản Linux mà bạn có thể kết nối từ máy tính Windows của mình. Lưu ý rằng một số dịch vụ này cung cấp các gói miễn phí, nhưng chúng thường không miễn phí về lâu dài.
Phần 2: Giới thiệu về Bash Shell và các lệnh hệ thống
2.1. Bắt đầu với Bash shell
Giới thiệu về Bash shell
Dòng lệnh Linux được cung cấp bởi một chương trình gọi là shell. Qua nhiều năm, chương trình shell đã phát triển để phục vụ nhiều tùy chọn khác nhau. Các người dùng khác nhau có thể được cấu hình để sử dụng các shell khác nhau. Nhưng, hầu hết người dùng thích gắn bó với shell mặc định hiện tại. Shell mặc định cho nhiều bản phân phối Linux là GNU Bourne-Again Shell (bash
). Bash được kế thừa từ Bourne shell (sh
).
Để tìm shell hiện tại của bạn, hãy mở terminal và nhập lệnh sau:
echo $SHELL
Phân tích lệnh:
- Lệnh
echo
được sử dụng để in ra terminal. $SHELL
là một biến đặc biệt chứa tên của shell hiện tại.
Trong thiết lập của tôi, kết quả là /bin/bash
. Điều này có nghĩa là tôi đang sử dụng bash shell.
# output
echo $SHELL
/bin/bash
Bash rất mạnh mẽ vì nó có thể đơn giản hóa một số thao tác khó thực hiện hiệu quả bằng GUI (hoặc Giao diện người dùng đồ họa). Hãy nhớ rằng hầu hết các máy chủ không có GUI, và tốt nhất là nên học cách sử dụng sức mạnh của giao diện dòng lệnh (CLI).
Terminal và Shell
Các thuật ngữ "terminal" và "shell" thường được sử dụng thay thế cho nhau, nhưng chúng đề cập đến các phần khác nhau của giao diện dòng lệnh. Terminal là giao diện bạn sử dụng để tương tác với shell. Shell là trình thông dịch lệnh xử lý và thực thi các lệnh của bạn. Bạn sẽ tìm hiểu thêm về các shell trong Phần 6 của cẩm nang.
Prompt là gì?
Khi một shell được sử dụng tương tác, nó hiển thị một dấu $
khi đang chờ lệnh từ người dùng. Đây được gọi là shell prompt.
[username@host ~]$
Nếu shell đang chạy với quyền root
(bạn sẽ tìm hiểu thêm về người dùng root sau), prompt sẽ thay đổi thành #
.
[root@host ~]#
2.2. Cấu trúc lệnh
Một lệnh là một chương trình thực hiện một thao tác cụ thể. Khi bạn có quyền truy cập vào shell, bạn có thể nhập bất kỳ lệnh nào sau dấu $
và xem kết quả trên terminal. Nói chung, các lệnh Linux tuân theo cú pháp này:
command [options] [arguments]
Đây là phân tích cú pháp trên:
command
: Đây là tên của lệnh bạn muốn thực thi.ls
(liệt kê),cp
(copy), vàrm
(xóa) là các lệnh Linux phổ biến.[options]
: Các tùy chọn, hoặc cờ, thường được đặt trước bởi dấu gạch ngang (-) hoặc hai dấu gạch ngang (--), sửa đổi hành vi của lệnh. Chúng có thể thay đổi cách lệnh hoạt động. Ví dụ,ls -a
sử dụng tùy chọn-a
để hiển thị các tệp ẩn trong thư mục hiện tại.[arguments]
: Các đối số là đầu vào cho các lệnh yêu cầu một đối số. Chúng có thể là tên tệp, tên người dùng hoặc dữ liệu khác mà lệnh sẽ tác động. Ví dụ, trong lệnhcat access.log
,cat
là lệnh vàaccess.log
là đầu vào. Kết quả là, lệnhcat
hiển thị nội dung của tệpaccess.log
.
Các tùy chọn và đối số không bắt buộc đối với tất cả các lệnh. Một số lệnh có thể được chạy mà không có bất kỳ tùy chọn hoặc đối số nào, trong khi những lệnh khác có thể yêu cầu một hoặc cả hai để hoạt động chính xác. Bạn luôn có thể tham khảo hướng dẫn sử dụng của lệnh để kiểm tra các tùy chọn và đối số mà nó hỗ trợ.
Mẹo: Bạn có thể xem hướng dẫn sử dụng của lệnh bằng cách sử dụng lệnh man
.
Bạn có thể truy cập trang hướng dẫn sử dụng cho ls
bằng man ls
, và nó sẽ trông như thế này:
Các trang hướng dẫn sử dụng là một cách tuyệt vời và nhanh chóng để truy cập tài liệu. Tôi rất khuyến khích bạn đọc kỹ các trang hướng dẫn sử dụng cho các lệnh mà bạn sử dụng nhiều nhất.
2.3. Các lệnh Bash và phím tắt
Khi bạn đang ở trong terminal, bạn có thể tăng tốc các tác vụ của mình bằng cách sử dụng các phím tắt. Dưới đây là một số phím tắt terminal phổ biến nhất:
2.4. Xác định danh tính của bạn: Lệnh whoami
Bạn có thể lấy tên người dùng mà bạn đã đăng nhập bằng cách sử dụng lệnh whoami
. Lệnh này hữu ích khi bạn chuyển đổi giữa các người dùng khác nhau và muốn xác nhận người dùng hiện tại.
Ngay sau dấu $
, nhập whoami
và nhấn enter.
whoami
Đây là kết quả tôi nhận được.
zaira@zaira-ThinkPad:~$ whoami
zaira
Phần 3: Hiểu về hệ thống Linux của bạn
3.1. Khám phá hệ điều hành và thông số kỹ thuật
In thông tin hệ thống bằng lệnh uname
Bạn có thể nhận thông tin hệ thống chi tiết từ lệnh uname
. Khi bạn cung cấp tùy chọn -a
, nó sẽ in tất cả thông tin hệ thống.
uname -a
# output
Linux zaira 6.5.0-21-generic #21~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb 9 13:32:52 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
Trong kết quả trên:
Linux
: Cho biết hệ điều hành.zaira
: Đại diện cho tên máy chủ của máy.6.5.0-21-generic #21~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb 9 13:32:52 UTC 2
: Cung cấp thông tin về phiên bản kernel, ngày xây dựng và một số chi tiết bổ sung.x86_64 x86_64 x86_64
: Cho biết kiến trúc của hệ thống.GNU/Linux
: Đại diện cho loại hệ điều hành.
Tìm chi tiết kiến trúc CPU bằng lệnh lscpu
Lệnh lscpu
trong Linux được sử dụng để hiển thị thông tin về kiến trúc CPU. Khi bạn chạy lscpu
trong terminal, nó cung cấp các chi tiết như:
- Kiến trúc của CPU (ví dụ: x86_64)
- Chế độ hoạt động của CPU (ví dụ: 32-bit, 64-bit)
- Thứ tự byte (ví dụ: Little Endian)
- CPU(s) (số lượng CPU), và v.v.
- Hãy thử xem:
lscpu
# output
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Address sizes: 48 bits physical, 48 bits virtual
Byte Order: Little Endian
CPU(s): 12
On-line CPU(s) list: 0-11
Vendor ID: AuthenticAMD
Model name: AMD Ryzen 5 5500U with Radeon Graphics
Thread(s) per core: 2
Core(s) per socket: 6
Socket(s): 1
Stepping: 1
CPU max MHz: 4056.0000
CPU min MHz: 400.0000
Đó là rất nhiều thông tin, nhưng cũng rất hữu ích! Hãy nhớ rằng bạn luôn có thể lọc thông tin liên quan bằng cách sử dụng các cờ cụ thể. Xem hướng dẫn lệnh với man lscpu
.
Phần 4: Quản lý tệp từ dòng lệnh
4.1. Cấu trúc hệ thống tệp Linux
Tất cả các tệp trong Linux được lưu trữ trong một hệ thống tệp. Nó tuân theo cấu trúc giống như cây đảo ngược vì thư mục gốc nằm ở phần trên cùng. /
là thư mục gốc và là điểm khởi đầu của hệ thống tệp. Thư mục gốc chứa tất cả các thư mục và tệp khác trên hệ thống. Ký tự /
cũng đóng vai trò là dấu phân cách thư mục giữa các tên đường dẫn. Ví dụ, /home/alice
tạo thành một đường dẫn hoàn chỉnh.
Hình ảnh dưới đây cho thấy toàn bộ cấu trúc phân cấp hệ thống tệp. Mỗi thư mục phục vụ một mục đích cụ thể. Lưu ý rằng đây không phải là một danh sách đầy đủ và các bản phân phối khác nhau có thể có các cấu hình khác nhau.
Dưới đây là bảng cho thấy mục đích của từng thư mục:
Mẹo: Bạn có thể tìm hiểu thêm về hệ thống tệp bằng lệnh man hier
.
Bạn có thể kiểm tra hệ thống tệp của mình bằng lệnh tree -d -L 1
. Bạn có thể sửa đổi cờ -L
để thay đổi độ sâu của cây.
tree -d -L 1
# output
.
├── bin -> usr/bin
├── boot
├── cdrom
├── data
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib32 -> usr/lib32
├── lib64 -> usr/lib64
├── libx32 -> usr/libx32
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── snap
├── srv
├── sys
├── tmp
├── usr
└── var
25 directories
Danh sách này không đầy đủ và các bản phân phối và hệ thống khác nhau có thể được cấu hình khác nhau.
4.2. Điều hướng hệ thống tệp Linux
Đường dẫn tuyệt đối và đường dẫn tương đối
Đường dẫn tuyệt đối là đường dẫn đầy đủ từ thư mục gốc đến tệp hoặc thư mục. Nó luôn bắt đầu bằng dấu /
. Ví dụ: /home/john/documents
.
Mặt khác, đường dẫn tương đối là đường dẫn từ thư mục hiện tại đến tệp hoặc thư mục đích. Nó không bắt đầu bằng dấu /
. Ví dụ: documents/work/project
.
Xác định vị trí thư mục hiện tại của bạn bằng lệnh pwd
Thật dễ dàng bị lạc trong hệ thống tệp Linux, đặc biệt nếu bạn là người mới làm quen với dòng lệnh. Bạn có thể xác định vị trí thư mục hiện tại của mình bằng lệnh pwd
. Dưới đây là một ví dụ:
pwd
# output
/home/zaira/scripts/python/free-mem.py
Thay đổi thư mục bằng lệnh cd
Lệnh để thay đổi thư mục là cd
và nó là viết tắt của "change directory" (thay đổi thư mục). Bạn có thể sử dụng lệnh cd
để điều hướng đến một thư mục khác. Bạn có thể sử dụng đường dẫn tương đối hoặc đường dẫn tuyệt đối. Ví dụ, nếu bạn muốn điều hướng cấu trúc tệp bên dưới (theo các đường màu đỏ):
và bạn đang đứng ở "home", lệnh sẽ như thế này:
cd home/bob/documents/work/project
Một số phím tắt cd
thường dùng khác là:
4.3. Quản lý tệp và thư mục
Khi làm việc với tệp và thư mục, bạn có thể muốn sao chép, di chuyển, xóa và tạo tệp và thư mục mới. Dưới đây là một số lệnh có thể giúp bạn thực hiện điều đó.
Mẹo: Bạn có thể phân biệt giữa tệp và thư mục bằng cách nhìn vào ký tự đầu tiên trong kết quả của ls -l
. Dấu '-'
đại diện cho một tệp và dấu 'd'
đại diện cho một thư mục.
Tạo thư mục mới bằng lệnh mkdir
Bạn có thể tạo một thư mục trống bằng lệnh mkdir
.
# tạo một thư mục trống có tên "foo" trong thư mục hiện tại
mkdir foo
Bạn cũng có thể tạo thư mục đệ quy bằng tùy chọn -p
.
mkdir -p tools/index/helper-scripts
# output của tree
.
└── tools
└── index
└── helper-scripts
3 directories, 0 files
Tạo tệp mới bằng lệnh touch
Lệnh touch
tạo một tệp trống. Bạn có thể sử dụng nó như sau:
# tạo tệp trống "file.txt" trong thư mục hiện tại
touch file.txt
Các tên tệp có thể được nối chuỗi nếu bạn muốn tạo nhiều tệp trong một lệnh duy nhất.
# tạo các tệp trống "file1.txt", "file2.txt", và "file3.txt" trong thư mục hiện tại
touch file1.txt file2.txt file3.txt
Xóa tệp và thư mục bằng lệnh rm
và rmdir
Bạn có thể sử dụng lệnh rm
để xóa cả tệp và thư mục không trống.
Lưu ý rằng bạn nên sử dụng cờ -f
một cách thận trọng vì bạn sẽ không được hỏi trước khi xóa tệp. Ngoài ra, hãy cẩn thận khi chạy lệnh rm
trong thư mục root
vì nó có thể dẫn đến việc xóa các tệp hệ thống quan trọng.
Sao chép tệp bằng lệnh cp
Để sao chép tệp trong Linux, hãy sử dụng lệnh cp
.
- Cú pháp để sao chép tệp:
cp source_file destination_of_file
Lệnh này sao chép một tệp có tên file1.txt
đến một vị trí tệp mới /home/adam/logs
.
cp file1.txt /home/adam/logs
Lệnh cp
cũng tạo một bản sao của một tệp với tên được cung cấp. Lệnh này sao chép một tệp có tên file1.txt
sang một tệp khác có tên file2.txt
trong cùng thư mục.
cp file1.txt file2.txt
Di chuyển và đổi tên tệp và thư mục bằng lệnh mv
Lệnh mv
được sử dụng để di chuyển tệp và thư mục từ thư mục này sang thư mục khác.
Cú pháp để di chuyển tệp: mv source_file destination_directory
Ví dụ: Di chuyển một tệp có tên file1.txt
đến một thư mục có tên backup
:
mv file1.txt backup/
Để di chuyển một thư mục và nội dung của nó:
mv dir1/ backup/
Đổi tên tệp và thư mục trong Linux cũng được thực hiện bằng lệnh mv
.
Cú pháp để đổi tên tệp: mv old_name new_name
Ví dụ: Đổi tên một tệp từ file1.txt
thành file2.txt
:
mv file1.txt file2.txt
Đổi tên một thư mục từ dir1
thành dir2
:
mv dir1 dir2
4.4. Xác định vị trí tệp và thư mục bằng lệnh find
Lệnh find
cho phép bạn tìm kiếm hiệu quả các tệp, thư mục và thiết bị ký tự và khối.
Dưới đây là cú pháp cơ bản của lệnh find
:
find /path/ -type f -name file-to-search
Trong đó,
/path
là đường dẫn nơi tệp dự kiến sẽ được tìm thấy. Đây là điểm bắt đầu để tìm kiếm tệp. Đường dẫn cũng có thể là/
hoặc.
đại diện cho thư mục gốc và thư mục hiện tại tương ứng.-type
đại diện cho các mô tả tệp. Chúng có thể là bất kỳ loại nào sau đây:f
– Tệp thông thường như tệp văn bản, hình ảnh và tệp ẩn.d
– Thư mục. Đây là các thư mục đang được xem xét.l
– Liên kết tượng trưng. Các liên kết tượng trưng trỏ đến các tệp và tương tự như các phím tắt.c
– Thiết bị ký tự. Các tệp được sử dụng để truy cập các thiết bị ký tự được gọi là tệp thiết bị ký tự. Trình điều khiển giao tiếp với các thiết bị ký tự bằng cách gửi và nhận các ký tự (byte, octet) đơn lẻ. Ví dụ bao gồm bàn phím, card âm thanh và chuột.b
– Thiết bị khối. Các tệp được sử dụng để truy cập các thiết bị khối được gọi là tệp thiết bị khối. Trình điều khiển giao tiếp với các thiết bị khối bằng cách gửi và nhận toàn bộ khối dữ liệu. Ví dụ bao gồm USB và CD-ROM.
-name
là tên của loại tệp bạn muốn tìm kiếm.
Cách tìm kiếm tệp theo tên hoặc phần mở rộng
Giả sử chúng ta cần tìm các tệp có chứa "style" trong tên của chúng. Chúng ta sẽ sử dụng lệnh này:
find . -type f -name "style*"
#output
./style.css
./styles.css
Bây giờ, giả sử chúng ta muốn tìm các tệp có phần mở rộng cụ thể như .html
. Chúng ta sẽ sửa đổi lệnh như sau:
find . -type f -name "*.html"
# output
./services.html
./blob.html
./index.html
Cách tìm kiếm các tệp ẩn
Dấu chấm ở đầu tên tệp đại diện cho các tệp ẩn. Chúng thường bị ẩn nhưng có thể được xem bằng ls -a
trong thư mục hiện tại. Chúng ta có thể sửa đổi lệnh find
như hiển thị bên dưới để tìm kiếm các tệp ẩn:
find . -type f -name ".*"
Liệt kê và tìm các tệp ẩn
ls -la
# folder contents
total 5
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:17 .
drwxr-x--- 61 zaira zaira 4096 Mar 26 14:12 ..
-rw-rw-r-- 1 zaira zaira 0 Mar 26 14:17 .bash_history
-rw-rw-r-- 1 zaira zaira 0 Mar 26 14:17 .bash_logout
-rw-rw-r-- 1 zaira zaira 0 Mar 26 14:17 .bashrc
find . -type f -name ".*"
# find output
./.bash_logout
./.bashrc
./.bash_history
Ở trên, bạn có thể thấy danh sách các tệp ẩn trong thư mục chính của tôi.
Cách tìm kiếm tệp nhật ký và tệp cấu hình
Các tệp nhật ký thường có phần mở rộng .log
, và chúng ta có thể tìm chúng như sau:
find . -type f -name "*.log"
Tương tự, chúng ta có thể tìm kiếm các tệp cấu hình như sau:
find . -type f -name "*.conf"
Cách tìm kiếm các tệp khác theo loại
Chúng ta có thể tìm kiếm các tệp khối ký tự bằng cách cung cấp c
cho -type
:
find / -type c
Tương tự, chúng ta có thể tìm các tệp khối thiết bị bằng cách sử dụng b
:
find / -type b
Cách tìm kiếm thư mục
Trong ví dụ dưới đây, chúng ta đang tìm kiếm các thư mục bằng cách sử dụng cờ -type d
.
ls -l
# list folder contents
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:22 hosts
-rw-rw-r-- 1 zaira zaira 0 Mar 26 14:23 hosts.txt
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:22 images
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:23 style
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:22 webp
find . -type d
# find directory output
.
./webp
./images
./style
./hosts
Cách tìm kiếm tệp theo kích thước
Một cách sử dụng vô cùng hữu ích của lệnh find
là liệt kê các tệp dựa trên một kích thước cụ thể.
find / -size +250M
Ở đây, chúng ta đang liệt kê các tệp có kích thước vượt quá 250MB
. Các đơn vị khác bao gồm:
G
: Gigabyte.M
: Megabyte.K
: Kilobyte.c
: byte.
Chỉ cần thay thế bằng đơn vị liên quan.
find <directory> -type f -size +N<Unit Type>
Cách tìm kiếm tệp theo thời gian sửa đổi
Bằng cách sử dụng cờ -mtime
, bạn có thể lọc các tệp và thư mục dựa trên thời gian sửa đổi.
find /path -name "*.txt" -mtime -10
Ví dụ,
- -mtime +10 có nghĩa là bạn đang tìm kiếm một tệp được sửa đổi 10 ngày trước.
- -mtime -10 có nghĩa là ít hơn 10 ngày.
- -mtime 10 Nếu bạn bỏ qua + hoặc – nó có nghĩa là chính xác 10 ngày.
4.5. Các lệnh cơ bản để xem tệp
Nối và hiển thị tệp bằng lệnh cat
Lệnh cat
trong Linux được sử dụng để hiển thị nội dung của một tệp. Nó cũng có thể được sử dụng để nối các tệp và tạo tệp mới. Dưới đây là cú pháp cơ bản của lệnh cat
:
cat [options] [file]
Cách đơn giản nhất để sử dụng cat
là không có bất kỳ tùy chọn hoặc đối số nào. Điều này sẽ hiển thị nội dung của tệp trên terminal. Ví dụ, nếu bạn muốn xem nội dung của một tệp có tên file.txt
, bạn có thể sử dụng lệnh sau:
cat file.txt
Điều này sẽ hiển thị tất cả nội dung của tệp trên terminal cùng một lúc.
Xem tệp văn bản tương tác bằng less
và more
Trong khi cat
hiển thị toàn bộ tệp cùng một lúc, less
và more
cho phép bạn xem nội dung của tệp một cách tương tác. Điều này hữu ích khi bạn muốn cuộn qua một tệp lớn hoặc tìm kiếm nội dung cụ thể.
Cú pháp của lệnh less
là:
less [options] [file]
Lệnh more
tương tự như less
nhưng có ít tính năng hơn. Nó được sử dụng để hiển thị nội dung của một tệp một màn hình tại một thời điểm. Cú pháp của lệnh more
là:
more [options] [file]
Đối với cả hai lệnh, bạn có thể sử dụng phím spacebar
để cuộn xuống một trang, phím Enter
để cuộn xuống một dòng và phím q
để thoát khỏi trình xem. Để di chuyển ngược lại, bạn có thể sử dụng phím b
, và để di chuyển về phía trước, bạn có thể sử dụng phím f
.
Hiển thị phần cuối của tệp bằng tail
Đôi khi bạn có thể cần xem vài dòng cuối cùng của một tệp thay vì toàn bộ tệp. Lệnh tail
trong Linux được sử dụng để hiển thị phần cuối của một tệp. Ví dụ, tail file.txt
sẽ hiển thị 10 dòng cuối cùng của tệp file.txt
theo mặc định.
Nếu bạn muốn hiển thị một số lượng dòng khác, bạn có thể sử dụng tùy chọn -n
theo sau là số lượng dòng bạn muốn hiển thị.
# Hiển thị 50 dòng cuối cùng của tệp file.txt
tail -n 50 file.txt
Mẹo: Một cách sử dụng khác của tail
là tùy chọn theo dõi (-f
). Tùy chọn này cho phép bạn xem nội dung của một tệp khi chúng đang được ghi. Đây là một tiện ích hữu ích để xem và giám sát các tệp nhật ký theo thời gian thực.
Hiển thị phần đầu của tệp bằng head
Cũng giống như tail
hiển thị phần cuối của một tệp, bạn có thể sử dụng lệnh head
trong Linux để hiển thị phần đầu của một tệp. Ví dụ, head file.txt
sẽ hiển thị 10 dòng đầu tiên của tệp file.txt
theo mặc định.
Để thay đổi số lượng dòng được hiển thị, bạn có thể sử dụng tùy chọn -n
theo sau là số lượng dòng bạn muốn hiển thị.
Đếm từ, dòng và ký tự bằng wc
Bạn có thể đếm từ, dòng và ký tự trong một tệp bằng lệnh wc
. Ví dụ, chạy wc syslog.log
đã cho tôi kết quả sau:
1669 9623 64367 syslog.log
Trong kết quả trên,
1669
đại diện cho số dòng trong tệpsyslog.log
.9623
đại diện cho số từ trong tệpsyslog.log
.64367
đại diện cho số ký tự trong tệpsyslog.log
.
Vì vậy, lệnh wc syslog.log
đã đếm 1669
dòng, 9623
từ và 64367
ký tự trong tệp syslog.log
.
So sánh tệp từng dòng bằng diff
So sánh và tìm sự khác biệt giữa hai tệp là một tác vụ phổ biến trong Linux. Bạn có thể so sánh hai tệp ngay trong dòng lệnh bằng lệnh diff
. Cú pháp cơ bản của lệnh diff
là:
diff [options] file1 file2
Dưới đây là hai tệp, hello.py
và also-hello.py
, mà chúng ta sẽ so sánh bằng lệnh diff
:
# nội dung của hello.py
def greet(name):
return f"Hello, {name}!"
user = input("Enter your name: ")
print(greet(user))
# nội dung của also-hello.py
more also-hello.py
def greet(name):
return fHello, {name}!
user = input(Enter your name: )
print(greet(user))
print("Nice to meet you")
- Kiểm tra xem các tệp có giống nhau hay không
diff -q hello.py also-hello.py
# Output
Files hello.py and also-hello.py differ
- Xem các tệp khác nhau như thế nào. Để làm điều đó, bạn có thể sử dụng cờ
-u
để xem một kết quả thống nhất:
diff -u hello.py also-hello.py
--- hello.py 2024-05-24 18:31:29.891690478 +0500
+++ also-hello.py 2024-05-24 18:32:17.207921795 +0500
@@ -3,4 +3,5 @@
user = input(Enter your name: )
print(greet(user))
+print("Nice to meet you")
Trong kết quả trên:
--- hello.py 2024-05-24 18:31:29.891690478 +0500
cho biết tệp đang được so sánh và dấu thời gian của nó.+++ also-hello.py 2024-05-24 18:32:17.207921795 +0500
cho biết tệp khác đang được so sánh và dấu thời gian của nó.@@ -3,4 +3,5 @@
hiển thị số dòng nơi các thay đổi xảy ra. Trong trường hợp này, nó cho biết rằng các dòng 3 đến 4 trong tệp gốc đã thay đổi thành các dòng 3 đến 5 trong tệp đã sửa đổi.user = input(Enter your name: )
là một dòng từ tệp gốc.print(greet(user))
là một dòng khác từ tệp gốc.+print("Nice to meet you")
là dòng bổ sung trong tệp đã sửa đổi.
- Để xem sự khác biệt ở định dạng song song, bạn có thể sử dụng cờ
-y
:
diff -y hello.py also-hello.py
# Output
def greet(name): def greet(name):
return fHello, {name}! return fHello, {name}!
user = input(Enter your name: ) user = input(Enter your name: )
print(greet(user)) print(greet(user))
> print("Nice to meet you")
Trong kết quả:
- Các dòng giống nhau trong cả hai tệp được hiển thị cạnh nhau.
- Các dòng khác nhau được hiển thị với ký hiệu
>
cho biết dòng đó chỉ có trong một trong các tệp.
Phần 5: Những điều cần thiết khi chỉnh sửa văn bản trong Linux
Kỹ năng chỉnh sửa văn bản bằng dòng lệnh là một trong những kỹ năng quan trọng nhất trong Linux. Trong phần này, bạn sẽ học cách sử dụng hai trình chỉnh sửa văn bản phổ biến trong Linux: Vim và Nano.
Tôi khuyên bạn nên thành thạo một trình chỉnh sửa văn bản mà bạn lựa chọn và gắn bó với nó. Điều đó sẽ giúp bạn tiết kiệm thời gian và làm việc hiệu quả hơn. Vim và Nano là những lựa chọn an toàn vì chúng có mặt trên hầu hết các bản phân phối Linux.
5.1. Thành thạo Vim: Hướng dẫn đầy đủ
Giới thiệu về Vim
Vim là một công cụ chỉnh sửa văn bản phổ biến cho dòng lệnh. Vim đi kèm với những ưu điểm của nó: mạnh mẽ, có thể tùy chỉnh và nhanh chóng. Dưới đây là một số lý do tại sao bạn nên cân nhắc học Vim:
- Hầu hết các máy chủ được truy cập thông qua CLI, vì vậy trong quản trị hệ thống, bạn không nhất thiết phải có sự tiện lợi của GUI. Nhưng Vim sẽ luôn ở đó hỗ trợ bạn.
- Vim sử dụng cách tiếp cận lấy bàn phím làm trung tâm, vì nó được thiết kế để sử dụng mà không cần chuột, điều này có thể tăng tốc đáng kể các tác vụ chỉnh sửa khi bạn đã học các phím tắt. Điều này cũng làm cho nó nhanh hơn các công cụ GUI.
- Một số tiện ích Linux, ví dụ như chỉnh sửa cron jobs, hoạt động ở định dạng chỉnh sửa tương tự như Vim.
- Vim phù hợp cho tất cả mọi người – người mới bắt đầu và người dùng nâng cao. Vim hỗ trợ tìm kiếm chuỗi phức tạp, đánh dấu tìm kiếm, và nhiều hơn nữa. Thông qua các plugin, Vim cung cấp các khả năng mở rộng cho các nhà phát triển và quản trị viên hệ thống bao gồm hoàn thành mã, tô sáng cú pháp, quản lý tệp, kiểm soát phiên bản, v.v.
Vim có hai biến thể: Vim (vim
) và Vim tiny (vi
). Vim tiny là một phiên bản nhỏ hơn của Vim thiếu một số tính năng của Vim.
Cách bắt đầu sử dụng vim
Bắt đầu sử dụng Vim với lệnh này:
vim your-file.txt
your-file.txt
có thể là một tệp mới hoặc một tệp hiện có mà bạn muốn chỉnh sửa.
Điều hướng Vim: Thành thạo các chế độ di chuyển và lệnh
Trong những ngày đầu của CLI, bàn phím không có phím mũi tên. Do đó, việc điều hướng được thực hiện bằng cách sử dụng tập hợp các phím có sẵn, hjkl
là một trong số đó. Vì tập trung vào bàn phím, việc sử dụng các phím hjkl
có thể tăng tốc đáng kể các tác vụ chỉnh sửa văn bản.
Lưu ý: Mặc dù các phím mũi tên sẽ hoạt động hoàn toàn tốt, bạn vẫn có thể thử nghiệm với các phím hjkl
để điều hướng. Một số người thấy cách điều hướng này hiệu quả.
Mẹo: Để nhớ chuỗi hjkl
, hãy sử dụng câu này: hang back, jump down, kick up, leap forward.
Ba chế độ Vim
Bạn cần biết 3 chế độ hoạt động của Vim và cách chuyển đổi giữa chúng. Các lần nhấn phím hoạt động khác nhau trong mỗi chế độ lệnh. Ba chế độ như sau:
- Chế độ lệnh (Command mode).
- Chế độ chỉnh sửa (Edit mode).
- Chế độ trực quan (Visual mode).
Chế độ lệnh. Khi bạn khởi động Vim, bạn mặc định ở chế độ lệnh. Chế độ này cho phép bạn truy cập các chế độ khác. Để chuyển sang các chế độ khác, bạn cần phải ở chế độ lệnh trước tiên.
Chế độ chỉnh sửa
Chế độ này cho phép bạn thực hiện các thay đổi đối với tệp. Để vào chế độ chỉnh sửa, nhấn I
khi đang ở chế độ lệnh. Lưu ý chuyển đổi '-- INSERT'
ở cuối màn hình.
Chế độ trực quan
Chế độ này cho phép bạn làm việc trên một ký tự đơn, một khối văn bản hoặc các dòng văn bản. Hãy chia nhỏ nó thành các bước đơn giản. Hãy nhớ, sử dụng các kết hợp dưới đây khi ở chế độ lệnh.
Shift + V
→ Chọn nhiều dòng.Ctrl + V
→ Chế độ khốiV
→ Chế độ ký tự
Chế độ trực quan rất hữu ích khi bạn cần sao chép và dán hoặc chỉnh sửa hàng loạt các dòng.
Chế độ lệnh mở rộng.
Chế độ lệnh mở rộng cho phép bạn thực hiện các thao tác nâng cao như tìm kiếm, đặt số dòng và tô sáng văn bản. Chúng ta sẽ tìm hiểu chế độ mở rộng trong phần tiếp theo. Làm thế nào để duy trì theo dõi? Nếu bạn quên chế độ hiện tại của mình, chỉ cần nhấn ESC
hai lần và bạn sẽ trở lại Chế độ lệnh.
Chỉnh sửa hiệu quả trong Vim: Sao chép/dán và tìm kiếm
1. Cách sao chép và dán trong Vim
Sao chép-dán được gọi là 'yank' và 'put' trong thuật ngữ Linux. Để sao chép-dán, hãy làm theo các bước sau:
- Chọn văn bản ở chế độ trực quan.
- Nhấn
'y'
để sao chép/yank. - Di chuyển con trỏ của bạn đến vị trí cần thiết và nhấn
'p'
.
2. Cách tìm kiếm văn bản trong Vim
Bất kỳ chuỗi nào cũng có thể được tìm kiếm bằng Vim bằng cách sử dụng /
trong chế độ lệnh. Để tìm kiếm, sử dụng /chuỗi-cần-khớp
.
Trong chế độ lệnh, gõ :set hls
và nhấn enter
. Tìm kiếm bằng /chuỗi-cần-khớp
. Điều này sẽ đánh dấu các tìm kiếm.
Hãy tìm kiếm một vài chuỗi:
3. Cách thoát Vim
Đầu tiên, chuyển sang chế độ lệnh (bằng cách nhấn escape hai lần) và sau đó sử dụng các cờ này:
- Thoát mà không lưu →
:q!
- Thoát và lưu →
:wq!
Phím tắt trong Vim: Giúp chỉnh sửa nhanh hơn
Lưu ý: Tất cả các phím tắt này chỉ hoạt động ở chế độ lệnh.
- Điều hướng cơ bản
h
: Di chuyển sang tráij
: Di chuyển xuốngk
: Di chuyển lênl
: Di chuyển sang phải0
: Di chuyển đến đầu dòng$
: Di chuyển đến cuối dònggg
: Di chuyển đến đầu tệpG
: Di chuyển đến cuối tệpCtrl+d
: Di chuyển xuống nửa trangCtrl+u
: Di chuyển lên nửa trang
- Chỉnh sửa
i
: Vào chế độ chèn trước con trỏI
: Vào chế độ chèn ở đầu dònga
: Vào chế độ chèn sau con trỏA
: Vào chế độ chèn ở cuối dòngo
: Mở một dòng mới bên dưới dòng hiện tại và vào chế độ chènO
: Mở một dòng mới bên trên dòng hiện tại và vào chế độ chènx
: Xóa ký tự dưới con trỏdd
: Xóa dòng hiện tạiyy
: Sao chép dòng hiện tại (sử dụng trong chế độ trực quan)p
: Dán bên dưới con trỏP
: Dán bên trên con trỏ
- Tìm kiếm và thay thế
/
: Tìm kiếm một mẫu sẽ đưa bạn đến lần xuất hiện tiếp theo của nó?
: Tìm kiếm một mẫu sẽ đưa bạn đến lần xuất hiện trước đó của nón
: Lặp lại tìm kiếm cuối cùng theo cùng một hướngN
: Lặp lại tìm kiếm cuối cùng theo hướng ngược lại:%s/old/new/g
: Thay thế tất cả các lần xuất hiện củaold
bằngnew
trong tệp
- Thoát
:w
: Lưu tệp nhưng không thoát:q
: Thoát Vim (thất bại nếu có các thay đổi chưa lưu):wq
hoặc:x
: Lưu và thoát:q!
: Thoát mà không lưu
- Nhiều cửa sổ
:split
hoặc:sp
: Chia cửa sổ theo chiều ngang:vsplit
hoặc:vsp
: Chia cửa sổ theo chiều dọcCtrl+w
theo sau làh/j/k/l
: Điều hướng giữa các cửa sổ đã chia
5.2. Thành thạo Nano
Bắt đầu với Nano: Trình chỉnh sửa văn bản thân thiện với người dùng
Nano là một trình chỉnh sửa văn bản thân thiện với người dùng, dễ sử dụng và hoàn hảo cho người mới bắt đầu. Nó được cài đặt sẵn trên hầu hết các bản phân phối Linux. Để tạo một tệp mới bằng Nano, hãy sử dụng lệnh sau:
nano
Để bắt đầu chỉnh sửa một tệp hiện có bằng Nano, hãy sử dụng lệnh sau:
nano filename
Danh sách các phím tắt trong Nano
Hãy cùng nghiên cứu các phím tắt quan trọng nhất trong Nano. Bạn sẽ sử dụng các phím tắt để thực hiện các thao tác khác nhau như lưu, thoát, sao chép, dán, và nhiều hơn nữa.
Ghi vào tệp và lưu
Khi bạn mở Nano bằng lệnh nano
, bạn có thể bắt đầu viết văn bản. Để lưu tệp, nhấn Ctrl+O
. Bạn sẽ được nhắc nhập tên tệp. Nhấn Enter
để lưu tệp.
Thoát Nano
Bạn có thể thoát Nano bằng cách nhấn Ctrl+X
. Nếu bạn có các thay đổi chưa lưu, Nano sẽ nhắc bạn lưu các thay đổi trước khi thoát.
Sao chép và dán
Để chọn một vùng, sử dụng ALT+A
. Một dấu hiệu sẽ hiển thị. Sử dụng các mũi tên để chọn văn bản. Sau khi chọn, thoát dấu hiệu bằng ALT+^
. Để sao chép văn bản đã chọn, nhấn Ctrl+K
. Để dán văn bản đã sao chép, nhấn Ctrl+U
.
Cắt và dán
Chọn vùng bằng ALT+A
. Sau khi chọn, cắt văn bản bằng Ctrl+K
. Để dán văn bản đã cắt, nhấn Ctrl+U
.
Điều hướng
Sử dụng Alt \
để di chuyển đến đầu tệp. Sử dụng Alt /
để di chuyển đến cuối tệp.
Xem số dòng
Khi bạn mở một tệp với nano -l filename
, bạn có thể xem số dòng ở phía bên trái của tệp.
Tìm kiếm
Bạn có thể tìm kiếm một số dòng cụ thể bằng ALt + G
. Nhập số dòng vào prompt và nhấn Enter
. Bạn cũng có thể bắt đầu tìm kiếm một chuỗi bằng CTRL + W
và nhấn Enter. Nếu bạn muốn tìm kiếm ngược lại, bạn có thể nhấn Alt+W
sau khi bắt đầu tìm kiếm bằng Ctrl+W
.
Tóm tắt các phím tắt trong Nano
- Tổng quan
Ctrl+X
: Thoát Nano (nhắc lưu nếu có thay đổi)Ctrl+O
: Lưu tệpCtrl+R
: Đọc một tệp vào tệp hiện tạiCtrl+G
: Hiển thị văn bản trợ giúp
- Chỉnh sửa
Ctrl+K
: Cắt dòng hiện tại và lưu vào bộ đệm cắtCtrl+U
: Dán nội dung của bộ đệm cắt vào dòng hiện tạiAlt+6
: Sao chép dòng hiện tại và lưu vào bộ đệm cắtCtrl+J
: Căn chỉnh đoạn văn hiện tại
- Điều hướng
Ctrl+A
: Di chuyển đến đầu dòngCtrl+E
: Di chuyển đến cuối dòngCtrl+C
: Hiển thị số dòng hiện tại và thông tin tệpCtrl+_
(Ctrl+Shift+-
): Đi đến một dòng (và tùy chọn, cột) cụ thểCtrl+Y
: Cuộn lên một trangCtrl+V
: Cuộn xuống một trang
- Tìm kiếm và thay thế
Ctrl+W
: Tìm kiếm một chuỗi (sau đóEnter
để tìm kiếm lại)Alt+W
: Lặp lại tìm kiếm cuối cùng nhưng theo hướng ngược lạiCtrl+\
: Tìm kiếm và thay thế
- Khác
Ctrl+T
: Kích hoạt kiểm tra chính tả, nếu cóCtrl+D
: Xóa ký tự dưới con trỏ (không cắt nó)Ctrl+L
: Làm mới (vẽ lại) màn hình hiện tạiAlt+U
: Hoàn tác thao tác cuối cùngAlt+E
: Làm lại thao tác đã hoàn tác cuối cùng
Phần 6: Lập trình Bash Script
6.1. Định nghĩa lập trình Bash script
Một bash script là một tệp chứa một chuỗi các lệnh được chương trình bash thực thi từng dòng một. Nó cho phép bạn thực hiện một loạt các hành động, chẳng hạn như điều hướng đến một thư mục cụ thể, tạo một thư mục và khởi chạy một tiến trình bằng dòng lệnh. Bằng cách lưu các lệnh trong một script, bạn có thể lặp lại cùng một chuỗi các bước nhiều lần và thực thi chúng bằng cách chạy script.
6.2. Ưu điểm của lập trình Bash script
Bash scripting là một công cụ mạnh mẽ và linh hoạt để tự động hóa các tác vụ quản trị hệ thống, quản lý tài nguyên hệ thống và thực hiện các tác vụ định kỳ khác trong các hệ thống Unix/Linux.
Một số ưu điểm của shell scripting là:
- Tự động hóa: Shell script cho phép bạn tự động hóa các tác vụ và quy trình lặp đi lặp lại, tiết kiệm thời gian và giảm nguy cơ lỗi có thể xảy ra khi thực hiện thủ công.
- Tính di động: Shell script có thể chạy trên nhiều nền tảng và hệ điều hành khác nhau, bao gồm Unix, Linux, macOS và thậm chí cả Windows thông qua việc sử dụng trình giả lập hoặc máy ảo.
- Tính linh hoạt: Shell script có khả năng tùy chỉnh cao và có thể dễ dàng sửa đổi để phù hợp với các yêu cầu cụ thể. Chúng cũng có thể được kết hợp với các ngôn ngữ lập trình hoặc tiện ích khác để tạo ra các script mạnh mẽ hơn.
- Khả năng truy cập: Shell script dễ viết và không yêu cầu bất kỳ công cụ hoặc phần mềm đặc biệt nào. Chúng có thể được chỉnh sửa bằng bất kỳ trình chỉnh sửa văn bản nào, và hầu hết các hệ điều hành đều có trình thông dịch shell tích hợp.
- Tích hợp: Shell script có thể được tích hợp với các công cụ và ứng dụng khác, chẳng hạn như cơ sở dữ liệu, máy chủ web và dịch vụ đám mây, cho phép tự động hóa phức tạp hơn và các tác vụ quản lý hệ thống.
- Gỡ lỗi: Shell script dễ gỡ lỗi, và hầu hết các shell đều có các công cụ gỡ lỗi và báo cáo lỗi tích hợp có thể giúp xác định và khắc phục sự cố nhanh chóng.
6.3. Tổng quan về Bash Shell và giao diện dòng lệnh
Các thuật ngữ "shell" và "bash" thường được sử dụng thay thế cho nhau. Nhưng có một sự khác biệt tinh tế giữa hai thuật ngữ này. Thuật ngữ "shell" đề cập đến một chương trình cung cấp giao diện dòng lệnh để tương tác với một hệ điều hành. Bash (Bourne-Again SHell) là một trong những shell Unix/Linux được sử dụng phổ biến nhất và là shell mặc định trong nhiều bản phân phối Linux.
Cho đến nay, các lệnh mà bạn đã nhập về cơ bản đang được nhập vào một "shell". Mặc dù Bash là một loại shell, nhưng cũng có các shell khác có sẵn, chẳng hạn như Korn shell (ksh), C shell (csh) và Z shell (zsh). Mỗi shell có cú pháp và bộ tính năng riêng, nhưng tất cả đều có chung mục đích là cung cấp giao diện dòng lệnh để tương tác với hệ điều hành.
Bạn có thể xác định loại shell của mình bằng lệnh ps
:
ps
# output:
PID TTY TIME CMD
20506 pts/0 00:00:00 bash <--- loại shell
20931 pts/0 00:00:00 ps
Tóm lại, trong khi "shell" là một thuật ngữ rộng đề cập đến bất kỳ chương trình nào cung cấp giao diện dòng lệnh, "Bash" là một loại shell cụ thể được sử dụng rộng rãi trong các hệ thống Unix/Linux. Lưu ý: Trong phần này, chúng ta sẽ sử dụng shell "bash".
6.4. Cách tạo và thực thi Bash script
Quy ước đặt tên script
Theo quy ước đặt tên, các bash script kết thúc bằng .sh
. Tuy nhiên, các bash script có thể chạy hoàn hảo mà không có phần mở rộng sh
.
Thêm Shebang
Các Bash script bắt đầu bằng một shebang
. Shebang là sự kết hợp của bash #
và bang !
theo sau là đường dẫn shell bash. Đây là dòng đầu tiên của script. Shebang cho shell biết để thực thi nó qua bash shell. Shebang đơn giản là một đường dẫn tuyệt đối đến trình thông dịch bash. Dưới đây là một ví dụ về câu lệnh shebang.
#!/bin/bash
Bạn có thể tìm đường dẫn shell bash của mình (có thể khác với trên) bằng lệnh:
which bash
Tạo bash script đầu tiên của bạn
Script đầu tiên của chúng ta nhắc người dùng nhập một đường dẫn. Đổi lại, nội dung của nó sẽ được liệt kê. Tạo một tệp có tên run_all.sh
bằng bất kỳ trình soạn thảo nào bạn chọn.
vim run_all.sh
Thêm các lệnh sau vào tệp của bạn và lưu nó:
#!/bin/bash
echo "Today is " `date`
echo -e "\nenter the path to directory"
read the_path
echo -e "\n you path has the following files and folders: "
ls $the_path
Hãy xem xét kỹ hơn script từng dòng một. Tôi đang hiển thị lại cùng một script, nhưng lần này với số dòng.
1 #!/bin/bash
2 echo "Today is " `date`
3
4 echo -e "\nenter the path to directory"
5 read the_path
6
7 echo -e "\n you path has the following files and folders: "
8 ls $the_path
- Dòng #1: Shebang (
#!/bin/bash
) trỏ đến đường dẫn bash shell. - Dòng #2: Lệnh
echo
hiển thị ngày và giờ hiện tại trên terminal. Lưu ý rằngdate
nằm trong dấu ngược. - Dòng #4: Chúng ta muốn người dùng nhập một đường dẫn hợp lệ.
- Dòng #5: Lệnh
read
đọc đầu vào và lưu trữ nó vào biếnthe_path
. - Dòng #8: Lệnh
ls
lấy biến với đường dẫn đã lưu và hiển thị các tệp và thư mục hiện tại.
Thực thi bash script
Để làm cho script có thể thực thi, hãy gán quyền thực thi cho người dùng của bạn bằng lệnh này:
chmod u+x run_all.sh
Ở đây,
chmod
sửa đổi quyền sở hữu của một tệp cho người dùng hiện tại:u
.+x
thêm quyền thực thi cho người dùng hiện tại. Điều này có nghĩa là người dùng là chủ sở hữu hiện có thể chạy script.run_all.sh
là tệp chúng ta muốn chạy.
Bạn có thể chạy script bằng bất kỳ phương pháp nào được đề cập:
sh run_all.sh
bash run_all.sh
./run_all.sh
Hãy xem nó chạy trong thực tế 🚀
6.5. Các kiến thức cơ bản về Bash Scripting
Ghi chú trong bash scripting
Ghi chú bắt đầu bằng dấu #
trong bash scripting. Điều này có nghĩa là bất kỳ dòng nào bắt đầu bằng dấu #
là một ghi chú và sẽ bị trình thông dịch bỏ qua. Ghi chú rất hữu ích trong việc tài liệu hóa mã, và đó là một thực hành tốt để thêm chúng để giúp người khác hiểu mã.
Đây là các ví dụ về ghi chú:
# Đây là một ví dụ ghi chú
# Cả hai dòng này sẽ bị trình thông dịch bỏ qua
Biến và kiểu dữ liệu trong Bash
Các biến cho phép bạn lưu trữ dữ liệu. Bạn có thể sử dụng các biến để đọc, truy cập và thao tác dữ liệu trong toàn bộ script của bạn. Không có kiểu dữ liệu trong Bash. Trong Bash, một biến có khả năng lưu trữ các giá trị số, các ký tự riêng lẻ hoặc các chuỗi ký tự.
Trong Bash, bạn có thể sử dụng và đặt giá trị biến theo các cách sau:
- Gán giá trị trực tiếp:
country=Netherlands
- Gán giá trị dựa trên kết quả thu được từ một chương trình hoặc lệnh, sử dụng thay thế lệnh. Lưu ý rằng
$
là bắt buộc để truy cập giá trị của một biến hiện có.
same_country=$country
Điều này gán giá trị của country
cho biến mới same_country
. Để truy cập giá trị biến, thêm $
vào tên biến.
country=Netherlands
echo $country
# output
Netherlands
new_country=$country
echo $new_country
# output
Netherlands
Ở trên, bạn có thể thấy một ví dụ về việc gán và in giá trị biến.
Quy ước đặt tên biến
Trong Bash scripting, các quy ước đặt tên biến sau đây:
-
- Tên biến nên bắt đầu bằng một chữ cái hoặc dấu gạch dưới (
_
). - Tên biến có thể chứa chữ cái, số và dấu gạch dưới (
_
). - Tên biến phân biệt chữ hoa chữ thường.
- Tên biến không nên chứa khoảng trắng hoặc ký tự đặc biệt.
- Sử dụng tên mô tả phản ánh mục đích của biến.
- Tránh sử dụng các từ khóa dành riêng, chẳng hạn như
if
,then
,else
,fi
, v.v. làm tên biến.
- Tên biến nên bắt đầu bằng một chữ cái hoặc dấu gạch dưới (
Dưới đây là một số ví dụ về tên biến hợp lệ trong Bash:
name
count
_var
myVar
MY_VAR
Và đây là một số ví dụ về tên biến không hợp lệ:
# tên biến không hợp lệ
2ndvar (tên biến bắt đầu bằng số)
my var (tên biến chứa khoảng trắng)
my-var (tên biến chứa dấu gạch ngang)
Tuân thủ các quy ước đặt tên này giúp Bash script dễ đọc và dễ bảo trì hơn.
Nhập và xuất trong Bash script
Thu thập đầu vào
Trong phần này, chúng ta sẽ thảo luận một số phương pháp để cung cấp đầu vào cho các script của chúng ta.
-
-
- Đọc đầu vào của người dùng và lưu trữ nó trong một biến
-
Chúng ta có thể đọc đầu vào của người dùng bằng lệnh read
.
#!/bin/bash
echo "What's your name?"
read entered_name
echo -e "\nWelcome to bash tutorial" $entered_name
-
-
- Đọc từ một tệp
-
Mã này đọc từng dòng từ một tệp có tên input.txt
và in nó ra terminal. Chúng ta sẽ tìm hiểu về vòng lặp while sau trong phần này.
while read line
do
echo $line
done < input.txt
-
-
- Đối số dòng lệnh
-
Trong một bash script hoặc hàm, $1
biểu thị đối số ban đầu được truyền, $2
biểu thị đối số thứ hai được truyền, v.v. Script này lấy một tên làm đối số dòng lệnh và in một lời chào cá nhân hóa.
#!/bin/bash
echo "Hello, $1!"
Chúng ta đã cung cấp Zaira
làm đối số cho script của mình. Kết quả:
Hiển thị đầu ra
Ở đây chúng ta sẽ thảo luận một số phương pháp để nhận đầu ra từ các script.
-
-
- In ra terminal:
-
echo "Hello, World!"
Điều này in văn bản "Hello, World!" ra terminal.
-
-
- Ghi vào tệp:
-
echo "This is some text." > output.txt
Điều này ghi văn bản "This is some text." vào một tệp có tên output.txt
. Lưu ý rằng toán tử >
sẽ ghi đè lên tệp nếu nó đã có nội dung.
-
-
- Nối vào một tệp:
-
echo "More text." >> output.txt
Điều này nối văn bản "More text." vào cuối tệp output.txt
.
-
-
- Chuyển hướng đầu ra:
-
ls > files.txt
Điều này liệt kê các tệp trong thư mục hiện tại và ghi đầu ra vào một tệp có tên files.txt
. Bạn có thể chuyển hướng đầu ra của bất kỳ lệnh nào sang một tệp theo cách này. Bạn sẽ tìm hiểu chi tiết về chuyển hướng đầu ra trong phần 8.5.
Câu lệnh điều kiện (if/else)
Các biểu thức tạo ra kết quả boolean, hoặc đúng hoặc sai, được gọi là điều kiện. Có một số cách để đánh giá điều kiện, bao gồm if
, if-else
, if-elif-else
và các điều kiện lồng nhau.
Cú pháp:
if [[ condition ]];
then
statement
elif [[ condition ]]; then
statement
else
do this by default
fi
Cú pháp câu lệnh điều kiện bash
Chúng ta có thể sử dụng các toán tử logic như AND -a
và OR -o
để thực hiện các phép so sánh có ý nghĩa hơn.
if [ $a -gt 60 -a $b -lt 100 ]
Câu lệnh này kiểm tra xem cả hai điều kiện có đúng không: a
lớn hơn 60
VÀ b
nhỏ hơn 100
.
Hãy xem một ví dụ về một Bash script sử dụng các câu lệnh if
, if-else
và if-elif-else
để xác định xem một số được người dùng nhập là số dương, số âm hay số 0:
#!/bin/bash
# Script để xác định xem một số là số dương, số âm hay số 0
echo "Please enter a number: "
read num
if [ $num -gt 0 ]; then
echo "$num is positive"
elif [ $num -lt 0 ]; then
echo "$num is negative"
else
echo "$num is zero"
fi
Script đầu tiên nhắc người dùng nhập một số. Sau đó, nó sử dụng câu lệnh if
để kiểm tra xem số đó có lớn hơn 0
không. Nếu có, script sẽ xuất ra rằng số đó là số dương. Nếu số đó không lớn hơn 0
, script sẽ chuyển sang câu lệnh tiếp theo, là một câu lệnh if-elif
. Ở đây, script kiểm tra xem số đó có nhỏ hơn 0
không. Nếu có, script sẽ xuất ra rằng số đó là số âm. Cuối cùng, nếu số đó không lớn hơn 0
cũng không nhỏ hơn 0
, script sẽ sử dụng câu lệnh else
để xuất ra rằng số đó là số 0.
Xem nó hoạt động 🚀
Lặp và phân nhánh trong Bash
Vòng lặp While
Vòng lặp While kiểm tra một điều kiện và lặp cho đến khi điều kiện đó vẫn true
. Chúng ta cần cung cấp một câu lệnh đếm để tăng bộ đếm nhằm kiểm soát việc thực thi vòng lặp. Trong ví dụ dưới đây, (( i += 1 ))
là câu lệnh đếm tăng giá trị của i
. Vòng lặp sẽ chạy chính xác 10 lần.
#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
echo "$i"
(( i += 1 ))
done
Vòng lặp For
Vòng lặp for
, giống như vòng lặp while
, cho phép bạn thực thi các câu lệnh một số lần cụ thể. Mỗi vòng lặp khác nhau về cú pháp và cách sử dụng.
Trong ví dụ dưới đây, vòng lặp sẽ lặp lại 5 lần.
#!/bin/bash
for i in {1..5}
do
echo $i
done
Câu lệnh Case
Trong Bash, các câu lệnh case được sử dụng để so sánh một giá trị đã cho với một danh sách các mẫu và thực thi một khối mã dựa trên mẫu đầu tiên khớp. Cú pháp cho một câu lệnh case trong Bash như sau:
case expression in
pattern1)
# mã để thực thi nếu biểu thức khớp với pattern1
;;
pattern2)
# mã để thực thi nếu biểu thức khớp với pattern2
;;
pattern3)
# mã để thực thi nếu biểu thức khớp với pattern3
;;
*)
# mã để thực thi nếu không có mẫu nào ở trên khớp với biểu thức
;;
esac
Ở đây, "expression" là giá trị mà chúng ta muốn so sánh, và "pattern1", "pattern2", "pattern3", v.v. là các mẫu mà chúng ta muốn so sánh nó với. Dấu chấm phẩy kép ";;" phân tách mỗi khối mã để thực thi cho mỗi mẫu. Dấu hoa thị "*" đại diện cho trường hợp mặc định, được thực thi nếu không có mẫu nào được chỉ định khớp với biểu thức.
Hãy xem một ví dụ:
fruit="apple"
case $fruit in
"apple")
echo "This is a red fruit."
;;
"banana")
echo "This is a yellow fruit."
;;
"orange")
echo "This is an orange fruit."
;;
*)
echo "Unknown fruit."
;;
esac
Trong ví dụ này, vì giá trị của fruit
là apple
, mẫu đầu tiên khớp và khối mã xuất ra "This is a red fruit." được thực thi. Nếu giá trị của fruit
là banana
, mẫu thứ hai sẽ khớp và khối mã xuất ra "This is a yellow fruit." sẽ thực thi, v.v. Nếu giá trị của fruit
không khớp với bất kỳ mẫu nào được chỉ định, trường hợp mặc định sẽ được thực thi, xuất ra "Unknown fruit."
Phần 7: Quản lý các gói phần mềm trong Linux
Linux đi kèm với một số chương trình tích hợp sẵn. Nhưng bạn có thể cần cài đặt các chương trình mới dựa trên nhu cầu của mình. Bạn cũng có thể cần nâng cấp các ứng dụng hiện có.
7.1. Gói và quản lý gói
Gói là gì?
Một gói là một tập hợp các tệp được đóng gói cùng nhau. Các tệp này rất cần thiết để một chương trình cụ thể chạy. Các tệp này chứa các tệp thực thi của chương trình, thư viện và các tài nguyên khác. Ngoài các tệp cần thiết để chương trình chạy, các gói còn chứa các script cài đặt, sao chép các tệp đến nơi cần thiết. Một chương trình có thể chứa nhiều tệp và phụ thuộc. Với các gói, việc quản lý tất cả các tệp và phụ thuộc cùng một lúc dễ dàng hơn.
Sự khác biệt giữa mã nguồn (source) và mã nhị phân (binary) là gì?
Các lập trình viên viết mã nguồn bằng một ngôn ngữ lập trình. Mã nguồn này sau đó được biên dịch thành mã máy mà máy tính có thể hiểu được. Mã được biên dịch được gọi là mã nhị phân.
Khi bạn tải xuống một gói, bạn có thể nhận được mã nguồn hoặc mã nhị phân. Mã nguồn là mã dễ đọc của con người có thể được biên dịch thành mã nhị phân. Mã nhị phân là mã đã biên dịch mà máy tính có thể hiểu được.
Các gói mã nguồn có thể được sử dụng với bất kỳ loại máy nào nếu mã nguồn được biên dịch đúng cách. Mã nhị phân, mặt khác, là mã đã biên dịch dành riêng cho một loại máy hoặc kiến trúc cụ thể. Bạn có thể tìm kiến trúc của máy mình bằng lệnh uname -m
.
uname -m
# output
x86_64
Các phụ thuộc gói
Các chương trình thường chia sẻ các tệp. Thay vì đưa các tệp này vào mỗi gói, một gói riêng biệt có thể cung cấp chúng cho tất cả các chương trình. Để cài đặt một chương trình cần các tệp này, bạn cũng phải cài đặt gói chứa chúng. Đây được gọi là phụ thuộc gói. Việc chỉ định các phụ thuộc làm cho các gói nhỏ hơn và đơn giản hơn bằng cách giảm các bản sao.
Khi bạn cài đặt một chương trình, các phụ thuộc của nó cũng phải được cài đặt. Hầu hết các phụ thuộc cần thiết thường đã được cài đặt, nhưng một vài cái bổ sung có thể được yêu cầu. Vì vậy, đừng ngạc nhiên nếu một số gói khác được cài đặt cùng với gói bạn đã chọn. Đây là những phụ thuộc cần thiết.
Trình quản lý gói
Linux cung cấp một hệ thống quản lý gói toàn diện để cài đặt, nâng cấp, cấu hình và gỡ bỏ phần mềm. Với quản lý gói, bạn có thể truy cập vào một cơ sở dữ liệu có tổ chức gồm hàng nghìn gói phần mềm cùng với khả năng giải quyết các phụ thuộc và kiểm tra các bản cập nhật phần mềm. Các gói có thể được quản lý bằng các tiện ích dòng lệnh có thể dễ dàng được quản trị viên hệ thống tự động hóa, hoặc thông qua giao diện đồ họa.
Kênh/kho phần mềm
Lưu ý: Quản lý gói khác nhau đối với các bản phân phối khác nhau. Ở đây, chúng ta đang sử dụng Ubuntu. Cài đặt phần mềm hơi khác trong Linux so với Windows và Mac. Linux sử dụng kho lưu trữ (repositories) để lưu trữ các gói phần mềm. Kho lưu trữ là một tập hợp các gói phần mềm có sẵn để cài đặt thông qua trình quản lý gói.
Một trình quản lý gói cũng lưu trữ một chỉ mục của tất cả các gói có sẵn từ một kho lưu trữ. Đôi khi chỉ mục được xây dựng lại để đảm bảo rằng nó được cập nhật và để biết các gói nào đã được nâng cấp hoặc thêm vào kênh kể từ lần kiểm tra cuối cùng. Quy trình chung để tải xuống phần mềm từ một kho lưu trữ trông như thế này:
Nếu chúng ta nói cụ thể về Ubuntu,
-
-
- Chỉ mục được lấy bằng
apt update
. (apt
được giải thích trong phần tiếp theo). - Các tệp/phụ thuộc cần thiết được yêu cầu theo chỉ mục bằng
apt install
. - Các gói và phụ thuộc được cài đặt cục bộ.
- Cập nhật các phụ thuộc và gói khi cần bằng
apt update
vàapt upgrade
.
- Chỉ mục được lấy bằng
-
Trên các bản phân phối dựa trên Debian, bạn có thể tìm danh sách các kho lưu trữ (repositories) trong /etc/apt/sources.list
.
7.2. Cài đặt gói qua dòng lệnh
Lệnh apt
là một công cụ dòng lệnh mạnh mẽ, hoạt động với "Advanced Packaging Tool (APT)" của Ubuntu. apt
, cùng với các lệnh đi kèm, cung cấp phương tiện để cài đặt các gói phần mềm mới, nâng cấp các gói phần mềm hiện có, cập nhật chỉ mục danh sách gói và thậm chí nâng cấp toàn bộ hệ thống Ubuntu.
Để xem nhật ký cài đặt bằng apt
, bạn có thể xem tệp /var/log/dpkg.log
.
Dưới đây là các cách sử dụng lệnh apt
:
Cài đặt gói
Ví dụ, để cài đặt gói htop
, bạn có thể sử dụng lệnh sau:
sudo apt install htop
Cập nhật chỉ mục danh sách gói
Chỉ mục danh sách gói là danh sách tất cả các gói có sẵn trong các kho lưu trữ. Để cập nhật chỉ mục danh sách gói cục bộ, bạn có thể sử dụng lệnh sau:
sudo apt update
Nâng cấp gói
Các gói đã cài đặt trên hệ thống của bạn có thể nhận được các bản cập nhật chứa các bản sửa lỗi, bản vá bảo mật và các tính năng mới. Để nâng cấp các gói, bạn có thể sử dụng lệnh sau:
sudo apt upgrade
Gỡ bỏ gói
Để gỡ bỏ một gói, như htop
, bạn có thể sử dụng lệnh sau:
sudo apt remove htop
7.3. Cài đặt gói qua phương pháp đồ họa nâng cao – Synaptic
Nếu bạn không thoải mái với dòng lệnh, bạn có thể sử dụng một ứng dụng GUI để cài đặt gói. Bạn có thể đạt được kết quả tương tự như dòng lệnh, nhưng với giao diện đồ họa.
Synaptic là một ứng dụng quản lý gói GUI giúp liệt kê các gói đã cài đặt, trạng thái của chúng, các bản cập nhật đang chờ xử lý, v.v. Nó cung cấp các bộ lọc tùy chỉnh để giúp bạn thu hẹp kết quả tìm kiếm.
Bạn cũng có thể nhấp chuột phải vào một gói và xem các chi tiết khác như các phụ thuộc, người bảo trì, kích thước và các tệp đã cài đặt.
7.4. Cài đặt các gói đã tải xuống từ một trang web
Bạn có thể muốn cài đặt một gói đã tải xuống từ một trang web, thay vì từ một kho phần mềm. Các gói này được gọi là tệp .deb
.
Sử dụng dpkg
để cài đặt gói: dpkg
là một công cụ dòng lệnh được sử dụng để cài đặt gói. Để cài đặt một gói bằng dpkg, hãy mở Terminal và gõ:
cd directory
sudo dpkg -i package_name.deb
Lưu ý: Thay thế "directory" bằng thư mục nơi gói được lưu trữ và "package_name" bằng tên tệp của gói. Ngoài ra, bạn có thể nhấp chuột phải, chọn "Open With Other Application" và chọn một ứng dụng GUI bạn chọn.
Mẹo: Trong Ubuntu, bạn có thể xem danh sách các gói đã cài đặt bằng dpkg --list
.
Phần 8: Các chủ đề Linux nâng cao
8.1. Quản lý người dùng
Có thể có nhiều người dùng với các cấp độ truy cập khác nhau trong một hệ thống. Trong Linux, người dùng root có cấp độ truy cập cao nhất và có thể thực hiện bất kỳ hoạt động nào trên hệ thống. Người dùng thông thường có quyền truy cập hạn chế và chỉ có thể thực hiện các hoạt động mà họ đã được cấp quyền.
Người dùng là gì?
Một tài khoản người dùng cung cấp sự phân tách giữa những người và chương trình khác nhau có thể chạy lệnh. Con người xác định người dùng bằng một tên, vì tên dễ làm việc. Nhưng hệ thống xác định người dùng bằng một số duy nhất được gọi là ID người dùng (UID).
Khi người dùng đăng nhập bằng tên người dùng được cung cấp, họ phải sử dụng mật khẩu để tự xác thực. Các tài khoản người dùng tạo thành nền tảng của bảo mật hệ thống. Quyền sở hữu tệp cũng được liên kết với các tài khoản người dùng và nó thực thi kiểm soát truy cập vào các tệp. Mỗi tiến trình có một tài khoản người dùng liên quan cung cấp một lớp kiểm soát cho quản trị viên.
Có ba loại tài khoản người dùng chính:
-
-
- Người dùng siêu cấp (Superuser): Người dùng siêu cấp có quyền truy cập hoàn toàn vào hệ thống. Tên của người dùng siêu cấp là
root
. Nó cóUID
là 0. - Người dùng hệ thống (System user): Người dùng hệ thống có các tài khoản người dùng được sử dụng để chạy các dịch vụ hệ thống. Các tài khoản này được sử dụng để chạy các dịch vụ hệ thống và không dành cho tương tác của con người.
- Người dùng thông thường (Regular user): Người dùng thông thường là người dùng con người có quyền truy cập vào hệ thống.
- Người dùng siêu cấp (Superuser): Người dùng siêu cấp có quyền truy cập hoàn toàn vào hệ thống. Tên của người dùng siêu cấp là
-
Lệnh id
hiển thị ID người dùng và ID nhóm của người dùng hiện tại.
id
uid=1000(john) gid=1000(john) groups=1000(john),4(adm),24(cdrom),27(sudo),30(dip)... output truncated
Để xem thông tin cơ bản của một người dùng khác, hãy truyền tên người dùng làm đối số cho lệnh id
.
id username
Để xem thông tin liên quan đến người dùng cho các tiến trình, sử dụng lệnh ps
với cờ -u
.
ps -u
# Output
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 16968 3920 ? Ss 18:45 0:00 /sbin/init splash
root 2 0.0 0.0 0 0 ? S 18:45 0:00 [kthreadd]
Theo mặc định, các hệ thống sử dụng tệp /etc/passwd
để lưu trữ thông tin người dùng. Dưới đây là một dòng từ tệp /etc/passwd
:
root:x:0:0:root:/root:/bin/bash
Tệp /etc/passwd
chứa các thông tin sau về mỗi người dùng:
-
-
- Tên người dùng:
root
– Tên người dùng của tài khoản người dùng. - Mật khẩu:
x
– Mật khẩu ở định dạng được mã hóa cho tài khoản người dùng được lưu trữ trong tệp/etc/shadow
vì lý do bảo mật. - ID người dùng (UID):
0
– Mã định danh số duy nhất cho tài khoản người dùng. - ID nhóm (GID):
0
– Mã định danh nhóm chính cho tài khoản người dùng. - Thông tin người dùng:
root
– Tên thật của tài khoản người dùng. - Thư mục chính:
/root
– Thư mục chính của tài khoản người dùng. - Shell:
/bin/bash
– Shell mặc định cho tài khoản người dùng. Người dùng hệ thống có thể sử dụng/sbin/nologin
nếu không cho phép đăng nhập tương tác cho người dùng đó.
- Tên người dùng:
-
Nhóm là gì?
Một nhóm là một tập hợp các tài khoản người dùng chia sẻ quyền truy cập và tài nguyên. Các nhóm có tên nhóm để xác định chúng. Hệ thống xác định các nhóm bằng một số duy nhất được gọi là ID nhóm (GID).
Theo mặc định, thông tin về các nhóm được lưu trữ trong tệp /etc/group
. Dưới đây là một mục từ tệp /etc/group
:
adm:x:4:syslog,john
Dưới đây là phân tích các trường trong mục đã cho:
-
-
- Tên nhóm:
adm
– Tên của nhóm. - Mật khẩu:
x
– Mật khẩu cho nhóm được lưu trữ trong tệp/etc/gshadow
vì lý do bảo mật. Mật khẩu là tùy chọn và xuất hiện trống nếu không được đặt. - ID nhóm (GID):
4
– Mã định danh số duy nhất cho nhóm. - Thành viên nhóm:
syslog,john
– Danh sách tên người dùng là thành viên của nhóm. Trong trường hợp này, nhómadm
có hai thành viên:syslog
vàjohn
.
- Tên nhóm:
-
Trong mục cụ thể này, tên nhóm là adm
, ID nhóm là 4
, và nhóm có hai thành viên: syslog
và john
. Trường mật khẩu thường được đặt thành x
để chỉ ra rằng mật khẩu nhóm được lưu trữ trong tệp /etc/gshadow
.
Các nhóm được chia nhỏ thành các nhóm 'chính' và 'bổ sung'.
-
-
- Nhóm chính: Mỗi người dùng được gán một nhóm chính theo mặc định. Nhóm này thường có cùng tên với người dùng và được tạo khi tài khoản người dùng được tạo. Các tệp và thư mục do người dùng tạo thường thuộc sở hữu của nhóm chính này.
- Nhóm bổ sung: Đây là các nhóm bổ sung mà một người dùng có thể thuộc vào ngoài nhóm chính của họ. Người dùng có thể là thành viên của nhiều nhóm bổ sung. Các nhóm này cho phép người dùng có quyền đối với các tài nguyên được chia sẻ giữa các nhóm đó. Chúng giúp cung cấp quyền truy cập vào các tài nguyên được chia sẻ mà không ảnh hưởng đến quyền của tệp hệ thống và giữ an ninh nguyên vẹn. Trong khi một người dùng phải thuộc một nhóm chính, việc thuộc các nhóm bổ sung là tùy chọn.
-
Kiểm soát truy cập: tìm hiểu và hiểu quyền tệp
Quyền sở hữu tệp có thể được xem bằng lệnh ls -l
. Cột đầu tiên trong kết quả của lệnh ls -l
hiển thị quyền của tệp. Các cột khác hiển thị chủ sở hữu của tệp và nhóm mà tệp thuộc về.
Hãy xem xét kỹ hơn cột mode
:
Chế độ (Mode) xác định hai điều:
-
-
- Loại tệp: Loại tệp xác định loại của tệp. Đối với các tệp thông thường chứa dữ liệu đơn giản, nó là trống
-
. Đối với các loại tệp đặc biệt khác, ký hiệu là khác. Đối với một thư mục là một tệp đặc biệt, nó làd
. Các tệp đặc biệt được hệ điều hành xử lý khác nhau. - Các lớp quyền: Bộ ký tự tiếp theo xác định các quyền cho người dùng, nhóm và những người khác tương ứng.
- Người dùng (User): Đây là chủ sở hữu của một tệp và chủ sở hữu của tệp thuộc lớp này.
- Nhóm (Group): Các thành viên của nhóm tệp thuộc lớp này.
- Khác (Other): Bất kỳ người dùng nào không thuộc lớp người dùng hoặc nhóm đều thuộc lớp này.
- Loại tệp: Loại tệp xác định loại của tệp. Đối với các tệp thông thường chứa dữ liệu đơn giản, nó là trống
-
Mẹo: Quyền sở hữu thư mục có thể được xem bằng lệnh ls -ld
.
Cách đọc quyền tượng trưng hoặc quyền rwx
Biểu diễn rwx
được gọi là biểu diễn quyền tượng trưng. Trong bộ quyền,
-
-
r
là viết tắt của đọc (read). Nó được chỉ định ở ký tự đầu tiên của bộ ba.w
là viết tắt của ghi (write). Nó được chỉ định ở ký tự thứ hai của bộ ba.x
là viết tắt của thực thi (execution). Nó được chỉ định ở ký tự thứ ba của bộ ba.
-
Đọc: Đối với các tệp thông thường, quyền đọc cho phép tệp được mở và chỉ đọc. Người dùng không thể sửa đổi tệp. Tương tự đối với các thư mục, quyền đọc cho phép liệt kê nội dung thư mục mà không có bất kỳ sửa đổi nào trong thư mục.
Ghi: Khi các tệp có quyền ghi, người dùng có thể sửa đổi (chỉnh sửa, xóa) tệp và lưu nó. Đối với các thư mục, quyền ghi cho phép người dùng sửa đổi nội dung của nó (tạo, xóa và đổi tên các tệp bên trong), và sửa đổi nội dung của các tệp mà người dùng có quyền ghi.
Ví dụ về quyền trong Linux
Bây giờ chúng ta đã biết cách đọc quyền, hãy xem một số ví dụ.
-
-
-rwx------
: Một tệp chỉ có thể truy cập và thực thi bởi chủ sở hữu của nó.-rw-rw-r--
: Một tệp có thể được sửa đổi bởi chủ sở hữu và nhóm của nó nhưng không phải bởi những người khác.drwxrwx---
: Một thư mục có thể được sửa đổi bởi chủ sở hữu và nhóm của nó.
-
Thực thi: Đối với các tệp, quyền thực thi cho phép người dùng chạy một script có thể thực thi. Đối với các thư mục, người dùng có thể truy cập chúng và truy cập thông tin chi tiết về các tệp trong thư mục.
Cách thay đổi quyền và quyền sở hữu tệp trong Linux bằng chmod
và chown
Bây giờ chúng ta đã biết các kiến thức cơ bản về quyền sở hữu và quyền, hãy xem cách chúng ta có thể sửa đổi quyền bằng lệnh chmod
.
Cú pháp của chmod
:
chmod permissions filename
Trong đó,
-
-
permissions
có thể là đọc, ghi, thực thi hoặc kết hợp của chúng.filename
là tên của tệp mà quyền cần thay đổi. Tham số này cũng có thể là một danh sách nếu các tệp cần thay đổi quyền hàng loạt.
-
Chúng ta có thể thay đổi quyền bằng hai chế độ:
-
-
- Chế độ biểu tượng (Symbolic mode): phương pháp này sử dụng các ký hiệu như
u
,g
,o
để đại diện cho người dùng, nhóm và những người khác. Quyền được biểu diễn làr, w, x
cho đọc, ghi và thực thi tương ứng. Bạn có thể sửa đổi quyền bằng cách sử dụng +, - và =. - Chế độ tuyệt đối (Absolute mode): phương pháp này biểu diễn quyền bằng các số bát phân 3 chữ số từ 0-7.
- Chế độ biểu tượng (Symbolic mode): phương pháp này sử dụng các ký hiệu như
-
Bây giờ, hãy xem chi tiết.
Cách thay đổi quyền bằng Chế độ biểu tượng
Bảng dưới đây tóm tắt biểu diễn người dùng:
Chúng ta có thể sử dụng các toán tử toán học để thêm, xóa và gán quyền. Bảng dưới đây cho thấy tóm tắt:
Ví dụ:
Giả sử tôi có một script và tôi muốn làm cho nó có thể thực thi được cho chủ sở hữu của tệp zaira
. Quyền tệp hiện tại như sau:
Hãy chia quyền như thế này:
Để thêm quyền thực thi (x
) cho chủ sở hữu (u
) bằng chế độ biểu tượng, chúng ta có thể sử dụng lệnh dưới đây:
chmod u+x mymotd.sh
Kết quả:
Bây giờ, chúng ta có thể thấy rằng quyền thực thi đã được thêm cho chủ sở hữu zaira
.
Các ví dụ bổ sung để thay đổi quyền thông qua phương pháp biểu tượng:
-
-
- Xóa quyền
read
vàwrite
chogroup
vàothers
:chmod go-rw
. - Xóa quyền
read
choothers
:chmod o-r
. - Gán quyền
write
chogroup
và ghi đè quyền hiện có:chmod g=w
.
- Xóa quyền
-
Cách thay đổi quyền bằng Chế độ tuyệt đối
Chế độ tuyệt đối sử dụng các số để biểu thị quyền và các toán tử toán học để sửa đổi chúng. Bảng dưới đây cho thấy cách chúng ta có thể gán các quyền liên quan:
Quyền có thể bị thu hồi bằng cách sử dụng phép trừ. Bảng dưới đây cho thấy cách bạn có thể loại bỏ các quyền liên quan.
Ví dụ:
-
-
- Đặt
read
(thêm 4) chouser
,read
(thêm 4) vàexecute
(thêm 1) cho nhóm, và chỉexecute
(thêm 1) cho những người khác.
- Đặt
-
chmod 451 file-name
Đây là cách chúng ta thực hiện phép tính:
Lưu ý rằng điều này giống với r--r-x--x
.
-
-
- Xóa quyền
execution
từother
vàgroup
.
- Xóa quyền
-
Để xóa quyền thực thi từ other
và group
, hãy trừ 1 từ phần thực thi của 2 số bát phân cuối cùng.
-
-
- Gán
read
,write
vàexecute
chouser
,read
vàexecute
chogroup
và chỉread
cho những người khác.
- Gán
-
Điều này sẽ giống với rwxr-xr--
.
Cách thay đổi quyền sở hữu bằng lệnh chown
Tiếp theo, chúng ta sẽ học cách thay đổi quyền sở hữu của một tệp. Bạn có thể thay đổi quyền sở hữu của một tệp hoặc thư mục bằng lệnh chown
. Trong một số trường hợp, việc thay đổi quyền sở hữu yêu cầu quyền sudo
.
Cú pháp của chown
:
chown user filename
Cách thay đổi quyền sở hữu người dùng bằng chown
Hãy chuyển quyền sở hữu từ người dùng zaira
sang người dùng news
.
chown news mymotd.sh
Lệnh để thay đổi quyền sở hữu: sudo chown news mymotd.sh
.
Kết quả:
Cách thay đổi quyền sở hữu người dùng và nhóm cùng lúc
Chúng ta cũng có thể sử dụng chown
để thay đổi người dùng và nhóm cùng lúc.
chown user:group filename
Cách thay đổi quyền sở hữu thư mục
Bạn có thể thay đổi quyền sở hữu đệ quy cho nội dung trong một thư mục. Ví dụ dưới đây thay đổi quyền sở hữu của thư mục /opt/script
để cho phép người dùng admin
.
chown -R admin /opt/script
Cách thay đổi quyền sở hữu nhóm
Trong trường hợp chúng ta chỉ cần thay đổi chủ sở hữu nhóm, chúng ta có thể sử dụng chown
bằng cách đặt trước tên nhóm bằng dấu hai chấm :
chown :admins /opt/script
Cách chuyển đổi giữa các người dùng
Bạn có thể chuyển đổi giữa các người dùng bằng lệnh su
.
[user01@host ~]$ su user02
Password:
[user02@host ~]$
Cách truy cập quyền siêu người dùng
Người dùng siêu cấp hoặc người dùng root có cấp độ truy cập cao nhất trên hệ thống Linux. Người dùng root có thể thực hiện bất kỳ hoạt động nào trên hệ thống. Người dùng root có thể truy cập tất cả các tệp và thư mục, cài đặt và gỡ bỏ phần mềm, và sửa đổi hoặc ghi đè cấu hình hệ thống.
Sức mạnh lớn đi kèm với trách nhiệm lớn. Nếu người dùng root bị xâm phạm, ai đó có thể giành quyền kiểm soát hoàn toàn hệ thống. Nên sử dụng tài khoản người dùng root chỉ khi cần thiết. Nếu bạn bỏ qua tên người dùng, lệnh su
sẽ chuyển sang tài khoản người dùng root theo mặc định.
[user01@host ~]$ su
Password:
[root@host ~]#
Một biến thể khác của lệnh su
là su -
. Lệnh su
chuyển sang tài khoản người dùng root nhưng không thay đổi các biến môi trường. Lệnh su -
chuyển sang tài khoản người dùng root và thay đổi các biến môi trường thành của người dùng đích.
Chạy lệnh với sudo
Để chạy lệnh với tư cách người dùng root
mà không cần chuyển sang tài khoản người dùng root
, bạn có thể sử dụng lệnh sudo
. Lệnh sudo
cho phép bạn chạy lệnh với quyền đặc quyền cao hơn. Chạy lệnh với sudo
là một lựa chọn an toàn hơn so với việc chạy lệnh với tư cách người dùng root
. Điều này là do chỉ một tập hợp người dùng cụ thể mới có thể được cấp quyền chạy lệnh với sudo
. Điều này được định nghĩa trong tệp /etc/sudoers
.
Ngoài ra, sudo
ghi lại tất cả các lệnh được chạy với nó, cung cấp một nhật ký kiểm tra về người đã chạy lệnh nào và khi nào. Trong Ubuntu, bạn có thể tìm nhật ký kiểm tra ở đây:
cat /var/log/auth.log | grep sudo
Đối với một người dùng không có quyền truy cập sudo
, nó sẽ được gắn cờ trong nhật ký và nhắc một thông báo như thế này:
user01 is not in the sudoers file. This incident will be reported.
Quản lý tài khoản người dùng cục bộ
Tạo người dùng từ dòng lệnh
Lệnh được sử dụng để thêm người dùng mới là:
sudo useradd username
Lệnh này thiết lập thư mục chính của người dùng và tạo một nhóm riêng tư được chỉ định bởi tên người dùng của người dùng. Hiện tại, tài khoản thiếu mật khẩu hợp lệ, ngăn người dùng đăng nhập cho đến khi mật khẩu được tạo.
Sửa đổi người dùng hiện có
Lệnh usermod
được sử dụng để sửa đổi người dùng hiện có. Dưới đây là một số tùy chọn phổ biến được sử dụng với lệnh usermod
. Dưới đây là một số ví dụ về lệnh usermod
trong Linux:
-
-
- Thay đổi tên đăng nhập của người dùng:
sudo usermod -l newusername oldusername
- Thay đổi thư mục chính của người dùng:
sudo usermod -d /new/home/directory -m username
- Thêm người dùng vào một nhóm bổ sung:
sudo usermod -aG groupname username
- Thay đổi shell của người dùng:
sudo usermod -s /bin/bash username
- Khóa tài khoản người dùng:
sudo usermod -L username
- Mở khóa tài khoản người dùng:
sudo usermod -U username
- Đặt ngày hết hạn cho tài khoản người dùng:
sudo usermod -e YYYY-MM-DD username
- Thay đổi ID người dùng (UID):
sudo usermod -u newUID username
- Thay đổi nhóm chính của người dùng:
sudo usermod -g newgroup username
- Xóa người dùng khỏi một nhóm bổ sung:
sudo gpasswd -d username groupname
- Thay đổi tên đăng nhập của người dùng:
-
Xóa người dùng
Lệnh userdel
được sử dụng để xóa một tài khoản người dùng và các tệp liên quan khỏi hệ thống.
-
-
sudo userdel username
: xóa thông tin chi tiết của người dùng khỏi/etc/passwd
nhưng giữ lại thư mục chính của người dùng.- Lệnh
sudo userdel -r username
xóa thông tin chi tiết của người dùng khỏi/etc/passwd
và cũng xóa thư mục chính của người dùng.
-
Thay đổi mật khẩu người dùng
Lệnh passwd
được sử dụng để thay đổi mật khẩu của người dùng.
-
-
sudo passwd username
: đặt mật khẩu ban đầu hoặc thay đổi mật khẩu hiện có của tên người dùng. Nó cũng được sử dụng để thay đổi mật khẩu của người dùng hiện đang đăng nhập.
-
8.2. Kết nối đến máy chủ từ xa qua SSH
Truy cập máy chủ từ xa là một trong những tác vụ thiết yếu đối với quản trị viên hệ thống. Bạn có thể kết nối đến các máy chủ khác nhau hoặc truy cập cơ sở dữ liệu thông qua máy cục bộ của mình và thực thi lệnh, tất cả đều sử dụng SSH.
Giao thức SSH là gì?
SSH là viết tắt của Secure Shell. Nó là một giao thức mạng mật mã cho phép giao tiếp an toàn giữa hai hệ thống. Cổng mặc định cho SSH là 22
. Hai bên tham gia giao tiếp qua SSH là:
-
-
- Máy chủ (The server): máy mà bạn muốn truy cập.
- Máy khách (The client): Hệ thống mà bạn đang truy cập máy chủ từ đó.
-
Kết nối đến máy chủ tuân theo các bước sau:
-
-
- Khởi tạo kết nối: Máy khách gửi yêu cầu kết nối đến máy chủ.
- Trao đổi khóa: Máy chủ gửi khóa công khai của nó cho máy khách. Cả hai đồng ý về các phương pháp mã hóa sẽ sử dụng.
- Tạo khóa phiên: Máy khách và máy chủ sử dụng trao đổi khóa Diffie-Hellman để tạo một khóa phiên chia sẻ.
- Xác thực máy khách: Máy khách đăng nhập vào máy chủ bằng mật khẩu, khóa riêng hoặc phương pháp khác.
- Giao tiếp an toàn: Sau khi xác thực, máy khách và máy chủ giao tiếp an toàn với mã hóa.
-
Cách kết nối đến máy chủ từ xa bằng SSH?
Lệnh ssh
là một tiện ích tích hợp trong Linux và cũng là tiện ích mặc định. Nó giúp việc truy cập máy chủ khá dễ dàng và an toàn. Ở đây, chúng ta đang nói về cách máy khách sẽ tạo kết nối đến máy chủ. Trước khi kết nối đến một máy chủ, bạn cần có các thông tin sau:
-
-
- Địa chỉ IP hoặc tên miền của máy chủ.
- Tên người dùng và mật khẩu của máy chủ.
- Số cổng mà bạn có quyền truy cập trên máy chủ.
-
Cú pháp cơ bản của lệnh ssh
là:
ssh username@server_ip
Ví dụ, nếu tên người dùng của bạn là john
và IP máy chủ là 192.168.1.10
, lệnh sẽ là:
ssh john@192.168.1.10
Sau đó, bạn sẽ được nhắc nhập mật khẩu bí mật. Màn hình của bạn sẽ trông tương tự như thế này:
john@192.168.1.10's password:
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-70-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Fri Jun 5 10:17:32 UTC 2024
System load: 0.08 Processes: 122
Usage of /: 12.3% of 19.56GB Users logged in: 1
Memory usage: 53% IP address for eth0: 192.168.1.10
Swap usage: 0%
Last login: Fri Jun 5 09:34:56 2024 from 192.168.1.2
john@hostname:~$ # start entering commands
Bây giờ bạn có thể thực thi các lệnh liên quan trên máy chủ 192.168.1.10
. Cổng mặc định cho ssh là 22
nhưng nó cũng dễ bị tấn công, vì tin tặc có thể sẽ thử tấn công ở đây trước. Máy chủ của bạn có thể hiển thị một cổng khác và chia sẻ quyền truy cập với bạn. Để kết nối đến một cổng khác, sử dụng cờ -p
.
ssh -p port_number username@server_ip
8.3. Phân tích và xử lý log nâng cao
Các tệp nhật ký, khi được cấu hình, được hệ thống của bạn tạo ra vì nhiều lý do hữu ích. Chúng có thể được sử dụng để theo dõi các sự kiện hệ thống, giám sát hiệu suất hệ thống và khắc phục sự cố. Chúng đặc biệt hữu ích cho quản trị viên hệ thống, nơi họ có thể theo dõi lỗi ứng dụng, sự kiện mạng và hoạt động của người dùng.
Dưới đây là một ví dụ về tệp nhật ký:
# tệp nhật ký mẫu
2024-04-25 09:00:00 INFO Startup: Application starting
2024-04-25 09:01:00 INFO Config: Configuration loaded successfully
2024-04-25 09:02:00 DEBUG Database: Database connection established
2024-04-25 09:03:00 INFO User: New user registered (UserID: 1001)
2024-04-25 09:04:00 WARN Security: Attempted login with incorrect credentials (UserID: 1001)
2024-04-25 09:05:00 ERROR Network: Network timeout on request (ReqID: 456)
2024-04-25 09:06:00 INFO Email: Notification email sent (UserID: 1001)
2024-04-25 09:07:00 DEBUG API: API call with response time over threshold (Duration: 350ms)
2024-04-25 09:08:00 INFO Session: User session ended (UserID: 1001)
2024-04-25 09:09:00 INFO Shutdown: Application shutdown initiated
Một tệp nhật ký thường chứa các cột sau:
-
-
- Dấu thời gian: Ngày và giờ sự kiện xảy ra.
- Cấp độ nhật ký: Mức độ nghiêm trọng của sự kiện (INFO, DEBUG, WARN, ERROR).
- Thành phần: Thành phần của hệ thống đã tạo ra sự kiện (Startup, Config, Database, User, Security, Network, Email, API, Session, Shutdown).
- Thông báo: Mô tả về sự kiện đã xảy ra.
- Thông tin bổ sung: Thông tin bổ sung liên quan đến sự kiện.
-
Trong các hệ thống thời gian thực, các tệp nhật ký có xu hướng dài hàng nghìn dòng và được tạo ra mỗi giây. Chúng có thể rất dài dòng tùy thuộc vào cấu hình. Mỗi cột trong tệp nhật ký là một phần thông tin có thể được sử dụng để theo dõi các vấn đề. Điều này làm cho các tệp nhật ký khó đọc và hiểu thủ công. Đây là lúc phân tích nhật ký phát huy tác dụng. Phân tích nhật ký là quá trình trích xuất thông tin hữu ích từ các tệp nhật ký. Nó liên quan đến việc chia nhỏ các tệp nhật ký thành các phần nhỏ hơn, dễ quản lý hơn và trích xuất thông tin liên quan. Thông tin đã lọc cũng có thể hữu ích để tạo cảnh báo, báo cáo và bảng điều khiển. Trong phần này, bạn sẽ khám phá một số kỹ thuật để phân tích các tệp nhật ký trong Linux.
Trích xuất văn bản bằng grep
Grep là một tiện ích bash tích hợp sẵn. Nó là viết tắt của "global regular expression print". Grep được sử dụng để khớp chuỗi trong các tệp. Dưới đây là một số cách sử dụng phổ biến của grep
:
-
-
- Tìm kiếm một chuỗi cụ thể trong một tệp:
grep "search_string" filename
Lệnh này tìm kiếm "search_string" trong tệp có tên
filename
. - Tìm kiếm đệ quy trong các thư mục:
grep -r "search_string" /path/to/directory
Lệnh này tìm kiếm "
search_string"
trong tất cả các tệp trong thư mục được chỉ định và các thư mục con của nó. - Bỏ qua trường hợp khi tìm kiếm:
grep -i "search_string" filename
Lệnh này thực hiện tìm kiếm không phân biệt chữ hoa chữ thường cho "search_string" trong tệp có tên
filename
. - Hiển thị số dòng với các dòng khớp:
grep -n "search_string" filename
Lệnh này hiển thị số dòng cùng với các dòng khớp trong tệp có tên
filename
. - Đếm số dòng khớp:
grep -c "search_string" filename
Lệnh này đếm số dòng chứa "search_string" trong tệp có tên
filename
. - Đảo ngược khớp để hiển thị các dòng không khớp:
grep -v "search_string" filename
Lệnh này hiển thị tất cả các dòng không chứa "search_string" trong tệp có tên
filename
. - Tìm kiếm một từ hoàn chỉnh:
grep -w "word" filename
Lệnh này tìm kiếm từ hoàn chỉnh "word" trong tệp có tên
filename
. - Sử dụng biểu thức chính quy mở rộng:
grep -E "pattern" filename
Lệnh này cho phép sử dụng biểu thức chính quy mở rộng để khớp mẫu phức tạp hơn trong tệp có tên
filename
.
- Tìm kiếm một chuỗi cụ thể trong một tệp:
-
Mẹo: Nếu có nhiều tệp trong một thư mục, bạn có thể sử dụng lệnh dưới đây để tìm danh sách các tệp chứa các chuỗi mong muốn.
# tìm danh sách các tệp chứa các chuỗi mong muốn
grep -l "String to Match" /path/to/directory
Trích xuất văn bản bằng sed
sed
là viết tắt của "stream editor" (trình chỉnh sửa luồng). Nó xử lý dữ liệu theo luồng, nghĩa là nó đọc dữ liệu từng dòng một. sed
cho phép bạn tìm kiếm các mẫu và thực hiện các hành động trên các dòng khớp với các mẫu đó.
Cú pháp cơ bản của sed
:
Cú pháp cơ bản của sed
như sau:
sed [options] 'command' file_name
Ở đây, command
được sử dụng để thực hiện các thao tác như thay thế, xóa, chèn, v.v., trên dữ liệu văn bản. Tên tệp là tên của tệp bạn muốn xử lý.
Cách sử dụng sed
:
1. Thay thế:
Cờ s
được sử dụng để thay thế văn bản. old-text
được thay thế bằng new-text
:
sed 's/old-text/new-text/' filename
Ví dụ, để thay đổi tất cả các trường hợp "error" thành "warning" trong tệp nhật ký system.log
:
sed 's/error/warning/' system.log
2. In các dòng chứa một mẫu cụ thể:
Sử dụng sed
để lọc và hiển thị các dòng khớp với một mẫu cụ thể:
sed -n '/pattern/p' filename
Chẳng hạn, để tìm tất cả các dòng chứa "ERROR":
sed -n '/ERROR/p' system.log
3. Xóa các dòng chứa một mẫu cụ thể:
Bạn có thể xóa các dòng khỏi đầu ra khớp với một mẫu cụ thể:
sed '/pattern/d' filename
Ví dụ, để xóa tất cả các dòng chứa "DEBUG":
sed '/DEBUG/d' system.log
4. Trích xuất các trường cụ thể từ một dòng nhật ký:
Bạn có thể sử dụng biểu thức chính quy để trích xuất các phần của dòng. Giả sử mỗi dòng nhật ký bắt đầu bằng một ngày ở định dạng "YYYY-MM-DD". Bạn có thể trích xuất chỉ ngày từ mỗi dòng:
sed -n 's/^\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\).*/\1/p' system.log
Phân tích văn bản bằng awk
awk
có khả năng dễ dàng chia mỗi dòng thành các trường. Nó rất phù hợp để xử lý văn bản có cấu trúc như các tệp nhật ký.
Cú pháp cơ bản của awk
Cú pháp cơ bản của awk
là:
awk 'pattern { action }' file_name
Ở đây, pattern
là một điều kiện phải được đáp ứng để action
được thực hiện. Nếu mẫu bị bỏ qua, hành động được thực hiện trên mọi dòng.
Trong các ví dụ sắp tới, bạn sẽ sử dụng tệp nhật ký này làm ví dụ:
2024-04-25 09:00:00 INFO Startup: Application starting
2024-04-25 09:01:00 INFO Config: Configuration loaded successfully
2024-04-25 09:02:00 INFO Database: Database connection established
2024-04-25 09:03:00 INFO User: New user registered (UserID: 1001)
2024-04-25 09:04:00 INFO Security: Attempted login with incorrect credentials (UserID: 1001)
2024-04-25 09:05:00 INFO Network: Network timeout on request (ReqID: 456)
2024-04-25 09:06:00 INFO Email: Notification email sent (UserID: 1001)
2024-04-25 09:07:00 INFO API: API call with response time over threshold (Duration: 350ms)
2024-04-25 09:08:00 INFO Session: User session ended (UserID: 1001)
2024-04-25 09:09:00 INFO Shutdown: Application shutdown initiated
INFO
-
-
- Truy cập các cột bằng
awk
- Truy cập các cột bằng
-
Các trường trong awk
(được phân tách bằng khoảng trắng theo mặc định) có thể được truy cập bằng $1
, $2
, $3
, v.v.
zaira@zaira-ThinkPad:~$ awk '{ print $1 }' sample.log
# output
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
zaira@zaira-ThinkPad:~$ awk '{ print $2 }' sample.log
# output
09:00:00
09:01:00
09:02:00
09:03:00
09:04:00
09:05:00
09:06:00
09:07:00
09:08:00
09:09:00
-
-
- In các dòng chứa một mẫu cụ thể (ví dụ: ERROR)
-
awk '/ERROR/ { print $0 }' logfile.log
# output
2024-04-25 09:05:00 ERROR Network: Network timeout on request (ReqID: 456)
Điều này in tất cả các dòng chứa "ERROR".
-
-
- Trích xuất trường đầu tiên (Ngày và Giờ)
-
awk '{ print $1, $2 }' logfile.log
# output
2024-04-25 09:00:00
2024-04-25 09:01:00
2024-04-25 09:02:00
2024-04-25 09:03:00
2024-04-25 09:04:00
2024-04-25 09:05:00
2024-04-25 09:06:00
2024-04-25 09:07:00
2024-04-25 09:08:007
2024-04-25 09:09:00
Điều này sẽ trích xuất hai trường đầu tiên từ mỗi dòng, trong trường hợp này sẽ là ngày và giờ.
-
-
- Tóm tắt các lần xuất hiện của mỗi cấp độ nhật ký
-
awk '{ count[$3]++ } END { for (level in count) print level, count[level] }' logfile.log
# output
1
WARN 1
ERROR 1
DEBUG 2
INFO 6
Kết quả sẽ là tóm tắt số lần xuất hiện của mỗi cấp độ nhật ký.
-
-
- Lọc các trường cụ thể (ví dụ: trường thứ 3 là INFO)
-
awk '{ $3="INFO"; print }' sample.log
# output
2024-04-25 09:00:00 INFO Startup: Application starting
2024-04-25 09:01:00 INFO Config: Configuration loaded successfully
2024-04-25 09:02:00 INFO Database: Database connection established
2024-04-25 09:03:00 INFO User: New user registered (UserID: 1001)
2024-04-25 09:04:00 INFO Security: Attempted login with incorrect credentials (UserID: 1001)
2024-04-25 09:05:00 INFO Network: Network timeout on request (ReqID: 456)
2024-04-25 09:06:00 INFO Email: Notification email sent (UserID: 1001)
2024-04-25 09:07:00 INFO API: API call with response time over threshold (Duration: 350ms)
2024-04-25 09:08:00 INFO Session: User session ended (UserID: 1001)
2024-04-25 09:09:00 INFO Shutdown: Application shutdown initiated
INFO
Lệnh này sẽ trích xuất tất cả các dòng mà trường thứ 3 là "INFO".
Mẹo: Dấu phân cách mặc định trong awk
là một khoảng trắng. Nếu tệp nhật ký của bạn sử dụng một dấu phân cách khác, bạn có thể chỉ định nó bằng tùy chọn -F
. Ví dụ, nếu tệp nhật ký của bạn sử dụng dấu hai chấm làm dấu phân cách, bạn có thể sử dụng awk -F: '{ print $1 }' logfile.log
để trích xuất trường đầu tiên.
Phân tích tệp nhật ký bằng cut
Lệnh cut
là một lệnh đơn giản nhưng mạnh mẽ được sử dụng để trích xuất các phần văn bản từ mỗi dòng đầu vào. Vì các tệp nhật ký được cấu trúc và mỗi trường được phân tách bằng một ký tự cụ thể, chẳng hạn như khoảng trắng, tab hoặc dấu phân cách tùy chỉnh, cut
thực hiện rất tốt việc trích xuất các trường cụ thể đó. Cú pháp cơ bản của lệnh cut là:
cut [options] [file]
Một số tùy chọn thường được sử dụng cho lệnh cut:
-
-
-d
: Chỉ định một dấu phân cách được sử dụng làm dấu phân cách trường.-f
: Chọn các trường sẽ được hiển thị.-c
: Chỉ định các vị trí ký tự.
-
Ví dụ, lệnh dưới đây sẽ trích xuất trường đầu tiên (được phân tách bằng khoảng trắng) từ mỗi dòng của tệp nhật ký:
cut -d ' ' -f 1 logfile.log
Ví dụ về cách sử dụng cut
để phân tích nhật ký
Giả sử bạn có một tệp nhật ký được cấu trúc như sau, trong đó các trường được phân tách bằng khoảng trắng:
2024-04-25 08:23:01 INFO 192.168.1.10 User logged in successfully.
2024-04-25 08:24:15 WARNING 192.168.1.10 Disk usage exceeds 90%.
2024-04-25 08:25:02 ERROR 10.0.0.5 Connection timed out.
...
cut
có thể được sử dụng theo các cách sau:
-
-
- Trích xuất thời gian từ mỗi mục nhật ký:
-
cut -d ' ' -f 2 system.log
# Output
08:23:01
08:24:15
08:25:02
...
Lệnh này sử dụng khoảng trắng làm dấu phân cách và chọn trường thứ hai, là thành phần thời gian của mỗi mục nhật ký.
-
-
- Trích xuất địa chỉ IP từ các nhật ký:
-
cut -d ' ' -f 4 system.log
# Output
192.168.1.10
192.168.1.10
10.0.0.5
Lệnh này trích xuất trường thứ tư, là địa chỉ IP từ mỗi mục nhật ký.
-
-
- Trích xuất cấp độ nhật ký (INFO, WARNING, ERROR):
-
cut -d ' ' -f 3 system.log
# Output
INFO
WARNING
ERROR
Điều này trích xuất trường thứ ba chứa cấp độ nhật ký.
-
-
- Kết hợp
cut
với các lệnh khác:
- Kết hợp
-
Đầu ra của các lệnh khác có thể được chuyển đến lệnh cut
. Giả sử bạn muốn lọc nhật ký trước khi cắt. Bạn có thể sử dụng grep
để trích xuất các dòng chứa "ERROR" và sau đó sử dụng cut
để lấy thông tin cụ thể từ các dòng đó:
grep "ERROR" system.log | cut -d ' ' -f 1,2
# Output
2024-04-25 08:25:02
Lệnh này đầu tiên lọc các dòng bao gồm "ERROR", sau đó trích xuất ngày và giờ từ các dòng này.
-
-
- Trích xuất nhiều trường:
-
Có thể trích xuất nhiều trường cùng một lúc bằng cách chỉ định một phạm vi hoặc một danh sách các trường được phân tách bằng dấu phẩy:
cut -d ' ' -f 1,2,3 system.log`
# Output
2024-04-25 08:23:01 INFO
2024-04-25 08:24:15 WARNING
2024-04-25 08:25:02 ERROR
...
Lệnh trên trích xuất ba trường đầu tiên từ mỗi mục nhật ký là ngày, giờ và cấp độ nhật ký.
Phân tích tệp nhật ký bằng sort
và uniq
Sắp xếp và loại bỏ các bản sao là các thao tác phổ biến khi làm việc với các tệp nhật ký. Các lệnh sort
và uniq
là các lệnh mạnh mẽ được sử dụng để sắp xếp và loại bỏ các bản sao khỏi đầu vào tương ứng.
Cú pháp cơ bản của sort
Lệnh sort
sắp xếp các dòng văn bản theo thứ tự bảng chữ cái hoặc số.
sort [options] [file]
Một số tùy chọn chính cho lệnh sort:
-
-
-n
: Sắp xếp tệp giả định nội dung là số.-r
: Đảo ngược thứ tự sắp xếp.-k
: Chỉ định khóa hoặc số cột để sắp xếp.-u
: Sắp xếp và loại bỏ các dòng trùng lặp.
-
Lệnh uniq
được sử dụng để lọc hoặc đếm và báo cáo các dòng lặp lại trong một tệp.
Cú pháp của uniq
là:
uniq [options] [input_file] [output_file]
Một số tùy chọn chính cho lệnh uniq
là:
-
-
-c
: Thêm tiền tố vào các dòng bằng số lần xuất hiện.-d
: Chỉ in các dòng trùng lặp.-u
: Chỉ in các dòng duy nhất.
-
Ví dụ về cách sử dụng sort
và uniq
cùng nhau để phân tích nhật ký
Hãy giả định các mục nhật ký ví dụ sau cho các minh họa này:
2024-04-25 INFO User logged in successfully.
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 ERROR Connection timed out.
2024-04-25 INFO User logged in successfully.
2024-04-26 INFO Scheduled maintenance.
2024-04-26 ERROR Connection timed out.
-
-
- Sắp xếp các mục nhật ký theo ngày:
-
sort system.log
# Output
2024-04-25 INFO User logged in successfully.
2024-04-25 INFO User logged in successfully.
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 ERROR Connection timed out.
2024-04-26 ERROR Connection timed out.
2024-04-26 INFO Scheduled maintenance.
Điều này sắp xếp các mục nhật ký theo thứ tự bảng chữ cái, giúp sắp xếp chúng theo ngày nếu ngày là trường đầu tiên.
-
-
- Sắp xếp và loại bỏ các bản sao:
-
sort system.log | uniq
# Output
2024-04-25 INFO User logged in successfully.
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 ERROR Connection timed out.
2024-04-26 INFO Scheduled maintenance.
Lệnh này sắp xếp tệp nhật ký và chuyển nó đến uniq
, loại bỏ các dòng trùng lặp.
-
-
- Đếm số lần xuất hiện của mỗi dòng:
-
sort system.log | uniq -c
# Output
2 2024-04-25 INFO User logged in successfully.
1 2024-04-25 WARNING Disk usage exceeds 90%.
2 2024-04-26 ERROR Connection timed out.
1 2024-04-26 INFO Scheduled maintenance.
Sắp xếp các mục nhật ký và sau đó đếm từng dòng duy nhất. Theo kết quả, dòng '2024-04-25 INFO User logged in successfully.'
xuất hiện 2 lần trong tệp.
-
-
- Xác định các mục nhật ký duy nhất:
-
sort system.log | uniq -u
# Output
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 INFO Scheduled maintenance.
Lệnh này hiển thị các dòng duy nhất.
-
-
- Sắp xếp theo cấp độ nhật ký:
-
sort -k2 system.log
# Output
2024-04-26 ERROR Connection timed out.
2024-04-26 ERROR Connection timed out.
2024-04-25 INFO User logged in successfully.
2024-04-25 INFO User logged in successfully.
2024-04-26 INFO Scheduled maintenance.
2024-04-25 WARNING Disk usage exceeds 90%.
Sắp xếp các mục nhập dựa trên trường thứ hai, là cấp độ nhật ký.
8.4. Quản lý các tiến trình Linux qua dòng lệnh
Một tiến trình là một phiên bản đang chạy của một chương trình. Một tiến trình bao gồm:
-
-
- Không gian địa chỉ của bộ nhớ được phân bổ.
- Các trạng thái tiến trình.
- Các thuộc tính như quyền sở hữu, thuộc tính bảo mật và việc sử dụng tài nguyên.
-
Một tiến trình cũng có một môi trường bao gồm:
-
-
- Các biến cục bộ và toàn cục
- Ngữ cảnh lập lịch hiện tại
- Các tài nguyên hệ thống được phân bổ, chẳng hạn như cổng mạng hoặc bộ mô tả tệp.
-
Khi bạn chạy lệnh ls -l
, hệ điều hành tạo một tiến trình mới để thực thi lệnh. Tiến trình có một ID, một trạng thái và chạy cho đến khi lệnh hoàn tất.
Hiểu về việc tạo và vòng đời tiến trình
Trong Ubuntu, tất cả các tiến trình đều bắt nguồn từ tiến trình hệ thống ban đầu có tên là systemd
, là tiến trình đầu tiên được kernel khởi tạo trong quá trình khởi động. Tiến trình systemd
có ID tiến trình (PID) là 1
và chịu trách nhiệm khởi tạo hệ thống, khởi động và quản lý các tiến trình khác, cũng như xử lý các dịch vụ hệ thống. Tất cả các tiến trình khác trên hệ thống đều là hậu duệ của systemd
.
Một tiến trình cha sao chép không gian địa chỉ của chính nó (fork) để tạo một cấu trúc tiến trình mới (con). Mỗi tiến trình mới được gán một ID tiến trình (PID) duy nhất để theo dõi và mục đích bảo mật. PID và ID tiến trình cha (PPID) là một phần của môi trường tiến trình mới. Bất kỳ tiến trình nào cũng có thể tạo một tiến trình con.
Thông qua quy trình fork, một tiến trình con kế thừa các danh tính bảo mật, các bộ mô tả tệp trước đó và hiện tại, các đặc quyền cổng và tài nguyên, các biến môi trường và mã chương trình. Một tiến trình con sau đó có thể thực thi mã chương trình của riêng nó. Thông thường, một tiến trình cha sẽ ngủ trong khi tiến trình con chạy, đặt một yêu cầu (wait) để được thông báo khi tiến trình con hoàn thành. Khi thoát, tiến trình con đã đóng hoặc loại bỏ các tài nguyên và môi trường của nó. Tài nguyên còn lại duy nhất, được gọi là zombie, là một mục trong bảng tiến trình. Tiến trình cha, được đánh thức khi tiến trình con thoát, dọn dẹp bảng tiến trình của mục nhập của tiến trình con, do đó giải phóng tài nguyên cuối cùng của tiến trình con. Tiến trình cha sau đó tiếp tục thực thi mã chương trình của riêng nó.
Hiểu về trạng thái tiến trình
Các tiến trình trong Linux có các trạng thái khác nhau trong vòng đời của chúng. Trạng thái của một tiến trình cho biết tiến trình hiện đang làm gì và cách nó tương tác với hệ thống. Các tiến trình chuyển đổi giữa các trạng thái dựa trên trạng thái thực thi của chúng và thuật toán lập lịch của hệ thống.
Các tiến trình trong hệ thống Linux có thể ở một trong các trạng thái sau:
Các tiến trình chuyển đổi giữa các trạng thái này theo các cách sau:
Cách xem các tiến trình
Bạn có thể sử dụng lệnh ps
cùng với một sự kết hợp các tùy chọn để xem các tiến trình trên hệ thống Linux. Lệnh ps
được sử dụng để hiển thị thông tin về một lựa chọn các tiến trình hoạt động. Ví dụ, ps aux
hiển thị tất cả các tiến trình đang chạy trên hệ thống.
zaira@zaira:~$ ps aux
# Output
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 168140 11352 ? Ss May21 0:18 /sbin/init splash
root 2 0.0 0.0 0 0 ? S May21 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< May21 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< May21 0:00 [rcu_par_gp]
root 5 0.0 0.0 0 0 ? I< May21 0:00 [slub_flushwq]
root 6 0.0 0.0 0 0 ? I< May21 0:00 [netns]
root 11 0.0 0.0 0 0 ? I< May21 0:00 [mm_percpu_wq]
root 12 0.0 0.0 0 0 ? I May21 0:00 [rcu_tasks_kthread]
root 13 0.0 0.0 0 0 ? I May21 0:00 [rcu_tasks_rude_kthread]
*... output truncated ....*
Kết quả trên hiển thị một bản chụp nhanh các tiến trình đang chạy trên hệ thống. Mỗi hàng đại diện cho một tiến trình với các cột sau:
-
USER
: Người dùng sở hữu tiến trình.PID
: ID tiến trình.%CPU
: Mức sử dụng CPU của tiến trình.%MEM
: Mức sử dụng bộ nhớ của tiến trình.VSZ
: Kích thước bộ nhớ ảo của tiến trình.RSS
: Kích thước tập hợp cư trú, tức là bộ nhớ vật lý không bị trao đổi mà một tác vụ đã sử dụng.TTY
: Terminal điều khiển của tiến trình. Dấu?
cho biết không có terminal điều khiển.STAT
: Trạng thái tiến trình.- <li style="margin-bottom:
Cảm ơn bạn rất nhiều vì đã đọc tới đây. Chúng tôi hy vọng bài viết sẽ truyền cảm hứng cho bạn tìm hiểu thêm về Linux và giúp bạn có một khởi đầu vững chắc trên con đường lập trình của mình!
Source: FreeCodeCamp
MagicFlow | TechData.AI