Giải ngố Kali Linux – Phần 4: Ép xung tốc độ thao tác Command Line với Bash và nhập môn Bash Script

Tiếp theo nội dung  Phần 3: Quản lý package và vấn đề Kali Linux update với Advanced Package Tool – apt kỳ này tôi chuyển sang một nội dung khá thú vị là bash – Bourne Again Shellbash script. Cái này thực ra phổ biến trên Linux OS nói chung không riêng gì thằng Kali Linux. Tuy nhiên, khá nhiều tác vụ đặc thù với Kali Linux có thể được xử lý hiệu quả hơn với bash (và bash script) nên tôi sẽ gom vào đây nói luôn.

#1 Bash – Bourne Again Shell là gì

Như tôi đề cập trong nội dung Giải ngố Linux – Phần 2: Linux Filesystem và các đòn cơ bản để duyệt và quản lý file với Command Line về mối quan hệ mờ ám của Command LineShell:

“…Trước hết, Command Line Interface – CLI (Text-based interface hay giao diện dòng lệnh) nói chung là giao diện dạng text cho phép bạn nhập command, thực thi nó và xem kết quả thực thi (cũng ở dạng text). Để làm được điều này, nó sẽ nhờ cậy vào một nhân vật có tên gọi là Command Interpreter (đại ý là thằng thông dịch command cho máy hiểu) hay gọi bằng tên quen thuộc hơn là “The Shell” (trong Kali Linux mặc định là Bash – Bourne Again Shell)…”

Như vậy Shell giống như thằng thông dịch viên (Command Interpreter), mỗi lần bạn gõ command và nhấn Enter thì nó quay sang dịch lại cho thằng computer hiểu bạn vừa mới “nói” command gì để biết đường chạy.

Lưu ý: Bạn có thể đâu đó gặp một thằng khác có tên gọi là Complier (tiếng Việt gọi là trình biên dịch). Điểm khác biệt quan trọng với InterpreterComplier chờ bạn “nói” hết tất cả tâm tư nguyện vọng rồi nó sẽ dịch một lần cho máy hiểu (và làm) chứ không chơi kiểu dịch từng “câu” đứt quãng như Interpreter.

Bàn về con đường và sự nghiệp của dòng họ nhà Shell sẽ rất tốn giấy mực nên tôi xin phép giới thiệu tóm lược bằng hình sau (bạn có thể xem thêm thông tin chi tiết theo nguồn tôi đính kèm).

Evolution of shells in Linux
Evolution of shells in Linux

Nguồn: Evolution of shells in Linux – IBM Developer

Trong cây gia phả nói trên, có hai đối tượng mà tôi đặc biệt quan tâm là sh – The Bourne Shellbash – Bourne Again Shell. Như bạn thấy, thằng bash này là đệ tử chân truyền của sh, một nhân vật kỳ cựu của Unix shell. Với việc thừa hưởng võ nghệ của sh và kết hợp các tính năng hữu ích từ ksh – KornShellcsh – C shell, ngoài các phần mở rộng bổ sung, bash còn có thêm 2 nâng cấp đáng giá là Tab completionHistory (Tôi sẽ bàn kỹ thêm trong Mục 3).

Quay trở lại vấn đề thực tế, trên con Kali Linux, bạn có thể xem các loại Shell có trên hệ thống với command:

cat /etc/shells

cat /etc/shells
cat /etc/shells

Và xác định loại Shell đang sử dụng mặc định với command:

echo $0
echo $0

Kết quả là bash giống như tôi giới thiệu ở trên.

Với command echo $0, tôi nghĩ bạn có thể đoán chức năng của echo kiểu như hiển thị nội dung nhưng cái cục $0 có vẻ hơi quái! Tôi sẽ bàn kỹ hơn về cái này ngay bên dưới.

#2 Bash và Environment Variables (Biến môi trường)

Hình dung thế này, mặc định trên con Kali Linux, mỗi khi bạn mở một terminal thì một bash process với các Environment Variables tương ứng sẽ được khởi tạo. Các biến này thường là các thiết lập hệ thống trong đó phổ biến nhất là PATH (danh sách các đường dẫn thư mục mà bash sẽ tra cứu khi bạn chạy command mà không cung cấp full path). Để biết có Environment Variable nào trên Kali Linux, bạn có thể dùng command:

env

env
env

Như vậy cái $0 bạn gọi ở trên tương ứng với dòng đầu tiên SHELL=/bin/bash. Để xem nội dung của một Environment Variable cụ thể bạn có thể dùng command:

echo $Environment_Variable_Name

Ngoài PATH thì còn một số Environment Variables quan trọng khác như USER (username), PWD (thư mục làm việc hiện hành) và HOME (thư mục Home). Bạn có thể kiểm tra với các command sau:

echo $PATH

echo $USER

echo $PWD

echo $HOME

Environment Variables
Environment Variables

Ngoài ra, bạn cũng có thể định nghĩa Environment Variables với export command. Cái này sẽ khá hữu ích trong tình huống bạn cần nhập liệu một thông số nhiều lần. Ví dụ bạn có thể định nghĩa Environment Variables cho địa chỉ IP của mục tiêu cần nghiên cứu bằng command:

export tar_ip=8.8.8.8

Sau đó bạn có thể sử dụng Environment Variable tar_ip để tiết kiệm công sức (và hạn chế sai sót) trong quá trình nhập liệu cho các tác vụ sử dụng cái địa chỉ IP nói trên.

ping -c 2 $tar_ip

ping -c 2 $tar_ip
ping -c 2 $tar_ip

Lưu ý: Với export, các subprocess bạn gọi từ shell hiện hành cũng có thể sử dụng Environment Variable đã định nghĩa (nếu không có export thì nó sẽ chỉ hiệu lực với shell hiện hành)

#3 Tăng tốc thao tác Command Line với các mánh Tab Completion và History của Bash

#3.1 Tab Completion

Tab Completion là dạng tính năng auto-complete filename và directory path (và cả command name) của bash shell với phím Tab. Tính năng này cực kỳ hữu ích trong việc giúp bạn tăng tốc xử lý vơi các filename hoặc directory path dài ngoằng. Ví dụ, tại vị trí hiện hành, tôi đang có danh sách file và directory sau.

ls -l
ls -l

Bạn để ý cái directory “long_dir_name” minh họa cho một cái directory với tên dài dòng khó nhớ. Giờ nếu tôi cần di chuyển vô bên trong directory này tôi chỉ cần gõ command:

cd l[Tab]

Khi đó bash sẽ chạy auto-complete để đổi thành command cd long_dir_name/ giùm tôi.

Lưu ý: Trường hợp có nhiều hơn có nhiều hơn 1 tùy chọn, bạn sẽ cần cung cấp ký tự kế tiếp cho đến khi hệ thống xác định chỉ còn một tùy chọn để chạy auto-complete.

#3.2 History

Tiếp đến là các mánh với History của bash để hỗ trợ bạn tăng tốc độ xử lý với command dài cần chạy nhiều lần. Như bạn biết đấy (nếu chưa thì bây giờ biết), ngoài đám command ngắn gọn dễ nhớ như ping, ls, đôi lúc bạn có thể phải nhập một số command khó nhớ (ví dụ như sudo vi /var/run/postgresql/.s.PGSQL.5432). Để tránh bị ức chế do gõ sai nhiều lần, bạn có thể trông cậy vào vị cứu tinh History của bash. Rất đơn giản, để kiểm tra lịch sử cào phím trên shell, bạn chạy command:

history

history
history

Lúc này shell sẽ hiển thị cho bạn danh sách các command đã chạy với line number tương ứng (cái output trên tôi cắt bớt rồi chứ thực tế nó dài lắm) và bạn cần chạy lại thằng nào thì cứ việc gõ command:

!line_number

!line_number
!line_number

Nếu cần chạy lại ngay command trước đó bạn có thể dùng command

!!

!!
!!

Lưu ý: Mặc định command History sẽ được lưu trong file .bash_history tại user home directory. Và bạn có 2 Environment Variable để kiểm soát dữ liệu History với:

  • HISTSIZE kiểm soát số command lưu trữ trong bộ nhớ của phiên làm việc hiện hành;
  • HISTFILESIZE kiểm soát số command được lưu trong history file.

Đám Environment Variable này có thể được chỉnh sửa là lưu vào file cấu hình của bash (.bashrc)

Ngoài phương án trên bạn còn có thể triển với các keyboard shortcut phổ biến như sau:

  • Mũi tên lên: Đi lùi về trong command History
  • Mũi tên xuống: Đi tiến tới trong command History

Ngoài ra, bạn còn có combo bẩn bựa Ctrl + R để gọi reverse-i-search

Với thằng này, bạn gõ một ký tự  thì hệ thống sẽ hiển thị command trong History tương ứng có chứa ký tự mà bạn mới gõ. Khi nào tìm được command cần thiết bạm bấm Enter để thực thi.

reverse-i-search
reverse-i-search

#4 Bash script là gì?

Bash script hiểu đơn giản là script chạy với Command Interpreter bash. Như vậy tôi có thể gượng ép mà phát biểu rằng khi run echo “Hello World” với bash là tôi đang chạy 1 bash script. Tuy nhiên, thực tế bash script thường ở dạng kết hợp nhiều command và gom vô một file *.sh để thực hiện tác vụ theo một kịch bản nhất định như ví dụ sau.

bash script example
bash script example

Tất nhiên ở đây tôi không tập trung vào chức năng của cái script nói trên mà chỉ dùng nó để minh họa một số điểm cần lưu ý của bash script:

  • Ở dòng đầu tiên bạn sẽ thấy một đối tượng với ký hiệu “#!”. Thằng này có tên gọi là Shebang với vai trò thông báo cho hệ điều hành biết file script sẽ được thực thi bằng Interpreter nào (trong ví dụ trên là bin/bash). Nếu bạn không quy định gì cả thì mặc định script sẽ được xử lý với sh;
  • Với các dòng bắt đầu với ký tự “#” (She) – ký tự đại diện cho nội dung comment, nội dung để phục vụ người đọc nên bash nó sẽ bỏ qua chứ không xử lý;
  • Sẽ có thể xuất hiện một số Variable đặc biệt trong bash script như $0 (tên của file script, còn $1 sẽ là argument thứ 1), $# (Số lượng của tham số truyền vào);
  • Hỗ trợ việc xây dựng các kịch bản với các câu lệnh điều kiện như đoạn if trong bash script minh họa trên.

Hy vọng đến đây bạn đã thu lượm được vài mánh hữu ích để tăng tốc cho quá tình thao tác Command Line với bash cũng như ý tưởng tổng thể về bash script. Nếu có thể, tôi sẽ sắp xếp bàn kỹ thêm về bash script trong các kỳ sau.

4 thoughts on “Giải ngố Kali Linux – Phần 4: Ép xung tốc độ thao tác Command Line với Bash và nhập môn Bash Script”

Leave a Reply

Your email address will not be published. Required fields are marked *