前段時(shí)間群里討論,想實(shí)現(xiàn)某個(gè)文件定時(shí)上傳到服務(wù)器要怎么來實(shí)現(xiàn)。我記得之前做過一個(gè)項(xiàng)目:為高通的iot模組編寫FOTA功能
:實(shí)現(xiàn)模組可以遠(yuǎn)程下載升級(jí)鏡像包,實(shí)現(xiàn)版本升級(jí)功能。當(dāng)時(shí)使用的是一個(gè)超級(jí)強(qiáng)大的工具cURL。心血來潮,決定專門寫一篇文章,送給需要的朋友。
文章主要分兩部分:
? 1.首先介紹cURL的語法;
? 2.實(shí)現(xiàn)一個(gè)定時(shí)上傳日志文件的一個(gè)簡(jiǎn)單的程序。
概念
cURL 是常用的命令行工具,用來請(qǐng)求 Web 服務(wù)器。它的名字就是客戶端(client)的 URL 工具的意思。
cURL的原作者是 Daniel Stenberg (目前是 cURL 的核心開發(fā)者),同時(shí)也是 IETF HTTPbis工作組的資深成員。Daniel 在 1998 年創(chuàng)建了 curl 項(xiàng)目,他編寫了最初的 curl 版本,并創(chuàng)建了 libcurl庫。到目前為止,代碼倉庫包括的 24000 次 commit 有超過一半是 Daniel 本人提交的,他依然是項(xiàng)目的核心開發(fā)者。Daniel 表示已將 curl 視為自己的孩子。
作為一款強(qiáng)力工具,支持的協(xié)議包括(DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS,POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),還支持POST、cookies、認(rèn)證、從指定偏移處下載部分文件等功能,具有用戶代理字符串、限速、文件大小、進(jìn)度條、cookie支持、用戶認(rèn)證、斷點(diǎn)續(xù)傳等特征。
一、命令的安裝
sudo?apt-get?install?curl
二、cURL命令語法:
curl?[options]?[URL...]
三、URL格式
在WWW上,每一信息資源都有統(tǒng)一的且在網(wǎng)上唯一的地址,該地址就叫URL(Uniform Resource Locator,統(tǒng)一資源定位器),它是WWW的統(tǒng)一資源定位標(biāo)志,就是指網(wǎng)絡(luò)地址。URL的格式定義要參考 RFC 1808 。
地址:http://www.w3.org/Addressing/rfc1808.txt
《Relative?Uniform?Resource?Locators?》?
URL由三部分組成:資源類型、存放資源的主機(jī)域名、資源文件名。也可認(rèn)為由4部分組成:協(xié)議、主機(jī)、端口、路徑
URL的一般語法格式為:
protocol?://?hostname[:port]?/?path?/?[;parameters][?query]#fragment
(帶方括號(hào)[]的為可選項(xiàng))。
protocol(協(xié)議)
指定使用的傳輸協(xié)議,下表列出 protocol 屬性的有效方案名稱。最常用的是HTTP協(xié)議,它也是WWW中應(yīng)用最廣的協(xié)議。
- file 資源是本地計(jì)算機(jī)上的文件。格式file:///,注意后邊應(yīng)是三個(gè)斜杠。ftp 通過 FTP訪問資源。格式 FTP://gopher 通過 Gopher 協(xié)議訪問該資源。http 通過 HTTP 訪問該資源。格式 HTTP://https 通過安全的 HTTPS 訪問該資源。格式 HTTPS://mailto 資源為電子郵件地址,通過 SMTP 訪問。格式 mailto:MMS 通過 支持MMS(流媒體)協(xié)議的播放該資源。(代表軟件:Windows Media Player)格式 MMS://ed2k 通過 支持ed2k(專用下載鏈接)協(xié)議的P2P軟件訪問該資源。(代表軟件:電驢) 格式 ed2k://Flashget 通過 支持Flashget:(專用下載鏈接)協(xié)議的P2P軟件訪問該資源。(代表軟件:快車) 格式 Flashget://thunder 通過 支持thunder(專用下載鏈接)協(xié)議的P2P軟件訪問該資源。(代表軟件:迅雷) 格式 thunder://news 通過 NNTP 訪問該資源。
hostname(主機(jī)名)
是指存放資源的服務(wù)器的域名系統(tǒng)(DNS) 主機(jī)名或 IP 地址。有時(shí),在主機(jī)名前也可以包含連接到服務(wù)器所需的用戶名和密碼(格式:username:password@hostname)。
port(端口號(hào))
整數(shù),可選,省略時(shí)使用方案的默認(rèn)端口,各種傳輸協(xié)議都有默認(rèn)的端口號(hào),如http的默認(rèn)端口為80。如果輸入時(shí)省略,則使用默認(rèn)端口號(hào)。有時(shí)候出于安全或其他考慮,可以在服務(wù)器上對(duì)端口進(jìn)行重定義,即采用非標(biāo)準(zhǔn)端口號(hào),此時(shí),URL中就不能省略端口號(hào)這一項(xiàng)。
path(路徑)
由零或多個(gè)“/”符號(hào)隔開的字符串,一般用來表示主機(jī)上的一個(gè)目錄或文件地址。
parameters(參數(shù))
這是用于指定特殊參數(shù)的可選項(xiàng)。
query(查詢)
可選,用于給動(dòng)態(tài)網(wǎng)頁(如使用CGI、ISAPI、PHP/JSP/ASP/ASP.NET等技術(shù)制作的網(wǎng)頁)傳遞參數(shù),可有多個(gè)參數(shù),用“&”符號(hào)隔開,每個(gè)參數(shù)的名和值用“=”符號(hào)隔開。
fragment(信息片斷)
字符串,用于指定網(wǎng)絡(luò)資源中的片斷。例如一個(gè)網(wǎng)頁中有多個(gè)名詞解釋,可使用fragment直接定位到某一名詞解釋。
四、curl命令參數(shù)詳解:
由于linux curl功能十分強(qiáng)大,所以命令參數(shù)十分多,下表只篩選出來部分常用的參數(shù),更多參數(shù)請(qǐng)運(yùn)行“man curl”命令查看。
在以下選項(xiàng)中,(H) 表示僅適用 HTTP/HTTPS ,(F) 表示僅適用于 FTP
參數(shù)1 | 參數(shù)2 | 說明 |
---|---|---|
--anyauth | 選擇 "any" 認(rèn)證方法 (H) | |
-a, | --append | 添加要上傳的文件 (F/SFTP) |
--basic | 使用HTTP基礎(chǔ)認(rèn)證(Basic Authentication)(H) | |
--cacert FILE | CA 證書,用于每次請(qǐng)求認(rèn)證 (SSL) | |
--capath DIR | CA 證書目錄 (SSL) | |
-E, | --cert CERT[:PASSWD] | 客戶端證書文件及密碼 (SSL) |
--cert-type TYPE | 證書文件類型 (DER/PEM/ENG) (SSL) | |
--ciphers LIST | SSL 秘鑰 (SSL) | |
--compressed | 請(qǐng)求壓縮 (使用 deflate 或 gzip) | |
-K, | --config FILE | 指定配置文件 |
--connect-timeout SECONDS | 連接超時(shí)設(shè)置 | |
-C, | --continue-at OFFSET | 斷點(diǎn)續(xù)轉(zhuǎn) |
-b, | --cookie STRING/FILE | Cookies字符串或讀取Cookies的文件位置 (H) |
-c, | --cookie-jar FILE | 操作結(jié)束后,要寫入 Cookies 的文件位置 (H) |
--create-dirs | 創(chuàng)建必要的本地目錄層次結(jié)構(gòu) | |
--crlf | 在上傳時(shí)將 LF 轉(zhuǎn)寫為 CRLF | |
--crlfile FILE | 從指定的文件獲得PEM格式CRL列表 | |
-d, | --data DATA | HTTP POST 數(shù)據(jù) (H) |
--data-ascii DATA ?ASCII | 編碼 HTTP POST 數(shù)據(jù) (H) | |
--data-binary DATA ?binary | 編碼 HTTP POST 數(shù)據(jù) (H) | |
--data-urlencode DATA ?url | 編碼 HTTP POST 數(shù)據(jù) (H) | |
--delegation STRING GSS-API | 委托權(quán)限 | |
--digest | 使用數(shù)字身份驗(yàn)證 (H) | |
--disable-eprt | 禁止使用 EPRT 或 LPRT (F) | |
--disable-epsv | 禁止使用 EPSV (F) | |
-D, | --dump-header FILE | 將頭信息寫入指定的文件 |
--egd-file FILE | 為隨機(jī)數(shù)據(jù)設(shè)置EGD socket路徑(SSL) | |
--engine ENGINGE | 加密引擎 (SSL). "--engine list" 指定列表 | |
-f, | --fail | 連接失敗時(shí)不顯示HTTP錯(cuò)誤信息 (H) |
-F, | --form CONTENT | 模擬 HTTP 表單數(shù)據(jù)提交(multipart POST) (H) |
--form-string STRING | 模擬 HTTP 表單數(shù)據(jù)提交 (H) | |
--ftp-account DATA | 帳戶數(shù)據(jù)提交 (F) | |
--ftp-alternative-to-user COMMAND | 指定替換 "USER [name]" 的字符串 (F) | |
--ftp-create-dirs | 如果不存在則創(chuàng)建遠(yuǎn)程目錄 (F) | |
--ftp-method [MULTICWD/NOCWD/SINGLECWD] | 控制 CWD (F) | |
--ftp-pasv | 使用 PASV/EPSV 替換 PORT (F) | |
-P, | --ftp-port ADR | 使用指定 PORT 及地址替換 PASV (F) |
--ftp-skip-pasv-ip | 跳過 PASV 的IP地址 (F) | |
--ftp-pret | 在 PASV 之前發(fā)送 PRET (drftpd) (F) | |
--ftp-ssl-ccc | 在認(rèn)證之后發(fā)送 CCC (F) | |
--ftp-ssl-ccc-mode ACTIVE/PASSIVE | 設(shè)置 CCC 模式 (F) | |
--ftp-ssl-control ftp | 登錄時(shí)需要 SSL/TLS (F) | |
-G, | --get | 使用 HTTP GET 方法發(fā)送 -d 數(shù)據(jù) ?(H) |
-g, | --globoff | 禁用的 URL 隊(duì)列 及范圍使用 {} 和 [] |
-H, | --header LINE | 要發(fā)送到服務(wù)端的自定義請(qǐng)求頭 (H) |
-I, | --head | 僅顯示響應(yīng)文檔頭 |
-h, | --help | 顯示幫助 |
-0, | --http1.0 | 使用 HTTP 1.0 (H) |
--ignore-content-length | 忽略 HTTP Content-Length 頭 | |
-i, | --include | 在輸出中包含協(xié)議頭 (H/F) |
-k, | --insecure | 允許連接到 SSL 站點(diǎn),而不使用證書 (H) |
--interface INTERFACE | 指定網(wǎng)絡(luò)接口/地址 | |
-4, | --ipv4 | 將域名解析為 IPv4 地址 |
-6, | --ipv6 | 將域名解析為 IPv6 地址 |
-j, | --junk-session-cookies | 讀取文件中但忽略會(huì)話cookie (H) |
--keepalive-time SECONDS | keepalive 包間隔 | |
--key KEY | 私鑰文件名 (SSL/SSH) | |
--key-type TYPE | 私鑰文件類型 (DER/PEM/ENG) (SSL) | |
--krb LEVEL | 啟用指定安全級(jí)別的 Kerberos (F) | |
--libcurl FILE | 命令的libcurl等價(jià)代碼 | |
--limit-rate RATE | 限制傳輸速度 | |
-l, | --list-only | 只列出FTP目錄的名稱 (F) |
--local-port RANGE | 強(qiáng)制使用的本地端口號(hào) | |
-L, | --location | 跟蹤重定向 (H) |
--location-trusted | 類似 ?--location 并發(fā)送驗(yàn)證信息到其它主機(jī) (H) | |
-M, | --manual | 顯示全手動(dòng) |
--mail-from FROM | 從這個(gè)地址發(fā)送郵件 | |
--mail-rcpt TO | 發(fā)送郵件到這個(gè)接收人(s) | |
--mail-auth AUTH | 原始電子郵件的起始地址 | |
--max-filesize BYTES | 下載的最大文件大小 (H/F) | |
--max-redirs NUM | 最大重定向數(shù) (H) | |
-m, | --max-time SECONDS | 允許的最多傳輸時(shí)間 |
--metalink | 處理指定的URL上的XML文件 | |
--negotiate | 使用 HTTP Negotiate 認(rèn)證 (H) | |
-n, | --netrc | 必須從 .netrc 文件讀取用戶名和密碼 |
--netrc-optional | 使用 .netrc 或 URL; 將重寫 -n 參數(shù) | |
--netrc-file FILE | 設(shè)置要使用的 netrc 文件名 | |
-N, | --no-buffer | 禁用輸出流的緩存 |
--no-keepalive | 禁用 connection 的 keepalive | |
--no-sessionid | 禁止重復(fù)使用 SSL session-ID (SSL) | |
--noproxy | 不使用代理的主機(jī)列表 | |
--ntlm | 使用 HTTP NTLM 認(rèn)證 (H) | |
-o, | --output FILE | 將輸出寫入文件,而非 stdout |
--pass PASS | 傳遞給私鑰的短語 (SSL/SSH) | |
--post301 | 在 301 重定向后不要切換為 GET 請(qǐng)求 (H) | |
--post302 | 在 302 重定向后不要切換為 GET 請(qǐng)求 (H) | |
--post303 | 在 303 重定向后不要切換為 GET 請(qǐng)求 (H) | |
-#, | --progress-bar | 以進(jìn)度條顯示傳輸進(jìn)度 |
--proto PROTOCOLS | 啟用/禁用 指定的協(xié)議 | |
--proto-redir PROTOCOLS | 在重定向上 啟用/禁用 指定的協(xié)議 | |
-x, | --proxy [PROTOCOL://]HOST[:PORT] | 在指定的端口上使用代理 |
--proxy-anyauth | 在代理上使用 "any" 認(rèn)證方法 (H) | |
--proxy-basic | 在代理上使用 Basic 認(rèn)證 ?(H) | |
--proxy-digest | 在代理上使用 Digest 認(rèn)證 (H) | |
--proxy-negotiate | 在代理上使用 Negotiate 認(rèn)證 (H) | |
--proxy-ntlm | 在代理上使用 NTLM 認(rèn)證 (H) | |
-U, | --proxy-user USER[:PASSWORD] | 代理用戶名及密碼 |
--proxy1.0 HOST[:PORT] | 在指定的端口上使用 HTTP/1.0 代理 | |
-p, | --proxytunnel | 使用HTTP代理 (用于 CONNECT) |
--pubkey KEY | 公鑰文件名 (SSH) | |
-Q, | --quote CMD | 在傳輸開始前向服務(wù)器發(fā)送命令 (F/SFTP) |
--random-file FILE | 讀取隨機(jī)數(shù)據(jù)的文件 (SSL) | |
-r, | --range RANGE | 僅檢索范圍內(nèi)的字節(jié) |
--raw | 使用原始HTTP傳輸,而不使用編碼 (H) | |
-e, | --referer | Referer URL (H) |
-J, | --remote-header-name | 從遠(yuǎn)程文件讀取頭信息 (H) |
-O, | --remote-name | 將輸出寫入遠(yuǎn)程文件 |
--remote-name-all | 使用所有URL的遠(yuǎn)程文件名 | |
-R, | --remote-time | 將遠(yuǎn)程文件的時(shí)間設(shè)置在本地輸出上 |
-X, | --request COMMAND | 使用指定的請(qǐng)求命令 |
--resolve HOST:PORT:ADDRESS | 將 HOST:PORT 強(qiáng)制解析到 ADDRESS | |
--retry NUM | 出現(xiàn)問題時(shí)的重試次數(shù) | |
--retry-delay SECONDS | 重試時(shí)的延時(shí)時(shí)長(zhǎng) | |
--retry-max-time SECONDS | 僅在指定時(shí)間段內(nèi)重試 | |
-S, | --show-error | 顯示錯(cuò)誤. 在選項(xiàng) -s 中,當(dāng) curl 出現(xiàn)錯(cuò)誤時(shí)將顯示 |
-s, | --silent | Silent模式。不輸出任務(wù)內(nèi)容 |
--socks4 HOST[:PORT] | 在指定的 host + port 上使用 SOCKS4 代理 | |
--socks4a HOST[:PORT] | 在指定的 host + port 上使用 SOCKSa 代理 | |
--socks5 HOST[:PORT] | 在指定的 host + port 上使用 SOCKS5 代理 | |
--socks5-hostname HOST[:PORT] SOCKS5 | 代理,指定用戶名、密碼 | |
--socks5-gssapi-service NAME | 為gssapi使用SOCKS5代理服務(wù)名稱 | |
--socks5-gssapi-nec | 與NEC Socks5服務(wù)器兼容 | |
-Y, | --speed-limit RATE | 在指定限速時(shí)間之后停止傳輸 |
-y, | --speed-time SECONDS | 指定時(shí)間之后觸發(fā)限速. 默認(rèn) 30 |
--ssl | 嘗試 SSL/TLS (FTP, IMAP, POP3, SMTP) | |
--ssl-reqd | 需要 SSL/TLS (FTP, IMAP, POP3, SMTP) | |
-2, | --sslv2 | 使用 SSLv2 (SSL) |
-3, | --sslv3 | 使用 SSLv3 (SSL) |
--ssl-allow-beast | 允許的安全漏洞,提高互操作性(SSL) | |
--stderr FILE | 重定向 stderr 的文件位置. - means stdout | |
--tcp-nodelay | 使用 TCP_NODELAY 選項(xiàng) | |
-t, | --telnet-option OPT=VAL | 設(shè)置 telnet 選項(xiàng) |
--tftp-blksize VALUE | 設(shè)備 TFTP BLKSIZE 選項(xiàng) (必須 >512) | |
-z, | --time-cond TIME | 基于時(shí)間條件的傳輸 |
-1, | --tlsv1 | 使用 => TLSv1 (SSL) |
--tlsv1.0 | 使用 TLSv1.0 (SSL) | |
--tlsv1.1 | 使用 TLSv1.1 (SSL) | |
--tlsv1.2 | 使用 TLSv1.2 (SSL) | |
--trace FILE | 將 debug 信息寫入指定的文件 | |
--trace-ascii FILE | 類似 ?--trace 但使用16進(jìn)度輸出 | |
--trace-time | 向 trace/verbose 輸出添加時(shí)間戳 | |
--tr-encoding | 請(qǐng)求壓縮傳輸編碼 (H) | |
-T, | --upload-file FILE | 將文件傳輸(上傳)到指定位置 |
--url URL | 指定所使用的 URL | |
-B, | --use-ascii | 使用 ASCII/text 傳輸 |
-u, | --user USER[:PASSWORD] | 指定服務(wù)器認(rèn)證用戶名、密碼 |
--tlsuser USER | TLS 用戶名 | |
--tlspassword STRING | TLS 密碼 | |
--tlsauthtype STRING | TLS 認(rèn)證類型 (默認(rèn) SRP) | |
--unix-socket FILE | 通過這個(gè) UNIX socket 域連接 | |
-A, | --user-agent STRING | 要發(fā)送到服務(wù)器的 User-Agent (H) |
-v, | --verbose | 顯示詳細(xì)操作信息 |
-V, | --version | 顯示版本號(hào)并退出 |
-w, | --write-out FORMAT | 完成后輸出什么 |
--xattr | 將元數(shù)據(jù)存儲(chǔ)在擴(kuò)展文件屬性中 | |
-q | .curlrc 如果作為第一個(gè)參數(shù)無效 |
五、Linux cURL命令退出碼:
下面是linux curl命令的錯(cuò)誤代碼和她們的相應(yīng)的錯(cuò)誤消息,命令執(zhí)行錯(cuò)誤的時(shí)候可以通過錯(cuò)誤碼來查看出錯(cuò)原因,方便開發(fā)調(diào)試。
退 出 碼 | 錯(cuò)誤描述 |
---|---|
1 | Unsupported protocol. This build of curl has no support for this protocol. |
2 | Failed to initialize. |
3 | URL malformed. The syntax was not correct. |
5 | Couldn't resolve proxy. The given proxy host could not be resolved. |
6 | Couldn't resolve host. The given remote host was not resolved. |
7 | Failed to connect to host. |
8 | FTP weird server reply. The server sent data curl couldn't parse. |
9 | FTP access denied. The server denied login or denied access to the particular resource or directory you wanted to reach. Most often you tried to change to a directory that doesn't exist on the server. |
11 | FTP weird PASS reply. Curl couldn't parse the reply sent to the PASS request. |
13 | FTP weird PASV reply, Curl couldn't parse the reply sent to the PASV request. |
14 | FTP weird 227 format. Curl couldn't parse the 227-line the server sent. |
15 | FTP can't get host. Couldn't resolve the host IP we got in the 227-line. |
17 | FTP couldn't set binary. Couldn't change transfer method to binary. |
18 | Partial file. Only a part of the file was transferred. |
19 | FTP couldn't download/access the given file, the RETR (or similar) command failed. |
21 | FTP quote error. A quote command returned error from the server. |
22 | HTTP page not retrieved. The requested url was not found or returned another error with the HTTP error code being 400 or above. This return code only appears if -f/--fail is used. |
23 | Write error. Curl couldn't write data to a local filesystem or similar. |
25 | FTP couldn't STOR file. The server denied the STOR operation, used for FTP uploading. |
26 | Read error. Various reading problems. |
27 | Out of memory. A memory allocation request failed. |
28 | Operation timeout. The specified time-out period was reached according to the conditions. |
30 | FTP PORT failed. The PORT command failed. Not all FTP servers support the PORT command, try doing a transfer using PASV instead! |
31 | FTP couldn't use REST. The REST command failed. This command is used for resumed FTP transfers. |
33 | HTTP range error. The range "command" didn't work. |
34 | HTTP post error. Internal post-request generation error. |
35 | SSL connect error. The SSL handshaking failed. |
36 | FTP bad download resume. Couldn't continue an earlier aborted download. |
37 | FILE couldn't read file. Failed to open the file. Permissions? |
38 | LDAP cannot bind. LDAP bind operation failed. |
39 | LDAP search failed. |
41 | Function not found. A required LDAP function was not found. |
42 | Aborted by callback. An application told curl to abort the operation. |
43 | Internal error. A function was called with a bad parameter. |
45 | Interface error. A specified outgoing interface could not be used. |
47 | Too many redirects. When following redirects, curl hit the maximum amount. |
48 | Unknown TELNET option specified. |
49 | Malformed telnet option. |
51 | The peer's SSL certificate or SSH MD5 fingerprint was not ok. |
52 | The server didn't reply anything, which here is considered an error. |
53 | SSL crypto engine not found. |
54 | Cannot set SSL crypto engine as default. |
55 | Failed sending network data. |
56 | Failure in receiving network data. |
58 | Problem with the local certificate. |
59 | Couldn't use specified SSL cipher. |
60 | Peer certificate cannot be authenticated with known CA certificates. |
61 | Unrecognized transfer encoding. |
62 | Invalid LDAP URL. |
63 | Maximum file size exceeded. |
64 | Requested FTP SSL level failed. |
65 | Sending the data requires a rewind that failed. |
66 | Failed to initialize SSL Engine. |
67 | The user name, password, or similar was not accepted and curl failed to log in. |
68 | File not found on TFTP server. |
69 | Permission problem on TFTP server. |
70 | Out of disk space on TFTP server. |
71 | Illegal TFTP operation. |
72 | Unknown TFTP transfer ID. |
73 | File already exists (TFTP). |
74 | No such user (TFTP). |
75 | Character conversion failed. |
76 | Character conversion functions required. |
77 | Problem with reading the SSL CA cert (path? access rights?). |
78 | The resource referenced in the URL does not exist. |
79 | An unspecified error occurred during the SSH session. |
80 | Failed to shut down the SSL connection. |
82 | Could not load CRL file, missing or wrong format (added in 7.19.0). |
83 | Issuer check failed (added in 7.19.0). |
XX | More error codes will appear here in future releases. The existing ones are meant to never change. |
六、用法演示:
為節(jié)省篇幅,部分操作不再貼上執(zhí)行結(jié)果。
1、查看網(wǎng)頁源碼
直接在curl命令后加上網(wǎng)址,就可以看到網(wǎng)頁源碼。我們以網(wǎng)址www.sina.com為例(選擇該網(wǎng)址,主要因?yàn)樗木W(wǎng)頁代碼較短):
root@ubuntu:/home/peng#?curl?www.sohu.com
<html>
<head><title>307?Temporary?Redirect</title></head>
<body?bgcolor="white">
<center><h1>307?Temporary?Redirect</h1></center>
<hr><center>nginx</center>
</body>
</html>
執(zhí)行結(jié)果顯示 307 Temporary Redirect
,說明該網(wǎng)址需要重定向。
如果要把這個(gè)網(wǎng)頁保存下來,可以使用-o
參數(shù),這就相當(dāng)于使用wget命令了。
curl?-o?[文件名]?www.sohu.com
2、自動(dòng)跳轉(zhuǎn)
有的網(wǎng)址是自動(dòng)跳轉(zhuǎn)的。使用-L
參數(shù),curl就會(huì)跳轉(zhuǎn)到新的網(wǎng)址。
curl?-L?www.sohu.com
鍵入上面的命令,結(jié)果就自動(dòng)跳轉(zhuǎn)為www.sohu.com.cn。
3、顯示頭信息
-i
參數(shù)可以顯示http response的頭信息,連同網(wǎng)頁代碼一起。
root@ubuntu:/home/peng/driver/test#??curl?-i?www.sohu.com
HTTP/1.1?307?Temporary?Redirect
Content-Type:?text/html
Content-Length:?180
Connection:?keep-alive
Server:?nginx
Date:?Tue,?25?Aug?2020?10:10:54?GMT
Location:?https://www.sohu.com/
FSS-Cache:?from?9790436.18244590.10468709
FSS-Proxy:?Powered?by?2384755.3433341.3062915
<html>
<head><title>307?Temporary?Redirect</title></head>
<body?bgcolor="white">
<center><h1>307?Temporary?Redirect</h1></center>
<hr><center>nginx</center>
</body>
</html>
-I
參數(shù)則是只顯示http response的頭信息。
4、顯示通信過程
-v
參數(shù)可以顯示一次http通信的整個(gè)過程,包括端口連接和http request頭信息。
root@ubuntu:/home/peng/driver/test#??curl?-v?www.sohu.com
*?About?to?connect()?to?www.sohu.com?port?80?(#0)
*???Trying?240e:83:201:3700::5...?connected
>?GET?/?HTTP/1.1
>?User-Agent:?curl/7.22.0?(i686-pc-linux-gnu)?libcurl/7.22.0?OpenSSL/1.0.1?zlib/1.2.3.4?libidn/1.23?librtmp/2.3
>?Host:?www.sohu.com
>?Accept:?*/*
>?
<?HTTP/1.1?307?Temporary?Redirect
<?Content-Type:?text/html
<?Content-Length:?180
<?Connection:?keep-alive
<?Server:?nginx
<?Date:?Tue,?25?Aug?2020?10:11:49?GMT
<?Location:?https://www.sohu.com/
<?FSS-Cache:?from?9855973.18375663.10534247
<?FSS-Proxy:?Powered?by?2450292.3564414.3128453
<?
<html>
<head><title>307?Temporary?Redirect</title></head>
<body?bgcolor="white">
<center><h1>307?Temporary?Redirect</h1></center>
<hr><center>nginx</center>
</body>
</html>
*?Connection?#0?to?host?www.sohu.com?left?intact
*?Closing?connection?#0
如果你覺得上面的信息還不夠,那么下面的命令可以查看更詳細(xì)的通信過程。
curl?--trace?output.txt?www.sohu.com
或者
curl?--trace-ascii?output.txt?www.sohu.com
運(yùn)行后,請(qǐng)打開output.txt文件查看。
5、發(fā)送表單信息
發(fā)送表單信息有GET和POST兩種方法。GET方法相對(duì)簡(jiǎn)單,只要把數(shù)據(jù)附在網(wǎng)址后面就行。
curl?example.com/form.cgi?data=xxx
POST方法必須把數(shù)據(jù)和網(wǎng)址分開,curl就要用到--data參數(shù)。
curl?-X?POST?--data?"data=xxx"?example.com/form.cgi
如果你的數(shù)據(jù)沒有經(jīng)過表單編碼,還可以讓curl為你編碼,參數(shù)是--data-urlencode
。
curl?-X?POST--data-urlencode?"date=April?1"?example.com/form.cgi
6、HTTP動(dòng)詞
curl默認(rèn)的HTTP動(dòng)詞是GET,使用-X
參數(shù)可以支持其他動(dòng)詞。
curl?-X?POST?www.example.com
curl?-X?DELETE?www.example.com
7、文件上傳
假定文件上傳的表單是下面這樣:
<form?method="POST"?enctype='multipart/form-data'?action="upload.cgi">
?<input?type=file?name=upload>
?<input?type=submit?name=press?value="OK">
</form>
你可以用curl這樣上傳文件:
curl?--form?upload=@localfilename?--form?press=OK?[URL]
8、Referer字段
有時(shí)你需要在http request頭信息中,提供一個(gè)referer字段,表示你是從哪里跳轉(zhuǎn)過來的。
curl?--referer?http://www.example.com?http://www.example.com
9、User Agent字段
這個(gè)字段是用來表示客戶端的設(shè)備信息。服務(wù)器有時(shí)會(huì)根據(jù)這個(gè)字段,針對(duì)不同設(shè)備,返回不同格式的網(wǎng)頁,比如手機(jī)版和桌面版。
iPhone4的User Agent是
Mozilla/5.0?(iPhone;?U;?CPU?iPhone?OS?4_0?like?Mac?OS?X;?en-us)?AppleWebKit/532.9?(KHTML,?like?Gecko)?Version/4.0.5?Mobile/8A293?Safari/6531.22.7
curl可以這樣模擬:
curl?--user-agent?"[User?Agent]"?[URL]
10、cookie
使用--cookie
參數(shù),可以讓curl發(fā)送cookie。
curl?--cookie?"name=xxx"?www.example.com
至于具體的cookie的值,可以從http response頭信息的Set-Cookie
字段中得到。
-c cookie-file
可以保存服務(wù)器返回的cookie到文件,-b cookie-file
可以使用這個(gè)文件作為cookie信息,進(jìn)行后續(xù)的請(qǐng)求。
curl?-c?cookies?http://example.com
curl?-b?cookies?http://example.com
11、增加頭信息
有時(shí)需要在http request之中,自行增加一個(gè)頭信息。--header
參數(shù)就可以起到這個(gè)作用。
$?curl?--header?"Content-Type:application/json"?http://example.com
12、認(rèn)證
使用curl選項(xiàng) -u 可以完成HTTP或者FTP的認(rèn)證,可以指定密碼,也可以不指定密碼在后續(xù)操作中輸入密碼:
curl?-u?user:pwd?http://man.linuxde.net
curl?-u?user?http://man.linuxde.net
13、FTP
1)、列出ftp服務(wù)器上的目錄列表
curl?ftp://www.xxx.com/?--user?name:passwd
curl?ftp://www.xxx.com/?–u?name:passwd?#簡(jiǎn)潔寫法
curl?ftp://name:passwd@www.xxx.com?#簡(jiǎn)潔寫法2
例如:在IP地址192.168.43.117上搭建FTP服務(wù)器,并設(shè)置用戶名為user
,密碼為123456
。
現(xiàn)在我們要顯示服務(wù)器上根目錄下的所有文件信息,命令如下:
curl?-u?user:123456?ftp://192.168.43.117
執(zhí)行結(jié)果如下:
簡(jiǎn)潔寫法:
curl?ftp://user:123456@192.168.43.117
執(zhí)行結(jié)果如下:
2)、只列出目錄,不顯示進(jìn)度條
curl?ftp://www.xxx.com?–u?name:passwd?-s
3)、下載一個(gè)文件:
命令如下:
curl?ftp://www.xxx.com/size.zip?–u?name:passwd?-o?size.zip
示例如下:從服務(wù)器的根目錄下下載文件test.c,保存到本地,本地文件名也為test.c?!咀⒁狻咳绻麤]有-o選項(xiàng),程序會(huì)吧數(shù)據(jù)流定向到stdout,即直接把文件內(nèi)容顯示到終端上。
curl?ftp://user:123456@192.168.43.117/test.c?-o?test.c
執(zhí)行結(jié)果如下:
簡(jiǎn)潔模式
curl?-u?user:123456?ftp://192.168.43.117/list.h?-o?list.h
執(zhí)行結(jié)果如下:
4)、上載一個(gè)文件:
curl?–u?name:passwd?-T?size.mp3?ftp://www.xxx.com/mp3/
舉例如下:
curl?-u?user:123456?ftp://192.168.43.117/?-T?list.h
可以看到文件并沒有上傳成功,返回錯(cuò)誤碼是25,參考第五章
25?FTP?couldn't?STOR?file.?The?server?denied?the?STOR?operation,?used?for?FTP?uploading.
可知,是因?yàn)榉?wù)器沒有賦予存儲(chǔ)的權(quán)限,所以設(shè)置服務(wù)器的write權(quán)限即可。
5)、從服務(wù)器上刪除文件(使用curl傳遞ftp協(xié)議的DELE命令):
curl?–u?name:passwd?ftp://www.xxx.com/?-X?'DELE?mp3/size.mp3'
6)、另外curl不支持遞歸下載,不過可以用數(shù)組方式下載文件,比如我們要下載1-10.gif連續(xù)命名的文件:**
curl?–u?name:passwd?ftp://www.xxx.com/img/[1-10].gif?–O?#O字母大寫
7)、要連續(xù)下載多個(gè)文件:
curl?–u?name:passwd?ftp://www.xxx.com/img/[one,two,three].jpg?–O?#O字母大寫
六、實(shí)現(xiàn)日志文件定時(shí)上傳
功能
- 程序運(yùn)行時(shí)要記錄當(dāng)前日志文件的最后修改時(shí)間;每個(gè)10秒鐘就檢查下log文件是否被修改,如果沒有被修改就休眠10秒鐘;如果log文件被修改了,就將當(dāng)前的日志文件拷貝成備份文件,備份文件名字加上當(dāng)前時(shí)間;通過curl發(fā)送備份文件給ftp服務(wù)器;刪除備份文件,重復(fù)步驟2。
程序流程圖如下:
函數(shù)功能介紹
init()
首先記錄當(dāng)前l(fā)og文件時(shí)間,并記錄到全局變量last_mtime
中。
check_file_change()
讀取文件最后修改時(shí)間,并和last_mtime
進(jìn)行比較,如果相同就返回0,不同就返回1.
file_name_add_time()
將當(dāng)前的日志文件拷貝成備份文件,備份文件名字加上當(dāng)前時(shí)間。
stat()
得到對(duì)應(yīng)文件的屬性信息,存放到struct stat結(jié)構(gòu)體變量中。
system()
執(zhí)行參數(shù)中字符串對(duì)應(yīng)的命令。
代碼如下:
/*???Copyright?(C)???公眾號(hào):?yikoulinux??*/
#include?<sys/stat.h>
#include?<stdio.h>
#include?<stdlib.h>
#include?<unistd.h>
#include?<time.h>
?
typedef?struct?stat?ST;
unsigned?long?last_mtime;
/*用戶名密碼暫時(shí)寫死,實(shí)際應(yīng)該保存在配置文件*/
char?name[32]="user";
char?pass[32]?="123456";
char?ip[32]?????="192.168.43.117";
char?filename[32]="t.log";
char?dstfile[256]??={0};
int?init(void)
{
?//準(zhǔn)備結(jié)構(gòu)體
?ST?status;
?
?//調(diào)用stat函數(shù)
?int?res?=?stat(filename,&status);
?if(-1?==?res)
?{
??perror("error:open?file?failn");
??return?0;
?}
?last_mtime?=?status.st_mtime;
?printf("init?time:%s?n",ctime(&last_mtime));
?return?1;
}
?
int??check_file_change(void)
{
?//準(zhǔn)備結(jié)構(gòu)體
?ST?status;
?
?//調(diào)用stat函數(shù)
?int?res?=?stat(filename,&status);
?if(-1?==?res)
?{
??perror("error:open?file?failn");
??return?0;
?}
//?printf("old:%s?new:%s",ctime(&last_mtime),ctime(&status.st_mtime));
?if(last_mtime?==?status.st_mtime)
?{
??printf("file?not?changen");
??return?0;
?}else{
??printf("file?updatedn");?
??last_mtime?=?status.st_mtime;
??return?1;
?}
}
void?file_name_add_time(void)
{
?ST?status;
?time_t?t;??
?struct?tm?*tblock;?
?char?cmd[1024]={0};
??
?t?=?time(NULL);
?tblock?=?localtime(&t);
?
?sprintf(dstfile,"t-%d-%d-%d-%d-%d-%d.log",
??tblock->tm_year+1900,
??tblock->tm_mon,
??tblock->tm_mday,
??tblock->tm_hour,
??tblock->tm_min,
??tblock->tm_sec);
?sprintf(cmd,"cp?%s?%s",filename,dstfile);
//?printf("cdm=%sn",cmd);
?system(cmd);
}
int?main(void)
{
?char?cmd[1024]={0};
?init();
?while(1)
?{?
??if(check_file_change()?==?1)
??{
???file_name_add_time();
???sprintf(cmd,"curl?-u?%s:%s?ftp://%s/?-T?%s",name,pass,ip,dstfile);
?//??printf("cdm=%sn",cmd);
???system(cmd);
???unlink(dstfile);
??}
??sleep(10);?
?}
}
運(yùn)行截圖:
第一步:
因?yàn)閘og文件沒有被修改過,所以程序不會(huì)上傳。
第二步:手動(dòng)輸入字符串 yikoulinux 到日志文件 t.log中。
第三步:因?yàn)槲募l(fā)生了改變,所以打印“file updated”,同時(shí)可以看到curl上傳文件的log信息。
以下是FTP服務(wù)器的根目錄,可以看到,上傳的日志文件:t-2020-7-26-1-19-45.log
。
【補(bǔ)充】
-
- 配置信息,直接在代碼中寫死,通常應(yīng)該從配置文件中讀取,為方便讀者閱讀,本代碼沒有增加該功能;FTP服務(wù)器搭建,本文沒有說明,相關(guān)文件比較多,大家可以自行搜索,一口君用的是File zilla;
- 通常這種需要長(zhǎng)時(shí)間運(yùn)行的程序,需要設(shè)置成守護(hù)進(jìn)程,本文沒有添加相應(yīng)功能,讀者可以自行搜索。如果強(qiáng)烈要求可以單開一篇詳細(xì)介紹。
4. 代碼中time的管理函數(shù),請(qǐng)讀者自行搜索相關(guān)文章。
5. curl也提供了相關(guān)的函數(shù)庫curl.lib,如果要實(shí)現(xiàn)更靈活的功能可以使用對(duì)應(yīng)的api。
6. 之所以先把文件拷貝成備份文件,主要是考慮其他模塊隨時(shí)可能修改日志文件,起到一定保護(hù)作用。