You are on page 1of 8

Question: List some other popular Linux shells and describe their

hightlighted features
Ans:
Hiện tại trên thế giới tồn tại khá nhiều Linux shells khác nhau được
phát triển bởi nhiều lập trình viên. Trong đó, có 5 Linux shells khá nổi
trội hơn là bash, ksh, tcsh, fish, zsh.
Bash - GNU Bourne-Again Shell : là shell phổ biến nhất, mặc
định trên hầu hết các bản phân phối của Linux ( Linux Distro). Tiền thân
của Bash là Bourne Shell (sh), là một trong những shell gốc của Linux.
Bash có những tính năng hấp dẫn đối với các lập trình viên là họ có thể
chuyển trực tiếp các tập lệnh của mình sang bash mà hoàn toàn được giữ
nguyên, và một số cải tiến như hoàn thành lệnh và lịch sử lệnh. Nhưng
việc ghi và đọc bash không phải lúc nào cũng dễ dàng.

Ksh - KornShell: là một Shell đầy mạnh mẽ và linh hoạt khi kết
hợp tính năng ưu việc của Bourne shell và C shell. Có thể kể đến một số
tính năng như: Job control, hỗ trợ biểu thức chính quy, tính năng
nhập/xuất nâng cao, tăng tốc việc thực thi, vấn đề bảo mật,...

Tcsh - Tennex CShell: đây là một phiên bản nâng cấp của C
shell, cung cấp tính năng cho việc chỉnh sửa command line, lịch sử
command và cả job control.
• Chỉnh sửa dòng lệnh: Tcsh hỗ trợ tính năng chỉnh sửa dòng lệnh
nâng cao, gồm tìm kiếm lịch sử, tự động hoàn thành (tab), thiết lập key
bindings.
• Job control: Tcsh cho phép ta có thể quản lý đa tiến trình
(processes và jobs) trên cùng một background, cung cấp lệnh để kiểm
soát việc thực thi này.
• Scripting: Tcsh cung cấp nhiều tính năng để viết và thực thi
shell scripts, như vòng lặp, câu lệnh điều kiện, mảng,...

Fish - Friendly Interactive Shell: là một tools thay thế cho


command line bash mặc định của Windows, Linux, MacOS, nó giúp cho
việc thực thi các lệnh bash trở lên đơn giản hơn, có tính tương tác hơn và
giao diện thân thiện với người dùng hơn.
• Giao diện thân thiện với người dùng: Fish bao bồm một giao
diện dòng lệnh đơn giản và trực quan hơn với highlighted syntax và error
message dễ đọc. Có thể tùy ý config những màu mà mình thích, cho
những đối tượng thích hợp trong một câu command.
• Khả năng gợi ý - Autosuggestions: báo cho bạn biết một câu
lệnh có gõ sai hay không, một thư mục có tồn tại hay không ... hay cả
những gợi ý về các câu lệnh đã gõ từ trước, gợi ý về câu lệnh dựa trên
document của câu lệnh đó.
Zsh - Z Shell: là một phương án thay thế phổ biến cho Bash, một
shell mở rộng của Unix, cũng được gọi là Z shell. Nó cũng cung cấp một
tập hợp các tính năng mở rộng và các cấu hình để tăng cường trải nghiệm
làm việc với shell. Ví dụ:
• Chỉnh sửa command line: chế độ tab completion với hệ thống
gợi ý tùy theo ngữ cảnh (context-sensitive suggestion), tự kiểm tra và sửa
lỗi chính tả hay thiết lập key bindings.
• Tự động định dạng tên tệp: Zsh có thể tự động hoàn thành tên
tệp hay thư mục, ngay cả cho các đường dẫn phức tạp với các biến và ký
tự đặc biệt.
• Cấu hình: Zsh cho phép tùy chỉnh shell environment và shell
behaviors theo nhiều cách, sử dụng các tùy chọn, biến cũng như các tệp
cấu hình (configuration files).

Question: Compare the Output Redirection (>/>>) with the Piping (|)
technique.
Ans:
Điều hướng đầu ra (Output Redirection) và Đường nối (Piping) đều
là những kỹ thuật được sử dụng trong giao diện command line để thao tác
với các luồng dữ liệu bao gồm: standard input (stdin), standard output
(stdout) và standard error (stderr). Thế nhưng giữa chúng có những sự
khác biệt, cụ thể như nhau:
• Thứ nhất, về ký kiệu: trong linux piping có kí hiệu là dấu gạch
đứng (|), còn Output Redirection có các kí hiệu như >, >>, 2 >.
• Thứ hai, về tính năng:
– Kỹ thuật điều hướng đầu ra được sử dụng để điều
hướng đầu ra của một lệnh đến một tập tin. Dấu ">" sẽ ghi đè nội dung
lên tập tin đích, trong khi ">>" sẽ ghi đầu ra vào cuối tập tin, còn "2>" sẽ
lưu output vào tập tin chỉ khi có lỗi xuất hiện.
– Kỹ thuật đường ống (Piping) được sử dụng để lấy đầu
ra của một lệnh và sử dụng nó làm đầu vào cho một lệnh khác.
• Ví dụ cụ thể:
1. Đối với Output Redirection:
– Để tạo một tập tin với đầu ra của một lệnh: Lệnh "ls >
file.txt" sẽ điều hướng stdout của lệnh "ls" đến một tập tin có tên là
"file.txt", ghi đè lên bất kỳ nội dung hiện có nào. Nếu tập tin chưa tồn tại,
nó sẽ được tạo ra.
– Để thêm đầu ra của một lệnh vào cuối một tập tin đã có:
Lệnh "ls » file.txt" sẽ thêm đầu ra của lệnh "ls" vào cuối tập tin "file.txt".
Nếu tập tin chưa tồn tại, nó sẽ được tạo ra.
– Để điều hướng đầu ra của một thông báo lỗi đến một
tập tin: Lệnh "command 2> error.txt" sẽ điều hướng đầu ra của thông báo
lỗi được tạo ra bởi "command" đến một tập tin có tên là error.txt".
2. Đối với Piping:
– Để tìm kiếm một chuỗi cụ thể trong đầu ra của một
lệnh: Lệnh "ls | grep’test’" sẽ lấy đầu ra của lệnh "ls" (một danh sách các
tập tin và thư mục) và đưa nó vào lệnh "grep", lệnh này sẽ tìm kiếm bất
kỳ tập tin hoặc thư mục nào có chữ "test" trong tên của chúng.
– Để đếm số dòng trong đầu ra của một lệnh: Lệnh "ls |
wc -l" sẽ lấy đầu ra của lệnh "ls" và đưa nó vào lệnh "wc", lệnh này sẽ
đếm số dòng trong đầu ra.
– Để sắp xếp danh sách các tập tin và thư mục: Lệnh "ls |
sort" sẽ lấy đầu ra của lệnh "ls" và đưa nó vào lệnh "sort", lệnh này sẽ sắp
xếp danh sách theo thứ tự bảng chữ cái.

Question:: Compare the sudo and the su command.


Ans:
Cả hai lệnh "sudo" và "su" đều được sử dụng trong các hệ điều hành
Unix-based để thực thi các lệnh với đặc quyền cao hơn. Tuy nhiên, có
một số khác biệt quan trọng giữa hai lệnh này.

1. Về user context:
• Lệnh "su" là viết tắt của "switch user" được sử dụng để
chuyển đổi giữa những tài khoản người dùng khác nhau, thường là tài
khoản root, bằng cách nhập mật khẩu của tài khoản đó. Điều này có nghĩa
là user context được thay đổi hoàn toàn thành context của tài khoản người
dùng mới.
• Ngược lại, lệnh "sudo" có nghĩa là "super user do" hay
"substitute user do" cho phép một người dùng thực thi một lệnh như một
superuser hoặc người dùng khác mà không cần chuyển sang tài khoản
người dùng đó. Người dùng cần nhập mật khẩu của chính họ, không phải
mật khẩu của tài khoản người dùng đích.
2. Về đặc quyền: Lệnh "su" cấp quyền truy cập root đầy đủ cho
người dùng, điều này có thể nguy hiểm nếu người dùng không cẩn thận.
Ngược lại, "sudo" cho phép quản trị viên cấp quyền cụ thể cho một người
dùng hoặc một nhóm người dùng. Ví dụ, một quản trị viên có thể cấp
quyền cho một người dùng thực thi một lệnh cụ thể với quyền root mà
không cần cấp cho họ quyền truy cập root đầy đủ. Sự kiểm soát chi tiết
quyền này là một lợi thế đáng kể của lệnh "sudo".
3. Về tính bảo mật: "sudo" cung cấp quyền kiểm soát chi tiết
hơn về những lệnh nào có thể được thực thi với đặc quyền cao hơn, và
bởi ai (by whom), khiến cho nó là một lựa chọn an toàn hơn so với "su".
4. Về cách xác thực: "su" yêu cầu mật khẩu của người dùng mục
tiêu để chuyển đổi sang tài khoản của họ, trong khi "sudo" yêu cầu mật
khẩu của chính người dùng để xác thực lệnh với đặc quyền cao hơn.
Tóm lại, "su" được sử dụng để chuyển đổi sang một tài khoản
người dùng khác và có quyền truy cập đầy đủ vào đặc quyền của tài
khoản đó, trong khi "sudo" được sử dụng để thực thi một lệnh duy nhất
với đặc quyền cao hơn mà không cần chuyển đổi sang tài khoản người
dùng khác.

Question: Discuss about the 777 permission on critical services (web


hostings, sensitive databases,...).
Ans:
Phân quyền 777 trên các dịch vụ quan trọng như web hosting, cơ
sở dữ liệu nhạy cảm và các dữ liệu quan trọng khác được coi là một thực
hành bảo mật xấu vì nó cho phép quyền đọc, ghi và thực thi cho tất cả
người dùng trên hệ thống. Điều này có nghĩa là bất kỳ người dùng nào
cũng có thể truy cập, sửa đổi và thực thi bất kỳ tệp hoặc dữ liệu nào được
lưu trữ trên dịch vụ đó, đây có thể gây ra nhiều rủi ro bảo mật, bao gồm:
• Truy cập trái phép: Với quyền 777, bất kỳ người dùng nào trên
hệ thống đều có thể truy cập và sửa đổi các tệp hoặc dữ liệu được lưu trữ
trên các dịch vụ quan trọng này. Điều này gây nguy hiểm đặc biệt trong
một môi trường đa người dùng, nơi
không phải tất cả người dùng đều có quyền truy cập vào dữ liệu nhạy cảm.
• Sửa đổi độc hại: Quyền truy cập mở cung cấp bởi quyền 777 có
thể tạo ra một lỗ hổng cho các kẻ tấn công xâm nhập, chiếm đoạt hoặc
xóa dữ liệu nhạy cảm, cài đặt phần mềm độc hại hoặc gây cản trở cho các
dịch vụ.
• Tăng quyền: Nếu một người dùng không có đặc quyền truy cập
vào một dịch vụ với quyền 777, họ có thể sử dụng điều này để tăng quyền
và truy cập vào các phần khác của hệ thống.
• Vấn đề tuân thủ: Trong các ngành được quy định, sử dụng
quyền 777 trên các dịch vụ quan trọng có thể vi phạm yêu cầu tuân thủ và
tiềm ẩn rủi ro pháp lý hoặc tài chính. Để giảm thiểu các rủi ro này, cần
thiết phải thực hiện các biện pháp bảo mật phù hợp trên các dịch vụ quan
trọng, bao gồm:
• Hạn chế truy cập: Hạn chế quyền truy cập vào các dịch vụ quan
trọng chỉ cho những người dùng được ủy quyền và giới hạn quyền hạn
cần thiết để truy cập vào các dữ liệu và tệp tin đó.
• Phân quyền: Sử dụng phân quyền để đảm bảo rằng chỉ có
những người dùng được cấp quyền mới có thể truy cập và thực thi các tệp
và dữ liệu quan trọng.
• Tạo các tài khoản người dùng đặc biệt: Tạo ra các tài khoản
người dùng đặc biệt với quyền hạn giới hạn để truy cập các dịch vụ quan
trọng. Chúng ta cũng có thể sử dụng các công cụ để tạo ra các tài khoản
người dùng tạm thời cho những người dùng có nhu cầu truy cập.
• Kiểm soát truy cập từ xa: Sử dụng các giải pháp bảo mật để
kiểm soát và giám sát truy cập từ xa vào các dịch vụ quan trọng, bao gồm
sử dụng các kỹ thuật mã hóa để bảo vệ các dữ liệu nhạy cảm.

• Thực hiện các chính sách bảo mật nghiêm ngặt: Thiết lập các
chính sách và quy trình nghiêm ngặt để bảo vệ các dịch vụ quan trọng
khỏi các cuộc tấn công và lỗ hổng bảo mật. Đồng thời cần thường xuyên
kiểm tra và cập nhật các cấu hình bảo mật để đảm bảo rằng các dịch vụ
đang được bảo vệ tốt nhất.

Tóm lại, việc sử dụng quyền 777 trên các dịch vụ quan trọng như
web hosting, cơ sở dữ liệu nhạy cảm và các dữ liệu quan trọng khác là
một hành động bảo mật xấu, có thể gây ra nhiều rủi ro bảo mật cho hệ
thống. Để giảm thiểu các rủi ro này, chúng ta cần áp dụng các biện pháp
bảo mật phù hợp, bao gồm hạn chế truy cập, phân quyền và kiểm soát
truy cập từ xa để đảm bảo an toàn cho các dịch vụ quan trọng.

Question: 1.What are the advantages of Makefile? Give examples?


2.Compiling a program in the first time usually takes a
longer time in comparison with the next re-compiling. What is the reason?
3. Is there any Makefile mechanism for other programming
languages? If it has, give an example

Ans:
1. Makefile là một công cụ hữu ích trong quản lý dự án phần
mềm, được sử dụng để tự động hóa quá trình biên dịch và liên kết các mã
nguồn để tạo ra các tập tin thực thi. Dưới đây là một số lợi ích và ví dụ
của Makefile:
• Tự động hóa quá trình biên dịch: Makefile cho phép tự động
hóa quá trình biên dịch, giúp tiết kiệm thời gian và giảm thiểu các lỗi do
con người gây ra.
• Dễ dàng sửa đổi và cập nhật: Makefile cho phép dễ dàng sửa
đổi và cập nhật các mã nguồn, mà không cần phải biên dịch lại toàn bộ
chương trình.
• Phát triển độc lập với nền tảng: Makefile giúp đảm bảo tính độc
lập với nền tảng, cho phép chương trình có thể được biên dịch trên nhiều
hệ điều hành khác nhau.
• Tích hợp với hệ thống quản lý phiên bản: Makefile được tích
hợp với các hệ thống quản lý phiên bản như Git, SVN, để đảm bảo việc
theo dõi và quản lý các phiên bản của chương trình dễ dàng hơn.
• Dễ dàng tạo các tập tin thực thi và thư viện: Makefile giúp tạo
ra các tập tin thực thi và thư viện động một cách dễ dàng và linh hoạt.
Ví dụ: Khi bạn phát triển một ứng dụng C với nhiều tệp tin mã
nguồn. Bằng cách sử dụng Makefile, bạn có thể tạo một quy trình biên
dịch tự động để biên dịch tất
cả các tệp tin mã nguồn và liên kết chúng để tạo ra tệp tin thực thi. Ngoài
ra, bạn có thể sử dụng Makefile để cập nhật và quản lý phiên bản của
chương trình dễ dàng hơn.
Hay: Makefile có thể được sử dụng để tự động hóa quá trình biên
dịch và thu gọn lại web assets như HTML, CSS và JavaScript. Makefile
sẽ xác định các phụ thuộc giữa các tệp nguồn và sử dụng các công cụ như
`uglifyjs` hoặc `minify` để tạo ra các tệp đã thu gọn đó.

2. • Lý do tại sao việc biên dịch chương trình lần đầu tiên thường mất
nhiều thời gian hơn so với các lần biên dịch sau đó là do trong lần biên
dịch đầu tiên, toàn
bộ chương trình cần phải được biên dịch từ đầu. Quá trình này bao gồm
một loạt các bước bao gồm preprocessing, compilation, assembly, and
linking.
• Trong bước tiền xử lý (preprocessing), sẽ đọc mã nguồn (source
code) và thực hiện thay thế văn bản trên bất kỳ chỉ thị tiền xử lý nào được
tìm thấy. Trong bước biên dịch (compilation), trình biên dịch chuyển đổi
mã nguồn đã được tiền xử lý thành mã máy hoặc biểu diễn trung gian.
Trong bước assembly, assembler chuyển đổi biểu diễn trung gian thành
mã máy và trong bước linking, linker kết hợp mã máy với các mã thư
viện cần thiết nào để tạo ra tệp thực thi cuối cùng (executable file).
• Trong lần biên dịch đầu tiên, tất cả các bước này đều cần được
thực hiện trên toàn bộ chương trình, điều này có thể tốn nhiều thời gian.
Tuy nhiên, trong các lần biên dịch sau đó, chỉ những phần của chương
trình đã được thay đổi cần được biên dịch lại. Trình biên dịch cũng có thể
sử dụng dữ liệu được lưu trữ tạm thời và quy trình xây dựng được tối ưu
hóa để tăng tốc quá trình biên dịch.

3. Makefile có thể được sử dụng để xây dựng projects cho nhiều ngôn
ngữ lập trình khác ngoài C như C++, Python, Java, Go… Các nguyên tắc
cơ bản của việc sử dụng Makefile là giống nhau cho các ngôn ngữ lập
trình khác nhau, chỉ có chút khác biệt về các lệnh compile và build.

Đây là một ví dụ sử dụng Makefile cho một project Python:

# Define variables for the input and output directories


SRC_DIR = src
BUILD_DIR = build
BIN_DIR = bin

# Define the source files and executable name


SRCS := $(wildcard $(SRC_DIR)/*.py)
TARGET := $(BIN_DIR)/myprogram

# Define the compilation and linking commands


PYTHON := python3
PYFLAGS := -m py_compile
LINK := $(PYTHON) -m zipapp --output $(TARGET) --main
$(SRC_DIR)/main.py $(BUILD_DIR)

# Define the default target


.PHONY: all
all: $(TARGET)

# Define the build rules for the Python files


$(BUILD_DIR)/%.pyc: $(SRC_DIR)/%.py
$(PYTHON) $(PYFLAGS) -o $@ $<

# Define the build rule for the executable file


$(TARGET): $(patsubst$(SRC_DIR)/%.py,$(BUILD_DIR)/%.pyc,$(SRCS))
$(LINK)

# Define the clean target to remove all build artifacts


.PHONY: clean
clean:
rm -rf $(BUILD_DIR)/* $(BIN_DIR)/*

Giải thích ví dụ:


Trong ví dụ này, chúng ta định nghĩa các biến để đặt tên cho các
thư mục và tệp tin trong dự án, và định nghĩa các công cụ sẽ được sử
dụng để chạy các lệnh.

Mục tiêu được định nghĩa trong Makefile bao gồm:


all: tạo ra tệp thực thi myprogram từ các tệp nguồn
Python
Các quy tắc xây dựng được định nghĩa trong Makefile bao gồm:
$(BUILD_DIR)/%.pyc: biên dịch các tệp Python trong
thư mục src sang tệp biên dịch .pyc tương ứng trong thư mục build
$(TARGET): tạo ra tệp thực thi myprogram từ các tệp
biên dịch .pyc tương ứng trong thư mục build
Mục tiêu clean được định nghĩa để xóa tất cả các tệp đã được xây
dựng trong quá trình biên dịch.

Exercise: Try more options with the ls command and analyze its output.
You can also try to combine multiple options into one, ex: -la.

Ans:
Lệnh ls là một lệnh thường được sử dụng trong các hệ điều hành giống
như UNIX liệt kê nội dung của một thư mục. Theo mặc định, ls liệt kê
tên của các tệp và thư mục trong thư mục hiện tại theo thứ tự bảng chữ
cái. Dưới đây là một đầu ra ví dụ của lệnh ls:

-l: Định dạng dài. Hiển thị thông tin bổ sung về từng tệp, bao
gồm các quyền
của tệp, số lượng liên kết, chủ sở hữu, nhóm, kích thước và thời
gian sửa đổi.

-a: Tất cả các tập tin. Hiển thị tất cả các tệp, bao gồm các tệp ẩn
(các tệp có tên bắt đầu bằng dấu chấm).

-R: đệ quy. Hiển thị nội dung của các thư mục con đệ quy.

-d: liệt kê thư mục (directories) - với ' */'

-la: định dạng dài, bao gồm file ẩn

-lh: định dạng dài và hiển thị kích thước file

-r: liệt kê theo tứ tự đảo ngược


.............…

Exercise: In the previous section, we have built a Shell Script version of


a calculator. Following this idea, we will re-implement a C version, but
do not implement the function HIST. Requirements:
• Students must create a Makefile to build the program with at
least these 2 targets: all and clean
• The executable name is calc
• The main program is implemented in the calc.c source file,
while the calculation logic is held on the other source files.
• Input and output requirements are the same as the Shell Script
version
Truy cập link để xem source code:
https://drive.google.com/drive/folders/1xIWErDe4HXGwxIL9smcHKNy
tUnZlzHPI?usp=drive_link

Output:

You might also like