Xin chào,
Hôm nay chúng ta sẽ học tiếp về những operator còn lại trong series Linux Căn Bản. Chúng ta cũng sẽ có một thử thách nho nhỏ đó là lấy password của account shiba3 dựa vào những kiến thức đã học. Cuối bài mình cũng có chia sẻ vài thủ thuật nhỏ khi sử dụng giao diện dòng lệnh.
Chúng ta cùng vào bài nhé.
1 – Operator && (Task 16)
Operator “&&” hay còn gọi là operator “and”. Bạn nào có kiến thức về lập trình sẽ biết operator “and” được dùng để kiểm tra xem input có thỏa mãn tất cả điều kiện được đặt ra hay không.
Trong Linux Command Line, operator “and” sẽ khác biệt một chút. Cụ thể, operator “and” trong Linux Command Line được dùng khi bạn muốn thực thi câu lệnh thứ 2 sau khi câu lệnh thứ nhất đã được thực thi thành công.
Thực tế với operator “&&” con số câu lệnh bạn muốn thực thi cùng một lúc không giới hạn ở con số 2, bạn có thể dùng lệnh && để nối bao nhiêu lệnh lại với nhau tùy thích, miễn là các lệnh phía trước operator “&&” phải có nghĩa (thực thi được). Ví dụ 1

Như các bạn thấy trong hình bên trên, mình dùng lệnh touch để tạo file tuhocnetworksecurity.txt sau đó dùng lệnh ls -l để liệt kê tất cả các file và directory hiện đang chứa trong directory hiện tại. Ở giữa hai lệnh, mình nối bằng operator “and”, vì cả 2 lệnh này đều có nghĩa, nên cả câu lệnh đã được thực thi.
Ở ví dụ 2, mình sẽ demo như sau

Ở đây, mình đã nối 4 câu lệnh lại với nhau bằng operator “and”, vì tất cả câu lệnh đều có nghĩa, nên tất cả đều được thực thi.
Chúng ta sẽ đi đến ví dụ 3

Ở ví dụ trên, như bạn thấy bên trái của operator “and” mình gõ một dãy giá trị vô nghĩa và bên phải operator “and” là lệnh ls -l. Vì dãy kí tự bên trái của mình không phải là một câu lệnh có nghĩa, dẫn đến cả câu lệnh không được thực thi.
Ví dụ 4

Ở ví dụ này chúng ta có thể thấy 2 câu lệnh và 1 chuỗi giá trị vô nghĩa được nối với nhau bởi 2 operator “and”.
- Câu lệnh đầu tiên echo “Hello” là một câu lệnh có nghĩa
- Chuỗi giá trị abcdefg không phải là một câu lệnh có nghĩa
- Câu lệnh ls -l là một câu lệnh có nghĩa
Như ở trong hình các bạn sẽ thấy, lệnh echo “Hello” được thực thi thành công, nên nó đã chuyển đến câu lệnh tiếp theo là câu lệnh abcdefg, vì đây không phải là lệnh có nghĩa, nên nó báo lỗi “command not found” và không thực thi tiếp câu lệnh thứ 3 là ls -l.
2/ Operator & (Task 17)
Operator “&” không có hề liên quan đến operator “&&”. Operator “&” là một backgroup operator (operator nền). Ví dụ như bạn thực thi một lệnh mất tầm 10 giây. Trong suốt 10 giây này, bạn sẽ không thể thực thi bất kỳ câu lệnh nào khác. Tuy nhiên với operator “&”, dù một câu lệnh đang được thực thi, bạn vẫn có thể thực thi một câu lệnh khác mà không cần phải chờ cho câu lệnh kia thực thi xong. Ví dụ

Mình dùng lệnh sleep tạm đóng băng toàn hệ thống trong vòng 10 giây. Trong vòng 10 giây này, mình không thể gõ bất cứ câu lệnh hay thực thi bất cứ câu lệnh nào. Bạn nào muốn tìm hiểu về lệnh sleep thì có thể tự tra cứu bằng command man sleep nhé.

Bây giờ, khi dùng operator “&” chúng ta sẽ được như hình bên dưới

Ở đây, mình đã cho hệ thống tạm ngủ trong 30 giây với lệnh sleep 30. Khi mình có thêm operator “&”, bạn sẽ thấy kết quả được trả về chính là process number của lệnh sleep đang được thực thi. Mình dùng lệnh ps để kiểm tra, thì sẽ thấy số process 1556 đang chạy lệnh sleep (Mình sẽ nói kỹ hơn về lệnh này ở task 41)
Sau đó mình thực hiện một loạt các lệnh khác như ls -l và cat mà không cần phải chờ máy hết 30 giây mới thực thi được các lệnh khác.
3/ Operator $ (Task 18)
Operator “$”, mình đã có đề cập đến một lần ở bài số 3 của Linux Căn Bản, phần 2 – Lệnh echo. Mình xin nhắc lại một tí nhé.
Operator “$” được dùng để gọi một biến (variable) trong hệ thống máy tính (environment variable). Cú pháp (syxtax) của nó như sau
$<TÊN-BIẾN>

Ở hình H8 bên trên, khi mình dùng lệnh echo $USER, mình đã in ra được giá trị được gán với biến USER trong hệ thống Linux. Nếu không có operator “$”, mình sẽ chỉ in ra chữ USER mà thôi.
Các bạn lưu ý là hệ thống Linux có phân biệt chữ viết hoa và viết thường (case sensitive). $user và $USER là 2 biến hoàn toàn khác nhau. Các biến trong hệ thống Linux thường được viết bằng chữ in hoa ví vụ như USER, HOME, PATH, v.v. Các biến trong hệ thống Linux đều được gán bởi hệ thống Linux và được sử dụng để đảm bảo hệ thống chạy ổn định và đúng đắn, trong hầu hết các trường hợp, bạn không nên thay đổi giá trị của các biến này.
Tuy nhiên, nếu bạn là pentester, sẽ có lúc bạn phải thay đổi giá trị của variable nhằm một mục đích nào đó ví dụ nâng cấp quyền quản trị (privilege escalation) chẳng hạn. Nhưng đó là một câu chuyện khác và chúng ta sẽ đề cập trong một series khác nhé.
Chúng ta có thể dùng giá trị được gán cho biến để tạo một file có cùng tên như bài thực hành sau.

Trong hình H9 bên trên, mình đã làm những việc sau:
- Mình in ra giá trị được gán cho variable USER
- Mình dùng lệnh touch để tạo một file có tên là giá trị được gán cho variable USER. Tuy nhiên vì trong directory hiện tại đã có một file tên shiba2 rồi, nên hệ thống không thể tạo ra một file có cùng tên được.
- Mình quyết định dùng lệnh mkdir để tạo một directory mới tên sample và dùng lệnh cd để chuyển đến directory mới tạo (2 lệnh này mình sẽ nói thêm ở task 29).
- Ở bên trong directory sample, mình dùng lệnh echo để kiểm tra giá trị của biến USER một lần nữa và dùng lệnh touch để tạo một file có tên là giá trị được gán cho biến USER. Ở đây giá trị đó là “shiba2”.
- Mình dùng lệnh ls để show ra toàn bộ file và directory đang có trong directory hiện tại, thì thấy file shiba2 đã được tạo.
- Mình dùng operator “>>” để thêm nội dung cho file shiba2 và sau đó xuất nội dung ra bằng lệnh cat.
Tiếp theo, chúng ta sẽ thực hành tạo và gán giá trị cho variable. Các bạn gõ theo cú pháp sau
<TÊN-BIẾN>=<GIÁ-TRỊ-CẦN-GÁN>
Ví dụ

Ở hình trên mình đã tạo ra 2 biến, một là hoten và hai là page. Sau đó mình đã dùng lệnh echo để in ra giá trị đã gán cho cả 2 biến.
Để thay đổi giá trị của 2 biến trên, các bạn có thể dùng lệnh export (vì lệnh export không có manual page nên các bạn không thể tra cứu cách dùng bằng lệnh man export được, tuy nhiên các bạn có thể tra cứu cách dùng nhanh lệnh export bằng flag –help
export --help
Hoặc bạn có thể tra cứu thêm tại trang sau)
Các bạn thay đổi giá trị đã gán cho biến theo cách như sau

Với cú pháp
export <TÊN-BIẾN>=<GIÁ-TRỊ-MỚI>
Mình đã thay đổi giá trị được gán cho biến hoten từ vincent thành sombody. Giá trị của biến page cũng được mình thay đổi từ tuhocnetworksecurity sang youtube.com.
Ngoài ra, bạn cũng có thể dùng lệnh export để tạo variable theo cú pháp sau
export tên-biến-cần-tạo=giá-trị-gán

Với lệnh export, mình đã tạo ra một biến có tên là number và gán vào đó chuỗi số 123456. Sau đó mình in giá trị được gán ra bằng lệnh echo.
2 câu hỏi ở task 18 khá dễ nên các bạn tự làm nhé.
Gợi ý:
- Câu 1: Hãy để ý độ dài và khoảng cách của các dấu chấm trong ô trả lời.
- Câu 2: Tất cả tên của các environment variable đều là ký tự in hoa.
4/ Operator | (Task 19)
Operator “|” hay còn được gọi là pipe line. Đây là một operator đặc biệt sử dụng output của command đứng trước làm input cho command đứng sau nó.
Mình sẽ cho các bạn một ví dụ như sau

Trong hình H13 bên trên, đầu tiên mình dùng lệnh ifconfig -a để kiểm tra xem máy Linux hiện tại đang có bao nhiêu network interface và IP và MAC address của mỗi interface là bao nhiêu. Vì thông tin xuất ra có quá nhiều chi tiết mà mình không cần, nên mình sẽ dùng pipe line để lấy output của lệnh ifconfig -a sau đó dùng nó làm input cho lệnh grep inet.
Lệnh grep có chức năng là tìm từ khóa (ở đây là inet) trong dữ liệu được cho (ở đây là output của lệnh ifconfig -a). Khi tìm được những dòng chứa từ khóa inet, lệnh grep sẽ in những dòng đó ra như ta thấy bên trên. Dựa vào kết quả được trả về, ta biết rằng máy hiện đang có 2 network interfaces. Một là network interface chính có IPv4 là 10.10.227.38/16 và một có là loopback interface có IPv4 là 127.0.0.1/8.
Chúng ta sẽ học thêm về lệnh grep ở task 32 nhé.
Dành cho bạn nào chưa biết thì “inet” là từ dùng để chỉ địa chỉ IP trong hệ thống Linux.
- IPv4 = inet
- IPv6 = inet6
Phòng Learn Linux Try Hack Me cho bạn một ví dụ khác về pipeline như sau

Ở đây, chúng ta dùng lệnh echo tạo một file có tên test.txt. File này chứa 4 nội dung khác nhau. Để kiểm tra xem trong file những dòng nào chứa từ khóa “hoc” chúng ta sẽ sử dụng lệnh cat để in nội dung của file ra sau đó chúng ta dùng pipeline lấy output của lệnh cat và chuyển vào lệnh grep để tìm từ khóa “hoc”. Và kết quả chúng ta đã tìm được 3 dòng có chứa từ “hoc” trong file test.txt.
5/ Operator ; (Task 20)
Operator “;” hoạt động tương tự như operator “or” trong lập trình.
Trong Linux Command Line, operator “;” khác với operator “&&” ở chỗ, operator “;” không yêu cầu command phía trước phải có nghĩa. Nghĩa là không cần biết command phía trước operator “;” có nghĩa hay không, command sau operator “;” vẫn sẽ được thực thi.
Chúng ta có ví dụ sau

Trong ví dụ bên trên, ở bên trái của operator “;” mình cố tình nhập một dãy giá trị không có nghĩa và bên phải operator “;” là lệnh ifconfig. Như bạn thấy, mặc dùng dãy giá trị “abhjhkhku” không có nghĩa và bị báo lỗi “command not found”, nhưng lệnh phía sau là ifconfig vẫn được thực thi.
Không giống với bên dưới, khi mình dùng operator “&&”, khi dãy giá trị báo lỗi “command not found”, lệnh ifconfig đã không được thực thi tiếp.
Bạn có thể dùng operator “;” để nối nhiều lệnh lại với nhau

Chính vì tính chất đặc biệt này của operator “;” mà nó rất hay được dùng để thực hiện tấn công Command Injection.
6/ Task 21: Lấy mật khẩu cho account shiba3

Với những gì mà mình đã giải thích trong ngày hôm nay, các bạn thử ứng dụng để lấy password cho account shiba3 nhé. Đáp án sẽ được mình công bố vào bài tiếp theo.
7/ 3 thủ thuật căn bản khi dùng giao diện dòng lệnh
7a/ Ctrl + C
Khi một lệnh đang chạy, và bạn muốn dừng nó lại, bạn có thể bấm tổ hợp phím Ctrl + C. Một ví dụ đó là khi bạn dùng lệnh ping trên Linux, hệ thống sẽ ping máy mục tiêu không ngừng cho đến khi bạn dừng nó lại bằng tổ hợp Ctrl + C.
7b/ Phím Tab
Trong giao diện CLI còn được gọi là phím autocomplete. Phím tab được sử dụng rất nhiều để gia tăng tốc độ gõ lệnh. Ví dụ khi bạn muốn xem nội dung chứa trong file tuhocnetworksecurity.txt, nếu directory hiện tại có chứa file mang tên tuhocnetworksecurity.txt, thay vì phải gõ nguyên tên, bạn chỉ cần gõ tu + tab. Bạn sẽ thấy phím tab tự đồng điền đầy đủ thông tên file cho bạn.
Tuy nhiên, nếu trong directory hiện tại có 2 files mang tên như sau:
- tu-hoc-cybersecurity
- tu-hoc-linux-can-ban
Khi bạn gõ tu + tab, phím tab sẽ chỉ cho ra kết quả “tu-hoc-” mà thôi vì nó không biết bạn sẽ chọn file số 1 hay file số 2. Nên nếu bạn muốn chọn file số 2, bạn phải gõ tu-hoc-cy + tab, thì lúc này phím tab mới có thể hoàn thành file được. Nghĩa là khi tên của các file khác nhau có những thành phần giống nhau, bạn phải gõ tên file cho đến khi qua những thành phần giống nhau kia thì bạn mới dùng phím tab để autocomplete file name được.
7c/ Phím mũi tên lên và xuống
Bạn có thể dùng phím mũi tên lên để truy cập ngược về những command mà mình đã từng thực thi và phím mũi tên xuống để đưa bạn trở về lại những câu lệnh gần nhất. Nói một cách dễ hiểu là phím mũi tên lên sẽ cho bạn đi ngược về quá khứ những câu lệnh trong quá khứ và phím mũi tên xuống dẫn bạn về lại hiện tại.

Cám ơn các bạn và chúc các bạn học tốt,
Vincent Nguyễn