15+ mẹo và thủ thuật Bash giúp bạn làm chủ dòng lệnh Linux (Phần 2)

15+ mẹo và thủ thuật Bash giúp bạn làm chủ dòng lệnh Linux (Phần 2)

Trong chuỗi bài viết này, chúng ta sẽ cùng khám phá nhiều mẹo, thủ thuật và ví dụ về dòng lệnh Bash, giúp bạn trở thành một người dùng Bash cũng như lập trình viên nâng cao. Bash cung cấp một ngôn ngữ lập trình – viết script – phong phú, trao quyền cho cả người dùng lẫn nhà phát triển. Hơn nữa, Bash cho phép bạn học hỏi dần dần qua quá trình sử dụng, tạo ra một trải nghiệm thú vị và dễ tiếp cận. Nếu bạn quan tâm, hãy xem bài viết Các Mẹo và Thủ Thuật Dòng Lệnh Bash Hữu Ích – Phần 1 của chúng tôi để có được nền tảng ban đầu.

DataOnline sẽ hướng dẫn bạn :

  • Các mẹo, thủ thuật và phương pháp hữu ích của dòng lệnh Bash
  • Cách tương tác nâng cao với dòng lệnh Bash
  • Cách rèn luyện kỹ năng Bash tổng thể để trở thành người sử dụng Bash chuyên nghiệp hơn

Yêu cầu phần mềm và các quy ước sử dụng

Danh mục Yêu cầu, quy ước hoặc phiên bản phần mềm sử dụng
Hệ thống Linux (không phụ thuộc vào bản phân phối)
Phần mềm Dòng lệnh Bash, hệ thống dựa trên Linux
Khác Bất kỳ tiện ích nào không được tích hợp sẵn trong shell Bash mặc định có thể được cài đặt bằng lệnh sudo apt-get install utility-name (hoặc yum install đối với hệ thống dựa trên RedHat)

Các quy ước

  • Dấu # – yêu cầu các lệnh Linux được thực thi với quyền root, trực tiếp hoặc thông qua lệnh sudo.
  • Dấu $ – yêu cầu các lệnh Linux được thực hiện với tư cách người dùng thường (không có đặc quyền).

Ví dụ 1: Bắt lấy địa chỉ IP “ảo giải”

Đôi khi, các script của chúng ta cần biết địa chỉ IP của máy. Có vài phương pháp khác nhau để lấy thông tin này, dù không phương pháp nào là hoàn hảo tuyệt đối. Ví dụ, việc có nhiều card mạng trên cùng một máy có thể làm thay đổi đầu ra của các lệnh khác nhau; bên cạnh đó, một số lệnh cũng tồn tại giới hạn nhất định.

Chẳng hạn, lệnh hostname đã chỉ rõ trong trang hướng dẫn (với tùy chọn -I) rằng nó sẽ hiển thị tất cả các địa chỉ mạng của máy chủ, nhưng không đảm bảo về thứ tự xuất của chúng. Do đó, sử dụng hostname có thể không phải là lựa chọn tối ưu.

Các ví dụ dưới đây nhằm mang lại cho bạn sức mạnh trong việc tùy biến và cung cấp một số gợi ý để bạn có thể tiếp tục khám phá, cải thiện theo môi trường cụ thể và khắc phục các hạn chế chung. Kiến thức về máy đang được truy vấn hay mạng lưới sử dụng sẽ giúp bạn biến những lệnh này thành những script truy xuất địa chỉ IP ổn định hơn.

$ MYIP="$(ip a | grep 'inet.*global' | grep -v docker | sed 's|.*inet ||' | grep -o "^[\.0-9]\+")"; echo "${MYIP}"
10.10.0.20
$ MYIP="$(ip -s route get 1 | grep -o "src [\.0-9]\+" | grep -o "[\.0-9]\+")"; echo "${MYIP}"
10.10.0.20

Trong câu lệnh đầu tiên, chúng ta đã sử dụng lệnh ip a (viết tắt của “IP address”) để truy xuất danh sách tất cả các địa chỉ IP được gán cho máy hiện tại. Bạn có thể gõ trực tiếp lệnh ip a trong dòng lệnh Bash để quan sát định dạng đầu ra.

Sau đó, chúng ta lọc ra tất cả các adapter có địa chỉ inet ở chế độ global và loại bỏ các kết nối mạng liên quan đến Docker khỏi danh sách. Tuy nhiên, cần lưu ý rằng phương pháp này không hoàn toàn chính xác, vì một số phần mềm khác như SSH hoặc các chương trình ảo hóa như VirtualBox cũng có thể tạo ra giao diện mạng riêng và cần được lọc tương tự.

Dữ liệu đầu ra tiếp tục được xử lý bằng công cụ sed để loại bỏ phần thông tin phía trước từ khóa “inet”. Cuối cùng, ta sử dụng grep kết hợp biểu thức chính quy để tách ra địa chỉ IP đầy đủ theo định dạng IPv4.

Ngoài ra, bạn cũng có thể nhận thấy rằng cách làm này vẫn còn tồn tại một số hạn chế, ví dụ như việc xử lý địa chỉ IP phiên bản 6 (IPv6) hay xác định địa chỉ IP chính khi máy có nhiều adapter mạng.

Trong câu lệnh thứ hai, chúng ta tìm tuyến đường đầu tiên trên máy bằng cách dùng lệnh ip -s route get 1, sau đó xử lý đầu ra theo cách tương tự như trước. Phương pháp này có thể ổn định hơn khi mục tiêu là xác định địa chỉ IPv4 chính của hệ thống.

Hãy chia sẻ với chúng tôi phương pháp bạn thường dùng để truy xuất địa chỉ IP – đặc biệt là địa chỉ IPv4 chính – bằng cách sử dụng Bash scripting nhé!

Ví dụ 2: Rủi ro của Globbing và sự cần thiết của việc đặt dấu nháy đúng cách

Giả sử bạn tạo ra 3 file có tên: ab và c, sau đó chạy 2 lệnh echo như sau:

$ touch a b c
$ echo "$(echo "*")"
*
$ echo $(echo "*")
a b c

Giải thích:
Trong ví dụ này, bạn đầu tiên tạo ra 3 file: ab và c. Sau đó, lệnh đầu tiên sử dụng câu lệnh echo "*", với dấu * được đặt trong dấu nháy kép bên trong subshell $(), dẫn đến việc in ra ký tự * theo nghĩa đen. Còn lệnh thứ hai không đặt dấu nháy cho * nên Bash sẽ hiểu * là một “filename identifier” (tham chiếu đến các file trong thư mục), do đó liệt kê ra danh sách các file a b c.

Để minh họa rõ ràng, bạn có thể thử:

$ echo *
a b c

Qua đó, ta thấy sự cần thiết phải luôn đặt dấu nháy đúng cách cho bất kỳ chuỗi nào có thể bị hiểu là tên file, ngay cả khi chuỗi đó đã được đặt dấu nháy bên trong subshell như trường hợp $(echo "*").

Kết luận

Trong nội dung hôm nay, bạn đã được hướng dẫn chi tiết cách xác định địa chỉ IP máy chủ bằng nhiều phương pháp Bash khác nhau – từ cơ bản đến nâng cao – đồng thời nhận diện ưu, nhược điểm của từng cách tiếp cận để tối ưu hóa theo từng môi trường mạng thực tế.

Bên cạnh đó, bài viết cũng làm rõ rủi ro tiềm ẩn của Bash globbing – hiện tượng ký tự đại diện tự động mở rộng thành tên file – và lý do vì sao việc đặt dấu nháy đúng cách khi xử lý chuỗi là cực kỳ quan trọng để tránh lỗi logic không mong muốn trong quá trình viết shell script.

Với kiến thức thực tế và ví dụ minh họa rõ ràng, bạn hoàn toàn có thể áp dụng ngay vào công việc hệ thống, DevOps hoặc tự động hóa quy trình trên nền tảng Linux.

Các ví dụ về mẹo và thủ thuật dòng lệnh Bash hữu ích – Phần 1

Các ví dụ về mẹo và thủ thuật dòng lệnh Bash hữu ích – Phần 2

Các ví dụ về mẹo và thủ thuật dòng lệnh Bash hữu ích – Phần 3

Các ví dụ về mẹo và thủ thuật dòng lệnh Bash hữu ích – Phần 4

Các ví dụ về mẹo và thủ thuật dòng lệnh Bash hữu ích – Phần 5

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *