Trong thế giới công nghệ, curl
là một trong những công cụ dòng lệnh mạnh mẽ và linh hoạt nhất mà bất kỳ ai làm việc với mạng, API hoặc hệ thống Linux/Unix đều nên thành thạo. Được phát triển để truyền dữ liệu với cú pháp URL, curl
hỗ trợ một loạt các giao thức bao gồm HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP, LDAPS, FILE và GOPHER. Sự đa năng và khả năng triển khai HTTP toàn diện của nó có nghĩa là, nếu có một URL cho nó, curl
có thể thực hiện được.
Bài viết này của tinhoccongnghe.net sẽ đi sâu vào các trường hợp sử dụng thực tế của curl
, từ những tác vụ cơ bản như truy xuất trang web đến những ứng dụng phức tạp hơn như tương tác với API và xử lý dữ liệu. Chúng tôi sẽ hướng dẫn bạn cách tận dụng tối đa công cụ này, giúp bạn làm chủ các lệnh curl
để tối ưu hóa công việc và tự động hóa các tác vụ liên quan đến mạng một cách hiệu quả nhất.
1. Truy Xuất Trang Web Một Cách Đơn Giản
Ở dạng cơ bản nhất, lệnh curl
được dùng để truy xuất một URL và hiển thị nội dung của nó ngay trên terminal của bạn. Đây là cách nhanh chóng để xem mã nguồn HTML của một trang web mà không cần mở trình duyệt.
Lệnh curl
cơ bản
Để truy xuất một trang web, bạn chỉ cần gõ curl
theo sau là URL mong muốn:
curl info.cern.ch
Nội dung hiển thị sẽ phụ thuộc vào loại nội dung của URL đó. Nếu bạn yêu cầu một trang web, bạn sẽ thấy mã nguồn HTML của nó.
Kết quả từ một yêu cầu curl đơn giản hiển thị mã nguồn HTML.
Lưu nội dung trang web vào file
Bạn có thể dễ dàng chuyển hướng đầu ra này vào một tệp tin để lưu trữ trang web:
curl info.cern.ch > info.cern.ch.html
curl
đủ thông minh để nhận biết rằng bạn đang chuyển hướng đầu ra tiêu chuẩn và sẽ gửi thông tin thời gian chuyển giao đến stderr, giúp bạn theo dõi quá trình.
Một lệnh curl với đầu ra được chuyển hướng đến một tệp, hiển thị thông tin thời gian cho quá trình truyền.
Lưu ý về ký tự đặc biệt trong URL
Một URL có thể chứa các ký tự đặc biệt có ý nghĩa riêng trong shell, như “?” hoặc “#”. Để tránh các vấn đề tiềm ẩn, hãy đảm bảo bạn đặt URL trong dấu nháy đơn. Nếu không chắc chắn, hãy cẩn thận và luôn đặt chúng trong dấu nháy đơn:
curl 'info.cern.ch'
2. Tải Tệp Tin Hiệu Quả
Nếu bạn cố gắng sử dụng curl
để tải một tệp tin nhị phân – như một hình ảnh hoặc tài liệu Microsoft Word – bạn có thể gặp thông báo lỗi “Binary output can mess up your terminal.” Điều này xảy ra vì curl
sẽ in trực tiếp phần thân phản hồi mà nó nhận được ra màn hình, điều mà bạn gần như chắc chắn không muốn làm đối với các tệp nhị phân.
Lệnh -o
hoặc --output
Thông báo lỗi thường gợi ý sử dụng tùy chọn --output
, cho phép bạn chỉ định một tệp để lưu đầu ra thay vì in nó ra terminal. Bạn cũng có thể dùng -o
như một tùy chọn viết tắt tương đương:
curl -o neo-the-cat.jpg https://placecats.com/neo/300/200
Lệnh này sẽ lưu tệp tại URL đó vào thư mục hiện tại của bạn. Tương tự như khi chuyển hướng đầu ra, curl
sẽ không in nội dung ra màn hình mà thay vào đó cung cấp chi tiết về thời gian tải xuống.
Hiển thị thanh tiến trình
Nếu bạn muốn một thanh tiến trình đơn giản thay vì thông tin chi tiết, hãy sử dụng tùy chọn -#
hoặc --progress-bar
:
curl --progress-bar -o neo-the-cat.jpg https://placecats.com/neo/300/200
Đầu ra từ curl hiển thị hai dạng tải xuống tệp, sau đó là một thanh tiến trình đơn giản một dòng.
3. Cài Đặt Phần Mềm Qua curl
và Các Tùy Chọn Bảo Mật
Bạn có thể thường xuyên bắt gặp các hướng dẫn cài đặt phần mềm yêu cầu sử dụng curl
. Ví dụ, atuin
– một công cụ thay thế cho lệnh history
– có hướng dẫn cài đặt như sau:
curl --proto '=https' --tlsv1.2 -LsSf https://setup.atuin.sh | sh
Nếu bạn mở URL đó trong trình duyệt web, bạn sẽ thấy một shell script thực hiện cài đặt và thiết lập. Bạn có thể tải nó xuống và chạy thủ công nếu muốn, nhưng lệnh một dòng trong shell chỉ là một cách nhanh hơn. Lưu ý rằng đầu ra – nội dung của script này – được chuyển tiếp (piped) đến sh
, lệnh này sẽ chạy nó như một shell script.
Giải thích các tùy chọn quan trọng
Cách sử dụng curl
trong ví dụ atuin
sử dụng các tùy chọn sau:
--proto '=https'
: Đảm bảocurl
sử dụng giao thức HTTPS. Đây là một lớp bảo mật quan trọng, mã hóa dữ liệu giữa bạn và máy chủ.--tlsv1.2
: Buộccurl
sử dụng TLS phiên bản 1.2 hoặc cao hơn. TLS (Transport Layer Security) là giao thức bảo mật dữ liệu giao tiếp qua mạng máy tính.-L
: Tự động theo dõi các chuyển hướng. Nếu URL ban đầu chuyển hướng đến một URL khác,curl
sẽ theo dõi đến đích cuối cùng.-sS
: Ngăncurl
hiển thị thanh tiến trình, nhưng vẫn hiển thị thông báo lỗi nếu có. (-s
là silent,-S
là show errors).-f
: Xử lý lỗi HTTP (ví dụ: mã trạng thái 4xx hoặc 5xx) như một lỗi lệnh. Điều này đảm bảo rằng không có thông báo lỗi HTTP nào được chuyển tiếp đếnsh
, tránh một hành động có khả năng nguy hiểm.
Cảnh báo về an toàn khi cài đặt phần mềm
Việc chạy một shell script được tải xuống từ internet tiềm ẩn rủi ro vì bạn không biết chính xác nó sẽ làm gì. Bạn không chỉ cần tin tưởng nguồn gốc của script, mà còn phải tự tin rằng bạn an toàn trước bất kỳ cuộc tấn công trung gian nào (Man-in-the-Middle attacks). HTTPS có thể giúp giảm thiểu rủi ro này, nhưng nếu bạn muốn cẩn thận hơn, hãy cân nhắc bỏ qua việc chuyển tiếp trực tiếp (| sh
), tải tệp xuống, kiểm tra nội dung để đảm bảo nó an toàn trước khi chạy.
4. Kiểm Tra Địa Chỉ IP Công Cộng của Bạn
Đây là một ứng dụng thực tế của curl
giúp bạn nhanh chóng và dễ dàng tìm ra địa chỉ IP công cộng của mình, nhờ vào dịch vụ tại ifconfig.co
:
curl ifconfig.co
Trang web này sẽ phản hồi bằng địa chỉ IP công cộng của bạn.
Đầu ra từ một yêu cầu curl đến ifconfig.co hiển thị một địa chỉ IP.
Đầu ra mặc định là văn bản thuần túy, điều này làm cho nó trở thành một nguồn tài nguyên tuyệt vời cho các tác vụ tự động hóa.
Tùy chỉnh User Agent
Bạn có thể nhận thấy rằng bạn nhận được một kết quả rất khác nếu bạn truy cập cùng một URL trong trình duyệt web của mình.
Trang chủ ifconfig.co trong trình duyệt web với các chi tiết bao gồm địa chỉ IP công cộng của người dùng, quốc gia và khu vực của họ.
Điều này là do trang web hoạt động khác nhau dựa trên user agent của bạn. Mặc định, curl
gửi một chuỗi như “curl/8.7.1” trong tiêu đề User-Agent. Nếu bạn cần đặt giá trị này thành một cái gì đó khác, ví dụ cho mục đích kiểm thử, hãy sử dụng tùy chọn -A
hoặc --user-agent
:
curl -s --user-agent "my pretend browser" ifconfig.co | head
Bây giờ, trang ifconfig.co
sẽ phản hồi bằng HTML, giống như khi bạn truy cập bằng trình duyệt web.
Đầu ra từ một yêu cầu curl đến ifconfig.co với user agent đã sửa đổi hiển thị mã nguồn HTML trong phản hồi.
5. Hiển Thị Tiêu Đề Phản Hồi hoặc Yêu Cầu
Đôi khi, bạn chỉ muốn lấy các tiêu đề phản hồi từ một URL. Bạn có thể đang gỡ lỗi một lỗi hoặc kiểm tra các tiêu đề cache để xem liệu bạn có cần tải lại tệp hay không.
Xem tiêu đề phản hồi với -I
hoặc --head
Để chỉ xem các tiêu đề phản hồi, sử dụng tùy chọn -I
hoặc --head
:
curl -I example.com
Lệnh curl hiển thị các tiêu đề phản hồi bao gồm Content-Type và Last-Modified.
Lệnh này sẽ gửi một yêu cầu HEAD, mà không phải tất cả các máy chủ web đều hỗ trợ. Nếu bạn gặp lỗi khi sử dụng phương pháp này, bạn có thể yêu cầu curl
gửi một yêu cầu GET và chỉ xuất ra các tiêu đề:
curl -I -X GET example.com
Xem tiêu đề yêu cầu với --verbose
Nếu bạn muốn xem các tiêu đề yêu cầu mà curl
gửi đi, hãy sử dụng tùy chọn --verbose
hoặc -v
:
curl -I -v example.com
Đầu ra từ curl với các tùy chọn –verbose và -I để hiển thị cả tiêu đề phản hồi và yêu cầu.
6. Truy Cập API REST và Xử Lý Dữ Liệu
Khi bạn làm việc với một API, các client chuyên dụng như Postman hoặc Posting sẽ giúp bạn tự động hóa và gỡ lỗi tác vụ. Tuy nhiên, curl
cũng cực kỳ hữu ích để khám phá cách một API hoạt động và kiểm tra nhanh các endpoint.
Dịch vụ DummyJSON là một điểm khởi đầu tuyệt vời. Trang web này cung cấp một API ví dụ với dữ liệu giả mà bạn có thể sử dụng để kiểm tra ứng dụng client và chương trình của riêng mình. Bạn có thể sử dụng các endpoint khác nhau để kiểm tra chuyển hướng, xác thực, và mô phỏng độ trễ thời gian hoặc phản hồi ngẫu nhiên.
Sử dụng DummyJSON
làm ví dụ
Kiểm tra dịch vụ với curl
đơn giản như việc truyền endpoint phù hợp:
curl https://dummyjson.com/test
Bạn sẽ thấy một tài liệu JSON đơn giản trong phản hồi, với hai thuộc tính. Thuộc tính method
sẽ phản ánh phương thức HTTP của yêu cầu của bạn:
Đầu ra định dạng JSON từ một yêu cầu curl đến dummyjson.com.
Xử lý dữ liệu JSON với jq
Sau khi bạn đã lấy dữ liệu từ một API, bạn có thể dễ dàng xử lý nó bằng các công cụ dòng lệnh tiêu chuẩn. Ví dụ, bạn có thể xử lý dữ liệu JSON bằng công cụ jq
. Luồng lệnh này sẽ lấy dữ liệu sản phẩm bằng curl
, sau đó chuyển nó đến jq
để trích xuất sản phẩm đầu tiên:
curl https://dummyjson.com/products | jq '.products[0]' | more
Dữ liệu định dạng JSON đại diện cho một sản phẩm thu được từ dummyjson.com bằng cách sử dụng curl và jq.
7. Lấy Nguồn Cấp RSS (RSS Feed)
Một trong những dự án cá nhân của tác giả là một client RSS dựa trên shell. Cốt lõi của nó là curl
vì công cụ này rất tiện lợi và hỗ trợ mọi thao tác HTTP cấp thấp cần thiết. Ví dụ, bạn có thể lấy một nguồn cấp RSS và kiểm tra nội dung của nó bằng curl
:
curl -s https://www.w3.org/blog/feed/ | more
Dữ liệu định dạng XML thu được qua một yêu cầu curl đến một URL nguồn cấp RSS.
Xử lý XML với xmllint
Nếu bạn đã cài đặt libxml
, bạn có thể xử lý đầu ra XML bằng xmllint
:
curl -s https://www.w3.org/blog/feed/ | xmllint --xpath '//channel/title/text()' -
Luồng lệnh này sử dụng xmllint
để đánh giá một biểu thức XPath trích xuất dữ liệu từ XML, trong trường hợp này là tiêu đề của kênh:
Một phần dữ liệu duy nhất, đại diện cho tiêu đề của nguồn cấp RSS, được trích xuất bằng cách sử dụng curl và xmllint.
8. Sử Dụng libcurl
Trong Lập Trình
Dự án cURL không chỉ là curl
, công cụ dòng lệnh. Nó còn bao gồm một thư viện, libcurl
, mà chính curl
cũng sử dụng. Thư viện này có tính di động cao và có sẵn cho nhiều hệ điều hành bao gồm Linux, Windows, macOS và Android. libcurl
đi kèm với API C, nhưng có các binding cho nhiều ngôn ngữ khác như C++, Python, Rust và Go.
Giới thiệu libcurl
Thư viện này phản ánh phần lớn những gì công cụ dòng lệnh thực hiện, đặc biệt là các tùy chọn và hành vi của chúng. Điều này cho phép các nhà phát triển tích hợp khả năng truyền dữ liệu mạng mạnh mẽ vào ứng dụng của họ một cách dễ dàng.
Ví dụ PHP cơ bản
Đây là một ví dụ cơ bản về cách sử dụng libcurl
trong PHP:
<?php
$ch = curl_init("http://www.example.com/");
$fp = fopen("www-example-com.html", "w");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
if (curl_error($ch))
fwrite($fp, curl_error($ch));
curl_close($ch);
fclose($fp);
?>
Hàm curl_init()
bắt đầu một phiên và trả về một handle mà bạn có thể sử dụng để truy cập nó. Bạn có thể kiểm soát hành vi của thư viện bằng cách sử dụng các tùy chọn mà curl
hỗ trợ thông qua curl_setopt()
. curl_exec()
thực sự gửi yêu cầu trong khi curl_error()
và curl_close()
là các hàm quản trị hữu ích.
Ví dụ này sử dụng thiết lập CURLOPT_FILE
để ghi phần thân phản hồi vào một file handle đã mở. Lưu ý rằng điều này tương đương với tùy chọn --output
của lệnh curl
.
Kết Luận
Qua bài viết này, chúng ta đã khám phá 8 trường hợp sử dụng mạnh mẽ và thực tế của lệnh curl
, từ việc truy xuất nội dung trang web, tải xuống tệp tin, đến tương tác với các API và xử lý dữ liệu XML/JSON. curl
không chỉ là một công cụ tiện lợi cho các tác vụ hàng ngày trên dòng lệnh mà còn là một thư viện libcurl
mạnh mẽ, cung cấp khả năng truyền dữ liệu mạng linh hoạt cho các ứng dụng lập trình.
Việc nắm vững curl
sẽ trang bị cho bạn một công cụ vô giá để gỡ lỗi mạng, tự động hóa tác vụ, kiểm thử API và thực hiện nhiều thao tác dữ liệu phức tạp khác. Hãy tiếp tục thực hành với các ví dụ và tùy chọn khác của curl
để khai thác triệt để tiềm năng của nó. Nếu bạn muốn tìm hiểu sâu hơn về các công cụ dựa trên terminal khác, hãy khám phá thêm về các lệnh Git cơ bản hoặc các ví dụ shell script để mở rộng bộ kỹ năng dòng lệnh của mình!