मैं कमांड लाइन से cURL का उपयोग कैसे करते हैं?


36

मैं यह सत्यापित करने की कोशिश कर रहा हूं कि एक निरंतर वेबसर्वर जो मुझे मिला है, उसके साथ संचार के दौरान HTTP लगातार कनेक्शन का उपयोग किया जा रहा है। वर्तमान में, मैं अपने सर्वर पर एक ब्राउज़र (जैसे क्रोम) से एक संसाधन प्राप्त कर सकता हूं और नेटस्टैट का उपयोग करके सत्यापित कर सकता हूं कि कनेक्शन स्थापित है:

# visit http://server:8080/path/to/resource in Chrome
[server:/tmp]$ netstat -a
...
tcp        0      0 server.mydomain:webcache client.mydomain:55502 ESTABLISHED

हालांकि, अगर मैं कर्ल का उपयोग करता हूं, तो मुझे नेटस्टैट में सर्वर पर कनेक्शन कभी नहीं दिखता है।

[client:/tmp]$ curl --keepalive-time 60 --keepalive http://server:8080/path/to/resource
...

[server:/tmp]$ netstat -a
# no connection exists for client.mydomain

मैंने निम्नलिखित कर्ल कमांड का उपयोग करने की भी कोशिश की है:

curl -H "Keep-Alive: 60" -H "Connection: keep-alive" http://server:8080/path/to/resource

यहाँ मेरे ग्राहक मशीन का कर्ल संस्करण है:

[server:/tmp]$ curl -V
curl 7.19.5 (x86_64-unknown-linux-gnu) libcurl/7.19.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5 libssh2/1.1
Protocols: tftp ftp telnet dict http file https ftps scp sftp
Features: IDN IPv6 Largefile NTLM SSL libz

मैं लगातार / रखने योग्य कनेक्शन का उपयोग करने के लिए कर्ल कैसे प्राप्त करूं? मैंने इस विषय पर बहुत सारे Googling किए हैं, लेकिन कोई सफलता नहीं है। यह ध्यान दिया जाना चाहिए कि मैं भी उपयोग किया है linksसंसाधन को पुनः प्राप्त करने क्लाइंट मशीन पर, और कहा कि करता है मुझे एक दे ESTABLISHEDसर्वर पर कनेक्शन।

यदि मुझे अधिक जानकारी प्रदान करने की आवश्यकता है, तो मुझे बताएं।


जवाबों:


38

कर्ल पहले से ही डिफ़ॉल्ट रूप से रखने का उपयोग करता है।

उदहारण के लिए:

curl -v http://www.google.com http://www.google.com

निम्नलिखित का उत्पादन करता है:

* About to connect() to www.google.com port 80 (#0)
*   Trying 74.125.39.99... connected
* Connected to www.google.com (74.125.39.99) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: www.google.com
> Accept: */*
> 
< HTTP/1.1 302 Found
< Location: http://www.google.ch/
< Cache-Control: private
< Content-Type: text/html; charset=UTF-8
< Set-Cookie: PREF=ID=0dd153a227433b2f:FF=0:TM=1289232886:LM=1289232886:S=VoXSLP8XWvjzNcFj; expires=Wed, 07-Nov-2012 16:14:46 GMT; path=/; domain=.google.com
< Set-Cookie: NID=40=sOJuv6mxhQgqXkVEOzBwpUFU3YLPQYf4HRcySE1veCBV5cPtP3OiLPKqvRxL10VLiFETGz7cu25pD_EoUq1f_CkNwOna-xRcFFsCokiFqIbGPrb6DmUO7XhcpMYOt3dB; expires=Tue, 10-May-2011 16:14:46 GMT; path=/; domain=.google.com; HttpOnly
< Date: Mon, 08 Nov 2010 16:14:46 GMT
< Server: gws
< Content-Length: 218
< X-XSS-Protection: 1; mode=block
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.ch/">here</A>.
</BODY></HTML>
* Connection #0 to host www.google.com left intact
* Re-using existing connection! (#0) with host www.google.com
* Connected to www.google.com (74.125.39.99) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: www.google.com
> Accept: */*
> 
< HTTP/1.1 302 Found
< Location: http://www.google.ch/
< Cache-Control: private
< Content-Type: text/html; charset=UTF-8
< Set-Cookie: PREF=ID=8b531815cdfef717:FF=0:TM=1289232886:LM=1289232886:S=ifbAe1QBX915QGHr; expires=Wed, 07-Nov-2012 16:14:46 GMT; path=/; domain=.google.com
< Set-Cookie: NID=40=Rk86FyMCV3LzorQ1Ph8g1TV3f-h41NA-9fP6l7G-441pLEiciG9k8L4faOGC0VI6a8RafpukiDvaNvJqy8wExED9-Irzs7VdUQYwI8bCF2Kc2ivskb6KDRDkWzMxW_xG; expires=Tue, 10-May-2011 16:14:46 GMT; path=/; domain=.google.com; HttpOnly
< Date: Mon, 08 Nov 2010 16:14:46 GMT
< Server: gws
< Content-Length: 218
< X-XSS-Protection: 1; mode=block
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.ch/">here</A>.
</BODY></HTML>
* Connection #0 to host www.google.com left intact
* Closing connection #0

यह स्निपेट:

* Www.google.com को होस्ट करने के लिए कनेक्शन # 0 बरकरार है
* मौजूदा कनेक्शन का फिर से उपयोग करना! (# 0) होस्ट www.google.com के साथ

यह उसी कनेक्शन को फिर से इस्तेमाल करने का संकेत देता है।

curl -v http://my.server/url1 http://my.server/url2अपने सर्वर के खिलाफ समान " " आह्वान का उपयोग करें और जांचें कि आप एक ही संदेश देखते हैं।

नेटस्टैट के बजाय tcpdump का उपयोग करने पर विचार करें कि पैकेट कैसे संभाले जाते हैं। netstat आपको केवल एक क्षणिक झलक देगा कि क्या हो रहा है, जबकि tcpdump के साथ आप हर एक पैकेट को देखेंगे। एक अन्य विकल्प Wireshark है।


जवाब के लिए धन्यवाद। हाँ, मुझे यह समझ में आ गया है कि अधिकांश HTTP क्लाइंट डिफ़ॉल्ट रूप से कीपैलिव का उपयोग करते हैं। मुझे लगता है कि मैं जो पता लगाने की कोशिश कर रहा हूं वह यह है कि मैं ESTABLISHEDसर्वर पर केवल तभी कनेक्शन नहीं देख रहा हूं जब मैं कर्ल का उपयोग कर रहा हूं।
रॉब ह्रस्का

7
यदि आप कर्ल के माध्यम से केवल एक ही URL का अनुरोध करते हैं तो कर्ल के लिए कुछ भी जीवित रखने का कोई कारण नहीं है। जैसे ही सभी URL लाए गए हैं, कर्ल प्रक्रिया समाप्त हो जाएगी। दो URL निर्दिष्ट करें (यह एक ही URL दो बार भी हो सकता है) और "कर्ल -v" द्वारा निर्मित आउटपुट पर नज़र रखें। जब तक नेटस्टैट चलता है तब तक कनेक्शन पहले ही बंद हो चुका होता है क्योंकि कर्ल अब नहीं चल रहा है और अब कनेक्शन को खुला रखने का कोई कारण नहीं है।
रोशन

1
यह समझ आता है; यदि यह प्रक्रिया समाप्त हो गई है, तो कनेक्शन के आसपास पड़े रहने का कोई मतलब नहीं होगा। आपकी सहायता के लिए धन्यवाद।
रोब Hruska

8

यदि आपका सर्वर 'KeepAlive On' की अनुमति देता है, तो आप टेलनेट का उपयोग लगातार कनेक्शन को चालू रखने के लिए कर सकते हैं:

$ while :;do echo -e "GET / HTTP/1.1\nhost: $YOUR_VIRTUAL_HOSTNAME\n\n";sleep 1;done|telnet $YOUR_SERVERS_IP 80

सुंदर। दूर तक लूप करते हुए एक कर्ल धड़कता है।
माइकल ओजेरानस्की

मैं यह जांचने की कोशिश कर रहा था कि क्या मेरा KeepAliveTimout परिवर्तन ठीक से लागू किया गया था - यह सिर्फ टिकट था। धन्यवाद!
डेव ग्रेगोरी

6

HTTP लगातार कनेक्शन / Keep-Alive का परीक्षण करने का एक तरीका यह देखना है कि क्या बाद के कनेक्शन के लिए TCP कनेक्शन का पुन: उपयोग किया जाता है या नहीं।

उदाहरण के लिए। मेरे पास एक फाइल है जिसमें http://google.com का लिंक कई बार दोहराया गया है।

कमांड के नीचे चलने पर एक ही टीसीपी कनेक्शन के साथ http://google.com कई बार खुलेगा ।

curl -K /tmp/file

और इस समय के दौरान यदि आप नेटस्टैट करते हैं, तो आप पा सकते हैं कि टीसीपी कनेक्शन में बदलाव नहीं हुआ है और पुराने को बचाया गया है (सॉकेट वही रहता है)।

$ sudo netstat -pnt|grep curl
tcp        0      0 106.51.85.118:48682     74.125.236.69:80        ESTABLISHED 9732/curl       
$ sudo netstat -pnt|grep curl
tcp        0      0 106.51.85.118:48682     74.125.236.69:80        ESTABLISHED 9732/curl       
$ sudo netstat -pnt|grep curl
tcp        0      0 106.51.85.118:48682     74.125.236.69:80        ESTABLISHED 9732/curl   

लेकिन जब हम क्लाइंट से HTTP 1.0 का उपयोग करने के लिए कहते हैं, जो खुराक लगातार HTTP कनेक्शन का समर्थन नहीं करता है तो सॉकेट एड्रेस में बदलाव होता है

$ curl -0 -K /tmp/file

$ sudo netstat -pnt|grep curl
tcp        0      0 106.51.85.118:48817     74.125.236.69:80        ESTABLISHED 9765/curl       
$ sudo netstat -pnt|grep curl
tcp        0      0 106.51.85.118:48827     74.125.236.69:80        ESTABLISHED 9765/curl       
$ sudo netstat -pnt|grep curl
tcp        0     74 106.51.85.118:48838     74.125.236.69:80        ESTABLISHED 9765/curl       

इससे हम यह सुनिश्चित कर सकते हैं कि टीसीपी कनेक्शन का पुन: उपयोग किया जाए।


5

--keepalive समय

आदमी कर्ल ... आदमी ..: डी


2
मैंने मैन पेज पढ़ा है, धन्यवाद। क्या आपने --keepalive-time 60मेरे उदाहरण में ध्यान नहीं दिया ?
रोब Hruska

3
ओह ... मुझे अब बेवकूफ लग रहा है :(
Arenstar

8
जैसा कि ऊपर सुझाया गया है "रख-रखाव-समय" निर्दिष्ट करना HTTP-स्तर को जीवित रखने को प्रभावित नहीं करता है; यह निम्न स्तर की टीसीपी कनेक्टिविटी को प्रभावित करता है। मैन पेज से ( curl.haxx.se/docs/manpage.html ): "यह विकल्प उस समय को सेट करता है जब कनेक्शन रखने के लिए निष्क्रिय रहने से पहले निष्क्रिय रहने की जरूरत होती है और व्यक्तिगत रखने की जांच के बीच का समय।" यह अच्छा है कि बहुत सारे प्रकार के रख-रखाव हैं जिनमें से मुझे चुनना है, मुझे लगता है;)
ShabbyDoo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.