加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 一、命令的安裝
    • 二、cURL命令語法:
    • 三、URL格式
    • 四、curl命令參數(shù)詳解:
    • 五、Linux cURL命令退出碼:
    • 六、用法演示:
    • 六、實(shí)現(xiàn)日志文件定時(shí)上傳
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

Linux命令cURL詳解+C語言實(shí)現(xiàn)定時(shí)上傳文件到FTP服務(wù)器(送源碼)

07/19 11:10
1139
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

前段時(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ǔ)充】

    1. 配置信息,直接在代碼中寫死,通常應(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ù)作用。

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
NRF52840-QIAA-R7 1 Nordic Semiconductor Telecom Circuit, 1-Func, PBGA73, AQFN-73
$7.48 查看
CM7V-T1A-LOW-ESR-32.768KHZ-7PF-20-TA-QC 1 Micro Crystal AG Parallel - Fundamental Quartz Crystal,

ECAD模型

下載ECAD模型
$3.02 查看
AT27C512R-45JU-T 1 Microchip Technology Inc OTP ROM, 64KX8, 45ns, CMOS, PQCC32

ECAD模型

下載ECAD模型
$2.23 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

公眾號(hào)『一口Linux』號(hào)主彭老師,擁有15年嵌入式開發(fā)經(jīng)驗(yàn)和培訓(xùn)經(jīng)驗(yàn)。曾任職ZTE,某研究所,華清遠(yuǎn)見教學(xué)總監(jiān)。擁有多篇網(wǎng)絡(luò)協(xié)議相關(guān)專利和軟件著作。精通計(jì)算機(jī)網(wǎng)絡(luò)、Linux系統(tǒng)編程、ARM、Linux驅(qū)動(dòng)、龍芯、物聯(lián)網(wǎng)。原創(chuàng)內(nèi)容基本從實(shí)際項(xiàng)目出發(fā),保持原理+實(shí)踐風(fēng)格,適合Linux驅(qū)動(dòng)新手入門和技術(shù)進(jìn)階。