Các Lệnh cURL Cơ Bản Trong Linux: Hướng Dẫn Chi Tiết & Ví Dụ Thực Tế
Công cụ dòng lệnh curl là gì và vì sao tiện ích nhỏ gọn này lại trở thành chuẩn mực không thể thay thế trong quy trình làm việc của mọi kỹ sư DevOps, quản trị viên hệ thống và lập trình viên? Khi làm việc trên môi trường máy chủ Linux không có giao […]
Công cụ dòng lệnh curl là gì và vì sao tiện ích nhỏ gọn này lại trở thành chuẩn mực không thể thay thế trong quy trình làm việc của mọi kỹ sư DevOps, quản trị viên hệ thống và lập trình viên? Khi làm việc trên môi trường máy chủ Linux không có giao diện đồ họa (GUI), cURL là công cụ mạnh mẽ nhất giúp bạn gửi các yêu cầu mạng, tải tệp tin, kiểm tra mã phản hồi HTTP và kiểm thử API trực tiếp qua terminal. Đội ngũ kỹ thuật tại ThueVPSGiaRe.vn sẽ phân tích chi tiết bản chất của cURL, hướng dẫn cấu hình tham số chuẩn xác và cung cấp các ví dụ thực hành thực tế từ cơ bản đến nâng cao.
1. Công cụ dòng lệnh cURL là gì?
Công cụ dòng lệnh cURL là gì? cURL (viết tắt của Client URL) là một tiện ích dòng lệnh và thư viện phần mềm mã nguồn mở dùng để truyền dữ liệu qua lại giữa client và server thông qua các giao thức mạng đa dạng. cURL hoạt động độc lập, không cần tương tác của người dùng và chạy trực tiếp từ giao diện terminal console.

Dự án cURL được khởi xướng bởi lập trình viên người Thụy Điển Daniel Stenberg vào năm 1997. Ban đầu, tác giả muốn xây dựng một công cụ tự động lấy tỷ giá tiền tệ từ các trang web qua giao thức IRC và HTTP. Trải qua gần ba thập kỷ phát triển liên tục, cURL đã trở thành một trong những phần mềm mạng phổ biến nhất thế giới, được tích hợp mặc định trên hầu hết bản phân phối Linux, macOS và cả Windows 10/11.
Phân biệt giữa công cụ cURL (CLI) và thư viện libcurl
Nhiều người mới bắt đầu thường nhầm lẫn giữa hai khái niệm `curl` và `libcurl`. Trong thực tế kiến trúc hệ thống, chúng có sự phân định rõ ràng:
- libcurl: Là thư viện lõi viết bằng ngôn ngữ C, cung cấp toàn bộ logic xử lý giao thức mạng, quản lý socket, đàm phán bảo mật TLS/SSL, cookie và phiên truyền dữ liệu. Các ngôn ngữ như PHP, Python, Node.js, Go hay Ruby đều sử dụng các wrapper liên kết trực tiếp với libcurl để thực hiện HTTP request.
- cURL (Dòng lệnh – CLI): Là chương trình thực thi (binary) tương tác với người dùng qua terminal. Khi bạn gõ lệnh `curl` kèm theo các tham số trên shell, chương trình sẽ tiếp nhận input, xử lý cấu hình và gọi đến thư viện `libcurl` bên dưới để thực thi tác vụ mạng.
Hệ thống giao thức mạng phong phú được cURL hỗ trợ
Điểm vượt trội của cURL nằm ở khả năng hỗ trợ giao thức cực kỳ rộng rãi. Không chỉ gói gọn trong môi trường web, cURL cho phép bạn gửi nhận dữ liệu qua:
- Giao thức Web: HTTP, HTTPS (hỗ trợ cả HTTP/1.1, HTTP/2 và HTTP/3).
- Truyền nhận tệp: FTP, FTPS, SFTP, SCP, TFTP, FILE.
- Dịch vụ thư điện tử và thư mục: IMAP, IMAPS, POP3, POP3S, SMTP, SMTPS, LDAP, LDAPS.
- Giao thức chuyên biệt khác: DICT, TELNET, MQTT, RTSP.
2. Điều kiện tiên quyết và cách cài đặt cURL trên Linux
Trước khi thực hành, bạn cần đăng nhập vào terminal của máy chủ qua SSH với quyền root hoặc tài khoản có quyền sudo. Nếu hệ thống chưa có sẵn gói cURL, bạn có thể cài đặt theo từng bản phân phối hệ điều hành như sau:
- Trên Debian / Ubuntu:
sudo apt update sudo apt install curl - Trên RHEL / CentOS / Fedora:
sudo yum install curl # hoặc trên các phiên bản mới sử dụng dnf: sudo dnf install curl - Trên OpenSUSE:
sudo zypper install curl
3. Các lệnh cURL cơ bản cần nắm trong Linux
Kiểm tra phiên bản cURL hiện tại
Lệnh này giúp bạn kiểm tra phiên bản cURL đang hoạt động trên hệ thống, phiên bản thư viện libcurl đi kèm cũng như danh sách toàn bộ các giao thức mạng được hỗ trợ (HTTP, HTTPS, FTP, FTPS, SFTP, SCP, TELNET,…):
curl --version
Cú pháp tổng quát và xem nội dung trang web
Cú pháp cơ bản của lệnh cURL trên Linux:
curl [OPTIONS] [URL]
Mặc định, nếu bạn không khai báo giao thức cụ thể, cURL sẽ tự động chọn giao thức HTTP. Ví dụ, để hiển thị trực tiếp toàn bộ mã nguồn HTML của một website ra màn hình dòng lệnh:
curl yourdomain.com
# hoặc
curl http://mydomain.com
Tải tệp tin bằng cURL (Phân biệt -O và -o)
Khi cần tải tập tin từ xa về thư mục làm việc hiện tại, cURL hỗ trợ hai tùy chọn chính:
- Tùy chọn
-O(chữ O hoa): Giữ nguyên tên tập tin gốc trên máy chủ từ xa:curl -O http://yourdomain.com/yourfile.tar.gz - Tùy chọn
-o(chữ o thường): Lưu tệp tin với tên mới hoặc chỉ định đường dẫn lưu trữ theo ý muốn:curl -o newyourfile.tar.gz http://yourdomain.com/yourfile.tar.gz
Các lệnh HTTP: Kiểm tra Header, gửi request GET và POST
cURL được ứng dụng phổ biến nhất trong việc kiểm thử và tương tác với các dịch vụ web HTTP/HTTPS:
- Kiểm tra thông tin HTTP Header (
-I): Chỉ lấy các trường tiêu đề phản hồi từ máy chủ (Server, Content-Type, Date, Status Code,…) mà không tải toàn bộ nội dung trang:curl -I www.yourdomain.com - Gửi yêu cầu GET: Truy xuất dữ liệu trang web thông thường:
curl http://mydomain.com - Gửi yêu cầu POST có dữ liệu (
--data): Đẩy dữ liệu lên máy chủ web qua phương thức POST:curl --data "text=Howareyou" https://mydomain.com/firstpage.jsp
Quản lý và xử lý Cookies với cURL
Để duy trì phiên làm việc hoặc lưu trạng thái đăng nhập giữa các lần gửi request, bạn có thể kết hợp hai tùy chọn sau:
- Lưu Cookie vào tệp tin (
--cookie-jar): Gửi yêu cầu và ghi lại toàn bộ cookie nhận được từ máy chủ vào một tệp:curl --cookie-jar Mycookies.txt https://www.samplewebsite.com/index.html -O - Sử dụng lại Cookie đã lưu (
--cookie): Đính kèm tệp cookie đã lưu vào các yêu cầu tiếp theo để máy chủ nhận diện phiên:curl --cookie Mycookies.txt https://www.samplewebsite.com
Thao tác với máy chủ FTP (Tải xuống & Tải lên tệp tin)
Bên cạnh giao thức web, cURL hỗ trợ tương tác với máy chủ FTP có yêu cầu xác thực tài khoản:
- Tải tập tin từ máy chủ FTP về máy cục bộ: Kết hợp cờ
-uđể điền thông tin đăng nhập và-Ođể lưu file:curl -u username:password -O ftp://nameftpserver/yourfile.tar.gz - Tải tập tin từ máy cục bộ lên máy chủ FTP (
-T):curl -u username:password -T yourfile.tar.gz ftp://nameftpserver
Giới hạn tốc độ tải về (–limit-rate)
Nhằm tránh việc cURL chiếm dụng toàn bộ băng thông mạng của máy chủ, bạn có thể thiết lập giới hạn tốc độ truyền tải tối đa thông qua tham số --limit-rate:
# Giới hạn tốc độ tải file ở mức tối đa 100 KB/s
curl --limit-rate 100K http://testdomain.com/samplefile.tar.gz -O
Gửi dữ liệu biểu mẫu (Form) và xác thực HTTP
- Mô phỏng gửi biểu mẫu qua POST: Truyền dữ liệu trường thông tin giống như thao tác submit form trên trình duyệt:
curl --data "username=john&password=123456" https://yourdomain.com/login.php - Xác thực tài khoản HTTP (HTTP Authentication): Dùng cờ
-uđể truy cập các khu vực hoặc thư mục web được bảo vệ bằng mật khẩu:curl -u username:password https://yourdomain.com/protected
4. So sánh chi tiết cURL và Wget: Đâu là lựa chọn tối ưu?
Cả cURL và Wget đều là hai công cụ mạng kinh điển trong thế giới Linux, nhưng mục đích thiết kế nguyên bản của chúng hoàn toàn khác nhau. Việc nắm rõ sự khác biệt giữa cURL và lệnh wget trong linux là gì sẽ giúp bạn chọn đúng công cụ, tránh lãng phí thời gian viết mã lệnh không phù hợp.

Dưới đây là bảng so sánh cơ bản giữa cURL và Wget:
| Tiêu chí kỹ thuật | cURL (Client URL) | GNU Wget | Khuyến nghị sử dụng |
|---|---|---|---|
| Mục tiêu chính | Truyền dữ liệu 2 chiều (Upload/Download, gọi API). | Tải tệp tin đơn chiều từ xa về máy chủ. | Chọn cURL cho API; chọn Wget để kéo file. |
| Tải đệ quy (Recursive) | Không hỗ trợ tải đệ quy toàn bộ thư mục web. | Rất mạnh (hỗ trợ cờ -r để mirror cả website). |
Dùng Wget nếu cần sao chép toàn bộ trang web. |
| Hỗ trợ giao thức | Hơn 25 giao thức (HTTP/3, SFTP, SCP, LDAP…). | Hạn chế (chủ yếu là HTTP, HTTPS, FTP, FTPS). | Chọn cURL khi làm việc với giao thức phức tạp. |
| Tích hợp lập trình | Tuyệt vời thông qua thư viện `libcurl` đa ngôn ngữ. | Chỉ là tiện ích dòng lệnh độc lập, không có API thư viện. | cURL là lựa chọn số 1 cho nhà phát triển phần mềm. |
| Tự động thử lại (Retry) | Cần khai báo cờ cụ thể (--retry). |
Mặc định tự động thử lại khi mất mạng hoặc đứt file. | Wget ổn định hơn khi tải file lớn mạng chập chờn. |
5. 4 Lỗi thường gặp khi chạy lệnh cURL và cách khắc phục nhanh
Trong quá trình vận hành, cURL có thể trả về các thông báo lỗi kèm theo mã số cụ thể. Dưới đây là 4 lỗi kỹ thuật phổ biến nhất và giải pháp xử lý tương ứng:
1. curl: (7) Failed to connect to host: Connection refused
- Nguyên nhân: Cổng (Port) đích đang đóng, dịch vụ web server (Nginx/Apache) trên máy chủ đích chưa được bật, hoặc tường lửa (UFW/Firewalld/Iptables) đang chặn gói tin kết nối.
- Cách xử lý: Kiểm tra trạng thái dịch vụ đích bằng lệnh
systemctl status nginxhoặc dùngnetstat -tlpnđể xác định cổng mạng có đang được lắng nghe hay không.
2. curl: (60) SSL certificate problem: unable to get local issuer certificate
- Nguyên nhân: Hệ điều hành trên máy bạn thiếu chứng chỉ gốc (CA Certificates), máy chủ đích chưa cài đủ chuỗi chứng chỉ trung gian (SSL Intermediate Chain), hoặc trang web dùng chứng chỉ tự ký.
- Cách xử lý: Cập nhật kho chứng chỉ của hệ thống bằng lệnh
sudo apt install --reinstall ca-certificates(trên Ubuntu) hoặcsudo update-ca-trust(trên CentOS). Nếu test nội bộ tạm thời, có thể thêm cờ-k.
3. curl: (52) Empty reply from server
- Nguyên nhân: Kết nối đã được thiết lập thành công nhưng máy chủ đích đột ngột ngắt kết nối mà không gửi lại bất kỳ byte dữ liệu nào (thường do ứng dụng backend bị crash hoặc bị giới hạn timeout).
- Cách xử lý: Sử dụng cờ
-v(Verbose) để kiểm tra luồng trao đổi dữ liệu:curl -v https://api.example.comđể xác định chính xác thời điểm kết nối bị đứt.
4. curl: (28) Operation timed out
- Nguyên nhân: Thời gian chờ kết nối vượt quá ngưỡng quy định do nghẽn mạng hoặc máy chủ đích bị quá tải tài nguyên CPU/RAM.
- Cách xử lý: Thiết lập rõ thời gian timeout tối đa bằng tham số
--connect-timeout 10(chờ tối đa 10 giây) hoặc kiểm tra lại đường truyền mạng giữa hai máy chủ.
7. Câu hỏi thường gặp về cURL (FAQ)
1. cURL là viết tắt của từ gì và ai là người sáng lập?
cURL là từ viết tắt của Client URL. Công cụ này được lập trình viên Daniel Stenberg phát hành lần đầu vào năm 1997 với mục đích ban đầu là hỗ trợ việc tự động hóa lấy dữ liệu tỷ giá tiền tệ từ các trang web qua terminal mà không cần trình duyệt.
2. Tại sao trên VPS mới tạo lại báo lỗi “curl: command not found”?
Lỗi này xảy ra do hình ảnh hệ điều hành (OS template) cài trên máy chủ là phiên bản tối giản (Minimal), nhà cung cấp đã lược bỏ bớt các tiện ích phụ trợ để giảm dung lượng đĩa. Bạn chỉ cần chạy lệnh sudo apt install curl -y (Ubuntu/Debian) hoặc sudo dnf install curl -y (CentOS/AlmaLinux) để cài bổ sung.
3. Làm cách nào để gửi dữ liệu JSON bằng cURL mà không bị lỗi cú pháp?
Bạn cần khai báo trường tiêu đề -H "Content-Type: application/json" và đặt chuỗi JSON bên trong cặp dấu nháy đơn với tham số -d '{"key":"value"}'. Cách viết này giúp bảo vệ các dấu nháy kép bên trong JSON không bị bash shell hiểu nhầm thành biến môi trường.
4. Tùy chọn -k trong cURL có tác dụng gì và khi nào nên dùng?
Tùy chọn -k (hoặc --insecure) có tác dụng yêu cầu cURL bỏ qua bước xác thực chứng chỉ số SSL/TLS. Tùy chọn này chỉ nên dùng khi bạn test các máy chủ nội bộ (Localhost/Staging) có chứng chỉ tự ký; tuyệt đối không dùng trong môi trường production vì nguy cơ bị tấn công giả mạo.
5. Khi nào nên ưu tiên chọn Wget thay vì cURL?
Bạn nên dùng Wget khi cần tải các tệp tin có kích thước lớn qua đường truyền mạng không ổn định nhờ tính năng tự động khôi phục tải (resume download), hoặc khi muốn tải đệ quy (recursive download) để lưu bản sao lưu (mirror) của toàn bộ một website về máy chủ cục bộ.
Tổng kết
Hiểu rõ công cụ dòng lệnh curl là gì cùng cách phối hợp các tham số -X, -H, -d, -I là kỹ năng nền tảng giúp bạn tự tin kiểm soát mọi luồng dữ liệu mạng trên máy chủ Linux. Từ việc kiểm thử API, theo dõi tính khả dụng của website đến việc xây dựng các kịch bản tự động hóa, cURL luôn là giải pháp nhanh gọn, chính xác và tiết kiệm tài nguyên nhất.
Cần một VPS giá rẻ để bắt đầu thực hành?
Khởi tạo VPS Linux với đầy đủ quyền root, ổ cứng NVMe U.2 siêu tốc và băng thông không giới hạn ngay hôm nay.
Lưu ý kỹ thuật: Toàn bộ cú pháp và câu lệnh mẫu trong bài viết được xây dựng dựa trên tài liệu cURL chính thức và đã được kiểm nghiệm trên các bản phân phối Linux phổ biến (Ubuntu, Debian, CentOS). Tùy thuộc vào phiên bản gói phần mềm, phân quyền tài khoản và cấu hình tường lửa cụ thể trên máy chủ của bạn, kết quả phản hồi có thể có sự sai biệt nhỏ. Bạn nên thử nghiệm kịch bản trên môi trường lab hoặc staging trước khi đưa vào vận hành chính thức trên máy chủ production.



