【curl】Linux下命令行curl詳解


在Linux中curl是一個利用URL規則在命令行下工作的文件傳輸工具,可以說是一款很強大的http命令行工具。它支持文件的上傳和下載,是綜合傳輸工具,但按傳統,習慣稱url為下載工具。

語法:# curl [option] [url]
-A/--user-agent <string>              設置用戶代理發送給服務器
-b/--cookie <name=string/file>    cookie字符串或文件讀取位置
-c/--cookie-jar <file>                    操作結束后把cookie寫入到這個文件中
-C/--continue-at <offset>            斷點續轉
-D/--dump-header <file>              把header信息寫入到該文件中
-e/--referer                                  來源網址
-f/--fail                                          連接失敗時不顯示http錯誤
-o/--output                                  把輸出寫到該文件中
-O/--remote-name                      把輸出寫到該文件中,保留遠程文件的文件名
-r/--range <range>                      檢索來自HTTP/1.1或FTP服務器字節范圍
-s/--silent                                    靜音模式。不輸出任何東西
-T/--upload-file <file>                  上傳文件
-u/--user <user[:password]>      設置服務器的用戶和密碼
-w/--write-out [format]                什么輸出完成后
-x/--proxy <host[:port]>              在給定的端口上使用HTTP代理
-#/--progress-bar                        進度條顯示當前的傳送狀態





-a/--append 上傳文件時,附加到目標文件
--anyauth 可以使用“任何”身份驗證方法
--basic 使用HTTP基本驗證
-B/--use-ascii 使用ASCII文本傳輸
-d/--data <data> HTTP POST方式傳送數據
--data-ascii <data> 以ascii的方式post數據
--data-binary <data> 以二進制的方式post數據
--negotiate 使用HTTP身份驗證
--digest 使用數字身份驗證
--disable-eprt 禁止使用EPRT或LPRT
--disable-epsv 禁止使用EPSV
--egd-file <file> 為隨機數據(SSL)設置EGD socket路徑
--tcp-nodelay 使用TCP_NODELAY選項
-E/--cert <cert[:passwd]> 客戶端證書文件和密碼 (SSL)
--cert-type <type> 證書文件類型 (DER/PEM/ENG) (SSL)
--key <key> 私鑰文件名 (SSL)
--key-type <type> 私鑰文件類型 (DER/PEM/ENG) (SSL)
--pass <pass> 私鑰密碼 (SSL)
--engine <eng> 加密引擎使用 (SSL). "--engine list" for list
--cacert <file> CA證書 (SSL)
--capath <directory> CA目 (made using c_rehash) to verify peer against (SSL)
--ciphers <list> SSL密碼
--compressed 要求返回是壓縮的形勢 (using deflate or gzip)
--connect-timeout <seconds> 設置最大請求時間
--create-dirs 建立本地目錄的目錄層次結構
--crlf 上傳是把LF轉變成CRLF
--ftp-create-dirs 如果遠程目錄不存在,創建遠程目錄
--ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用
--ftp-pasv 使用 PASV/EPSV 代替端口
--ftp-skip-pasv-ip 使用PASV的時候,忽略該IP地址
--ftp-ssl 嘗試用 SSL/TLS 來進行ftp數據傳輸
--ftp-ssl-reqd 要求用 SSL/TLS 來進行ftp數據傳輸
-F/--form <name=content> 模擬http表單提交數據
-form-string <name=string> 模擬http表單提交數據
-g/--globoff 禁用網址序列和范圍使用{}和[]
-G/--get 以get的方式來發送數據
-h/--help 幫助
-H/--header <line> 自定義頭信息傳遞給服務器
--ignore-content-length 忽略的HTTP頭信息的長度
-i/--include 輸出時包括protocol頭信息
-I/--head 只顯示文檔信息
-j/--junk-session-cookies 讀取文件時忽略session cookie
--interface <interface> 使用指定網絡接口/地址
--krb4 <level> 使用指定安全級別的krb4
-k/--insecure 允許不使用證書到SSL站點
-K/--config 指定的配置文件讀取
-l/--list-only 列出ftp目錄下的文件名稱
--limit-rate <rate> 設置傳輸速度
--local-port<NUM> 強制使用本地端口號
-m/--max-time <seconds> 設置最大傳輸時間
--max-redirs <num> 設置最大讀取的目錄數
--max-filesize <bytes> 設置最大下載的文件總量
-M/--manual 顯示全手動
-n/--netrc 從netrc文件中讀取用戶名和密碼
--netrc-optional 使用 .netrc 或者 URL來覆蓋-n
--ntlm 使用 HTTP NTLM 身份驗證
-N/--no-buffer 禁用緩沖輸出
-p/--proxytunnel 使用HTTP代理
--proxy-anyauth 選擇任一代理身份驗證方法
--proxy-basic 在代理上使用基本身份驗證
--proxy-digest 在代理上使用數字身份驗證
--proxy-ntlm 在代理上使用ntlm身份驗證
-P/--ftp-port <address> 使用端口地址,而不是使用PASV
-Q/--quote <cmd> 文件傳輸前,發送命令到服務器
--range-file 讀取(SSL)的隨機文件
-R/--remote-time 在本地生成文件時,保留遠程文件時間
--retry <num> 傳輸出現問題時,重試的次數
--retry-delay <seconds> 傳輸出現問題時,設置重試間隔時間
--retry-max-time <seconds> 傳輸出現問題時,設置最大重試時間
-S/--show-error 顯示錯誤
--socks4 <host[:port]> 用socks4代理給定主機和端口
--socks5 <host[:port]> 用socks5代理給定主機和端口
-t/--telnet-option <OPT=val> Telnet選項設置
--trace <file> 對指定文件進行debug
--trace-ascii <file> Like --跟蹤但沒有hex輸出
--trace-time 跟蹤/詳細輸出時,添加時間戳
--url <URL> Spet URL to work with
-U/--proxy-user <user[:password]> 設置代理用戶名和密碼
-V/--version 顯示版本信息
-X/--request <command> 指定什么命令
-y/--speed-time 放棄限速所要的時間。默認為30
-Y/--speed-limit 停止傳輸速度的限制,速度時間'秒
-z/--time-cond 傳送時間設置
-0/--http1.0 使用HTTP 1.0
-1/--tlsv1 使用TLSv1(SSL)
-2/--sslv2 使用SSLv2的(SSL)
-3/--sslv3 使用的SSLv3(SSL)
--3p-quote like -Q for the source URL for 3rd party transfer
--3p-url 使用url,進行第三方傳送
--3p-user 使用用戶名和密碼,進行第三方傳送
-4/--ipv4 使用IP4
-6/--ipv6 使用IP6

 

 

 

 -M/--manual  顯示全手動
 -n/--netrc  從netrc文件中讀取用戶名和密碼
 --netrc-optional  使用 .netrc 或者 URL來覆蓋-n
 --ntlm  使用 HTTP NTLM 身份驗證
 -N/--no-buffer  禁用緩沖輸出
 -o/--output  把輸出寫到該文件中
 -O/--remote-name  把輸出寫到該文件中,保留遠程文件的文件名
 -p/--proxytunnel  使用HTTP代理
 --proxy-anyauth  選擇任一代理身份驗證方法
 --proxy-basic  在代理上使用基本身份驗證
 --proxy-digest  在代理上使用數字身份驗證
 --proxy-ntlm  在代理上使用ntlm身份驗證
 -P/--ftp-port <address>  使用端口地址,而不是使用PASV
 -Q/--quote <cmd>  文件傳輸前,發送命令到服務器
 -r/--range <range>  檢索來自HTTP/1.1或FTP服務器字節范圍
 --range-file    讀取(SSL)的隨機文件
 -R/--remote-time  在本地生成文件時,保留遠程文件時間
 --retry <num>  傳輸出現問題時,重試的次數
 --retry-delay <seconds>  傳輸出現問題時,設置重試間隔時間
 --retry-max-time <seconds>  傳輸出現問題時,設置最大重試時間
 -s/--silent  靜音模式。不輸出任何東西
 -S/--show-error  顯示錯誤
 --socks4 <host[:port]>  用socks4代理給定主機和端口
 --socks5 <host[:port]>  用socks5代理給定主機和端口
 -t/--telnet-option <OPT=val>  Telnet選項設置
 --trace <file>  對指定文件進行debug
 --trace-ascii <file> Like  跟蹤但沒有hex輸出
 --trace-time  跟蹤/詳細輸出時,添加時間戳
 -T/--upload-file <file>  上傳文件
 --url <URL>  Spet URL to work with
 -u/--user <user[:password]>  設置服務器的用戶和密碼
 -U/--proxy-user <user[:password]>  設置代理用戶名和密碼
 -V/--version  顯示版本信息
 -w/--write-out [format]  什么輸出完成后
 -x/--proxy <host[:port]>  在給定的端口上使用HTTP代理
 -X/--request <command>  指定什么命令
 -y/--speed-time  放棄限速所要的時間。默認為30
 -Y/--speed-limit  停止傳輸速度的限制,速度時間'秒
 -z/--time-cond  傳送時間設置
 -0/--http1.0  使用HTTP 1.0
 -1/--tlsv1  使用TLSv1(SSL)
 -2/--sslv2  使用SSLv2的(SSL)
 -3/--sslv3  使用的SSLv3(SSL)
 --3p-quote   like -Q for the source URL for 3rd party transfer
 --3p-url  使用url,進行第三方傳送
 --3p-user  使用用戶名和密碼,進行第三方傳送
 -4/--ipv4  使用IP4
 -6/--ipv6  使用IP6
 -#/--progress-bar  用進度條顯示當前的傳送狀態

基本用法

例子:

1.測試是否可以達到一個網站,可用於client建立tcp連接或其他連接時候的測試排查網址是否可達

curl http://www.baidu.com

執行后,www.linux.com 的html就會顯示在屏幕上了
Ps:由於安裝linux的時候很多時候是沒有安裝桌面的,也意味着沒有瀏覽器,因此這個方法也經常用於測試一台服務器是否可以到達一個網站

 不可達則則返回結果為空

 

2.保存訪問的網頁

2.1:使用linux的重定向功能保存

curl http://www.linux.com >> linux.html

執行完成后會顯示如下界面,顯示100%則表示保存成功,0則表示為沒有保存內容

2.2:可以使用curl的內置option:-o(小寫)保存網頁,此時頁面內容就會存儲到home.html的文件中

 curl -o home.html  http://www.sina.com.cn 

結果和上面一樣

2.3,用-O(大寫的),后面的url要具體到某個文件,不然抓不下來。我們還可以用正則來抓取東西 

curl -O http://www.linux.com/hello.sh

3.測試網頁返回值

# curl -o /dev/null -s -w %{http_code} www.linux.com

Ps:在腳本中,這是很常見的測試網站是否正常的用法

4.指定proxy服務器以及其端口
很多時候上網需要用到代理服務器(比如是使用代理服務器上網或者因為使用curl別人網站而被別人屏蔽IP地址的時候),幸運的是curl通過使用內置option:-x來支持設置代理

curl -x 192.168.100.100:1080 http://www.linux.com
curl -i -X POST '{https://1662d8sji1.execute-api.eu-central-1.amazonaws.com/v1/3,"si":"c2826469a40b"}'

5.cookie
有些網站是使用cookie來記錄session信息。對於chrome這樣的瀏覽器,可以輕易處理cookie信息,但在curl中只要增加相關參數也是可以很容易的處理cookie
5.1:保存http的response里面的cookie信息。內置option:-c(小寫)

curl -c cookiec.txt  http://www.linux.com

執行后cookie信息就被存到了cookiec.txt里面了

模擬表單信息,模擬登錄,保存cookie信息 

curl -c ./cookie_c.txt -F log=aaaa -F pwd=****** http://blog.51yip.com/wp-login.php  

 

5.2:保存http的response里面的header信息。內置option: -D

curl -D cookied.txt http://www.linux.com

 

 curl -D ./cookie_D.txt -F log=aaaa -F pwd=****** http://blog.51yip.com/wp-login.php 

執行后cookie信息就被存到了cookied.txt里面了

注意:-c(小寫)產生的cookie和-D里面的cookie是不一樣的。

 

5.3:使用cookie
很多網站都是通過監視你的cookie信息來判斷你是否按規矩訪問他們的網站的,因此我們需要使用保存的cookie信息。內置option: -b

 curl -b cookiec.txt http://www.linux.com

6.模仿瀏覽器

curl -A "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0)" http://www.linux.com

這樣服務器端就會認為是使用IE8.0去訪問的

7.偽造referer(盜鏈)
很多服務器會檢查http訪問的referer從而來控制訪問。比如:你是先訪問首頁,然后再訪問首頁中的郵箱頁面,這里訪問郵箱的referer地址就是訪問首頁成功后的頁面地址,如果服務器發現對郵箱頁面訪問的referer地址不是首頁的地址,就斷定那是個盜連了
curl中內置option:-e可以讓我們設定referer

 curl -e "www.linux.com" http://mail.linux.com

這樣就會讓服務器其以為你是從www.linux.com點擊某個鏈接過來的

這邊做一個小科普:referer盜鏈知識:

referer 是 HTTP 請求 header 的一部分,當瀏覽器(或者模擬瀏覽器行為)向web服務器發送請求的時候,頭信息里有包含referer 。比如我在www.baidu.com 鏈接去訪問google,那么點擊這個www.baidu.com ,它的header 信息里就有:

    Referer=http://www.baidu.com

同理訪問sina也是,這邊都不屬於盜鏈情況,因為返回回來的還是baidu的頁面

 

盜鏈:就是一個網站中如果沒有起頁面中所說的信息,例如圖片信息,那么它完全可以將這個圖片的連接到別的網站。這樣沒有任何資源的網站利用了別的網站的資源來展示給瀏覽者,提高了自己的訪問量,而大部分瀏覽者又不會很容易地發現,這樣顯然,對於那個被利用了資源的網站是不公平的。一些不良網站為了不增加成本而擴充自己站點內容,經常盜用其他網站的鏈接。一方面損害了被鏈接網站的合法利益,另一方面又加重了被鏈接網站的服務器的負擔。

所以只要判斷當前的refer的上一頁是之前的主頁就可以斷定不是盜鏈。

如果想對自己的網站進行防盜鏈保護,則需要針對不同的情況進行區別對待。如果網站服務器用的是 apache,那么使用apache自帶的Url Rewrite功能可以很輕松地防止各種盜鏈,其原理是檢查refer,如果refer的信息來自其他網站則重定向到指定圖片或網頁上。
如果服務器使用的是 IIS的話,則需要通過第三方插件來實現防盜鏈功能了,現在比較常用的一款產品叫做ISAPI_Rewrite,可以實現類似於apache的防盜鏈功能。另外對於論壇來說還可以使用“登錄驗證”的方法進行防盜鏈。

8.下載文件
8.1:利用curl下載文件。
#使用內置option:-o(小寫)

 curl -o dodo1.jpg http:www.linux.com/dodo1.JPG

#使用內置option:-O(大寫)

curl -O http://www.linux.com/dodo1.JPG

這樣就會以服務器上的名稱保存文件到本地

8.2:循環下載
有時候下載圖片可以能是前面的部分名稱是一樣的,就最后的尾綴名不一樣

curl -O http://www.linux.com/dodo[1-5].JPG

這樣就會把dodo1,dodo2,dodo3,dodo4,dodo5全部保存下來

8.3:下載重命名

 curl -O http://www.linux.com/{hello,bb}/dodo[1-5].JPG

由於下載的hello與bb中的文件名都是dodo1,dodo2,dodo3,dodo4,dodo5。因此第二次下載的會把第一次下載的覆蓋,這樣就需要對文件進行重命名。

curl -o #1_#2.JPG http://www.linux.com/{hello,bb}/dodo[1-5].JPG

這樣在hello/dodo1.JPG的文件下載下來就會變成hello_dodo1.JPG,其他文件依此類推,從而有效的避免了文件被覆蓋

8.4:分塊下載
有時候下載的東西會比較大,這個時候我們可以分段下載。使用內置option:-r

curl -r 0-100 -o dodo1_part1.JPG http://www.linux.com/dodo1.JPG
curl -r 100-200 -o dodo1_part2.JPG http://www.linux.com/dodo1.JPG
curl -r 200- -o dodo1_part3.JPG http://www.linux.com/dodo1.JPG
cat dodo1_part* > dodo1.JPG

這樣就可以查看dodo1.JPG的內容了

8.5:通過ftp下載文件
curl可以通過ftp下載文件,curl提供兩種從ftp中下載的語法

curl -O -u 用戶名:密碼 ftp://www.linux.com/dodo1.JPG
curl -O ftp://用戶名:密碼@www.linux.com/dodo1.JPG

8.6:顯示下載進度條

curl -# -O http://www.linux.com/dodo1.JPG

8.7:不會顯示下載進度信息

curl -s -O http://www.linux.com/dodo1.JPG

9.斷點續傳
在windows中,我們可以使用迅雷這樣的軟件進行斷點續傳。curl可以通過內置option:-C同樣可以達到相同的效果
如果在下載dodo1.JPG的過程中突然掉線了,可以使用以下的方式續傳

curl -C -O http://www.linux.com/dodo1.JPG

10.上傳文件
curl不僅僅可以下載文件,還可以上傳文件。通過內置option:-T來實現

curl -T dodo1.JPG -u 用戶名:密碼 ftp://www.linux.com/img/

這樣就向ftp服務器上傳了文件dodo1.JPG

11.顯示抓取錯誤

curl -f http://www.linux.com/error

  

1. 獲取頁面內容 
2. 顯示 HTTP 頭 
3. 將鏈接保存到文件 
4. 同時下載多個文件 
5. 使用 -L 跟隨鏈接重定向 
6. 使用 -A 自定義 User-Agent 
7. 使用 -H 自定義 header 
8. 使用 -c 保存 Cookie 
9. 使用 -b 讀取 Cookie 
10. 使用 -d 發送 POST 請求

1. 獲取頁面內容

當我們不加任何選項使用 curl 時,默認會發送 GET 請求來獲取鏈接內容到標准輸出。 
curl http://www.codebelief.com

2. 顯示 HTTP 頭

如果我們只想要顯示 HTTP 頭,而不顯示文件內容,可以使用 -I 選項: 
curl -I http://www.codebelief.com 
輸出為:

HTTP/1.1 200 OK Server: nginx/1.10.3 Date: Thu, 11 May 2017 08:24:45 GMT Content-Type: text/html; charset=utf-8 Content-Length: 24206 Connection: keep-alive X-Powered-By: Express Cache-Control: public, max-age=0 ETag: W/"5e8e-Yw5ZdnVVly9/aEnMX7fVXQ" Vary: Accept-Encoding

也可以同時顯示 HTTP 頭和文件內容,使用 -i 選項: 
curl -i http://www.codebelief.com 
輸出為:

HTTP/1.1 200 OK Server: nginx/1.10.3 Date: Thu, 11 May 2017 08:25:46 GMT Content-Type: text/html; charset=utf-8 Content-Length: 24206 Connection: keep-alive X-Powered-By: Express Cache-Control: public, max-age=0 ETag: W/"5e8e-Yw5ZdnVVly9/aEnMX7fVXQ" Vary: Accept-Encoding <!DOCTYPE html> <html lang="en"> ...... </html>

3. 將鏈接保存到文件

我們可以使用 > 符號將輸出重定向到本地文件中。 
curl http://www.codebelief.com > index.html 
也可以通過 curl 自帶的 -o/-O 選項將內容保存到文件中。

-o(小寫的 o):結果會被保存到命令行中提供的文件名 
-O(大寫的 O):URL 中的文件名會被用作保存輸出的文件名 
curl -o index.html http://www.codebelief.com 
curl -O http://www.codebelief.com/page/2/ 
注意:使用 -O 選項時,必須確保鏈接末尾包含文件名,否則 curl 無法正確保存文件。如果遇到鏈接中無文件名的情況,應該使用 -o 選項手動指定文件名,或使用重定向符號。

4. 同時下載多個文件

我們可以使用 -o 或 -O 選項來同時指定多個鏈接,按照以下格式編寫命令: 
curl -O http://www.codebelief.com/page/2/ -O http://www.codebelief.com/page/3/

或者: 
curl -o page1.html http://www.codebelief.com/page/1/ -o page2.html http://www.codebelief.com/page/2/

5. 使用 -L 跟隨鏈接重定向

如果直接使用 curl 打開某些被重定向后的鏈接,這種情況下就無法獲取我們想要的網頁內容。例如: 
curl http://codebelief.com 
會得到如下提示:

<html> <head><title>301 Moved Permanently</title></head> <body bgcolor="white"> <center><h1>301 Moved Permanently</h1></center> <hr><center>nginx/1.10.3</center> </body> </html>

 

而當我們通過瀏覽器打開該鏈接時,會自動跳轉到 http://www.codebelief.com。此時我們想要 curl 做的,就是像瀏覽器一樣跟隨鏈接的跳轉,獲取最終的網頁內容。我們可以在命令中添加 -L 選項來跟隨鏈接重定向:

curl -L http://codebelief.com 
這樣我們就能獲取到經過重定向后的網頁內容了。

6. 使用 -A 自定義 User-Agent

我們可以使用 -A 來自定義用戶代理,例如下面的命令將偽裝成安卓火狐瀏覽器對網頁進行請求: 
curl -A “Mozilla/5.0 (Android; Mobile; rv:35.0) Gecko/35.0 Firefox/35.0” http://www.baidu.com 
下面我們會使用 -H 來實現同樣的目的。

7. 使用 -H 自定義 header

當我們需要傳遞特定的 header 的時候,可以仿照以下命令來寫: 
curl -H “Referer: www.example.com” -H “User-Agent: Custom-User-Agent” http://www.baidu.com 
可以看到,當我們使用 -H 來自定義 User-Agent 時,需要使用 “User-Agent: xxx” 的格式。

我們能夠直接在 header 中傳遞 Cookie,格式與上面的例子一樣: 
curl -H “Cookie: JSESSIONID=D0112A5063D938586B659EF8F939BE24” http://www.example.com 
另一種方式會在下面介紹。

當我們使用 cURL 訪問頁面的時候,默認是不會保存 Cookie 的。有些情況下我們希望保存 Cookie 以便下次訪問時使用。例如登陸了某個網站,我們希望再次訪問該網站時保持登陸的狀態,這時就可以現將登陸時的 Cookie 保存起來,下次訪問時再讀取。

-c 后面跟上要保存的文件名。 
curl -c “cookie-example” http://www.example.com

前面講到了使用 -H 來發送 Cookie 的方法,這種方式是直接將 Cookie 字符串寫在命令中。如果使用 -b 來自定義 Cookie,命令如下: 
curl -b “JSESSIONID=D0112A5063D938586B659EF8F939BE24” http://www.example.com 
如果要從文件中讀取 Cookie,-H 就無能為力了,此時可以使用 -b 來達到這一目的: 
curl -b “cookie-example” http://www.example.com 
即 -b 后面既可以是 Cookie 字符串,也可以是保存了 Cookie 的文件名。

10. 使用 -d 發送 POST 請求

我們以登陸網頁為例來進行說明使用 cURL 發送 POST 請求的方法。假設有一個登錄頁面 www.example.com/login,只需要提交用戶名和密碼便可登錄。我們可以使用 cURL 來完成這一 POST 請求,-d 用於指定發送的數據,-X 用於指定發送數據的方式: 
curl -d “userName=tom&passwd=123456” -X POST http://www.example.com/login

在使用 -d 的情況下,如果省略 -X,則默認為 POST 方式: 
curl -d “userName=tom&passwd=123456” http://www.example.com/login

強制使用 GET 方式 
發送數據時,不僅可以使用 POST 方式,也可以使用 GET 方式,例如: 
curl -d “somedata” -X GET http://www.example.com/api

或者使用 -G 選項: 
curl -d “somedata” -G http://www.example.com/api

從文件中讀取 data 
curl -d “@data.txt” http://www.example.com/login

帶 Cookie 登錄 
當然,如果我們再次訪問該網站,仍然會變成未登錄的狀態。我們可以用之前提到的方法保存 Cookie,在每次訪問網站時都帶上該 Cookie 以保持登錄狀態。 
curl -c “cookie-login” -d “userName=tom&passwd=123456” http://www.example.com/login 
再次訪問該網站時,使用以下命令: 
curl -b “cookie-login” http://www.example.com/login 
這樣,就能保持訪問的是登錄后的頁面了。

 

參考鏈接:

https://blog.csdn.net/cuishi0/article/details/7038999

https://blog.csdn.net/chenliaoyuanjv/article/details/79689028

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM