Welcome to MikeDaDev's Blog – notes on Java, backend & system design.

Explore
MikeDaDev's Blog

101+ lệnh linux thường gặp

Tung Bui Thanh (TungDaDev)16 mins read

Linux command.webp

Dân lập trình, nhất là anh em làm backend với devops, thường mê Linux lắm. Có người còn coi nó là chân ái.

Đi làm thật thì service nào cũng chạy trên server, mà server thì gần như toàn Linux, nên chuyện gõ lệnh là không né được. Biết nhiều lệnh, nhớ nhiều lệnh thì làm việc nhanh hơn, mà CV cũng đẹp hơn.

Thêm nữa, gõ lệnh nhìn ngầu hơn hẳn. Thật đấy, không đùa đâu :))) Không tin thì đọc xong bài ra quán cafe ngồi gõ thử xem có ai nhìn không nhé. :)))

# quản lý tệp và thư mục

ls: liệt kê nội dung thư mục, xem danh sách file kèm chi tiết trong thư mục hiện tại.

tungdadev@linux:~$ ls -l

ls còn hay đi kèm -a (hiện cả file ẩn), -h (dung lượng dễ đọc), gộp lại kiểu -la, -lah. Còn ll mà bạn hay thấy thực ra là alias của ls -l (hoặc ls -alF trên Ubuntu), không phải tham số.

cd: viết tắt của change directory, dùng để chuyển sang thư mục khác.
Ví dụ muốn vào thư mục /var/mb-server/log:

tungdadev@linux:~$ cd /var/mb-server/log

pwd: viết tắt của print working directory, in ra đường dẫn thư mục bạn đang đứng.

tungdadev@linux:~$ pwd
/home/tungdadev

mkdir: viết tắt của make directory, tạo thư mục mới.

tungdadev@linux:~$ mkdir new_project

rmdir: xóa thư mục rỗng.

tungdadev@linux:~$ rmdir old_folder

rm: xóa file hoặc thư mục. Ví dụ xóa một thư mục cùng toàn bộ nội dung bên trong:

tungdadev@linux:~$ rm -r temp_folder

cp: sao chép file hoặc thư mục, kiểu backup một file quan trọng:

tungdadev@linux:~$ cp file.txt /backup/file.txt

mv: di chuyển hoặc đổi tên file/thư mục.

tungdadev@linux:~$ mv old_name.txt new_name.txt

find: tìm file hoặc thư mục. Ví dụ tìm các file log trong /var/log:

tungdadev@linux:~$ find /var/log -name "*.log"

touch: tạo một file rỗng.

tungdadev@linux:~$ touch index.html

# quản lý người dùng và quyền

whoami: cho biết bạn đang đăng nhập bằng user nào.

tungdadev@linux:~$ whoami
tungdadev

id: xem thông tin user (uid, gid, group).

tungdadev@linux:~$ id
uid=1000(tungdadev) gid=1000(tungdadev) groups=1000(tungdadev)

chmod: đổi quyền truy cập file. Ví dụ cho phép chạy một script:

tungdadev@linux:~$ chmod 755 script.sh

chown: đổi chủ sở hữu file/thư mục. Ví dụ giao file cấu hình cho root (đổi chủ sang user khác thì cần quyền root, nên phải có sudo):

tungdadev@linux:~$ sudo chown root:root config.conf

passwd: đổi mật khẩu cho tài khoản đang dùng.

tungdadev@linux:~$ passwd

# quản lý hệ thống

top: theo dõi tiến trình và tài nguyên theo thời gian thực, xem máy đang ngốn bao nhiêu CPU/RAM.

tungdadev@linux:~$ top

htop: bản xịn hơn của top, giao diện dễ nhìn, quản lý tiến trình tiện hơn.

tungdadev@linux:~$ htop

df: xem ổ đĩa còn trống bao nhiêu.

tungdadev@linux:~$ df -h

du: xem một thư mục hay file chiếm bao nhiêu dung lượng, ví dụ thư mục log:

tungdadev@linux:~$ du -sh /var/log

free: xem RAM. Trên Windows hay Mac thì mở app có sẵn là xong. Linux cũng có app, nhưng thôi, gõ lệnh cho ngầu. Mà nói thật, server ngoài dự án làm gì có UI mà bấm :))) Nên nhớ lệnh đi nhé.

tungdadev@linux:~$ free -h

uptime: xem server đã chạy liên tục được bao lâu.

tungdadev@linux:~$ uptime

reboot: khởi động lại máy, giống nút Restart trên Windows vậy á.

tungdadev@linux:~$ sudo reboot

shutdown: tắt máy. Nhanh hơn cầm chuột click click mấy cái đúng không?

tungdadev@linux:~$ sudo shutdown now

systemctl: quản lý các service của hệ thống. Lệnh này đi làm dùng nhiều lắm nè, start/stop/restart service đều qua nó. Ví dụ restart Nginx:

tungdadev@linux:~$ sudo systemctl restart nginx

journalctl: xem log hệ thống, ví dụ log của Nginx:

tungdadev@linux:~$ sudo journalctl -u nginx

# xử lý mạng

ping: kiểm tra kết nối mạng.

tungdadev@linux:~$ ping google.com

curl: gửi request HTTP. Ví dụ xem website trả về status gì:

tungdadev@linux:~$ curl -I https://example.com

wget: tải file từ một URL về máy.

tungdadev@linux:~$ wget https://example.com/file.zip

netstat: xem các kết nối mạng, hay dùng để kiểm tra port nào đang mở. Lệnh này nằm trong gói net-tools đã cũ, nhiều distro mới không cài sẵn nữa; bản thay thế là ss ở bên dưới.

tungdadev@linux:~$ netstat -tuln

ifconfig: cấu hình và kiểm tra mạng, hay dùng nhất là để xem địa chỉ IP.

tungdadev@linux:~$ ifconfig

ip: bản thay thế mới hơn của ifconfig, xem thông tin mạng.

tungdadev@linux:~$ ip addr show

nslookup: tra DNS, xem thông tin một tên miền.

tungdadev@linux:~$ nslookup google.com

traceroute: xem gói tin đi qua những chặng nào, tiện để dò xem mạng nghẽn ở đâu.

tungdadev@linux:~$ traceroute example.com

nmap: quét port và dịch vụ, dùng để kiểm tra bảo mật mạng.

tungdadev@linux:~$ nmap -sT localhost

ss: xem trạng thái socket, theo dõi kết nối TCP/UDP.

tungdadev@linux:~$ ss -tuln

# quản lý gói phần mềm

apt-get: quản lý gói phần mềm. Ví dụ cài Nginx:

tungdadev@linux:~$ sudo apt-get install nginx

apt: bản cải tiến của apt-get. Ví dụ cập nhật danh sách gói:

tungdadev@linux:~$ sudo apt update

dpkg: quản lý gói ở mức thấp, hay dùng để cài tay một file .deb.

tungdadev@linux:~$ sudo dpkg -i package.deb

snap: hệ thống đóng gói và cài đặt app chạy được trên nhiều distro, do Canonical (công ty đứng sau Ubuntu) làm ra. Ubuntu có sẵn snap, còn các distro lớn khác như Debian, Arch Linux, Fedora, CentOS, Manjaro thì cài thêm snapd là dùng được.

Ví dụ cài Visual Studio Code:

tungdadev@linux:~$ sudo snap install code --classic

flatpak: một cách đóng gói app cho Linux. Mỗi distro có trình quản lý gói riêng, còn Flatpak muốn làm một kiểu đóng gói chạy được trên mọi distro, nhờ vậy người làm app đỡ cực hơn.

Ví dụ cài Firefox từ Flathub:

tungdadev@linux:~$ flatpak install flathub org.mozilla.firefox

# phân tích log

tail: xem mấy dòng cuối của file log. Thêm -f là theo dõi log chạy theo thời gian thực.

tungdadev@linux:~$ tail -f /var/log/syslog

head: xem mấy dòng đầu của file, ví dụ 20 dòng đầu của log:

tungdadev@linux:~$ head -n 20 /var/log/syslog

cat: in nội dung file ra màn hình, ví dụ access log của Nginx:

tungdadev@linux:~$ cat /var/log/nginx/access.log

less: đọc file dài, cuộn lên xuống thoải mái, hợp để xem log kernel.

tungdadev@linux:~$ less /var/log/dmesg

grep: tìm chuỗi trong file, ví dụ lục lỗi trong log hệ thống:

tungdadev@linux:~$ grep "error" /var/log/syslog

awk: lấy và xử lý dữ liệu theo cột, ví dụ rút IP và timestamp từ log Nginx:

tungdadev@linux:~$ awk '{print $1, $4}' /var/log/nginx/access.log

cut: cắt lấy từng trường trong dòng log, ví dụ lấy cột đầu tiên (IP):

tungdadev@linux:~$ cut -d' ' -f1 /var/log/nginx/access.log

sort: sắp xếp các dòng trong file, có mặt trên hầu hết hệ Unix và họ hàng của nó.

tungdadev@linux:~$ sort /var/log/nginx/access.log

uniq: báo cáo hoặc lọc các dòng bị lặp. Nói dễ hiểu thì uniq tìm các dòng trùng nhau nằm liền kề rồi bỏ bớt, chỉ giữ lại một dòng. Nó đọc từ file đầu vào (truyền vào làm tham số) và ghi kết quả đã lọc ra đầu ra.

tungdadev@linux:~$ sort /var/log/nginx/access.log | uniq

wc: viết tắt của word count, dùng để đếm số dòng, số từ, số ký tự, số byte...

tungdadev@linux:~$ wc -l /var/log/syslog

# xử lý file hệ thống

stat: xem thông tin của file, giống ls nhưng chi tiết hơn nhiều.

tungdadev@linux:~$ stat file.txt

file: cho biết file thuộc định dạng gì.

tungdadev@linux:~$ file image.png

ln: tạo link, hay dùng nhất là symbolic link (symlink). Symlink rất tiện, giúp sắp xếp file trên Linux linh hoạt hơn hẳn. Dùng nó để:

  • Tạo shortcut cho file và thư mục.
  • Quản lý cấu trúc thư mục phức tạp.
  • Chia sẻ file và thư mục.
  • Cập nhật liên kết thay vì file gốc.
  • Tạo các liên kết mềm cho các ứng dụng.
  • Tiết kiệm không gian đĩa.

Ví dụ tạo symlink cho Python (ghi vào /usr/bin nên cần sudo; trên Ubuntu/Debian có sẵn gói python-is-python3 làm đúng việc này):

tungdadev@linux:~$ sudo ln -s /usr/bin/python3 /usr/bin/python

fsck: kiểm tra và sửa lỗi hệ thống file, ví dụ trên phân vùng /dev/sda1. Nhớ umount phân vùng trước khi chạy, chạy fsck lên phân vùng đang mount có thể làm hỏng dữ liệu:

tungdadev@linux:~$ sudo fsck /dev/sda1

mount: gắn (mount) một hệ thống file vào máy, ví dụ cắm USB vào:

tungdadev@linux:~$ sudo mount /dev/sdb1 /mnt

umount: tháo một hệ thống file đã mount, ví dụ rút USB ra:

tungdadev@linux:~$ sudo umount /mnt

df: xem dung lượng trống trên các ổ đĩa. Lệnh này có thêm kha khá tham số để bạn chỉnh cách hiển thị theo ý mình.

tungdadev@linux:~$ df -h

blkid: xem nhãn (nếu có) và UUID của các phân vùng. Muốn xem một phân vùng cụ thể thì truyền đường dẫn thiết bị của nó vào.

tungdadev@linux:~$ sudo blkid

parted: chia và đổi kích thước phân vùng: tạo, xóa, đổi kích thước phân vùng, đặt nhãn GPT/MBR. Bản cũ (2.x) còn tự resize, di chuyển, sao chép được hệ thống file ext2, linux-swap, FAT, FAT32, reiserfs, nhưng từ bản 3.x phần này bị bỏ: resizepart chỉ đổi kích thước phân vùng, còn hệ thống file bên trong phải resize bằng công cụ riêng (resize2fs cho ext4 chẳng hạn). Ai hay phải quản lý ổ đĩa trên Linux thì gần như không thiếu được.

tungdadev@linux:~$ sudo parted /dev/sda print

mkfs: format, tức là tạo hệ thống file mới (cách dữ liệu được sắp xếp trên đĩa) cho một phân vùng.

Ví dụ: format USB sang định dạng ext4. Cẩn thận gõ đúng tên thiết bị (xem bằng lsblk trước), vì format là mất sạch dữ liệu cũ trên phân vùng đó.

tungdadev@linux:~$ sudo mkfs.ext4 /dev/sdb1

# các tiện ích khác

date: xem ngày giờ hiện tại của hệ thống.

tungdadev@linux:~$ date

cal: in lịch ra terminal. Gõ cal không kèm gì thì nó in lịch tháng này, ngày hôm nay được tô sáng.

tungdadev@linux:~$ cal

echo: lệnh có sẵn, in ra đoạn text bạn truyền vào. Đây là lệnh cơ bản nhất, script shell hay Bash nào cũng dùng để in trạng thái ra màn hình.

tungdadev@linux:~$ echo "Hello, Linux!"

man: mở tài liệu hướng dẫn của lệnh, tiện ích hay system call. Quên tham số nào thì cứ man là ra.

tungdadev@linux:~$ man ls

alias: đặt tên tắt cho một lệnh. Thay vì gõ cả câu lệnh dài, bạn gõ cái tên ngắn mình tự đặt. Chủ yếu dùng cho mấy lệnh dài, vừa đỡ mỏi tay vừa đỡ gõ sai.

tungdadev@linux:~$ alias ll="ls -l"

uname: xem thông tin kernel: tên kernel, hostname, bản phát hành, phiên bản kernel và kiến trúc phần cứng.

tungdadev@linux:~$ uname -a

iptables: quản lý luật tường lửa và lưu lượng mạng. Admin dùng nó để đặt luật lọc, dịch địa chỉ hoặc chuyển tiếp gói tin. Trên các distro mới, iptables thường chạy trên nền nftables (iptables-nft), và luật thêm bằng lệnh sẽ mất khi reboot nếu không lưu lại. Ví dụ mở port 22:

tungdadev@linux:~$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

ps: liệt kê các tiến trình đang chạy, đơn giản mà dùng hoài.

tungdadev@linux:~$ ps aux

kill: dừng tiến trình. Nó gửi tín hiệu tới tiến trình để bảo nó dừng lại. Mặc định kill <pid> gửi SIGTERM, tức là dừng nhẹ nhàng, cho tiến trình kịp dọn dẹp trước khi thoát. Còn -9 như ví dụ dưới là SIGKILL: kernel giết luôn, tiến trình không kịp làm gì (đóng file, flush dữ liệu...), nên chỉ dùng khi SIGTERM không ăn thua.

tungdadev@linux:~$ kill -9 12345

tar: tạo, quản lý và giải nén file lưu trữ (archive). Nó gom nhiều file và thư mục thành một file duy nhất, rồi có thể nén thêm bằng nhiều thuật toán khác nhau cho nhẹ.

tungdadev@linux:~$ tar -czvf archive.tar.gz folder

gzip: một trong những kiểu nén phổ biến nhất. Nén xong file nhỏ lại mà vẫn giữ nguyên dữ liệu, quyền sở hữu và timestamp của file gốc. File nén có đuôi .gz, và cũng dùng chính gzip -d để giải nén được. Lưu ý gzip file.txt sẽ thay file gốc bằng file.txt.gz; muốn giữ file gốc thì thêm -k.

tungdadev@linux:~$ gzip file.txt

gunzip: giải nén file .gz về lại file gốc.

tungdadev@linux:~$ gunzip file.txt.gz

zip: nén file/thư mục thành file .zip.

tungdadev@linux:~$ zip -r archive.zip folder

unzip: giải nén file .zip.

tungdadev@linux:~$ unzip archive.zip

scp: viết tắt của Secure Copy, copy file giữa máy mình và server từ xa. File đi qua mạng sang máy khác nên bạn cần có quyền SSH vào máy đó.

tungdadev@linux:~$ scp file.txt user@remote:/path

rsync: sao chép và đồng bộ file, thư mục, cả trong máy lẫn sang máy khác. Trên Linux/Unix thì đây là lựa chọn quen thuộc nhất.

tungdadev@linux:~$ rsync -av folder/ user@remote:/path

locate: tìm file, thư mục theo tên. Cú pháp dễ nhớ, kết quả ra gần như ngay lập tức, vì nó tra trong một database dựng sẵn chứ không quét đĩa. Bù lại, file mới tạo sẽ chưa có trong kết quả cho tới khi database được cập nhật (sudo updatedb).

tungdadev@linux:~$ locate file.txt

xargs: lấy đầu vào làm tham số để chạy một lệnh khác. Ví dụ xóa hết file log trong thư mục hiện tại và các thư mục con (-print0 với -0 để không vỡ khi tên file có dấu cách):

tungdadev@linux:~$ find . -name "*.log" -print0 | xargs -0 rm

diff: có sẵn trên hầu hết các distro, dùng để so hai file và chỉ ra chỗ khác nhau. Dòng nào sửa, dòng nào thêm, dòng nào xóa đều hiện ra rõ ràng, dễ đọc.

tungdadev@linux:~$ diff file1.txt file2.txt

cmp: so hai file từng byte xem có giống nhau không. Giống nhau thì nó im lặng, không in gì. Khác nhau thì nó in ra vị trí byte (và dòng) khác đầu tiên.

tungdadev@linux:~$ cmp file1.txt file2.txt

comm: so hai file đã sort theo từng dòng, chia ra dòng chỉ có ở file 1, dòng chỉ có ở file 2 và dòng chung. Rất tiện khi cần so hai danh sách, hai file log hay hai tập dữ liệu.

tungdadev@linux:~$ comm file1.txt file2.txt

tee: vừa ghi ra file vừa in ra màn hình cùng lúc.

tungdadev@linux:~$ echo "Hello" | tee file.txt

cut: cắt lấy một phần của từng dòng, ví dụ lấy cột đầu tiên của file CSV:

tungdadev@linux:~$ cut -d',' -f1 data.csv

tr: đổi hoặc xóa ký tự từ stdin rồi ghi ra stdout. Hay dùng để đổi chữ thường thành chữ hoa, gộp hoặc xóa ký tự, thay thế text đơn giản.

tungdadev@linux:~$ echo "hello" | tr 'a-z' 'A-Z'

sed: xử lý text trong file: tìm, thay thế, chèn, xóa đều được.

Ví dụ thay "old" bằng "new" trong file:

tungdadev@linux:~$ sed -i 's/old/new/g' file.txt

watch: chạy đi chạy lại một lệnh theo chu kỳ, ví dụ cứ 5 giây xem dung lượng ổ đĩa một lần:

tungdadev@linux:~$ watch -n 5 df -h

iotop: xem tiến trình nào đang đọc ghi đĩa nhiều.

tungdadev@linux:~$ sudo iotop

who: xem ai đang đăng nhập vào hệ thống.

tungdadev@linux:~$ who

w: giống who nhưng chi tiết hơn, xem ai đang đăng nhập và đang làm gì.

tungdadev@linux:~$ w

history: xem lại các lệnh đã gõ.

tungdadev@linux:~$ history

clear: dọn sạch màn hình terminal.

tungdadev@linux:~$ clear

vmstat: xem thống kê bộ nhớ ảo, process, CPU, I/O. Có cả các cột si/so (lượng bộ nhớ swap vào/ra mỗi giây) và bi/bo (block đọc/ghi đĩa), nhìn vào là biết máy có đang thiếu RAM phải swap hay không. vmstat 1 in một dòng mỗi giây, thường dùng để theo dõi CPU với bộ nhớ đang thế nào.

tungdadev@linux:~$ vmstat 1

ufw: (Uncomplicated Firewall) quản lý luật tường lửa với cú pháp gọn gàng. Ví dụ mở port 22:

tungdadev@linux:~$ sudo ufw allow 22/tcp

arp: xem và quản lý bảng ARP, tức bảng ghi IP nào ứng với địa chỉ MAC nào của các thiết bị trong cùng mạng.

tungdadev@linux:~$ arp -a

hostnamectl: quản lý hostname, ví dụ đổi tên máy:

tungdadev@linux:~$ sudo hostnamectl set-hostname new-host

useradd: tạo user mới trên máy.

tungdadev@linux:~$ sudo useradd -m -s /bin/bash newuser

usermod: sửa thông tin user.

Ví dụ cho một tài khoản quyền sudo:

tungdadev@linux:~$ sudo usermod -aG sudo newuser

groupadd: tạo group mới, ví dụ group cho team dev:

tungdadev@linux:~$ sudo groupadd devgroup

groups: xem một user đang thuộc những group nào.

tungdadev@linux:~$ groups tungdadev

last: xem lịch sử đăng nhập, ai vào lúc nào.

tungdadev@linux:~$ last

logrotate: tự động xoay vòng, nén và xóa file log. Admin Linux nào cũng cần nó, để file log không phình to vô hạn và log cũ được cất gọn gàng.

tungdadev@linux:~$ sudo logrotate /etc/logrotate.conf

cron: hẹn giờ chạy tác vụ định kỳ. Sửa lịch bằng crontab -e:

tungdadev@linux:~$ crontab -e

# lời kết

Gõ lệnh Linux thành thạo rồi thì đi làm cứ như được buff full giáp, một mình cân cả dàn server :)))

Phần lớn lệnh xử lý file, text, mạng cơ bản dùng được luôn trên macOS, vì hai hệ điều hành đều có gốc Unix. Có điều bản trên macOS là bản BSD nên vài tham số khác (ví dụ sed -i ''), còn mấy lệnh riêng của Linux như systemctl, journalctl, apt, free, ip, ss thì macOS không có.

Nhớ hết đống lệnh này chắc nhiều bạn thấy oải. Đừng lo, mấy anh dev lười đã làm sẵn extension gợi ý lệnh rồi. Cái đó hẹn bài khác nhé. :D

Chỉ là những ghi chép cá nhân với hy vọng mang lại chút giá trị. Nếu thấy hữu ích, đừng ngại chia sẻ cho bạn bè & đồng nghiệp nhé!

Happy coding 😎 👍🏻 🚀 🔥.