manual.md 6.7 KB
Newer Older
厉害2333's avatar
厉害2333 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
# curl教程

## 最普通的用法

获取百度的主页:

```bash
curl http://www.baidu.com/
```

获取ftp服务器funet的README文件:

```bash
curl ftp://ftp.funet.fi/README
```

从8000端口获取网页:

```bash
curl http://www.xxx.com:8000/ # www.xxx.com 纯属虚构
```
厉害2333's avatar
更新  
厉害2333 已提交
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

获取ftp服务器上的主页:

```bash
curl ftp://cool.haxx.se/
```

从dict服务器上中查找curl的资源(服务器dict.org在国外,访问缓慢):

```bash
curl dict://dict.org/m:curl
```

一次获取两个网页的主页,可以是指定端口的,也可以是ftp或者其他协议的网址:

```bash
curl http://www.baidu.com/ https://opentuna.cn/ # opentuna.cn必须使用https访问
```

从ftps服务器上获取文件:

```bash
curl ftps://files.are.secure.com/secrets.txt
```

或者使用--ftp-ssl参数和ftp网址获取文件:

```bash
curl --ftp-ssl ftp://files.are.secure.com/secrets.txt
```

厉害2333's avatar
更新  
厉害2333 已提交
53
通过ssh获取sftp服务器上的文件(`-u` 参数后要写登录sftp服务器的用户名(也可以直接在用户名后面加密码但要用 `:` 分割,如 admin@123456789),如果连接服务器成功,会让你输入密码):
厉害2333's avatar
更新  
厉害2333 已提交
54 55 56 57 58

```bash
curl -u username sftp://example.com/etc/issue # example.com 纯属虚构,只是个事例
```

厉害2333's avatar
更新  
厉害2333 已提交
59
使用ssh从scp服务器上获取文件(在本地生成私钥,使用 `--key` 参数引入私钥在计算机上的位置。简要概括就是私钥免去了密码验证,如果密钥有密码请看下一个,这个也是需要看的)
厉害2333's avatar
更新  
厉害2333 已提交
60 61 62 63

```bash
curl -u username: --key ~/.ssh/id_rsa scp://example.com/~/file.txt
```
厉害2333's avatar
厉害2333 已提交
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113

通过ssh从scp服务器上获取文件(--pass参数后面是密钥的密码)

```bash
curl -u username: --key ~/.ssh/id_rsa --pass private_key_password scp://example.com/~/file.txt
```

通过IPv6的ip获取服务器主页,和IPv4的ip获取服务器主页的区别是IPv6的ip被包裹在\[\]里:

```bash
# IPv6
curl http://[2001:1890:1112:1::20]/

# IPv4
curl http://223.5.5.5/
```

获取smb服务器的文件。`-u` 参数后的 `domain` 是域名,`username` 是登录服务器的用户名,`passwd` 是登录服务器的密码:

```bash
curl -u "domain\username:passwd" smb://server.example.com/share/file.txt
```

上面所有都是curl的最单的操作————获取网页/文件

## 下载文件

### 原理

curl先获取一个网页/文件,然后存储在本地一个文件,就做到了下载。

curl还有下载的功能,它能完全代替 `wget`。curl能下载任何类型的数据(如mp3,mp4,m4a,aac,html,css,js,cpp...)

获取网页然后存储为特定文件名,-o参数必须要特定文件名:

```bash
curl -o baidu.html https://www.baidu.com/
```

![下载时出现的界面](https://s1.ax1x.com/2020/09/11/wUkNWT.png)

下载时会出现上面的界面,表示curl正在获取网页,最后会保存为 `baidu.com` 文件。

我们先分割上面命令的参数(-o算第一个参数,以此类推):

|参数位置|值|解释|
|:-:|:-:|:-:|
|1|-o|下载一个网页/文件并要指定下载后保存的名字(有更简便的参数,在下面)|
|2|baidu.html|可自定义,网页/文件下载后保存的名字|
|3|https://www.baidu.com/|要下载的网页/文件|
厉害2333's avatar
厉害2333 已提交
114 115 116 117 118 119

和上面的功能一样,-O参数比-o参数更加方便,不用指定下载后的文件明,但是要在网址中指定文件名,说到这里你可能搞不懂了,什么才叫做没有指定文件名?这里的没有指定文件名的意思就是在网址中没有指定要下载的网页/文件的类型,就像原本要下载一张类型为png的图片 `https://xxx.com/xxx.png` ,但被你省略了后缀(.png `https://xxx.com/xxx`),这就叫做网址中没有指定文件名,也可以叫做网址中没有指定下载网页/文件的后缀。你肯定会想到一个网页的主页该怎么下载呢?难道只能用 `-o` 了吗?`-O` 参数也能下载,你访问每个网页的主页都相当于访问 https://一个网址/index.html (index.html还可以是index.htm),只要下载 `https://一个网址/index.html` 就能下载网页的主页。

```bash
curl -O https://www.baidu.com/index.html
```
厉害2333's avatar
更新  
厉害2333 已提交
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197

## 给网页传输密码

curl能传输密码,既然能传输密码就能登录网页。

### Ftp

使用用户名密码登录ftp服务器,获取文件:

```bash
curl ftp://name:passwd@machine.domain:port/full/path/to/file
```

格式

```bash
curl ftp://<用户名>:<密码>@xxx.com:port/xxx
```

`<用户名>:<密码>` 后,有一个 `@` ,你注意到了吗?这种登录方式不仅能在ftp协议网址中用,还能在其他协议中用。

或者使用 `-u` 参数登录,:passwd可以省略,只用有用户名就好了,如果连接上了服务器会让你输入密码:

```bash
curl -u name:passwd ftp://machine.domain:port/full/path/to/file
```

### FTPS

它和ftp相似,如果你看了前面的ftps文件获取实例,你肯定发现了它需要一个 `--ftp-ssl` 参数。

请注意!建议不要不加 `--ftp-ssl` 参数获取文件,或者直接使用ftp(ftp://)协议

### SFTP / SCP

这两个和FTP相似,但是你可以使用 `--key` 参数来指定要使用的私钥的位置,而不是登录的密码密码。请注意,私钥可能受有密码保护,需要输入密码;该密码是使用 `--pass` 参数指定的。通常,curl将自动从私钥文件的目录下提取公钥,但是curl在没有适当的库支持的情况下,必须使用 `--pubkey` 选项指定的公钥文件的位置。

### HTTP

curl还支持HTTP网址的登录操作:

```bash
curl http://name:passwd@machine.domain/full/path/to/file
```

和ftp一样,还有一种:

```bash
curl -u name:passwd http://machine.domain/full/path/to/file
```

----

HTTP提供了许多不同的身份验证方法,curl支持这些身份验证方法:Basic、Digest、NTLM、Negotiate(SPNEGO)。你可能不知道使用哪种方法,所以curl默认为Basic。您还可以使用 `--anyauth` 参数让curl从服务器可使用身份验证方法中选择最安全的验证方法。

注意!根据URL规范,HTTP网址不能包含用户和密码,当通过网络代理使用curl时,这种方法不会起作用,尽管在其他时候curl允许这样做。使用网络代理时,用户和密码必须使用 `-u` 参数。

### HTTPS

最常用于私有证书。

### Proxy

curl支持HTTP和SOCKS代理服务器,并提供多个的身份验证方法。它没有对FTP代理服务器支持,这个服务器目前没有标准,但是它仍然可以和其它许多服务器一起工作。您还可以使用HTTP和SOCKS代理在FTP服务器之间传输文件。

使用名为my-proxy的HTTP代理获取ftp文件,代理的端口是888(使用 `-x` 参数指定代理服务器):

```bash
curl -x my-proxy:888 ftp://ftp.leachsite.com/README
```

使用代理登录网页:

```bash
curl -u user:passwd -x my-proxy:888 http://www.get.this/
```