Linux的curl命令是一个功能强大的工具,用于传输数据,支持多种协议,包括HTTP、HTTPS、FTP、FTPS、SCP、SFTP、LDAP、LDAPS、DICT、FILE、TELNET、GOPHER、SMTP、POP3、IMAP等,它常用于与Web服务交互、下载文件、测试API接口等场景,curl命令的灵活性和丰富的参数使其成为Linux系统管理员和开发人员的必备工具之一。

curl命令的基本语法为:curl [选项] [URL],选项用于控制curl的行为,URL是要传输数据的资源地址,如果不指定任何选项,curl默认会以GET方式请求URL,并将响应内容输出到标准输出(通常是终端)。curl https://www.example.com会获取example.com的首页内容并显示在终端上。
curl命令的常用选项可以按照功能分类,首先是网络传输相关的选项,-L或--location用于跟随HTTP重定向,当服务器返回3xx状态码时,curl会自动请求新的URL;-m或--max-time用于设置最大传输时间,超过该时间后curl会终止操作;--connect-timeout用于设置连接超时时间;-o或--output用于将输出保存到文件,而不是显示在终端;-O或--remote-name用于使用远程文件名保存文件;-C或--continue-at用于断点续传,结合-o选项使用时,可以从上次中断的位置继续下载;-#或--progress-bar用于显示传输进度条。
HTTP请求相关的选项,-X或--request用于指定请求方法,如GET、POST、PUT、DELETE等;-d或--data用于发送POST请求的数据,数据格式为application/x-www-form-urlencoded;-H或--header用于添加请求头,如-H "Content-Type: application/json";-b或--cookie用于发送Cookie,可以指定Cookie文件或直接传入Cookie值;-c或--cookie-jar用于保存服务器返回的Cookie到文件;-k或--insecure用于允许不安全的SSL连接,即忽略证书验证;-u或--user用于设置用户名和密码,用于HTTP基本认证或FTP认证。
curl还支持上传文件的功能,使用-T或--upload-file选项可以将本地文件上传到FTP或HTTP服务器。curl -T localfile.txt ftp://example.com/remote.txt会将localfile.txt上传到FTP服务器的remote.txt文件中,对于HTTP服务器,如果支持PUT方法,可以使用-X PUT -T localfile.txt上传文件。

在调试和诊断方面,curl提供了多个有用的选项。-v或--verbose用于显示详细的传输过程,包括请求头和响应头;-i或--include用于在输出中包含响应头;--trace或--trace-ascii用于跟踪完整的传输过程,输出到指定文件;--trace-time用于在跟踪输出中显示时间戳;--cookie-on-refress用于在重定向时发送Cookie;--compressed用于请求服务器返回压缩内容(如gzip),并自动解压。
curl的输出控制选项也很丰富。-s或--silent用于静默模式,不显示进度信息和错误消息;-S或--show-error用于在静默模式下显示错误信息;-L或--location结合-s选项可以静默跟随重定向;-w或--write-out用于自定义输出格式,可以显示响应时间、状态码、文件大小等信息,如-w "%{http_code}\n"会输出HTTP状态码;-g或--globoff用于禁用URL中的通配符展开。
curl还支持代理服务器的设置,-x或--proxy用于指定代理服务器地址,如-x http://proxy.example.com:8080;--proxy-user用于设置代理服务器的用户名和密码;--noproxy用于设置不使用代理的主机列表,如--noproxy "localhost,127.0.0.1"。
对于SSL/TLS相关选项,-E或--cert用于指定客户端证书文件;--cacert用于指定CA证书文件;--capath用于指定CA证书目录;-k或--insecure用于跳过证书验证;--cert-type用于指定证书类型(PEM、DER等);--key用于指定私钥文件;--tls-max用于指定TLS最高版本。

curl的高级功能包括多线程传输(通过--parallel选项)、速率限制(--limit-rate选项)、通过环境变量配置选项(--config选项)等。curl --parallel -m 10 -o file1 "url1" -o file2 "url2"可以同时下载两个文件,每个连接的最大时间为10秒。
以下是一些常用curl命令的示例表格:
| 命令 | 功能描述 |
|---|---|
curl https://api.example.com/data |
发送GET请求获取API数据 |
curl -X POST -d "name=test&age=20" https://api.example.com/submit |
发送POST请求提交表单数据 |
curl -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com/json |
发送JSON格式的POST请求 |
curl -u username:password https://api.example.com/protected |
使用基本认证访问受保护的资源 |
curl -k https://self-signed.example.com |
忽略SSL证书验证访问HTTPS站点 |
curl -L -o output.html https://example.com |
跟随重定向并保存到文件 |
curl -C - -O https://example.com/largefile.zip |
断点续传下载大文件 |
curl -v https://api.example.com |
显示详细的请求和响应头信息 |
curl --trace debug.log https://api.example.com |
将完整的传输过程记录到文件 |
curl -w "Time: %{time_total}\nSize: %{size_download}\n" -o /dev/null https://example.com |
显示传输时间和文件大小 |
curl的强大之处在于其组合使用多个选项的能力,要下载一个需要登录的网站上的文件,可以使用curl -b cookies.txt -c cookies.txt -o file.zip "https://example.com/download?token=$(curl -s -b cookies.txt -c cookies.txt -d "username=user&password=pass" https://example.com/login | grep -oP 'token"\s*:\s*"\K[^"]*')",这是一个复杂的示例,展示了curl在处理会话和动态参数时的灵活性。
curl还支持通过.curlrc配置文件设置默认选项,该文件通常位于用户主目录下,在.curlrc文件中可以添加常用的选项,如user = "username:password"、proxy = "http://proxy.example.com:8080"等,这样在运行curl时就不需要每次都输入这些选项。
curl的版本可以通过curl --version查看,不同版本的curl可能支持的功能略有不同,建议使用最新版本以获得更好的性能和安全性,curl还支持多种编程语言的绑定,如Python的pycurl库、PHP的curl扩展等,方便在脚本中集成curl功能。
相关问答FAQs:
-
问题:curl如何发送带有Bearer Token的认证请求?
解答: 使用-H选项添加Authorization头,curl -H "Authorization: Bearer your_token_here" https://api.example.com/protected,如果Token包含特殊字符,建议使用单引号包裹整个Token值,如-H 'Authorization: Bearer "token_with_special_chars"'。 -
问题:curl如何下载多个文件并显示每个文件的下载进度? 解答: 使用
--parallel选项结合(进度条)和-o(指定输出文件),curl --parallel -# -o file1 "url1" -o file2 "url2",注意,--parallel选项需要较新版本的curl支持,旧版本可以使用xargs或parallel命令结合curl实现多线程下载。
