1*6236dae4SAndroid Build Coastguard Worker<!-- 2*6236dae4SAndroid Build Coastguard WorkerCopyright (C) Daniel Stenberg, <[email protected]>, et al. 3*6236dae4SAndroid Build Coastguard Worker 4*6236dae4SAndroid Build Coastguard WorkerSPDX-License-Identifier: curl 5*6236dae4SAndroid Build Coastguard Worker--> 6*6236dae4SAndroid Build Coastguard Worker 7*6236dae4SAndroid Build Coastguard Worker# curl tutorial 8*6236dae4SAndroid Build Coastguard Worker 9*6236dae4SAndroid Build Coastguard Worker## Simple Usage 10*6236dae4SAndroid Build Coastguard Worker 11*6236dae4SAndroid Build Coastguard WorkerGet the main page from a web-server: 12*6236dae4SAndroid Build Coastguard Worker 13*6236dae4SAndroid Build Coastguard Worker curl https://www.example.com/ 14*6236dae4SAndroid Build Coastguard Worker 15*6236dae4SAndroid Build Coastguard WorkerGet a README file from an FTP server: 16*6236dae4SAndroid Build Coastguard Worker 17*6236dae4SAndroid Build Coastguard Worker curl ftp://ftp.example.com/README 18*6236dae4SAndroid Build Coastguard Worker 19*6236dae4SAndroid Build Coastguard WorkerGet a webpage from a server using port 8000: 20*6236dae4SAndroid Build Coastguard Worker 21*6236dae4SAndroid Build Coastguard Worker curl http://www.example.com:8000/ 22*6236dae4SAndroid Build Coastguard Worker 23*6236dae4SAndroid Build Coastguard WorkerGet a directory listing of an FTP site: 24*6236dae4SAndroid Build Coastguard Worker 25*6236dae4SAndroid Build Coastguard Worker curl ftp://ftp.example.com/ 26*6236dae4SAndroid Build Coastguard Worker 27*6236dae4SAndroid Build Coastguard WorkerGet the all terms matching curl from a dictionary: 28*6236dae4SAndroid Build Coastguard Worker 29*6236dae4SAndroid Build Coastguard Worker curl dict://dict.example.com/m:curl 30*6236dae4SAndroid Build Coastguard Worker 31*6236dae4SAndroid Build Coastguard WorkerGet the definition of curl from a dictionary: 32*6236dae4SAndroid Build Coastguard Worker 33*6236dae4SAndroid Build Coastguard Worker curl dict://dict.example.com/d:curl 34*6236dae4SAndroid Build Coastguard Worker 35*6236dae4SAndroid Build Coastguard WorkerFetch two documents at once: 36*6236dae4SAndroid Build Coastguard Worker 37*6236dae4SAndroid Build Coastguard Worker curl ftp://ftp.example.com/ http://www.example.com:8000/ 38*6236dae4SAndroid Build Coastguard Worker 39*6236dae4SAndroid Build Coastguard WorkerGet a file off an FTPS server: 40*6236dae4SAndroid Build Coastguard Worker 41*6236dae4SAndroid Build Coastguard Worker curl ftps://files.are.example.com/secrets.txt 42*6236dae4SAndroid Build Coastguard Worker 43*6236dae4SAndroid Build Coastguard Workeror use the more appropriate FTPS way to get the same file: 44*6236dae4SAndroid Build Coastguard Worker 45*6236dae4SAndroid Build Coastguard Worker curl --ftp-ssl ftp://files.are.example.com/secrets.txt 46*6236dae4SAndroid Build Coastguard Worker 47*6236dae4SAndroid Build Coastguard WorkerGet a file from an SSH server using SFTP: 48*6236dae4SAndroid Build Coastguard Worker 49*6236dae4SAndroid Build Coastguard Worker curl -u username sftp://example.com/etc/issue 50*6236dae4SAndroid Build Coastguard Worker 51*6236dae4SAndroid Build Coastguard WorkerGet a file from an SSH server using SCP using a private key (not 52*6236dae4SAndroid Build Coastguard Workerpassword-protected) to authenticate: 53*6236dae4SAndroid Build Coastguard Worker 54*6236dae4SAndroid Build Coastguard Worker curl -u username: --key ~/.ssh/id_rsa scp://example.com/~/file.txt 55*6236dae4SAndroid Build Coastguard Worker 56*6236dae4SAndroid Build Coastguard WorkerGet a file from an SSH server using SCP using a private key 57*6236dae4SAndroid Build Coastguard Worker(password-protected) to authenticate: 58*6236dae4SAndroid Build Coastguard Worker 59*6236dae4SAndroid Build Coastguard Worker curl -u username: --key ~/.ssh/id_rsa --pass private_key_password 60*6236dae4SAndroid Build Coastguard Worker scp://example.com/~/file.txt 61*6236dae4SAndroid Build Coastguard Worker 62*6236dae4SAndroid Build Coastguard WorkerGet the main page from an IPv6 web server: 63*6236dae4SAndroid Build Coastguard Worker 64*6236dae4SAndroid Build Coastguard Worker curl "http://[2001:1890:1112:1::20]/" 65*6236dae4SAndroid Build Coastguard Worker 66*6236dae4SAndroid Build Coastguard WorkerGet a file from an SMB server: 67*6236dae4SAndroid Build Coastguard Worker 68*6236dae4SAndroid Build Coastguard Worker curl -u "domain\username:passwd" smb://server.example.com/share/file.txt 69*6236dae4SAndroid Build Coastguard Worker 70*6236dae4SAndroid Build Coastguard Worker## Download to a File 71*6236dae4SAndroid Build Coastguard Worker 72*6236dae4SAndroid Build Coastguard WorkerGet a webpage and store in a local file with a specific name: 73*6236dae4SAndroid Build Coastguard Worker 74*6236dae4SAndroid Build Coastguard Worker curl -o thatpage.html http://www.example.com/ 75*6236dae4SAndroid Build Coastguard Worker 76*6236dae4SAndroid Build Coastguard WorkerGet a webpage and store in a local file, make the local file get the name of 77*6236dae4SAndroid Build Coastguard Workerthe remote document (if no filename part is specified in the URL, this fails): 78*6236dae4SAndroid Build Coastguard Worker 79*6236dae4SAndroid Build Coastguard Worker curl -O http://www.example.com/index.html 80*6236dae4SAndroid Build Coastguard Worker 81*6236dae4SAndroid Build Coastguard WorkerFetch two files and store them with their remote names: 82*6236dae4SAndroid Build Coastguard Worker 83*6236dae4SAndroid Build Coastguard Worker curl -O www.haxx.se/index.html -O curl.se/download.html 84*6236dae4SAndroid Build Coastguard Worker 85*6236dae4SAndroid Build Coastguard Worker## Using Passwords 86*6236dae4SAndroid Build Coastguard Worker 87*6236dae4SAndroid Build Coastguard Worker### FTP 88*6236dae4SAndroid Build Coastguard Worker 89*6236dae4SAndroid Build Coastguard WorkerTo ftp files using name and password, include them in the URL like: 90*6236dae4SAndroid Build Coastguard Worker 91*6236dae4SAndroid Build Coastguard Worker curl ftp://name:[email protected]:port/full/path/to/file 92*6236dae4SAndroid Build Coastguard Worker 93*6236dae4SAndroid Build Coastguard Workeror specify them with the `-u` flag like 94*6236dae4SAndroid Build Coastguard Worker 95*6236dae4SAndroid Build Coastguard Worker curl -u name:passwd ftp://ftp.server.example:port/full/path/to/file 96*6236dae4SAndroid Build Coastguard Worker 97*6236dae4SAndroid Build Coastguard Worker### FTPS 98*6236dae4SAndroid Build Coastguard Worker 99*6236dae4SAndroid Build Coastguard WorkerIt is just like for FTP, but you may also want to specify and use SSL-specific 100*6236dae4SAndroid Build Coastguard Workeroptions for certificates etc. 101*6236dae4SAndroid Build Coastguard Worker 102*6236dae4SAndroid Build Coastguard WorkerNote that using `FTPS://` as prefix is the *implicit* way as described in the 103*6236dae4SAndroid Build Coastguard Workerstandards while the recommended *explicit* way is done by using `FTP://` and 104*6236dae4SAndroid Build Coastguard Workerthe `--ssl-reqd` option. 105*6236dae4SAndroid Build Coastguard Worker 106*6236dae4SAndroid Build Coastguard Worker### SFTP / SCP 107*6236dae4SAndroid Build Coastguard Worker 108*6236dae4SAndroid Build Coastguard WorkerThis is similar to FTP, but you can use the `--key` option to specify a 109*6236dae4SAndroid Build Coastguard Workerprivate key to use instead of a password. Note that the private key may itself 110*6236dae4SAndroid Build Coastguard Workerbe protected by a password that is unrelated to the login password of the 111*6236dae4SAndroid Build Coastguard Workerremote system; this password is specified using the `--pass` option. 112*6236dae4SAndroid Build Coastguard WorkerTypically, curl automatically extracts the public key from the private key 113*6236dae4SAndroid Build Coastguard Workerfile, but in cases where curl does not have the proper library support, a 114*6236dae4SAndroid Build Coastguard Workermatching public key file must be specified using the `--pubkey` option. 115*6236dae4SAndroid Build Coastguard Worker 116*6236dae4SAndroid Build Coastguard Worker### HTTP 117*6236dae4SAndroid Build Coastguard Worker 118*6236dae4SAndroid Build Coastguard WorkerCurl also supports user and password in HTTP URLs, thus you can pick a file 119*6236dae4SAndroid Build Coastguard Workerlike: 120*6236dae4SAndroid Build Coastguard Worker 121*6236dae4SAndroid Build Coastguard Worker curl http://name:[email protected]/full/path/to/file 122*6236dae4SAndroid Build Coastguard Worker 123*6236dae4SAndroid Build Coastguard Workeror specify user and password separately like in 124*6236dae4SAndroid Build Coastguard Worker 125*6236dae4SAndroid Build Coastguard Worker curl -u name:passwd http://http.server.example/full/path/to/file 126*6236dae4SAndroid Build Coastguard Worker 127*6236dae4SAndroid Build Coastguard WorkerHTTP offers many different methods of authentication and curl supports 128*6236dae4SAndroid Build Coastguard Workerseveral: Basic, Digest, NTLM and Negotiate (SPNEGO). Without telling which 129*6236dae4SAndroid Build Coastguard Workermethod to use, curl defaults to Basic. You can also ask curl to pick the most 130*6236dae4SAndroid Build Coastguard Workersecure ones out of the ones that the server accepts for the given URL, by 131*6236dae4SAndroid Build Coastguard Workerusing `--anyauth`. 132*6236dae4SAndroid Build Coastguard Worker 133*6236dae4SAndroid Build Coastguard Worker**Note**! According to the URL specification, HTTP URLs can not contain a user 134*6236dae4SAndroid Build Coastguard Workerand password, so that style does not work when using curl via a proxy, even 135*6236dae4SAndroid Build Coastguard Workerthough curl allows it at other times. When using a proxy, you _must_ use the 136*6236dae4SAndroid Build Coastguard Worker`-u` style for user and password. 137*6236dae4SAndroid Build Coastguard Worker 138*6236dae4SAndroid Build Coastguard Worker### HTTPS 139*6236dae4SAndroid Build Coastguard Worker 140*6236dae4SAndroid Build Coastguard WorkerProbably most commonly used with private certificates, as explained below. 141*6236dae4SAndroid Build Coastguard Worker 142*6236dae4SAndroid Build Coastguard Worker## Proxy 143*6236dae4SAndroid Build Coastguard Worker 144*6236dae4SAndroid Build Coastguard Workercurl supports both HTTP and SOCKS proxy servers, with optional authentication. 145*6236dae4SAndroid Build Coastguard WorkerIt does not have special support for FTP proxy servers since there are no 146*6236dae4SAndroid Build Coastguard Workerstandards for those, but it can still be made to work with many of them. You 147*6236dae4SAndroid Build Coastguard Workercan also use both HTTP and SOCKS proxies to transfer files to and from FTP 148*6236dae4SAndroid Build Coastguard Workerservers. 149*6236dae4SAndroid Build Coastguard Worker 150*6236dae4SAndroid Build Coastguard WorkerGet an ftp file using an HTTP proxy named my-proxy that uses port 888: 151*6236dae4SAndroid Build Coastguard Worker 152*6236dae4SAndroid Build Coastguard Worker curl -x my-proxy:888 ftp://ftp.example.com/README 153*6236dae4SAndroid Build Coastguard Worker 154*6236dae4SAndroid Build Coastguard WorkerGet a file from an HTTP server that requires user and password, using the 155*6236dae4SAndroid Build Coastguard Workersame proxy as above: 156*6236dae4SAndroid Build Coastguard Worker 157*6236dae4SAndroid Build Coastguard Worker curl -u user:passwd -x my-proxy:888 http://www.example.com/ 158*6236dae4SAndroid Build Coastguard Worker 159*6236dae4SAndroid Build Coastguard WorkerSome proxies require special authentication. Specify by using -U as above: 160*6236dae4SAndroid Build Coastguard Worker 161*6236dae4SAndroid Build Coastguard Worker curl -U user:passwd -x my-proxy:888 http://www.example.com/ 162*6236dae4SAndroid Build Coastguard Worker 163*6236dae4SAndroid Build Coastguard WorkerA comma-separated list of hosts and domains which do not use the proxy can be 164*6236dae4SAndroid Build Coastguard Workerspecified as: 165*6236dae4SAndroid Build Coastguard Worker 166*6236dae4SAndroid Build Coastguard Worker curl --noproxy example.com -x my-proxy:888 http://www.example.com/ 167*6236dae4SAndroid Build Coastguard Worker 168*6236dae4SAndroid Build Coastguard WorkerIf the proxy is specified with `--proxy1.0` instead of `--proxy` or `-x`, then 169*6236dae4SAndroid Build Coastguard Workercurl uses HTTP/1.0 instead of HTTP/1.1 for any `CONNECT` attempts. 170*6236dae4SAndroid Build Coastguard Worker 171*6236dae4SAndroid Build Coastguard Workercurl also supports SOCKS4 and SOCKS5 proxies with `--socks4` and `--socks5`. 172*6236dae4SAndroid Build Coastguard Worker 173*6236dae4SAndroid Build Coastguard WorkerSee also the environment variables Curl supports that offer further proxy 174*6236dae4SAndroid Build Coastguard Workercontrol. 175*6236dae4SAndroid Build Coastguard Worker 176*6236dae4SAndroid Build Coastguard WorkerMost FTP proxy servers are set up to appear as a normal FTP server from the 177*6236dae4SAndroid Build Coastguard Workerclient's perspective, with special commands to select the remote FTP server. 178*6236dae4SAndroid Build Coastguard Workercurl supports the `-u`, `-Q` and `--ftp-account` options that can be used to 179*6236dae4SAndroid Build Coastguard Workerset up transfers through many FTP proxies. For example, a file can be uploaded 180*6236dae4SAndroid Build Coastguard Workerto a remote FTP server using a Blue Coat FTP proxy with the options: 181*6236dae4SAndroid Build Coastguard Worker 182*6236dae4SAndroid Build Coastguard Worker curl -u "[email protected] Proxy-Username:Remote-Pass" 183*6236dae4SAndroid Build Coastguard Worker --ftp-account Proxy-Password --upload-file local-file 184*6236dae4SAndroid Build Coastguard Worker ftp://my-ftp.proxy.example:21/remote/upload/path/ 185*6236dae4SAndroid Build Coastguard Worker 186*6236dae4SAndroid Build Coastguard WorkerSee the manual for your FTP proxy to determine the form it expects to set up 187*6236dae4SAndroid Build Coastguard Workertransfers, and curl's `-v` option to see exactly what curl is sending. 188*6236dae4SAndroid Build Coastguard Worker 189*6236dae4SAndroid Build Coastguard Worker## Piping 190*6236dae4SAndroid Build Coastguard Worker 191*6236dae4SAndroid Build Coastguard WorkerGet a key file and add it with `apt-key` (when on a system that uses `apt` for 192*6236dae4SAndroid Build Coastguard Workerpackage management): 193*6236dae4SAndroid Build Coastguard Worker 194*6236dae4SAndroid Build Coastguard Worker curl -L https://apt.example.org/llvm-snapshot.gpg.key | sudo apt-key add - 195*6236dae4SAndroid Build Coastguard Worker 196*6236dae4SAndroid Build Coastguard WorkerThe '|' pipes the output to STDIN. `-` tells `apt-key` that the key file 197*6236dae4SAndroid Build Coastguard Workershould be read from STDIN. 198*6236dae4SAndroid Build Coastguard Worker 199*6236dae4SAndroid Build Coastguard Worker## Ranges 200*6236dae4SAndroid Build Coastguard Worker 201*6236dae4SAndroid Build Coastguard WorkerHTTP 1.1 introduced byte-ranges. Using this, a client can request to get only 202*6236dae4SAndroid Build Coastguard Workerone or more sub-parts of a specified document. Curl supports this with the 203*6236dae4SAndroid Build Coastguard Worker`-r` flag. 204*6236dae4SAndroid Build Coastguard Worker 205*6236dae4SAndroid Build Coastguard WorkerGet the first 100 bytes of a document: 206*6236dae4SAndroid Build Coastguard Worker 207*6236dae4SAndroid Build Coastguard Worker curl -r 0-99 http://www.example.com/ 208*6236dae4SAndroid Build Coastguard Worker 209*6236dae4SAndroid Build Coastguard WorkerGet the last 500 bytes of a document: 210*6236dae4SAndroid Build Coastguard Worker 211*6236dae4SAndroid Build Coastguard Worker curl -r -500 http://www.example.com/ 212*6236dae4SAndroid Build Coastguard Worker 213*6236dae4SAndroid Build Coastguard WorkerCurl also supports simple ranges for FTP files as well. Then you can only 214*6236dae4SAndroid Build Coastguard Workerspecify start and stop position. 215*6236dae4SAndroid Build Coastguard Worker 216*6236dae4SAndroid Build Coastguard WorkerGet the first 100 bytes of a document using FTP: 217*6236dae4SAndroid Build Coastguard Worker 218*6236dae4SAndroid Build Coastguard Worker curl -r 0-99 ftp://www.example.com/README 219*6236dae4SAndroid Build Coastguard Worker 220*6236dae4SAndroid Build Coastguard Worker## Uploading 221*6236dae4SAndroid Build Coastguard Worker 222*6236dae4SAndroid Build Coastguard Worker### FTP / FTPS / SFTP / SCP 223*6236dae4SAndroid Build Coastguard Worker 224*6236dae4SAndroid Build Coastguard WorkerUpload all data on stdin to a specified server: 225*6236dae4SAndroid Build Coastguard Worker 226*6236dae4SAndroid Build Coastguard Worker curl -T - ftp://ftp.example.com/myfile 227*6236dae4SAndroid Build Coastguard Worker 228*6236dae4SAndroid Build Coastguard WorkerUpload data from a specified file, login with user and password: 229*6236dae4SAndroid Build Coastguard Worker 230*6236dae4SAndroid Build Coastguard Worker curl -T uploadfile -u user:passwd ftp://ftp.example.com/myfile 231*6236dae4SAndroid Build Coastguard Worker 232*6236dae4SAndroid Build Coastguard WorkerUpload a local file to the remote site, and use the local filename at the 233*6236dae4SAndroid Build Coastguard Workerremote site too: 234*6236dae4SAndroid Build Coastguard Worker 235*6236dae4SAndroid Build Coastguard Worker curl -T uploadfile -u user:passwd ftp://ftp.example.com/ 236*6236dae4SAndroid Build Coastguard Worker 237*6236dae4SAndroid Build Coastguard WorkerUpload a local file to get appended to the remote file: 238*6236dae4SAndroid Build Coastguard Worker 239*6236dae4SAndroid Build Coastguard Worker curl -T localfile -a ftp://ftp.example.com/remotefile 240*6236dae4SAndroid Build Coastguard Worker 241*6236dae4SAndroid Build Coastguard WorkerCurl also supports ftp upload through a proxy, but only if the proxy is 242*6236dae4SAndroid Build Coastguard Workerconfigured to allow that kind of tunneling. If it does, you can run curl in a 243*6236dae4SAndroid Build Coastguard Workerfashion similar to: 244*6236dae4SAndroid Build Coastguard Worker 245*6236dae4SAndroid Build Coastguard Worker curl --proxytunnel -x proxy:port -T localfile ftp.example.com 246*6236dae4SAndroid Build Coastguard Worker 247*6236dae4SAndroid Build Coastguard Worker### SMB / SMBS 248*6236dae4SAndroid Build Coastguard Worker 249*6236dae4SAndroid Build Coastguard Worker curl -T file.txt -u "domain\username:passwd" 250*6236dae4SAndroid Build Coastguard Worker smb://server.example.com/share/ 251*6236dae4SAndroid Build Coastguard Worker 252*6236dae4SAndroid Build Coastguard Worker### HTTP 253*6236dae4SAndroid Build Coastguard Worker 254*6236dae4SAndroid Build Coastguard WorkerUpload all data on stdin to a specified HTTP site: 255*6236dae4SAndroid Build Coastguard Worker 256*6236dae4SAndroid Build Coastguard Worker curl -T - http://www.example.com/myfile 257*6236dae4SAndroid Build Coastguard Worker 258*6236dae4SAndroid Build Coastguard WorkerNote that the HTTP server must have been configured to accept PUT before this 259*6236dae4SAndroid Build Coastguard Workercan be done successfully. 260*6236dae4SAndroid Build Coastguard Worker 261*6236dae4SAndroid Build Coastguard WorkerFor other ways to do HTTP data upload, see the POST section below. 262*6236dae4SAndroid Build Coastguard Worker 263*6236dae4SAndroid Build Coastguard Worker## Verbose / Debug 264*6236dae4SAndroid Build Coastguard Worker 265*6236dae4SAndroid Build Coastguard WorkerIf curl fails where it is not supposed to, if the servers do not let you in, 266*6236dae4SAndroid Build Coastguard Workerif you cannot understand the responses: use the `-v` flag to get verbose 267*6236dae4SAndroid Build Coastguard Workerfetching. Curl outputs lots of info and what it sends and receives in order to 268*6236dae4SAndroid Build Coastguard Workerlet the user see all client-server interaction (but it does not show you the 269*6236dae4SAndroid Build Coastguard Workeractual data). 270*6236dae4SAndroid Build Coastguard Worker 271*6236dae4SAndroid Build Coastguard Worker curl -v ftp://ftp.example.com/ 272*6236dae4SAndroid Build Coastguard Worker 273*6236dae4SAndroid Build Coastguard WorkerTo get even more details and information on what curl does, try using the 274*6236dae4SAndroid Build Coastguard Worker`--trace` or `--trace-ascii` options with a given filename to log to, like 275*6236dae4SAndroid Build Coastguard Workerthis: 276*6236dae4SAndroid Build Coastguard Worker 277*6236dae4SAndroid Build Coastguard Worker curl --trace my-trace.txt www.haxx.se 278*6236dae4SAndroid Build Coastguard Worker 279*6236dae4SAndroid Build Coastguard Worker 280*6236dae4SAndroid Build Coastguard Worker## Detailed Information 281*6236dae4SAndroid Build Coastguard Worker 282*6236dae4SAndroid Build Coastguard WorkerDifferent protocols provide different ways of getting detailed information 283*6236dae4SAndroid Build Coastguard Workerabout specific files/documents. To get curl to show detailed information about 284*6236dae4SAndroid Build Coastguard Workera single file, you should use `-I`/`--head` option. It displays all available 285*6236dae4SAndroid Build Coastguard Workerinfo on a single file for HTTP and FTP. The HTTP information is a lot more 286*6236dae4SAndroid Build Coastguard Workerextensive. 287*6236dae4SAndroid Build Coastguard Worker 288*6236dae4SAndroid Build Coastguard WorkerFor HTTP, you can get the header information (the same as `-I` would show) 289*6236dae4SAndroid Build Coastguard Workershown before the data by using `-i`/`--include`. Curl understands the 290*6236dae4SAndroid Build Coastguard Worker`-D`/`--dump-header` option when getting files from both FTP and HTTP, and it 291*6236dae4SAndroid Build Coastguard Workerthen stores the headers in the specified file. 292*6236dae4SAndroid Build Coastguard Worker 293*6236dae4SAndroid Build Coastguard WorkerStore the HTTP headers in a separate file (headers.txt in the example): 294*6236dae4SAndroid Build Coastguard Worker 295*6236dae4SAndroid Build Coastguard Worker curl --dump-header headers.txt curl.se 296*6236dae4SAndroid Build Coastguard Worker 297*6236dae4SAndroid Build Coastguard WorkerNote that headers stored in a separate file can be useful at a later time if 298*6236dae4SAndroid Build Coastguard Workeryou want curl to use cookies sent by the server. More about that in the 299*6236dae4SAndroid Build Coastguard Workercookies section. 300*6236dae4SAndroid Build Coastguard Worker 301*6236dae4SAndroid Build Coastguard Worker## POST (HTTP) 302*6236dae4SAndroid Build Coastguard Worker 303*6236dae4SAndroid Build Coastguard WorkerIt is easy to post data using curl. This is done using the `-d <data>` option. 304*6236dae4SAndroid Build Coastguard WorkerThe post data must be urlencoded. 305*6236dae4SAndroid Build Coastguard Worker 306*6236dae4SAndroid Build Coastguard WorkerPost a simple `name` and `phone` guestbook. 307*6236dae4SAndroid Build Coastguard Worker 308*6236dae4SAndroid Build Coastguard Worker curl -d "name=Rafael%20Sagula&phone=3320780" http://www.example.com/guest.cgi 309*6236dae4SAndroid Build Coastguard Worker 310*6236dae4SAndroid Build Coastguard WorkerOr automatically [URL encode the data](https://everything.curl.dev/http/post/url-encode). 311*6236dae4SAndroid Build Coastguard Worker 312*6236dae4SAndroid Build Coastguard Worker curl --data-urlencode "name=Rafael Sagula&phone=3320780" 313*6236dae4SAndroid Build Coastguard Worker http://www.example.com/guest.cgi 314*6236dae4SAndroid Build Coastguard Worker 315*6236dae4SAndroid Build Coastguard WorkerHow to post a form with curl, lesson #1: 316*6236dae4SAndroid Build Coastguard Worker 317*6236dae4SAndroid Build Coastguard WorkerDig out all the `<input>` tags in the form that you want to fill in. 318*6236dae4SAndroid Build Coastguard Worker 319*6236dae4SAndroid Build Coastguard WorkerIf there is a normal post, you use `-d` to post. `-d` takes a full post 320*6236dae4SAndroid Build Coastguard Workerstring, which is in the format 321*6236dae4SAndroid Build Coastguard Worker 322*6236dae4SAndroid Build Coastguard Worker <variable1>=<data1>&<variable2>=<data2>&... 323*6236dae4SAndroid Build Coastguard Worker 324*6236dae4SAndroid Build Coastguard WorkerThe variable names are the names set with `"name="` in the `<input>` tags, and 325*6236dae4SAndroid Build Coastguard Workerthe data is the contents you want to fill in for the inputs. The data *must* 326*6236dae4SAndroid Build Coastguard Workerbe properly URL encoded. That means you replace space with + and that you 327*6236dae4SAndroid Build Coastguard Workerreplace weird letters with `%XX` where `XX` is the hexadecimal representation 328*6236dae4SAndroid Build Coastguard Workerof the letter's ASCII code. 329*6236dae4SAndroid Build Coastguard Worker 330*6236dae4SAndroid Build Coastguard WorkerExample: 331*6236dae4SAndroid Build Coastguard Worker 332*6236dae4SAndroid Build Coastguard Worker(say if `http://example.com` had the following html) 333*6236dae4SAndroid Build Coastguard Worker 334*6236dae4SAndroid Build Coastguard Worker```html 335*6236dae4SAndroid Build Coastguard Worker<form action="post.cgi" method="post"> 336*6236dae4SAndroid Build Coastguard Worker <input name=user size=10> 337*6236dae4SAndroid Build Coastguard Worker <input name=pass type=password size=10> 338*6236dae4SAndroid Build Coastguard Worker <input name=id type=hidden value="blablabla"> 339*6236dae4SAndroid Build Coastguard Worker <input name=ding value="submit"> 340*6236dae4SAndroid Build Coastguard Worker</form> 341*6236dae4SAndroid Build Coastguard Worker``` 342*6236dae4SAndroid Build Coastguard Worker 343*6236dae4SAndroid Build Coastguard WorkerWe want to enter user `foobar` with password `12345`. 344*6236dae4SAndroid Build Coastguard Worker 345*6236dae4SAndroid Build Coastguard WorkerTo post to this, you would enter a curl command line like: 346*6236dae4SAndroid Build Coastguard Worker 347*6236dae4SAndroid Build Coastguard Worker curl -d "user=foobar&pass=12345&id=blablabla&ding=submit" 348*6236dae4SAndroid Build Coastguard Worker http://example.com/post.cgi 349*6236dae4SAndroid Build Coastguard Worker 350*6236dae4SAndroid Build Coastguard WorkerWhile `-d` uses the application/x-www-form-urlencoded mime-type, generally 351*6236dae4SAndroid Build Coastguard Workerunderstood by CGI's and similar, curl also supports the more capable 352*6236dae4SAndroid Build Coastguard Workermultipart/form-data type. This latter type supports things like file upload. 353*6236dae4SAndroid Build Coastguard Worker 354*6236dae4SAndroid Build Coastguard Worker`-F` accepts parameters like `-F "name=contents"`. If you want the contents to 355*6236dae4SAndroid Build Coastguard Workerbe read from a file, use `@filename` as contents. When specifying a file, you 356*6236dae4SAndroid Build Coastguard Workercan also specify the file content type by appending `;type=<mime type>` to the 357*6236dae4SAndroid Build Coastguard Workerfilename. You can also post the contents of several files in one field. For 358*6236dae4SAndroid Build Coastguard Workerexample, the field name `coolfiles` is used to send three files, with 359*6236dae4SAndroid Build Coastguard Workerdifferent content types using the following syntax: 360*6236dae4SAndroid Build Coastguard Worker 361*6236dae4SAndroid Build Coastguard Worker curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html" 362*6236dae4SAndroid Build Coastguard Worker http://www.example.com/postit.cgi 363*6236dae4SAndroid Build Coastguard Worker 364*6236dae4SAndroid Build Coastguard WorkerIf the content-type is not specified, curl tries to guess from the file 365*6236dae4SAndroid Build Coastguard Workerextension (it only knows a few), or use the previously specified type (from an 366*6236dae4SAndroid Build Coastguard Workerearlier file if several files are specified in a list) or else it uses the 367*6236dae4SAndroid Build Coastguard Workerdefault type `application/octet-stream`. 368*6236dae4SAndroid Build Coastguard Worker 369*6236dae4SAndroid Build Coastguard WorkerEmulate a fill-in form with `-F`. Let's say you fill in three fields in a 370*6236dae4SAndroid Build Coastguard Workerform. One field is a filename which to post, one field is your name and one 371*6236dae4SAndroid Build Coastguard Workerfield is a file description. We want to post the file we have written named 372*6236dae4SAndroid Build Coastguard Worker`cooltext.txt`. To let curl do the posting of this data instead of your 373*6236dae4SAndroid Build Coastguard Workerfavorite browser, you have to read the HTML source of the form page and find 374*6236dae4SAndroid Build Coastguard Workerthe names of the input fields. In our example, the input field names are 375*6236dae4SAndroid Build Coastguard Worker`file`, `yourname` and `filedescription`. 376*6236dae4SAndroid Build Coastguard Worker 377*6236dae4SAndroid Build Coastguard Worker curl -F "file=@cooltext.txt" -F "yourname=Daniel" 378*6236dae4SAndroid Build Coastguard Worker -F "filedescription=Cool text file with cool text inside" 379*6236dae4SAndroid Build Coastguard Worker http://www.example.com/postit.cgi 380*6236dae4SAndroid Build Coastguard Worker 381*6236dae4SAndroid Build Coastguard WorkerTo send two files in one post you can do it in two ways: 382*6236dae4SAndroid Build Coastguard Worker 383*6236dae4SAndroid Build Coastguard WorkerSend multiple files in a single field with a single field name: 384*6236dae4SAndroid Build Coastguard Worker 385*6236dae4SAndroid Build Coastguard Worker curl -F "pictures=@dog.gif,cat.gif" $URL 386*6236dae4SAndroid Build Coastguard Worker 387*6236dae4SAndroid Build Coastguard WorkerSend two fields with two field names 388*6236dae4SAndroid Build Coastguard Worker 389*6236dae4SAndroid Build Coastguard Worker curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif" $URL 390*6236dae4SAndroid Build Coastguard Worker 391*6236dae4SAndroid Build Coastguard WorkerTo send a field value literally without interpreting a leading `@` or `<`, or 392*6236dae4SAndroid Build Coastguard Workeran embedded `;type=`, use `--form-string` instead of `-F`. This is recommended 393*6236dae4SAndroid Build Coastguard Workerwhen the value is obtained from a user or some other unpredictable 394*6236dae4SAndroid Build Coastguard Workersource. Under these circumstances, using `-F` instead of `--form-string` could 395*6236dae4SAndroid Build Coastguard Workerallow a user to trick curl into uploading a file. 396*6236dae4SAndroid Build Coastguard Worker 397*6236dae4SAndroid Build Coastguard Worker## Referrer 398*6236dae4SAndroid Build Coastguard Worker 399*6236dae4SAndroid Build Coastguard WorkerAn HTTP request has the option to include information about which address 400*6236dae4SAndroid Build Coastguard Workerreferred it to the actual page. curl allows you to specify the referrer to be 401*6236dae4SAndroid Build Coastguard Workerused on the command line. It is especially useful to fool or trick stupid 402*6236dae4SAndroid Build Coastguard Workerservers or CGI scripts that rely on that information being available or 403*6236dae4SAndroid Build Coastguard Workercontain certain data. 404*6236dae4SAndroid Build Coastguard Worker 405*6236dae4SAndroid Build Coastguard Worker curl -e www.example.org http://www.example.com/ 406*6236dae4SAndroid Build Coastguard Worker 407*6236dae4SAndroid Build Coastguard Worker## User Agent 408*6236dae4SAndroid Build Coastguard Worker 409*6236dae4SAndroid Build Coastguard WorkerAn HTTP request has the option to include information about the browser that 410*6236dae4SAndroid Build Coastguard Workergenerated the request. Curl allows it to be specified on the command line. It 411*6236dae4SAndroid Build Coastguard Workeris especially useful to fool or trick stupid servers or CGI scripts that only 412*6236dae4SAndroid Build Coastguard Workeraccept certain browsers. 413*6236dae4SAndroid Build Coastguard Worker 414*6236dae4SAndroid Build Coastguard WorkerExample: 415*6236dae4SAndroid Build Coastguard Worker 416*6236dae4SAndroid Build Coastguard Worker curl -A 'Mozilla/3.0 (Win95; I)' http://www.bank.example.com/ 417*6236dae4SAndroid Build Coastguard Worker 418*6236dae4SAndroid Build Coastguard WorkerOther common strings: 419*6236dae4SAndroid Build Coastguard Worker 420*6236dae4SAndroid Build Coastguard Worker- `Mozilla/3.0 (Win95; I)` - Netscape Version 3 for Windows 95 421*6236dae4SAndroid Build Coastguard Worker- `Mozilla/3.04 (Win95; U)` - Netscape Version 3 for Windows 95 422*6236dae4SAndroid Build Coastguard Worker- `Mozilla/2.02 (OS/2; U)` - Netscape Version 2 for OS/2 423*6236dae4SAndroid Build Coastguard Worker- `Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)` - Netscape for AIX 424*6236dae4SAndroid Build Coastguard Worker- `Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)` - Netscape for Linux 425*6236dae4SAndroid Build Coastguard Worker 426*6236dae4SAndroid Build Coastguard WorkerNote that Internet Explorer tries hard to be compatible in every way: 427*6236dae4SAndroid Build Coastguard Worker 428*6236dae4SAndroid Build Coastguard Worker- `Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)` - MSIE for W95 429*6236dae4SAndroid Build Coastguard Worker 430*6236dae4SAndroid Build Coastguard WorkerMozilla is not the only possible User-Agent name: 431*6236dae4SAndroid Build Coastguard Worker 432*6236dae4SAndroid Build Coastguard Worker- `Konqueror/1.0` - KDE File Manager desktop client 433*6236dae4SAndroid Build Coastguard Worker- `Lynx/2.7.1 libwww-FM/2.14` - Lynx command line browser 434*6236dae4SAndroid Build Coastguard Worker 435*6236dae4SAndroid Build Coastguard Worker## Cookies 436*6236dae4SAndroid Build Coastguard Worker 437*6236dae4SAndroid Build Coastguard WorkerCookies are generally used by web servers to keep state information at the 438*6236dae4SAndroid Build Coastguard Workerclient's side. The server sets cookies by sending a response line in the 439*6236dae4SAndroid Build Coastguard Workerheaders that looks like `Set-Cookie: <data>` where the data part then 440*6236dae4SAndroid Build Coastguard Workertypically contains a set of `NAME=VALUE` pairs (separated by semicolons `;` 441*6236dae4SAndroid Build Coastguard Workerlike `NAME1=VALUE1; NAME2=VALUE2;`). The server can also specify for what path 442*6236dae4SAndroid Build Coastguard Workerthe cookie should be used for (by specifying `path=value`), when the cookie 443*6236dae4SAndroid Build Coastguard Workershould expire (`expire=DATE`), for what domain to use it (`domain=NAME`) and 444*6236dae4SAndroid Build Coastguard Workerif it should be used on secure connections only (`secure`). 445*6236dae4SAndroid Build Coastguard Worker 446*6236dae4SAndroid Build Coastguard WorkerIf you have received a page from a server that contains a header like: 447*6236dae4SAndroid Build Coastguard Worker 448*6236dae4SAndroid Build Coastguard Worker```http 449*6236dae4SAndroid Build Coastguard WorkerSet-Cookie: sessionid=boo123; path="/foo"; 450*6236dae4SAndroid Build Coastguard Worker``` 451*6236dae4SAndroid Build Coastguard Worker 452*6236dae4SAndroid Build Coastguard Workerit means the server wants that first pair passed on when we get anything in a 453*6236dae4SAndroid Build Coastguard Workerpath beginning with `/foo`. 454*6236dae4SAndroid Build Coastguard Worker 455*6236dae4SAndroid Build Coastguard WorkerExample, get a page that wants my name passed in a cookie: 456*6236dae4SAndroid Build Coastguard Worker 457*6236dae4SAndroid Build Coastguard Worker curl -b "name=Daniel" www.example.com 458*6236dae4SAndroid Build Coastguard Worker 459*6236dae4SAndroid Build Coastguard WorkerCurl also has the ability to use previously received cookies in following 460*6236dae4SAndroid Build Coastguard Workersessions. If you get cookies from a server and store them in a file in a 461*6236dae4SAndroid Build Coastguard Workermanner similar to: 462*6236dae4SAndroid Build Coastguard Worker 463*6236dae4SAndroid Build Coastguard Worker curl --dump-header headers www.example.com 464*6236dae4SAndroid Build Coastguard Worker 465*6236dae4SAndroid Build Coastguard Worker... you can then in a second connect to that (or another) site, use the 466*6236dae4SAndroid Build Coastguard Workercookies from the `headers.txt` file like: 467*6236dae4SAndroid Build Coastguard Worker 468*6236dae4SAndroid Build Coastguard Worker curl -b headers.txt www.example.com 469*6236dae4SAndroid Build Coastguard Worker 470*6236dae4SAndroid Build Coastguard WorkerWhile saving headers to a file is a working way to store cookies, it is 471*6236dae4SAndroid Build Coastguard Workerhowever error-prone and not the preferred way to do this. Instead, make curl 472*6236dae4SAndroid Build Coastguard Workersave the incoming cookies using the well-known Netscape cookie format like 473*6236dae4SAndroid Build Coastguard Workerthis: 474*6236dae4SAndroid Build Coastguard Worker 475*6236dae4SAndroid Build Coastguard Worker curl -c cookies.txt www.example.com 476*6236dae4SAndroid Build Coastguard Worker 477*6236dae4SAndroid Build Coastguard WorkerNote that by specifying `-b` you enable the cookie engine and with `-L` you 478*6236dae4SAndroid Build Coastguard Workercan make curl follow a `location:` (which often is used in combination with 479*6236dae4SAndroid Build Coastguard Workercookies). If a site sends cookies and a location field, you can use a 480*6236dae4SAndroid Build Coastguard Workernon-existing file to trigger the cookie awareness like: 481*6236dae4SAndroid Build Coastguard Worker 482*6236dae4SAndroid Build Coastguard Worker curl -L -b empty.txt www.example.com 483*6236dae4SAndroid Build Coastguard Worker 484*6236dae4SAndroid Build Coastguard WorkerThe file to read cookies from must be formatted using plain HTTP headers OR as 485*6236dae4SAndroid Build Coastguard WorkerNetscape's cookie file. Curl determines what kind it is based on the file 486*6236dae4SAndroid Build Coastguard Workercontents. In the above command, curl parses the header and store the cookies 487*6236dae4SAndroid Build Coastguard Workerreceived from www.example.com. curl sends the stored cookies which match the 488*6236dae4SAndroid Build Coastguard Workerrequest to the server as it follows the location. The file `empty.txt` may be 489*6236dae4SAndroid Build Coastguard Workera nonexistent file. 490*6236dae4SAndroid Build Coastguard Worker 491*6236dae4SAndroid Build Coastguard WorkerTo read and write cookies from a Netscape cookie file, you can set both `-b` 492*6236dae4SAndroid Build Coastguard Workerand `-c` to use the same file: 493*6236dae4SAndroid Build Coastguard Worker 494*6236dae4SAndroid Build Coastguard Worker curl -b cookies.txt -c cookies.txt www.example.com 495*6236dae4SAndroid Build Coastguard Worker 496*6236dae4SAndroid Build Coastguard Worker## Progress Meter 497*6236dae4SAndroid Build Coastguard Worker 498*6236dae4SAndroid Build Coastguard WorkerThe progress meter exists to show a user that something actually is 499*6236dae4SAndroid Build Coastguard Workerhappening. The different fields in the output have the following meaning: 500*6236dae4SAndroid Build Coastguard Worker 501*6236dae4SAndroid Build Coastguard Worker % Total % Received % Xferd Average Speed Time Curr. 502*6236dae4SAndroid Build Coastguard Worker Dload Upload Total Current Left Speed 503*6236dae4SAndroid Build Coastguard Worker 0 151M 0 38608 0 0 9406 0 4:41:43 0:00:04 4:41:39 9287 504*6236dae4SAndroid Build Coastguard Worker 505*6236dae4SAndroid Build Coastguard WorkerFrom left-to-right: 506*6236dae4SAndroid Build Coastguard Worker 507*6236dae4SAndroid Build Coastguard Worker - `%` - percentage completed of the whole transfer 508*6236dae4SAndroid Build Coastguard Worker - `Total` - total size of the whole expected transfer 509*6236dae4SAndroid Build Coastguard Worker - `%` - percentage completed of the download 510*6236dae4SAndroid Build Coastguard Worker - `Received` - currently downloaded amount of bytes 511*6236dae4SAndroid Build Coastguard Worker - `%` - percentage completed of the upload 512*6236dae4SAndroid Build Coastguard Worker - `Xferd` - currently uploaded amount of bytes 513*6236dae4SAndroid Build Coastguard Worker - `Average Speed Dload` - the average transfer speed of the download 514*6236dae4SAndroid Build Coastguard Worker - `Average Speed Upload` - the average transfer speed of the upload 515*6236dae4SAndroid Build Coastguard Worker - `Time Total` - expected time to complete the operation 516*6236dae4SAndroid Build Coastguard Worker - `Time Current` - time passed since the invoke 517*6236dae4SAndroid Build Coastguard Worker - `Time Left` - expected time left to completion 518*6236dae4SAndroid Build Coastguard Worker - `Curr.Speed` - the average transfer speed the last 5 seconds (the first 519*6236dae4SAndroid Build Coastguard Worker 5 seconds of a transfer is based on less time of course.) 520*6236dae4SAndroid Build Coastguard Worker 521*6236dae4SAndroid Build Coastguard WorkerThe `-#` option displays a totally different progress bar that does not need 522*6236dae4SAndroid Build Coastguard Workermuch explanation! 523*6236dae4SAndroid Build Coastguard Worker 524*6236dae4SAndroid Build Coastguard Worker## Speed Limit 525*6236dae4SAndroid Build Coastguard Worker 526*6236dae4SAndroid Build Coastguard WorkerCurl allows the user to set the transfer speed conditions that must be met to 527*6236dae4SAndroid Build Coastguard Workerlet the transfer keep going. By using the switch `-y` and `-Y` you can make 528*6236dae4SAndroid Build Coastguard Workercurl abort transfers if the transfer speed is below the specified lowest limit 529*6236dae4SAndroid Build Coastguard Workerfor a specified time. 530*6236dae4SAndroid Build Coastguard Worker 531*6236dae4SAndroid Build Coastguard WorkerTo have curl abort the download if the speed is slower than 3000 bytes per 532*6236dae4SAndroid Build Coastguard Workersecond for 1 minute, run: 533*6236dae4SAndroid Build Coastguard Worker 534*6236dae4SAndroid Build Coastguard Worker curl -Y 3000 -y 60 www.far-away.example.com 535*6236dae4SAndroid Build Coastguard Worker 536*6236dae4SAndroid Build Coastguard WorkerThis can be used in combination with the overall time limit, so that the above 537*6236dae4SAndroid Build Coastguard Workeroperation must be completed in whole within 30 minutes: 538*6236dae4SAndroid Build Coastguard Worker 539*6236dae4SAndroid Build Coastguard Worker curl -m 1800 -Y 3000 -y 60 www.far-away.example.com 540*6236dae4SAndroid Build Coastguard Worker 541*6236dae4SAndroid Build Coastguard WorkerForcing curl not to transfer data faster than a given rate is also possible, 542*6236dae4SAndroid Build Coastguard Workerwhich might be useful if you are using a limited bandwidth connection and you 543*6236dae4SAndroid Build Coastguard Workerdo not want your transfer to use all of it (sometimes referred to as 544*6236dae4SAndroid Build Coastguard Worker*bandwidth throttle*). 545*6236dae4SAndroid Build Coastguard Worker 546*6236dae4SAndroid Build Coastguard WorkerMake curl transfer data no faster than 10 kilobytes per second: 547*6236dae4SAndroid Build Coastguard Worker 548*6236dae4SAndroid Build Coastguard Worker curl --limit-rate 10K www.far-away.example.com 549*6236dae4SAndroid Build Coastguard Worker 550*6236dae4SAndroid Build Coastguard Workeror 551*6236dae4SAndroid Build Coastguard Worker 552*6236dae4SAndroid Build Coastguard Worker curl --limit-rate 10240 www.far-away.example.com 553*6236dae4SAndroid Build Coastguard Worker 554*6236dae4SAndroid Build Coastguard WorkerOr prevent curl from uploading data faster than 1 megabyte per second: 555*6236dae4SAndroid Build Coastguard Worker 556*6236dae4SAndroid Build Coastguard Worker curl -T upload --limit-rate 1M ftp://uploads.example.com 557*6236dae4SAndroid Build Coastguard Worker 558*6236dae4SAndroid Build Coastguard WorkerWhen using the `--limit-rate` option, the transfer rate is regulated on a 559*6236dae4SAndroid Build Coastguard Workerper-second basis, which causes the total transfer speed to become lower than 560*6236dae4SAndroid Build Coastguard Workerthe given number. Sometimes of course substantially lower, if your transfer 561*6236dae4SAndroid Build Coastguard Workerstalls during periods. 562*6236dae4SAndroid Build Coastguard Worker 563*6236dae4SAndroid Build Coastguard Worker## Config File 564*6236dae4SAndroid Build Coastguard Worker 565*6236dae4SAndroid Build Coastguard WorkerCurl automatically tries to read the `.curlrc` file (or `_curlrc` file on 566*6236dae4SAndroid Build Coastguard WorkerMicrosoft Windows systems) from the user's home directory on startup. 567*6236dae4SAndroid Build Coastguard Worker 568*6236dae4SAndroid Build Coastguard WorkerThe config file could be made up with normal command line switches, but you 569*6236dae4SAndroid Build Coastguard Workercan also specify the long options without the dashes to make it more 570*6236dae4SAndroid Build Coastguard Workerreadable. You can separate the options and the parameter with spaces, or with 571*6236dae4SAndroid Build Coastguard Worker`=` or `:`. Comments can be used within the file. If the first letter on a 572*6236dae4SAndroid Build Coastguard Workerline is a `#`-symbol the rest of the line is treated as a comment. 573*6236dae4SAndroid Build Coastguard Worker 574*6236dae4SAndroid Build Coastguard WorkerIf you want the parameter to contain spaces, you must enclose the entire 575*6236dae4SAndroid Build Coastguard Workerparameter within double quotes (`"`). Within those quotes, you specify a quote 576*6236dae4SAndroid Build Coastguard Workeras `\"`. 577*6236dae4SAndroid Build Coastguard Worker 578*6236dae4SAndroid Build Coastguard WorkerNOTE: You must specify options and their arguments on the same line. 579*6236dae4SAndroid Build Coastguard Worker 580*6236dae4SAndroid Build Coastguard WorkerExample, set default time out and proxy in a config file: 581*6236dae4SAndroid Build Coastguard Worker 582*6236dae4SAndroid Build Coastguard Worker # We want a 30 minute timeout: 583*6236dae4SAndroid Build Coastguard Worker -m 1800 584*6236dae4SAndroid Build Coastguard Worker # ... and we use a proxy for all accesses: 585*6236dae4SAndroid Build Coastguard Worker proxy = proxy.our.domain.com:8080 586*6236dae4SAndroid Build Coastguard Worker 587*6236dae4SAndroid Build Coastguard WorkerWhitespaces ARE significant at the end of lines, but all whitespace leading 588*6236dae4SAndroid Build Coastguard Workerup to the first characters of each line are ignored. 589*6236dae4SAndroid Build Coastguard Worker 590*6236dae4SAndroid Build Coastguard WorkerPrevent curl from reading the default file by using -q as the first command 591*6236dae4SAndroid Build Coastguard Workerline parameter, like: 592*6236dae4SAndroid Build Coastguard Worker 593*6236dae4SAndroid Build Coastguard Worker curl -q www.example.org 594*6236dae4SAndroid Build Coastguard Worker 595*6236dae4SAndroid Build Coastguard WorkerForce curl to get and display a local help page in case it is invoked without 596*6236dae4SAndroid Build Coastguard WorkerURL by making a config file similar to: 597*6236dae4SAndroid Build Coastguard Worker 598*6236dae4SAndroid Build Coastguard Worker # default url to get 599*6236dae4SAndroid Build Coastguard Worker url = "http://help.with.curl.example.com/curlhelp.html" 600*6236dae4SAndroid Build Coastguard Worker 601*6236dae4SAndroid Build Coastguard WorkerYou can specify another config file to be read by using the `-K`/`--config` 602*6236dae4SAndroid Build Coastguard Workerflag. If you set config filename to `-` it reads the config from stdin, which 603*6236dae4SAndroid Build Coastguard Workercan be handy if you want to hide options from being visible in process tables 604*6236dae4SAndroid Build Coastguard Workeretc: 605*6236dae4SAndroid Build Coastguard Worker 606*6236dae4SAndroid Build Coastguard Worker echo "user = user:passwd" | curl -K - http://that.secret.example.com 607*6236dae4SAndroid Build Coastguard Worker 608*6236dae4SAndroid Build Coastguard Worker## Extra Headers 609*6236dae4SAndroid Build Coastguard Worker 610*6236dae4SAndroid Build Coastguard WorkerWhen using curl in your own programs, you may end up needing to pass on your 611*6236dae4SAndroid Build Coastguard Workerown custom headers when getting a webpage. You can do this by using the `-H` 612*6236dae4SAndroid Build Coastguard Workerflag. 613*6236dae4SAndroid Build Coastguard Worker 614*6236dae4SAndroid Build Coastguard WorkerExample, send the header `X-you-and-me: yes` to the server when getting a 615*6236dae4SAndroid Build Coastguard Workerpage: 616*6236dae4SAndroid Build Coastguard Worker 617*6236dae4SAndroid Build Coastguard Worker curl -H "X-you-and-me: yes" love.example.com 618*6236dae4SAndroid Build Coastguard Worker 619*6236dae4SAndroid Build Coastguard WorkerThis can also be useful in case you want curl to send a different text in a 620*6236dae4SAndroid Build Coastguard Workerheader than it normally does. The `-H` header you specify then replaces the 621*6236dae4SAndroid Build Coastguard Workerheader curl would normally send. If you replace an internal header with an 622*6236dae4SAndroid Build Coastguard Workerempty one, you prevent that header from being sent. To prevent the `Host:` 623*6236dae4SAndroid Build Coastguard Workerheader from being used: 624*6236dae4SAndroid Build Coastguard Worker 625*6236dae4SAndroid Build Coastguard Worker curl -H "Host:" server.example.com 626*6236dae4SAndroid Build Coastguard Worker 627*6236dae4SAndroid Build Coastguard Worker## FTP and Path Names 628*6236dae4SAndroid Build Coastguard Worker 629*6236dae4SAndroid Build Coastguard WorkerDo note that when getting files with a `ftp://` URL, the given path is 630*6236dae4SAndroid Build Coastguard Workerrelative to the directory you enter. To get the file `README` from your home 631*6236dae4SAndroid Build Coastguard Workerdirectory at your ftp site, do: 632*6236dae4SAndroid Build Coastguard Worker 633*6236dae4SAndroid Build Coastguard Worker curl ftp://user:[email protected]/README 634*6236dae4SAndroid Build Coastguard Worker 635*6236dae4SAndroid Build Coastguard WorkerIf you want the README file from the root directory of that same site, you 636*6236dae4SAndroid Build Coastguard Workerneed to specify the absolute filename: 637*6236dae4SAndroid Build Coastguard Worker 638*6236dae4SAndroid Build Coastguard Worker curl ftp://user:[email protected]//README 639*6236dae4SAndroid Build Coastguard Worker 640*6236dae4SAndroid Build Coastguard Worker(I.e with an extra slash in front of the filename.) 641*6236dae4SAndroid Build Coastguard Worker 642*6236dae4SAndroid Build Coastguard Worker## SFTP and SCP and Path Names 643*6236dae4SAndroid Build Coastguard Worker 644*6236dae4SAndroid Build Coastguard WorkerWith sftp: and scp: URLs, the path name given is the absolute name on the 645*6236dae4SAndroid Build Coastguard Workerserver. To access a file relative to the remote user's home directory, prefix 646*6236dae4SAndroid Build Coastguard Workerthe file with `/~/` , such as: 647*6236dae4SAndroid Build Coastguard Worker 648*6236dae4SAndroid Build Coastguard Worker curl -u $USER sftp://home.example.com/~/.bashrc 649*6236dae4SAndroid Build Coastguard Worker 650*6236dae4SAndroid Build Coastguard Worker## FTP and Firewalls 651*6236dae4SAndroid Build Coastguard Worker 652*6236dae4SAndroid Build Coastguard WorkerThe FTP protocol requires one of the involved parties to open a second 653*6236dae4SAndroid Build Coastguard Workerconnection as soon as data is about to get transferred. There are two ways to 654*6236dae4SAndroid Build Coastguard Workerdo this. 655*6236dae4SAndroid Build Coastguard Worker 656*6236dae4SAndroid Build Coastguard WorkerThe default way for curl is to issue the PASV command which causes the server 657*6236dae4SAndroid Build Coastguard Workerto open another port and await another connection performed by the 658*6236dae4SAndroid Build Coastguard Workerclient. This is good if the client is behind a firewall that does not allow 659*6236dae4SAndroid Build Coastguard Workerincoming connections. 660*6236dae4SAndroid Build Coastguard Worker 661*6236dae4SAndroid Build Coastguard Worker curl ftp.example.com 662*6236dae4SAndroid Build Coastguard Worker 663*6236dae4SAndroid Build Coastguard WorkerIf the server, for example, is behind a firewall that does not allow 664*6236dae4SAndroid Build Coastguard Workerconnections on ports other than 21 (or if it just does not support the `PASV` 665*6236dae4SAndroid Build Coastguard Workercommand), the other way to do it is to use the `PORT` command and instruct the 666*6236dae4SAndroid Build Coastguard Workerserver to connect to the client on the given IP number and port (as parameters 667*6236dae4SAndroid Build Coastguard Workerto the PORT command). 668*6236dae4SAndroid Build Coastguard Worker 669*6236dae4SAndroid Build Coastguard WorkerThe `-P` flag to curl supports a few different options. Your machine may have 670*6236dae4SAndroid Build Coastguard Workerseveral IP-addresses and/or network interfaces and curl allows you to select 671*6236dae4SAndroid Build Coastguard Workerwhich of them to use. Default address can also be used: 672*6236dae4SAndroid Build Coastguard Worker 673*6236dae4SAndroid Build Coastguard Worker curl -P - ftp.example.com 674*6236dae4SAndroid Build Coastguard Worker 675*6236dae4SAndroid Build Coastguard WorkerDownload with `PORT` but use the IP address of our `le0` interface (this does 676*6236dae4SAndroid Build Coastguard Workernot work on Windows): 677*6236dae4SAndroid Build Coastguard Worker 678*6236dae4SAndroid Build Coastguard Worker curl -P le0 ftp.example.com 679*6236dae4SAndroid Build Coastguard Worker 680*6236dae4SAndroid Build Coastguard WorkerDownload with `PORT` but use 192.168.0.10 as our IP address to use: 681*6236dae4SAndroid Build Coastguard Worker 682*6236dae4SAndroid Build Coastguard Worker curl -P 192.168.0.10 ftp.example.com 683*6236dae4SAndroid Build Coastguard Worker 684*6236dae4SAndroid Build Coastguard Worker## Network Interface 685*6236dae4SAndroid Build Coastguard Worker 686*6236dae4SAndroid Build Coastguard WorkerGet a webpage from a server using a specified port for the interface: 687*6236dae4SAndroid Build Coastguard Worker 688*6236dae4SAndroid Build Coastguard Worker curl --interface eth0:1 http://www.example.com/ 689*6236dae4SAndroid Build Coastguard Worker 690*6236dae4SAndroid Build Coastguard Workeror 691*6236dae4SAndroid Build Coastguard Worker 692*6236dae4SAndroid Build Coastguard Worker curl --interface 192.168.1.10 http://www.example.com/ 693*6236dae4SAndroid Build Coastguard Worker 694*6236dae4SAndroid Build Coastguard Worker## HTTPS 695*6236dae4SAndroid Build Coastguard Worker 696*6236dae4SAndroid Build Coastguard WorkerSecure HTTP requires a TLS library to be installed and used when curl is 697*6236dae4SAndroid Build Coastguard Workerbuilt. If that is done, curl is capable of retrieving and posting documents 698*6236dae4SAndroid Build Coastguard Workerusing the HTTPS protocol. 699*6236dae4SAndroid Build Coastguard Worker 700*6236dae4SAndroid Build Coastguard WorkerExample: 701*6236dae4SAndroid Build Coastguard Worker 702*6236dae4SAndroid Build Coastguard Worker curl https://secure.example.com 703*6236dae4SAndroid Build Coastguard Worker 704*6236dae4SAndroid Build Coastguard Workercurl is also capable of using client certificates to get/post files from sites 705*6236dae4SAndroid Build Coastguard Workerthat require valid certificates. The only drawback is that the certificate 706*6236dae4SAndroid Build Coastguard Workerneeds to be in PEM-format. PEM is a standard and open format to store 707*6236dae4SAndroid Build Coastguard Workercertificates with, but it is not used by the most commonly used browsers. If 708*6236dae4SAndroid Build Coastguard Workeryou want curl to use the certificates you use with your favorite browser, you 709*6236dae4SAndroid Build Coastguard Workermay need to download/compile a converter that can convert your browser's 710*6236dae4SAndroid Build Coastguard Workerformatted certificates to PEM formatted ones. 711*6236dae4SAndroid Build Coastguard Worker 712*6236dae4SAndroid Build Coastguard WorkerExample on how to automatically retrieve a document using a certificate with a 713*6236dae4SAndroid Build Coastguard Workerpersonal password: 714*6236dae4SAndroid Build Coastguard Worker 715*6236dae4SAndroid Build Coastguard Worker curl -E /path/to/cert.pem:password https://secure.example.com/ 716*6236dae4SAndroid Build Coastguard Worker 717*6236dae4SAndroid Build Coastguard WorkerIf you neglect to specify the password on the command line, you are prompted 718*6236dae4SAndroid Build Coastguard Workerfor the correct password before any data can be received. 719*6236dae4SAndroid Build Coastguard Worker 720*6236dae4SAndroid Build Coastguard WorkerMany older HTTPS servers have problems with specific SSL or TLS versions, 721*6236dae4SAndroid Build Coastguard Workerwhich newer versions of OpenSSL etc use, therefore it is sometimes useful to 722*6236dae4SAndroid Build Coastguard Workerspecify what TLS version curl should use.: 723*6236dae4SAndroid Build Coastguard Worker 724*6236dae4SAndroid Build Coastguard Worker curl --tlv1.0 https://secure.example.com/ 725*6236dae4SAndroid Build Coastguard Worker 726*6236dae4SAndroid Build Coastguard WorkerOtherwise, curl attempts to use a sensible TLS default version. 727*6236dae4SAndroid Build Coastguard Worker 728*6236dae4SAndroid Build Coastguard Worker## Resuming File Transfers 729*6236dae4SAndroid Build Coastguard Worker 730*6236dae4SAndroid Build Coastguard WorkerTo continue a file transfer where it was previously aborted, curl supports 731*6236dae4SAndroid Build Coastguard Workerresume on HTTP(S) downloads as well as FTP uploads and downloads. 732*6236dae4SAndroid Build Coastguard Worker 733*6236dae4SAndroid Build Coastguard WorkerContinue downloading a document: 734*6236dae4SAndroid Build Coastguard Worker 735*6236dae4SAndroid Build Coastguard Worker curl -C - -o file ftp://ftp.example.com/path/file 736*6236dae4SAndroid Build Coastguard Worker 737*6236dae4SAndroid Build Coastguard WorkerContinue uploading a document: 738*6236dae4SAndroid Build Coastguard Worker 739*6236dae4SAndroid Build Coastguard Worker curl -C - -T file ftp://ftp.example.com/path/file 740*6236dae4SAndroid Build Coastguard Worker 741*6236dae4SAndroid Build Coastguard WorkerContinue downloading a document from a web server 742*6236dae4SAndroid Build Coastguard Worker 743*6236dae4SAndroid Build Coastguard Worker curl -C - -o file http://www.example.com/ 744*6236dae4SAndroid Build Coastguard Worker 745*6236dae4SAndroid Build Coastguard Worker## Time Conditions 746*6236dae4SAndroid Build Coastguard Worker 747*6236dae4SAndroid Build Coastguard WorkerHTTP allows a client to specify a time condition for the document it requests. 748*6236dae4SAndroid Build Coastguard WorkerIt is `If-Modified-Since` or `If-Unmodified-Since`. curl allows you to specify 749*6236dae4SAndroid Build Coastguard Workerthem with the `-z`/`--time-cond` flag. 750*6236dae4SAndroid Build Coastguard Worker 751*6236dae4SAndroid Build Coastguard WorkerFor example, you can easily make a download that only gets performed if the 752*6236dae4SAndroid Build Coastguard Workerremote file is newer than a local copy. It would be made like: 753*6236dae4SAndroid Build Coastguard Worker 754*6236dae4SAndroid Build Coastguard Worker curl -z local.html http://remote.example.com/remote.html 755*6236dae4SAndroid Build Coastguard Worker 756*6236dae4SAndroid Build Coastguard WorkerOr you can download a file only if the local file is newer than the remote 757*6236dae4SAndroid Build Coastguard Workerone. Do this by prepending the date string with a `-`, as in: 758*6236dae4SAndroid Build Coastguard Worker 759*6236dae4SAndroid Build Coastguard Worker curl -z -local.html http://remote.example.com/remote.html 760*6236dae4SAndroid Build Coastguard Worker 761*6236dae4SAndroid Build Coastguard WorkerYou can specify a plain text date as condition. Tell curl to only download the 762*6236dae4SAndroid Build Coastguard Workerfile if it was updated since January 12, 2012: 763*6236dae4SAndroid Build Coastguard Worker 764*6236dae4SAndroid Build Coastguard Worker curl -z "Jan 12 2012" http://remote.example.com/remote.html 765*6236dae4SAndroid Build Coastguard Worker 766*6236dae4SAndroid Build Coastguard Workercurl accepts a wide range of date formats. You always make the date check the 767*6236dae4SAndroid Build Coastguard Workerother way around by prepending it with a dash (`-`). 768*6236dae4SAndroid Build Coastguard Worker 769*6236dae4SAndroid Build Coastguard Worker## DICT 770*6236dae4SAndroid Build Coastguard Worker 771*6236dae4SAndroid Build Coastguard WorkerFor fun try 772*6236dae4SAndroid Build Coastguard Worker 773*6236dae4SAndroid Build Coastguard Worker curl dict://dict.org/m:curl 774*6236dae4SAndroid Build Coastguard Worker curl dict://dict.org/d:heisenbug:jargon 775*6236dae4SAndroid Build Coastguard Worker curl dict://dict.org/d:daniel:gcide 776*6236dae4SAndroid Build Coastguard Worker 777*6236dae4SAndroid Build Coastguard WorkerAliases for `m` are `match` and `find`, and aliases for `d` are `define` and 778*6236dae4SAndroid Build Coastguard Worker`lookup`. For example, 779*6236dae4SAndroid Build Coastguard Worker 780*6236dae4SAndroid Build Coastguard Worker curl dict://dict.org/find:curl 781*6236dae4SAndroid Build Coastguard Worker 782*6236dae4SAndroid Build Coastguard WorkerCommands that break the URL description of the RFC (but not the DICT 783*6236dae4SAndroid Build Coastguard Workerprotocol) are 784*6236dae4SAndroid Build Coastguard Worker 785*6236dae4SAndroid Build Coastguard Worker curl dict://dict.org/show:db 786*6236dae4SAndroid Build Coastguard Worker curl dict://dict.org/show:strat 787*6236dae4SAndroid Build Coastguard Worker 788*6236dae4SAndroid Build Coastguard WorkerAuthentication support is still missing 789*6236dae4SAndroid Build Coastguard Worker 790*6236dae4SAndroid Build Coastguard Worker## LDAP 791*6236dae4SAndroid Build Coastguard Worker 792*6236dae4SAndroid Build Coastguard WorkerIf you have installed the OpenLDAP library, curl can take advantage of it and 793*6236dae4SAndroid Build Coastguard Workeroffer `ldap://` support. On Windows, curl uses WinLDAP from Platform SDK by 794*6236dae4SAndroid Build Coastguard Workerdefault. 795*6236dae4SAndroid Build Coastguard Worker 796*6236dae4SAndroid Build Coastguard WorkerDefault protocol version used by curl is LDAP version 3. Version 2 is used as 797*6236dae4SAndroid Build Coastguard Workera fallback mechanism in case version 3 fails to connect. 798*6236dae4SAndroid Build Coastguard Worker 799*6236dae4SAndroid Build Coastguard WorkerLDAP is a complex thing and writing an LDAP query is not an easy 800*6236dae4SAndroid Build Coastguard Workertask. Familiarize yourself with the exact syntax description elsewhere. One 801*6236dae4SAndroid Build Coastguard Workersuch place might be: [RFC 2255, The LDAP URL 802*6236dae4SAndroid Build Coastguard WorkerFormat](https://curl.se/rfc/rfc2255.txt) 803*6236dae4SAndroid Build Coastguard Worker 804*6236dae4SAndroid Build Coastguard WorkerTo show you an example, this is how to get all people from an LDAP server that 805*6236dae4SAndroid Build Coastguard Workerhas a certain subdomain in their email address: 806*6236dae4SAndroid Build Coastguard Worker 807*6236dae4SAndroid Build Coastguard Worker curl -B "ldap://ldap.example.com/o=frontec??sub?mail=*sth.example.com" 808*6236dae4SAndroid Build Coastguard Worker 809*6236dae4SAndroid Build Coastguard WorkerYou also can use authentication when accessing LDAP catalog: 810*6236dae4SAndroid Build Coastguard Worker 811*6236dae4SAndroid Build Coastguard Worker curl -u user:passwd "ldap://ldap.example.com/o=frontec??sub?mail=*" 812*6236dae4SAndroid Build Coastguard Worker curl "ldap://user:[email protected]/o=frontec??sub?mail=*" 813*6236dae4SAndroid Build Coastguard Worker 814*6236dae4SAndroid Build Coastguard WorkerBy default, if user and password are provided, OpenLDAP/WinLDAP uses basic 815*6236dae4SAndroid Build Coastguard Workerauthentication. On Windows you can control this behavior by providing one of 816*6236dae4SAndroid Build Coastguard Worker`--basic`, `--ntlm` or `--digest` option in curl command line 817*6236dae4SAndroid Build Coastguard Worker 818*6236dae4SAndroid Build Coastguard Worker curl --ntlm "ldap://user:[email protected]/o=frontec??sub?mail=*" 819*6236dae4SAndroid Build Coastguard Worker 820*6236dae4SAndroid Build Coastguard WorkerOn Windows, if no user/password specified, auto-negotiation mechanism is used 821*6236dae4SAndroid Build Coastguard Workerwith current logon credentials (SSPI/SPNEGO). 822*6236dae4SAndroid Build Coastguard Worker 823*6236dae4SAndroid Build Coastguard Worker## Environment Variables 824*6236dae4SAndroid Build Coastguard Worker 825*6236dae4SAndroid Build Coastguard WorkerCurl reads and understands the following environment variables: 826*6236dae4SAndroid Build Coastguard Worker 827*6236dae4SAndroid Build Coastguard Worker http_proxy, HTTPS_PROXY, FTP_PROXY 828*6236dae4SAndroid Build Coastguard Worker 829*6236dae4SAndroid Build Coastguard WorkerThey should be set for protocol-specific proxies. General proxy should be set 830*6236dae4SAndroid Build Coastguard Workerwith 831*6236dae4SAndroid Build Coastguard Worker 832*6236dae4SAndroid Build Coastguard Worker ALL_PROXY 833*6236dae4SAndroid Build Coastguard Worker 834*6236dae4SAndroid Build Coastguard WorkerA comma-separated list of hostnames that should not go through any proxy is 835*6236dae4SAndroid Build Coastguard Workerset in (only an asterisk, `*` matches all hosts) 836*6236dae4SAndroid Build Coastguard Worker 837*6236dae4SAndroid Build Coastguard Worker NO_PROXY 838*6236dae4SAndroid Build Coastguard Worker 839*6236dae4SAndroid Build Coastguard WorkerIf the hostname matches one of these strings, or the host is within the domain 840*6236dae4SAndroid Build Coastguard Workerof one of these strings, transactions with that node is not done over the 841*6236dae4SAndroid Build Coastguard Workerproxy. When a domain is used, it needs to start with a period. A user can 842*6236dae4SAndroid Build Coastguard Workerspecify that both www.example.com and foo.example.com should not use a proxy 843*6236dae4SAndroid Build Coastguard Workerby setting `NO_PROXY` to `.example.com`. By including the full name you can 844*6236dae4SAndroid Build Coastguard Workerexclude specific hostnames, so to make `www.example.com` not use a proxy but 845*6236dae4SAndroid Build Coastguard Workerstill have `foo.example.com` do it, set `NO_PROXY` to `www.example.com`. 846*6236dae4SAndroid Build Coastguard Worker 847*6236dae4SAndroid Build Coastguard WorkerThe usage of the `-x`/`--proxy` flag overrides the environment variables. 848*6236dae4SAndroid Build Coastguard Worker 849*6236dae4SAndroid Build Coastguard Worker## Netrc 850*6236dae4SAndroid Build Coastguard Worker 851*6236dae4SAndroid Build Coastguard WorkerUnix introduced the `.netrc` concept a long time ago. It is a way for a user 852*6236dae4SAndroid Build Coastguard Workerto specify name and password for commonly visited FTP sites in a file so that 853*6236dae4SAndroid Build Coastguard Workeryou do not have to type them in each time you visit those sites. You realize 854*6236dae4SAndroid Build Coastguard Workerthis is a big security risk if someone else gets hold of your passwords, 855*6236dae4SAndroid Build Coastguard Workertherefore most Unix programs do not read this file unless it is only readable 856*6236dae4SAndroid Build Coastguard Workerby yourself (curl does not care though). 857*6236dae4SAndroid Build Coastguard Worker 858*6236dae4SAndroid Build Coastguard WorkerCurl supports `.netrc` files if told to (using the `-n`/`--netrc` and 859*6236dae4SAndroid Build Coastguard Worker`--netrc-optional` options). This is not restricted to just FTP, so curl can 860*6236dae4SAndroid Build Coastguard Workeruse it for all protocols where authentication is used. 861*6236dae4SAndroid Build Coastguard Worker 862*6236dae4SAndroid Build Coastguard WorkerA simple `.netrc` file could look something like: 863*6236dae4SAndroid Build Coastguard Worker 864*6236dae4SAndroid Build Coastguard Worker machine curl.se login iamdaniel password mysecret 865*6236dae4SAndroid Build Coastguard Worker 866*6236dae4SAndroid Build Coastguard Worker## Custom Output 867*6236dae4SAndroid Build Coastguard Worker 868*6236dae4SAndroid Build Coastguard WorkerTo better allow script programmers to get to know about the progress of curl, 869*6236dae4SAndroid Build Coastguard Workerthe `-w`/`--write-out` option was introduced. Using this, you can specify what 870*6236dae4SAndroid Build Coastguard Workerinformation from the previous transfer you want to extract. 871*6236dae4SAndroid Build Coastguard Worker 872*6236dae4SAndroid Build Coastguard WorkerTo display the amount of bytes downloaded together with some text and an 873*6236dae4SAndroid Build Coastguard Workerending newline: 874*6236dae4SAndroid Build Coastguard Worker 875*6236dae4SAndroid Build Coastguard Worker curl -w 'We downloaded %{size_download} bytes\n' www.example.com 876*6236dae4SAndroid Build Coastguard Worker 877*6236dae4SAndroid Build Coastguard Worker## Kerberos FTP Transfer 878*6236dae4SAndroid Build Coastguard Worker 879*6236dae4SAndroid Build Coastguard WorkerCurl supports kerberos4 and kerberos5/GSSAPI for FTP transfers. You need the 880*6236dae4SAndroid Build Coastguard Workerkerberos package installed and used at curl build time for it to be available. 881*6236dae4SAndroid Build Coastguard Worker 882*6236dae4SAndroid Build Coastguard WorkerFirst, get the krb-ticket the normal way, like with the `kinit`/`kauth` tool. 883*6236dae4SAndroid Build Coastguard WorkerThen use curl in way similar to: 884*6236dae4SAndroid Build Coastguard Worker 885*6236dae4SAndroid Build Coastguard Worker curl --krb private ftp://krb4site.example.com -u username:fakepwd 886*6236dae4SAndroid Build Coastguard Worker 887*6236dae4SAndroid Build Coastguard WorkerThere is no use for a password on the `-u` switch, but a blank one makes curl 888*6236dae4SAndroid Build Coastguard Workerask for one and you already entered the real password to `kinit`/`kauth`. 889*6236dae4SAndroid Build Coastguard Worker 890*6236dae4SAndroid Build Coastguard Worker## TELNET 891*6236dae4SAndroid Build Coastguard Worker 892*6236dae4SAndroid Build Coastguard WorkerThe curl telnet support is basic and easy to use. Curl passes all data passed 893*6236dae4SAndroid Build Coastguard Workerto it on stdin to the remote server. Connect to a remote telnet server using a 894*6236dae4SAndroid Build Coastguard Workercommand line similar to: 895*6236dae4SAndroid Build Coastguard Worker 896*6236dae4SAndroid Build Coastguard Worker curl telnet://remote.example.com 897*6236dae4SAndroid Build Coastguard Worker 898*6236dae4SAndroid Build Coastguard WorkerEnter the data to pass to the server on stdin. The result is sent to stdout or 899*6236dae4SAndroid Build Coastguard Workerto the file you specify with `-o`. 900*6236dae4SAndroid Build Coastguard Worker 901*6236dae4SAndroid Build Coastguard WorkerYou might want the `-N`/`--no-buffer` option to switch off the buffered output 902*6236dae4SAndroid Build Coastguard Workerfor slow connections or similar. 903*6236dae4SAndroid Build Coastguard Worker 904*6236dae4SAndroid Build Coastguard WorkerPass options to the telnet protocol negotiation, by using the `-t` option. To 905*6236dae4SAndroid Build Coastguard Workertell the server we use a vt100 terminal, try something like: 906*6236dae4SAndroid Build Coastguard Worker 907*6236dae4SAndroid Build Coastguard Worker curl -tTTYPE=vt100 telnet://remote.example.com 908*6236dae4SAndroid Build Coastguard Worker 909*6236dae4SAndroid Build Coastguard WorkerOther interesting options for it `-t` include: 910*6236dae4SAndroid Build Coastguard Worker 911*6236dae4SAndroid Build Coastguard Worker - `XDISPLOC=<X display>` Sets the X display location. 912*6236dae4SAndroid Build Coastguard Worker - `NEW_ENV=<var,val>` Sets an environment variable. 913*6236dae4SAndroid Build Coastguard Worker 914*6236dae4SAndroid Build Coastguard WorkerNOTE: The telnet protocol does not specify any way to login with a specified 915*6236dae4SAndroid Build Coastguard Workeruser and password so curl cannot do that automatically. To do that, you need to 916*6236dae4SAndroid Build Coastguard Workertrack when the login prompt is received and send the username and password 917*6236dae4SAndroid Build Coastguard Workeraccordingly. 918*6236dae4SAndroid Build Coastguard Worker 919*6236dae4SAndroid Build Coastguard Worker## Persistent Connections 920*6236dae4SAndroid Build Coastguard Worker 921*6236dae4SAndroid Build Coastguard WorkerSpecifying multiple files on a single command line makes curl transfer all of 922*6236dae4SAndroid Build Coastguard Workerthem, one after the other in the specified order. 923*6236dae4SAndroid Build Coastguard Worker 924*6236dae4SAndroid Build Coastguard Workerlibcurl attempts to use persistent connections for the transfers so that the 925*6236dae4SAndroid Build Coastguard Workersecond transfer to the same host can use the same connection that was already 926*6236dae4SAndroid Build Coastguard Workerinitiated and was left open in the previous transfer. This greatly decreases 927*6236dae4SAndroid Build Coastguard Workerconnection time for all but the first transfer and it makes a far better use 928*6236dae4SAndroid Build Coastguard Workerof the network. 929*6236dae4SAndroid Build Coastguard Worker 930*6236dae4SAndroid Build Coastguard WorkerNote that curl cannot use persistent connections for transfers that are used 931*6236dae4SAndroid Build Coastguard Workerin subsequent curl invokes. Try to stuff as many URLs as possible on the same 932*6236dae4SAndroid Build Coastguard Workercommand line if they are using the same host, as that makes the transfers 933*6236dae4SAndroid Build Coastguard Workerfaster. If you use an HTTP proxy for file transfers, practically all transfers 934*6236dae4SAndroid Build Coastguard Workerare persistent. 935*6236dae4SAndroid Build Coastguard Worker 936*6236dae4SAndroid Build Coastguard Worker## Multiple Transfers With A Single Command Line 937*6236dae4SAndroid Build Coastguard Worker 938*6236dae4SAndroid Build Coastguard WorkerAs is mentioned above, you can download multiple files with one command line 939*6236dae4SAndroid Build Coastguard Workerby simply adding more URLs. If you want those to get saved to a local file 940*6236dae4SAndroid Build Coastguard Workerinstead of just printed to stdout, you need to add one save option for each 941*6236dae4SAndroid Build Coastguard WorkerURL you specify. Note that this also goes for the `-O` option (but not 942*6236dae4SAndroid Build Coastguard Worker`--remote-name-all`). 943*6236dae4SAndroid Build Coastguard Worker 944*6236dae4SAndroid Build Coastguard WorkerFor example: get two files and use `-O` for the first and a custom file 945*6236dae4SAndroid Build Coastguard Workername for the second: 946*6236dae4SAndroid Build Coastguard Worker 947*6236dae4SAndroid Build Coastguard Worker curl -O http://example.com/file.txt ftp://example.com/moo.exe -o moo.jpg 948*6236dae4SAndroid Build Coastguard Worker 949*6236dae4SAndroid Build Coastguard WorkerYou can also upload multiple files in a similar fashion: 950*6236dae4SAndroid Build Coastguard Worker 951*6236dae4SAndroid Build Coastguard Worker curl -T local1 ftp://example.com/moo.exe -T local2 ftp://example.com/moo2.txt 952*6236dae4SAndroid Build Coastguard Worker 953*6236dae4SAndroid Build Coastguard Worker## IPv6 954*6236dae4SAndroid Build Coastguard Worker 955*6236dae4SAndroid Build Coastguard Workercurl connects to a server with IPv6 when a host lookup returns an IPv6 address 956*6236dae4SAndroid Build Coastguard Workerand fall back to IPv4 if the connection fails. The `--ipv4` and `--ipv6` 957*6236dae4SAndroid Build Coastguard Workeroptions can specify which address to use when both are available. IPv6 958*6236dae4SAndroid Build Coastguard Workeraddresses can also be specified directly in URLs using the syntax: 959*6236dae4SAndroid Build Coastguard Worker 960*6236dae4SAndroid Build Coastguard Worker http://[2001:1890:1112:1::20]/overview.html 961*6236dae4SAndroid Build Coastguard Worker 962*6236dae4SAndroid Build Coastguard WorkerWhen this style is used, the `-g` option must be given to stop curl from 963*6236dae4SAndroid Build Coastguard Workerinterpreting the square brackets as special globbing characters. Link local 964*6236dae4SAndroid Build Coastguard Workerand site local addresses including a scope identifier, such as `fe80::1234%1`, 965*6236dae4SAndroid Build Coastguard Workermay also be used, but the scope portion must be numeric or match an existing 966*6236dae4SAndroid Build Coastguard Workernetwork interface on Linux and the percent character must be URL escaped. The 967*6236dae4SAndroid Build Coastguard Workerprevious example in an SFTP URL might look like: 968*6236dae4SAndroid Build Coastguard Worker 969*6236dae4SAndroid Build Coastguard Worker sftp://[fe80::1234%251]/ 970*6236dae4SAndroid Build Coastguard Worker 971*6236dae4SAndroid Build Coastguard WorkerIPv6 addresses provided other than in URLs (e.g. to the `--proxy`, 972*6236dae4SAndroid Build Coastguard Worker`--interface` or `--ftp-port` options) should not be URL encoded. 973*6236dae4SAndroid Build Coastguard Worker 974*6236dae4SAndroid Build Coastguard Worker## Mailing Lists 975*6236dae4SAndroid Build Coastguard Worker 976*6236dae4SAndroid Build Coastguard WorkerFor your convenience, we have several open mailing lists to discuss curl, its 977*6236dae4SAndroid Build Coastguard Workerdevelopment and things relevant to this. Get all info at 978*6236dae4SAndroid Build Coastguard Workerhttps://curl.se/mail/. 979*6236dae4SAndroid Build Coastguard Worker 980*6236dae4SAndroid Build Coastguard WorkerPlease direct curl questions, feature requests and trouble reports to one of 981*6236dae4SAndroid Build Coastguard Workerthese mailing lists instead of mailing any individual. 982*6236dae4SAndroid Build Coastguard Worker 983*6236dae4SAndroid Build Coastguard WorkerAvailable lists include: 984*6236dae4SAndroid Build Coastguard Worker 985*6236dae4SAndroid Build Coastguard Worker### `curl-users` 986*6236dae4SAndroid Build Coastguard Worker 987*6236dae4SAndroid Build Coastguard WorkerUsers of the command line tool. How to use it, what does not work, new 988*6236dae4SAndroid Build Coastguard Workerfeatures, related tools, questions, news, installations, compilations, 989*6236dae4SAndroid Build Coastguard Workerrunning, porting etc. 990*6236dae4SAndroid Build Coastguard Worker 991*6236dae4SAndroid Build Coastguard Worker### `curl-library` 992*6236dae4SAndroid Build Coastguard Worker 993*6236dae4SAndroid Build Coastguard WorkerDevelopers using or developing libcurl. Bugs, extensions, improvements. 994*6236dae4SAndroid Build Coastguard Worker 995*6236dae4SAndroid Build Coastguard Worker### `curl-announce` 996*6236dae4SAndroid Build Coastguard Worker 997*6236dae4SAndroid Build Coastguard WorkerLow-traffic. Only receives announcements of new public versions. At worst, 998*6236dae4SAndroid Build Coastguard Workerthat makes something like one or two mails per month, but usually only one 999*6236dae4SAndroid Build Coastguard Workermail every second month. 1000*6236dae4SAndroid Build Coastguard Worker 1001*6236dae4SAndroid Build Coastguard Worker### `curl-and-php` 1002*6236dae4SAndroid Build Coastguard Worker 1003*6236dae4SAndroid Build Coastguard WorkerUsing the curl functions in PHP. Everything curl with a PHP angle. Or PHP with 1004*6236dae4SAndroid Build Coastguard Workera curl angle. 1005*6236dae4SAndroid Build Coastguard Worker 1006*6236dae4SAndroid Build Coastguard Worker### `curl-and-python` 1007*6236dae4SAndroid Build Coastguard Worker 1008*6236dae4SAndroid Build Coastguard WorkerPython hackers using curl with or without the python binding pycurl. 1009