Như chúng ta đã biết, Linux là nhân (kernel) được sử dụng cho nhiều hệ điều hành mã nguồn mở (Open-source OS) được sử dụng rộng rãi hiện nay như Linux Mint, Ubuntu, CentOS. Các hệ điều hành này là miễn phí và có các tính năng không thua kém gì các hệ điều hành thương mại. Các hệ điều hành này ngày càng đáng tin cậy, an toàn, ngày càng thân thiện với người dùng và được hàng ngàn lập trình viên trên thế giới tiếp tục phát triển.
Các hệ điều hành này hỗ trợ chế độ Terminal để thao tác với hệ thống thông qua lệnh. Ưu điểm của nó là thực hiện tác vụ nhanh hơn so với việc chúng ta sử dụng giao diện đồ họa. Do sử dụng cùng nhân Linux nên hầu hết các lệnh tương đối giống nhau trừ một số lệnh đặc biệt. Dưới đây là một số câu lệnh thông dụng mà chúng tôi giới thiệu đến các bạn tham khảo. Bạn có thể xem thêm bài viết: Lập trình Shell Script trên Linux/Ubuntu
Mục lục
Lệnh liên quan tới network
Kiểm tra địa chỉ IP Public (Check IP public)
Có nhiều trang cho phép bạn kiểm tra IP Public của máy bạn: https://www.whatismyip.com/what-is-my-public-ip-address/
Nhưng cần có trình duyệt, trường hợp bạn muốn kiểm tra bằng dòng lệnh, sử dụng lệnh sau:
curl http://checkip.amazonaws.com
curl v4.ident.me
curl ipecho.net/plain
curl http://smart-ip.net/myip
curl bot.whatismyipaddress.com
Xem phiên địa chỉ IP của máy
# Lệnh này để xem tất cả các địa chỉ IP trên máy ifconfig # Xem với nhiều thông tin chi tiết hơn ifconfig -a
Kiểm tra các cổng (port) đang được mở trên máy
Xem thông tin các cổng đang mở
# Xem tất cả các cổng (port) đang được mở netstat # Xem các port đang lắng nghe các kết nối tới netstat -l
Bạn có thể sử dụng thêm với lệnh grep để lấy chi tiết thông tin.
# Liệt kê kết nối tới cổng 8080 netstat -an | grep :8080 # Đếm số kết nối tới cổng 8080 netstat -an | grep :8080 | wc -l # Thêm tham số -p để biết pid của ứng dụng đang mở cổng hoặc đang kết nối tới cổng netstat -alp | grep 8080 netstat -anp | grep 8080
Các lệnh nén và giải nén dữ liệu
# Cài đặt một số ứng dụng hỗ trợ nén và giải nén
sudo apt install zip unzip pv
# Lệnh nén 1 tệp sang zip file
zip a.log.zip a.log
# Lệnh giải nén tệp zip
unzip a.log.zip
# Giải nén tệp tar.gz, nhưng không biết được tiến trình
# Nếu là tệp lớn phải chờ lâu thì hơi bất tiện
tar -xf mysql.tar.gz
# Giải nén tệp tar.gz và hiển thị tiến trình
pv mysql.tar.gz | tar -xz
Xem thông tin server
Ghi chú: Hầu hết các lệnh trên xem thông tin cấu hình server đều phải sử dụng quyền root.
Xem thông tin nhà sản xuất
# Lệnh này cho phép xem thông tin về nhà sản xuất server sudo dmidecode | grep "System Information" -A 9
Xem thông tin thông tin Mainboard
# Lệnh này sẽ xuất ra màn hình thông tin Mainboard của server, tuy nhiên không phải tất cả server đều có thông tin này sudo dmidecode | grep "Base Board" -A 10
Xem thông tin CPU
# Lệnh này sẽ trả về thông tin của CPU trong server, tuy nhiên sẽ chỉ trả về thông tin của từng Core cat /proc/cpuinfo | head -n 25
# Lấy thông tin về tổng số core của CPU cat /proc/cpuinfo | grep processor | wc -l # Lấy thông tin chi tiết hơn cat /proc/cpuinfo
Xem thông tin số CPU Cores
lscpu | grep -E '^Thread|^Core|^Socket|^CPU\(' CPU(s): 56 Thread(s) per core: 2 Core(s) per socket: 14 Socket(s): 2
Như trên số CPU Cores là 56, tức là máy có thể chạy 56 tiến trình song song thực sự. Công thức tính: [Số CPU Cores] = [Số lượng Socket] * [Số core trên 1 socket] * [Số thread trên 1 core] = 2*14*2=56
Ngoài ra, bạn có thể cài ứng dụng để xem thông tin:
sudo apt-get install libvirt-bin sudo virsh nodeinfo CPU model: x86_64 CPU(s): 56 CPU frequency: 2297 MHz CPU socket(s): 1 Core(s) per socket: 14 Thread(s) per core: 2 NUMA cell(s): 2 Memory size: 65731628 KiB
Xem thông tin RAM
cat /proc/meminfo
Lệnh này sẽ trả về các thông tin về bộ nhớ RAM, trong đó MemTotal chính là tổng dung lượng bộ nhớ RAM đang có trong server.
Xem thông tin HDD
cat /proc/scsi/scsi
Lệnh này sẽ trả về thông tin những HDD vật lý đang được lắp trong server tuy nhiên chỉ bao gồm model HDD chứ không bao gồm dung lượng.
# Liệt kê dung lượng các HDD đang được lắp sudo fdisk -l | grep Disk # Nếu chỉ xem dung lượng các ổ df -h # Liệt kê các file có dung lượng lớn hơn 100M (large file) find / -xdev -type f -size +100M -exec du -sh {} ';' | sort -rh | head -n50
Xem thông tin PCI Bus
lspci
Lệnh này sẽ hiển thị thông tin về tất cả PCI Bus và các thiết bị kết nối tới nó. Lệnh này có thể gộp của “ls” + “pci”.
# lspci 00:00.0 Host bridge: Intel Corporation 5500 I/O Hub to ESI Port (rev 13) 00:01.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 1 (rev 13) 00:09.0 PCI bridge: Intel Corporation 7500/5520/5500/X58 I/O Hub PCI Express Root Port 9 (rev 13) 00:14.0 PIC: Intel Corporation 7500/5520/5500/X58 I/O Hub System Management Registers (rev 13) 00:14.1 PIC: Intel Corporation 7500/5520/5500/X58 I/O Hub GPIO and Scratch Pad Registers (rev 13) 00:14.2 PIC: Intel Corporation 7500/5520/5500/X58 I/O Hub Control Status and RAS Registers (rev 13) 00:1a.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 (rev 02) 00:1c.0 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 1 (rev 02) 00:1d.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 (rev 02) 00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 92) 00:1f.0 ISA bridge: Intel Corporation 82801IB (ICH9) LPC Interface Controller (rev 02) 00:1f.2 IDE interface: Intel Corporation 82801IB (ICH9) 2 port SATA Controller [IDE mode] (rev 02) 01:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20) 01:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20) 03:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS 2108 [Liberator] (rev 05) 06:03.0 VGA compatible controller: Matrox Electronics Systems Ltd. MGA G200eW WPCM450 (rev 0a
Ngoài ra bạn có thể sử dụng thêm các tham số tùy theo mục đích sử dụng. Ví dụ:
# Xem thông tin SubSystem lspci -m # Hiển thị dưới dạng cây để xem các thiết bị nào kết nối tới nó lspci -t # Xem thông tin chi tiết lspci -v
Xem thông tin hệ điều hành
Để xem đầy đủ thông tin hệ điều hành, bạn sử dụng lệnh sau:
uname -a Linux TEST-APP01 2.6.18-308.el5 #1 SMP Tue Feb 21 20:06:06 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
Ngoài ra bạn có thể sử dụng tham số sau để lấy thông tin từng loại:
- -s: Tên nhân hệ điều hành (Kernel name)
- -r: Phiên bản nhân release hệ điều hành sử dụng (Kernel release)
- -v: Phiên bản nhân (Kernel version)
- -n: Tên node (Nodename)
- -m: Tên phần cứng (Hardware name)
- -i: Platform phần cứng (Hardware platform)
- -p: Kiểu bộ vi xử lý (Processor type)
- -o: Hệ điều hành (Operating system)
Xem phiên bản bộ biên dịch C/C++
gcc -v g++ -v cc -v c++ -v make -v cmake -v
Thường bạn cài lệnh sau sẽ có đầy đủ công cụ để build các project C/C++:
sudo apt-get install build-essential sudo apt install cmake sudo apt-get install autotools-dev sudo apt-get install autoconf
Xem log đăng nhập hệ thống
# Lệnh này để xem tất cả các log đăng nhập hệ thống last
Xem log các lệnh đã thực thi trên hệ thống
# Xem tất cả các lệnh mà đã được thực thi trên server trước đó history # Kết hợp với lệnh grep để tìm lệnh nào đã thực hiện trước đó history | grep gcc
Trên Ubuntu, các lệnh trong history của từng user được lưu trong tệp ~/.bash_history tương ứng của user đó. Do đó, trên Ubuntu, bạn có thể xem history bằng lệnh:
cat ~/.bash_history
Xem không gian ổ đĩa
# Xem thông tin ổ đĩa (Tổng dung lượng, dung lượng đã sử dụng, dung lượng chưa sử dụng) df df -h # Liệt kê folder, file và kích thước tương ứng du -sh /* du -sh *
Xem dung lượng bộ nhớ
# Xem dung lượng bộ nhớ (Tổng dung lượng, dung lượng đã sử dụng, dung lượng chưa sử dụng) free -m
Lệnh quản trị hệ thống
Kiểm tra, cài đặt, gỡ bỏ các gói cài đặt
Trên dòng Linux, công cụ APT (Advanced Packageing Tool) được sử dụng phổ biến để thực hiện cài đặt các gói. Tất cả lệnh dùng với công cụ này đều phải sử dụng quyền root. Nếu bạn ở account thường bạn phải thêm sudo đằng trước, nếu bạn đang ở tài khoản root thì không cần.
Để cài đặt một gói sử dụng lệnh sau:
sudo apt-get install <package-name-01> <package-name-02> ...
Mọi người chỉ cần đến install rồi nhấn phím tab thì cộng cụ hiển thị tên tất cả các gói hỗ trợ, hoặc nhập một phần tên gói và nhấn tab để công cụ gợi ý thêm tên chính xác.
# Lệnh sau thực hiện cài đặt gói từ mã nguồn sudo apt-get build-dep <package-name> # Lệnh sau sẽ thực hiện gỡ bỏ một gói sudo apt-get remove <package-name> sudo apt-get remove --purge <package-name> sudo apt-get purge <package-name>
Sử dụng lệnh với remove thì công cụ chỉ gỡ bỏ những tệp cài đặt nhưng vẫn giữ nguyên các tệp cấu hình, còn sử dụng purge thì công cụ sẽ gỡ bỏ toàn bộ cả tệp cài đặt và tệp cấu hình.
# Lệnh sau thực hiện tìm kiếm các gói
sudo apt-get search <search-info>
search-info có thể là tên chương trình, ghi chú,…. Lệnh này trả về danh sách các tên gói phù hợp điều kiện tìm kiếm.
# Lệnh sau thực hiện cập nhật danh sách các package # Lệnh này sẽ làm thay đổi tệp /etc/apt/sources.list hoặc /etc/apt/preferences sudo apt-get update # Lệnh sau sẽ nâng cấp tất cả các gói đã cài đặt sudo apt-get upgrade # Lệnh sau nâng cấp toàn bộ hệ thống tới một phiên bản mới, tự động giải quyết xung đột (Ít dùng) sudo apt-get dist-upgrade # Lệnh sau thực hiện để chuẩn đoán. Nó không cập nhật danh sách nguồn, mà chỉ kiểm tra lỗi phụ thuộc sudo apt-get check # Lệnh này để xử lý lỗi phụ thuộc trong lệnh cài đặt trước đó: sudo apt-get -f install
Lệnh sau gỡ bỏ các tệp cài đặt .deb đã cũ trong hệ thống của bạn. Phụ thuộc vào thói quen cài đặt của bạn, xóa bỏ các tệp trong /var/cache/apt/archives có thể thu hồi một lượng không gian đĩa đáng kể:
sudo apt-get autoclean
Lệnh sau tương tự như trên nhưng nó sẽ xóa bỏ tất cả các gói trong nơi lưu trữ:
sudo apt-get clean
Nó không tốt lắm nếu bạn đang sở hữu một đường truyền Internet chậm, vì khi cài đặt sẽ phải tải lại các gói (đáng ra có sẵn tại nơi lưu trữ).
Lênh sau sẽ cho biết dung lượng các gói được lưu trữ:
du -sh /var/cache/apt/archives
Nơi lưu trữ các gói đã được cài đặt là /var/cache/apt/archives.
Dùng tham số -s đằng trước để giả lập hành động. Ví dụ lệnh sau:
sudo apt-get -s install <package-name>
sẽ giả lập việc cài đặt một gói, cho bạn biết nơi gói sẽ được cài đặt và cấu hình của nó.
Ngoài ra để cài đặt các tệp *.rpm bạn phải sử dụng công cụ RPM (Red Hat Package Manager). Lệnh thực hiện cài đặt gói rpm như sau:
rpm -ivh pidgin-2.7.9-5.el6.2.i686.rpm
Trong đó: -i là cài đặt; -v để hiển thị đẹp hơn và-h để hiển thị dấu # cho các gói đã giải nén. Trong trường hợp bạn thấy tất cả các thành cần thiết đều đã được cài đặt thì hệ thống vẫn báo thiếu, bạn có thể sử dụng tham số –nodeps để bỏ qua không yêu cầu phải cài đặt các thành phần phụ thuộc trước:
rpm -ivh --nodeps BitTorrent-5.2.2-1-Python2.4.noarch.rpm
Lệnh sau kiểm tra các thành phần phụ thuộc:
rpm -qpR BitTorrent-5.2.2-1-Python2.4.noarch.rpm
Trong đó, tham số -q nghĩa là truy vấn,-p là liệt kê danh sách các thành phần mà gói hỗ trợ,-R là liệt kê danh sách các thành phần mà gói này phụ thuộc.
# Để kiểm tra một gói RPM đã được cài đặt hay chưa, bạn hãy sử dụng tham số -q rpm -q BitTorrent # Để hiển thị chi tiết các tệp trong gói RPM đã được cài đặt, bạn hãy sử dụng tham số -ql (query list) rpm -ql BitTorrent # List danh sách các PPA bằng lệnh ls /etc/apt/sources.list.d # Dựa trên list trên xem PPA nào lỗi, sau đó dùng lệnh sau hay xóa sudo rm -i /etc/apt/sources.list.d/myppa.list
Kiểm tra các tiến trình đang chạy
ps là lệnh sử dụng để kiểm tra tiến trình đang chạy. Cú pháp của lệnh hỗ trợ cả hai kiểu cú pháp là BSD và UNIX.
# Hiển thị danh sách các tiến trình và thông tin chi tiết tiến trình, bạn sử dụng một trong hai lệnh sau ps aux ps -ef # Để hiển thị các tiến trình của một người dùng nào đó, bạn sử dụng tham số -u ps -f -u test_user # Để tìm kiếm tiến trình theo tên, bạn sử dụng tham số -C ps -C apache2 # Để tìm kiếm tiến trình theo Process ID, bạn sử dụng tham số -p ps -f -p 3150,7298,6544 # Để hiển thị tiến trình sắp xếp theo thứ tự sử dụng CPU, RAM, bạn hãy sử dụng lệnh sau ps aux --sort=-pcpu,+pmem # Để hiển thị tiến trình theo cấu trúc cây, bạn sử dụng tham số --forest ps -f --forest -C apache2 # Ngoài ra bạn kết hợp với lệnh grep để tìm đúng tiến trình mình mong muốn ps -ef | grep process_test # Lệnh sau hiển thị cây tiến trình pstree
Lệnh lấy pid của một tiến trình đang chạy
Lệnh ps chỉ giúp xem pid của một tiến trình đang chạy, còn nếu muốn lấy chính xác pid thì hơi khó. Trong trường hợp cần lấy chính xác pid của một process, bạn nên sử dụng lệnh sau:
pidof <ProcessName>
Trong đó ProcessName là tên tiến trình đang chạy, có thể trả về một hoặc nhiều pid. Ví dụ:
pidof compiz 2180 pidof bash 24321 12769 10331 8116 2408
Ngoài ra bạn có thể sử dung ps kết hợp với awk:
ps aux | grep -i firefox | awk {'print $2'}
Bạn có thể thay firefox bằng tên khác. Lệnh này trả về cả pid của tiến trình hiện tại.
Dừng các tiến trình bị treo
kill là lệnh dừng các tiến trình khi tiến trình đó bị treo. Chỉ có super-user mới có thể dừng tất cả các tiến trình còn user khác chỉ có thể dừng tiến trình mà user đó tạo ra.
Trước khi kill một tiến trình, bạn cần xác định pid của tiến trình đó, sau đó sử dụng một trong các lệnh sau:
kill -TERM pid
kill -SIGTERM pid
kill -9 pid
Ví dụ kill tiến trình firefox:
$ ps -ef | grep firefox 1986 ? Sl 7:22 /usr/lib/firefox-3.5.3/firefox $ kill -9 1986
# Với lệnh killall, bạn có thể kill tiến trình theo tên killall -9 firefox # Lệnh pkill sẽ kill tất cả các tiến trình có tên chứa xâu truyền vào pkill sample # Có thể sử dụng kết hợp với lệnh pidof ở trên kill -9 $(pidof firefox)
Xem tài nguyên hệ thống
top là lệnh hiển thị sự hoạt động của các tiến trình, đặc biệt là thông tin về tài nguyên hệ thống và việc sử dụng các tài nguyên đó của từng tiến trình.
Lệnh sau sẽ hiển thị thông tin các Task, thông tin bộ nhớ, CPU và vùng Swap. Nhấn phím ‘q’ để thoát khỏi cửa sổ:
top
Sử dụng tham số -O (Không phải số 0 mà là chữ O viết hoa) để sắp xếp tiến trình:
top -O
Tiếp đó bạn nhấn (Shift + O) để hiển thị danh sách kí tự tương ứng với trường thông tin, sau đó bạn nhấn kí tự tương ứng với trường để sắp xếp theo trường đó. Ví dụ nhấn phím ‘a’ để sắp xếp theo PID, nhấn (Shift+P) để sắp xếp theo % sử dụng CPU.
Sử dụng tham số -u để hiển thị thông tin các tiến trình theo user:
top -u tecmint
Hiển thị tiến trình đang chạy dưới dạng cây
pstree là lệnh hiển thị các tiến trình đang chạy dưới dạng cây. Bạn có thể sử dụng một trong các cú pháp sau:
pstree
pstree pid
pstree user
Ngoài ra bạn có thể sử dụng lệnh tree:
tree
Trường hợp báo không tìm thấy lệnh thì bạn phải cài đặt gói này bằng lệnh: sudo apt-get install tree
Xem cú pháp dòng lệnh
man là lệnh xem hướng dẫn về dòng lệnh như cú pháp, các tham số… Ví dụ:
man man
Giải phóng bộ nhớ cache
Nếu OS sử dụng quá nhiều memory cho cache, thì bạn có thể dùng lệnh sau để giải phóng:
sudo su
sync; echo 1 > /proc/sys/vm/drop_caches
Lệnh này không ảnh hưởng đến các ứng dụng đang chạy.
Hiển thị ứng dụng sử dụng nhiều bộ nhớ nhất
# Lệnh sau hiển thị 10 ứng dụng sử dụng nhiều bộ nhớ nhất ps aux --sort=-%mem | awk 'NR<=10{print $0}'
Lệnh thao tác người dùng
Lệnh tạo người dùng mới
useradd: là lệnh tạo một người dùng mới. Cú pháp của lệnh như sau:
useradd [options] username
Đơn giản nhất để tạo user mới bạn sử dụng lệnh sau:
useradd tecmint
Lệnh này tạo user mới nhưng user này ở trạng thái khóa, để mớ khóa user này bạn cần phải thiết lập mật khẩu bằng lệnh passwd:
passwd tecmint
Hệ thống hiển thị giao diện để bạn nhập mật khẩu. Khi người dùng mới được tạo, hệ thống sẽ tự động thêm vào tệp ‘/etc/passwd‘. Tệp này được sử dụng để lưu trữ thông tin các người dùng. Nội dung thêm dạng như dưới (Thư mục home mặc định hệ thống để là: /home/) :
tecmint:x:504:504:tecmint:/home/tecmint:/bin/bash
Để tạo user với thư mục home được xác định trước, bạn dùng lệnh sau:
useradd -d /data/projects anusha
Để tạo user trong một nhóm xác định, bạn sử dụng tham số -g theo sau là GID (Group ID). Nếu bạn muốn xác định User ID (UID) bạn sử dụng tham số -u theo sau là UID:
useradd -u 1000 -g 500 tarunika
Để thêm user vào nhiều group, bạn dùng tham số -G theo sau là danh sách tên các group:
useradd -G admins,webadmin,developers tecmint
Mặc định khi tạo tài khoản người dùng mới, tài khoản sẽ không bao giờ bị hết hạn.
# Nếu bạn muốn tạo tài khoản có thời gian sử dụng bạn sử dụng tham số -e useradd -e 2014-03-27 aparna # Nếu muốn thiết lập thời gian hết hạn của mật khẩu, bạn sử dụng tham số -f theo sau số ngày useradd -e 2014-04-27 -f 45 tecmint # Còn nếu bạn muốn kiểm tra thời gian hết hạn của tài khoản, bạn sử dụng lệnh change với tham số -l chage -l aparna
Lệnh tạo nhóm người dùng mới
groupadd: là lệnh tạo một nhóm người dùng mới. Khi dùng lệnh này, thông tin sẽ được cập nhật vào tệp “/etc/group“. Cú pháp lệnh như sau:
groupadd [options] group
# Để tạo nhóm người dùng mới, bạn dùng lệnh sau groupadd apache # Để kiểm tra chắc chắn bạn đã tạo thành công chưa, bạn sử dụng lệnh sau # Nếu thấy có dòng có tên nhóm là apache là okie grep apache /etc/group
Thay đổi mật khẩu người dùng
passwd là lệnh thay đổi mật khẩu người dùng. Cú pháp của lệnh như sau:
passwd {options} {user_name}
# Nếu bạn đăng nhập với người dùng thông thường, lệnh sau sẽ thay đổi mật khẩu của người dùng hiện tại passwd # Nếu bạn đăng nhập dưới người dùng root, bạn sẽ có thể thay đổi mật khẩu các các người dùng khác passwd linuxtechi # Để hiển thông tin trạng thái mật khẩu, bạn sử dụng tham số-S passwd -S linuxtechi # Để hiển thị thông tin trạng thái mật khẩu của tất cả người dùng, bạn sử dụng tham số -Sa passwd -Sa # Để xóa mật khẩu của người dùng, bạn sử dụng tham số -d passwd -d linuxtechi # Để thiết lập mật khẩu của người dùng hết hạn ngay lập tức, bạn sử dụng tham số -e passwd -e linuxtechi # Để khóa mật khẩu người dùng, bạn sử dụng tham số -l passwd -l linuxtechi # Để mở khóa mật khẩu người dùng, bạn sử dụng tham số-u passwd -u linuxtechi # Để thiết lập sau bao nhiêu ngày phải đổi mật khẩu, bạn sử dụng tham số -n passwd -n 90 linuxtechi
Xóa người dùng
userdel là lệnh xóa người dùng. Cú pháp của lệnh như sau:
userdel [options] username
Lệnh sau xóa người dùng linuxtechi:
userdel -r linuxtechi
Thao tác nhóm người dùng
groupdel là lệnh xóa người nhóm dùng. Cú pháp của lệnh như sau:
groupdel group
Lệnh sau xóa nhóm test:
groupdel test
gpasswd là lệnh giúp quản trị nhóm người dùng, bạn có thể sử dụng lệnh này để đổi mật khẩu, thêm hay loại bỏ người dùng khỏi nhóm. Cú pháp của lệnh như sau:
gpasswd [option] group
# Sử dụng tham số -r để xóa mật khẩu gpasswd -r test # Sử dụng tham số -a để thêm người dùng vào nhóm gpasswd -a daothang test # Sử dụng tham số -d để xóa người dùng khỏi nhóm gpasswd -d daothang test
groups giúp hiển thị danh sách người dùng trong một nhóm. Cú pháp của lệnh như sau:
groups [user]
Lệnh sau hiển thị danh sách người dùng trong trong nhóm chứa người dùng hiện tại:
groups
Lệnh sau hiển thị danh sách người dùng trong trong nhóm chứa người dùng daothang:
groups daothang
Lệnh thao tác với thư mục, tệp tin
Lệnh cơ bản thao tác thư mục tệp tin trên Linux/Ubuntu
Một số lệnh thông thường chắc ai dùng Linux đều biết:
# Lệnh tạo thư mục mkdir <Tên thư mục cần tạo> # Lệnh xóa thư mục (Yêu cầu thư mục phải là thư mục trống) rmdir <Tên thư mục cần xóa> # Lệnh chuyển thư mục cd <Đường dẫn tới thư mục cần chuyển> # Lệnh xem danh sánh cách tệp trong thư mục ls ls -al # Lệnh tạo tệp mới và tệp này trắng touch <Tên tệp muốn tạo> # Nếu muốn tạo và edit luôn thì bạn sử dụng một trong các lệnh sau vi <Tên tệp muốn tạo> nano <Tên tệp muốn tạo> gedit <Tên tệp muốn tạo>
Mỗi lệnh tương ứng với 1 tool, tùy theo từng người mà thích dùng tool nào hơn. Riêng gedit là GUI Tool cho phép sửa trực quan bằng giao diện. Ngoài ra bạn có thể sử dụng nhiều tool khác.
# Để xóa một tệp tin bạn sử dụng lệnh sau rm <Tên tệp cần xóa> # Trường hợp bạn muốn xóa tệp, thư mục và tất cả các file trong các thư mục con ban sử dụng lệnh sau rm -rf <Tên tệp hoặc thư mục cần xóa>
Tên tệp hoặc thư mục bạn có sử dụng kí tự *, ?… Lệnh này rất nguy hiểm, nếu đánh nhầm tên thư mục có thể xóa hết toàn bộ dữ liệu hệ thống.
Lệnh thao tác tệp trên FTP Server
Sử dụng lệnh ftp để kết nối tới server FTP:
ftp 192.168.0.1
ftp domain.com
ftp user@ftpdomain.com
Sau khi kết nối đến rùi, các lệnh cũng gần giống như thao tác trên Ubuntu thông thường:
# Sử dụng lệnh cd để chuyển thư mục, lệnh ls để xem danh sách tệp cd test ls # Để chuyển tệp giữa các thư mục trên FTP, bạn sử dụng lệnh rename mkdir bk rename my_file.txt bk/my_file.txt # Để lấy tệp từ server, trước hết bạn phải dùng lệnh lcd để thiết lập thư mục sẽ tải tệp về, sau đó dùng lệnh get để tải tệp lcd /u01/test get my_file.txt # Để lấy nhiều tệp, bạn sử dụng lệnh mget mget *.txt
Lệnh này sẽ hỏi bạn có thực hiện từng tệp không, để hệ thống không hỏi lại khi kết nối tới FTP bạn phải thêm tham số -i:
ftp -i 192.168.0.1
# Để đẩy tệp lên FTP Server bạn sử dụng lệnh put put test_file.xls # Để đẩy nhiều tệp, bạn sử dụng lệnh mput mput *.xls # Để đóng kết nối, bạn có thể sử dụng một trong các lệnh sau bye exit quit
Lệnh thao tác với SFTP Server
Trên Ubuntu 16, sử dụng lệnh sau để download file từ FTP Server:
wget ftps://test:123456a@@172.19.200.164/test/test.log --no-check-certificate
Để upload file lên bạn cần cài đặt phần mềm lftp trước:
sudo apt-get install lftp
Trong thư mục home, tạo tệp mới tệp .lftprc:
nano ~/.lftprc
Với nội dung như sau:
set ftp:ssl-auth TLS
set ftp:ssl-force true
set ftp:ssl-protect-list yes
set ftp:ssl-protect-data yes
set ftp:ssl-protect-fxp yes
set ssl:verify-certificate no
Sau đó đánh lệnh sau để upload tệp
$ lftp test@172.19.200.164 Password: $ lftp test@172.19.200.164:~> mput test.zip 1031293623 bytes transferred in 18 seconds (53.53 MiB/s)
Lệnh xác định vị trí của một file
Có nhiều trường hợp bạn chỉ biết tên file nhưng không biết nó được lưu trong thư mục nào, khi đó bạn có thể sử dụng lệnh sau để xác định vị trí của file:
locate <Tên tệp>
Ví dụ:
locate libxml2.so
/opt/lampp/lib/libxml2.so
/opt/lampp/lib/libxml2.so.2
/opt/lampp/lib/libxml2.so.2.9.4
Lệnh locate trên tìm rất nhanh vì thực chất nó lấy dữ liệu từ một database có sẵn, để đảm bảo chính xác bạn nên gọi lệnh cập nhật database này trước khi sử dụng lệnh locate:
sudo updatedb
locate libxml2.so
Lệnh tìm kiếm tệp
Bạn có thể sử dụng lệnh find, lệnh này có ưu điểm hỗ trợ tìm kiếm theo pattern:
find <Thư-mục-tìm-kiếm> -name <Pattern-tìm-kiếm>
Ví dụ:
find / -name libxml*
# Nếu bạn muốn tên tệp không phân biệt hoa thường có thể dùng lệnh find / -iname libxml* # Sử dụng thêm "-not -path" nếu muốn loại bỏ thư mục không tìm kiếm find / -iname libxml* -not -path './obj/*' # Sử dụng "-type f" nếu muốn chỉ tìm file, không phải thư mục find / -iname libxml* -not -path './obj/*' -type f
Lệnh tìm các tệp có nội dung chứa text nào đó
Kết hợp lệnh find với grep để thực hiện điều này:
find / -type f -exec grep -H 'text-to-find-here' {} \;
Bạn mở rộng lệnh này với các option cho lệnh find như ở trên. Ví dụ:
find . -iname "*.h" -not -path './data/*' -type f -exec grep -H 'public class' {} \;
Lệnh loại bỏ phần comment khỏi tệp
Nhiều những tệp có quá nhiều comment (Bắt đầu bằng dấu #) trong khi dòng cấu hình thực rất ít. Bạn mong muốn loại bỏ hết các comment để có thể tập trung vào dữ liệu cần:
grep -o '^[^#]*' file
Ví dụ:
grep -o '^[^#]*' squid.conf.default > squid.conf
Lệnh tạo tệp với dung lượng tùy ý
Đôi khi bạn cần tạo ra các tệp dữ liệu lớn, chẳng hạn để test trường hợp đầy HDD, hoặc test ứng dụng khi xử lý file lớn. Để tạo tệp dung lượng lơn, sử dụng lệnh sau:
fallocate -l 10G test.log
Lệnh trên tạo ra tệp test.log có dung lượng 10G. Các thông số bạn có thể thay đổi cho phù hợp.
Xem dung lượng của tệp, thư mục
# Sử dụng 1 trong các lệnh sau để xem kích thước các tệp trong thư mục hiện tại ls -l ll # Lệnh sau hiển thị các file và sắp xếp theo thời gian ls -lt ls -ltr # Lệnh sau để xem kích thước 1 thư mục du -hs /path/to/directory du -hs * du -sh * | sort -h # Lệnh tìm kiếm các file (tệp) có dung lượng lớn hơn 100M find / -xdev -type f -size +100M -exec du -sh {} ';' | sort -rh | head -n50
Lệnh thao tác văn bản
Xử lý văn bản với lệnh awk
awk không đơn giản là lệnh mà có thể gọi nó như ngôn ngữ lập trình. Nó cho phép bạn thực hiện các xử lý phức tạp. Chi tiết hơn bạn có thể xem tại: https://likegeeks.com/awk-command/, https://linuxconfig.org/learning-linux-commands-awk, https://www.tutorialspoint.com/awk/awk_basic_examples.htm
Khi sử dụng xử lý text bạn cần biết:
- awk sẽ tách dữ liệu đầu phân chia bởi dấu cách vào thành mảng. Để truy cập vào các phần tử bạn sử dụng kí tự $ theo sau là số:
- $0: Toàn bộ dòng
- $1: Trường thứ nhất
- $2: Trường thứ 2
- $n: Trường thứ n
- Ngoài ra awk hỗ trợ sẵn các biến:
- FIELDWIDTHS: Chỉ định chiều rộng trường
- RS: Chỉ định dấu phân cách giữa các bản ghi
- FS: Chỉ định dấu phân cách các trường dữ liệu
- OFS, ORS: Chỉ định dấu phân cách đầu ra
- Hỗ trợ cấu trúc lặp: while, for
- Hỗ trợ lệnh rẽ nhánh: if
- Các hàm/lệnh hay sử dụng:
- Lệnh in ra màn hình: print, printf
- Hàm toán học: sin, cos, sqrt, exp, log, rand,…
- Hàm thao tác xâu: toupper, tolower,…
- Hàm tự bạn định nghĩa
Nói đầu đủ về lệnh này thì mất rất nhiều thời gian, bạn có thể tham khảo các link ở trên. Ở đây tôi chỉ đưa ra ví dụ sử dụng:
Giả sử bạn có dữ liệu log lưu trong tệp test.log với nội dụng dạng như dưới, trong đó có các dòng log thời gian tính theo mili giây. Bạn cần lấy dòng log có thời gian lớn hơn 1 giây:
[2018-03-19 03:50:12.340] [INFO] test - conn.query 1521406212314 [2018-03-19 03:50:12.340] [INFO] test - before commit 1521406212314 [2018-03-19 03:50:12.421] [INFO] test - after commit 1521406212314 [2018-03-19 03:50:12.421] [INFO] test - before callback 1521406212314 [2018-03-19 03:50:12.421] [INFO] test - insert_execution callback begin emit begin [2018-03-19 03:50:12.422] [INFO] test - insert_execution callback emit end [2018-03-19 03:50:12.422] [INFO] test - g_nLastNewOrderTimestamp 1521406212422 [2018-03-19 03:50:12.423] [INFO] test - ltrim begin [2018-03-19 03:50:12.423] [INFO] test - insert_execution callback end [2018-03-19 03:50:12.423] [INFO] test - after callback 1521406212314 [2018-03-19 03:50:12.427] [INFO] test - 1 'trades in ' 113.43395599722862 'ms' [2018-03-19 03:50:12.427] [INFO] test - list begin lrange begin [2018-03-19 03:50:12.427] [INFO] test - ltrim end normal. [2018-03-19 03:50:12.429] [INFO] test - lrange callback begin [2018-03-19 03:50:12.429] [INFO] test - list end lrange callback end lrange end [2018-03-19 03:50:18.985] [INFO] test - list begin lrange begin [2018-03-19 03:50:18.988] [INFO] test - lrange callback begin [2018-03-19 03:50:18.989] [INFO] test - 2018-03-18T20:50:18.989Z get_trade 3 [2018-03-19 03:50:18.992] [INFO] test - Transaction No 1521406218991 [2018-03-19 03:50:18.993] [INFO] test - last of insert_execution [2018-03-19 03:50:18.993] [INFO] test - list end lrange callback end lrange end [2018-03-19 03:50:18.995] [INFO] test - pool.getConnection [2018-03-19 03:50:18.997] [INFO] test - pool.beginTransaction 1521406218991 [2018-03-19 03:50:19.010] [INFO] test - conn.query 1521406218991 [2018-03-19 03:50:19.010] [INFO] test - before commit 1521406218991 [2018-03-19 03:50:19.051] [INFO] test - after commit 1521406218991 [2018-03-19 03:50:19.051] [INFO] test - before callback 1521406218991 [2018-03-19 03:50:19.051] [INFO] test - insert_execution callback begin emit begin [2018-03-19 03:50:19.052] [INFO] test - insert_execution callback emit end [2018-03-19 03:50:19.052] [INFO] test - g_nLastNewOrderTimestamp 1521406219052 [2018-03-19 03:50:19.053] [INFO] test - ltrim begin [2018-03-19 03:50:19.053] [INFO] test - insert_execution callback end [2018-03-19 03:50:19.054] [INFO] test - after callback 1521406218991 [2018-03-19 03:50:19.061] [INFO] test - 3 'trades in ' 70.98334199935198 'ms' [2018-03-19 03:50:19.062] [INFO] test - list begin lrange begin [2018-03-19 03:50:19.062] [INFO] test - ltrim end normal. [2018-03-19 03:50:19.068] [INFO] test - lrange callback begin [2018-03-19 03:50:19.068] [INFO] test - list end lrange callback end lrange end [2018-03-19 03:50:19.201] [INFO] test - list begin lrange begin [2018-03-19 03:50:19.204] [INFO] test - lrange callback begin
Với awk bạn chỉ cần sử dụng lệnh đơn giản sau:
cat test.log | grep "'ms'" | awk {'if ($10>1000) print'}
Xử lý một số lỗi hay gặp trên Ubuntu
apt-get update fails to fetch files, “Temporary failure resolving …” error
Lỗi khi bạn thực hiện “apt-get update” nhưng nhiều link không lấy được dữ liệu do không xác định được IP từ một số domain.
<code>Reading package lists... Done W: Failed to fetch http://gb.archive.ubuntu.com/ubuntu/dists/oneiric/InRelease W: Failed to fetch http://gb.archive.ubuntu.com/ubuntu/dists/oneiric-updates/InRelease W: Failed to fetch http://gb.archive.ubuntu.com/ubuntu/dists/natty-backports/InRelease W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/oneiric-security/InRelease W: Failed to fetch http://archive.canonical.com/ubuntu/dists/natty/InRelease W: Failed to fetch http://extras.ubuntu.com/ubuntu/dists/natty/InRelease </code>
Gặp lỗi này bạn cấu hình DNS cho Ubuntu sang DNS của Google: 8.8.8.8 bằng lệnh sau:
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf > /dev/null
Ubuntu sử dụng hết RAM cho phần cache
Hiện tại tôi có server với RAM 16G, ứng dụng chỉ sử dụng hơn 7.1G, còn dư 700M, còn lại hệ thống sử dụng gần 8G cho phần CACHE.
Cũng có người thắc mắc về vấn đề này ở bài viết Cached Memory Takes all the memory, mọi người confirm rằng: Đây thực sự không phải là vấn đề, nó là thiết kế của Ubuntu. Ubuntu tận dụng RAM không sử dụng để làm cache giúp tăng tốc độ hệ thống. RAM sử dụng cho cache có thể được ứng dụng sử dụng bất cứ khi nào cần.
Có thể sử dụng lệnh sau để giải phóng bộ nhớ cache, không ảnh hưởng đến các ứng dụng:
// Chuyển sang quyền root
sudo -i
// Xóa bộ đệm
sync; echo 1 > /proc/sys/vm/drop_caches
// Kiểm tra lại bộ nhớ
free -w -h
Nếu bạn muốn giữ free mem luôn ở mức 2G trở lên, bạn có thể chạy bash sau check-free-mem.sh:
#!/bin/bash
# 1.5G
checkMem=1.5
while [ true ]
do
echo -----------------------------
freeMem=$( awk '/MemFree/ { printf "%.3f \n", $2/1024/1024 }' /proc/meminfo )
echo FreeMem = $freeMem
if (( $(echo "$freeMem < $checkMem" | bc -l) ))
then
echo Clean cache memory...
sync; echo 1 > /proc/sys/vm/drop_caches
freeMem=$( awk '/MemFree/ { printf "%.3f \n", $2/1024/1024 }' /proc/meminfo )
echo New FreeMem = $freeMem
fi
echo Waiting 60s...
sleep 60s
done
Lệnh chạy như sau:
sudo ./check-free-mem.sh
Có thể bạn quan tâm: Lập trình Shell Script trên Linux/Ubuntu
1 Pingbacks