Professional Documents
Culture Documents
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,...
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.
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.
• 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.
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.
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.
Output: