2013-03-10 3 views
6

चलाते समय अनुरोधों के बीच कनेक्शन बंद न करें मैं एक BASH कमांड लिखने की कोशिश कर रहा हूं जो दो अलग-अलग वेब पृष्ठों पर GET अनुरोध भेजने के लिए कर्ल का उपयोग करता है लेकिन उसी कनेक्शन का उपयोग करता है। मेरे लिए, यह सर्वर पर प्रमाणित करने के लिए लॉगिन पृष्ठ पर एक GET अनुरोध भेजना है और फिर दूसरा अनुरोध वेब पेज पर स्वचालित रीडायरेक्ट की नकल करता है जो वेब ब्राउज़र में हुआ होता है (मेटा रीफ्रेश टैग के माध्यम से)। मुझे अनुरोधों को श्रृंखलाबद्ध करने की आवश्यकता है क्योंकि होम पेज की सामग्री (सर्वर द्वारा जेनरेट की गई) एक अतिथि उपयोगकर्ता के लिए एक अधिकृत उपयोगकर्ता की तुलना में अलग होगी।BASH CURL: क्रमशः

मैं इस आदेश को पहले SOF post से सिफारिश के आधार पर करने की कोशिश की (मान लेते हैं कि चर $IP और $PORT पहले से ही मान्य मान के साथ परिभाषित किया गया):

curl -u user:pass ${IP}:${PORT}/login.php && curl ${IP}:${PORT}/index.php 

हालांकि, मैं हमेशा कुछ के अंत के बीच हो रहा है जैसे मिल पहला जीईटी और दूसरा की शुरुआत:

* Connection #0 to host 10.0.3.153 left intact 
* Closing connection #0 

तो एसओएफ पोस्ट गलत था? वैसे भी, इस आदेश कर सफलतापूर्वक कनेक्शन खुला दो अनुरोधों के बीच रखना होगा:

curl -u user:pass ${IP}:${PORT}/login.php ${IP}:${PORT}/index.php 

हालांकि, मैं वास्तव में एक समाधान बाद आदेश से पूर्व आदेश के करीब पसंद करेंगे। दूसरे पृष्ठ के विपरीत दूसरे पृष्ठ से आउटपुट को अलग-अलग आउटपुट फ़ाइलों में अलग करने का मुख्य कारण क्यों है। इसलिए मैं कुछ ऐसा करना चाहते हैं:

curl page1.html > output1 && curl page2.html > output2 

बेशक, मैं एक ही कनेक्शन का पुन: उपयोग करने की जरूरत है क्योंकि page2.html की सामग्री को मुझ पर निर्भर करता है भी एक ही HTTP सत्र में page1.html के लिए एक अनुरोध कर रही है।

मैं नेटकैट या wget का उपयोग करने वाले समाधानों के लिए भी खुला हूं, लेकिन PHP नहीं!

+0

'&&' के संबंध में: यह केवल दो आदेशों को चलाने के लिए एक बाश नोटेशन है, दूसरे प्रतिबंध के बाद, दूसरा आदेश केवल तभी चलाया जाता है जब पहला सफल होता है। (दूसरे शब्दों में, यदि 'curl -u उपयोगकर्ता: $ {IP} पास करें: $ {PORT}/login.php' एक त्रुटि देता है, तो 'curl $ {IP}: $ {PORT}/index.php' नहीं होगा चलाया जा सकता है।) कनेक्शन को खोलने, या उसके जैसा कुछ भी रखने के साथ इसका कोई संबंध नहीं है। – ruakh

उत्तर

5

कर्ल a.html कर & & कर्ल b.html जरूरी डेटा लाने के लिए दो टीसीपी (http) कनेक्शन का उपयोग करेगा। प्रत्येक कर्ल ऑपरेशन अपनी प्रक्रिया है और अपना कनेक्शन खोल देगा।

हालांकि, एक वेबसाइट लॉगिन जानकारी ट्रैक करने के लिए टीसीपी/HTTP कनेक्शन का उपयोग नहीं करती है। इसके बजाए, सत्र में किसी प्रकार का टोकन रखा जाता है (आमतौर पर कुकी का उपयोग करके) जो साइट पर बाद के अनुरोधों में पारित होता है। साइट उस अनुरोध पर टोकन को मान्य करती है।

कर्ल एक विकल्प -c इंगित करने के लिए जहां कुकीज़ कनेक्शन

curl -c cookiejar -u user:pass login.php && curl -c cookierjar index.php 

के बीच संग्रहित किया जाना चाहिए और बढ़ जाएगी है। मैं करीब कहता हूं क्योंकि कई साइटें -यू विकल्प द्वारा समर्थित http आधारित प्रमाणीकरण का उपयोग नहीं करती हैं बल्कि इसके बजाय कस्टम रूपों का उपयोग करती हैं और दूसरी बार चालानों का मानना ​​है कि कुकी का उपयोग किया जाता है (जावास्क्रिप्ट या यूआरएल पथ में कुछ एम्बेड करने के विपरीत)। उत्तरार्द्ध की संभावना है लेकिन मैं पहली बार गिनती नहीं करूंगा।

xidel http://${IP}/login.php --download page1.html -f '"index.php"' --download page2.html 

या:

0

मुख्यतः यह है कि क्या मैं अपने Xidel के लिए, आप एक ही आदेश कॉल में सभी अनुरोधों और कार्यों में लिख सकते हैं और यह कुकीज़ रखने एक ब्राउज़र के समान व्यवहार करेंगे, और कनेक्शन जिंदा कर दिया है अगर वहाँ एक दूसरे को पहले पृष्ठ से एक कड़ी है, उसे सीधे उस लिंक का अनुसरण कर सकते हैं:

xidel http://${IP}/login.php --download page1.html -f //a --download page2.html 

हालांकि, यह (बैकएंड हैं http प्रमाणीकरण या 80,8080 और 443 के अलावा बंदरगाहों समर्थन नहीं करता है इसका समर्थन करें, लेकिन वहां के बीच में एक यूआरएल सत्यापन जो इसे एक अवैध URL) होने के रूप में खारिज कर दिया

2

curl manual के अनुसार सार निम्नलिखित है:

curl [options] [URL...]

इसका मतलब है कि आप कई यूआरएल एक ही आदेश में एक के बाद एक निर्दिष्ट कर सकते हैं । कर्ल प्रत्येक अनुवर्ती यूआरएल के लिए संभाल पुन: उपयोग होगा: इतना है कि एक ही सर्वर से कई फाइलों हो रही कई जोड़ता/हैंडशेक से काम नहीं चलेगा

कर्ल, कई फ़ाइल स्थानांतरण के लिए कनेक्शन पुन: उपयोग करने का प्रयास करेंगे। यह गति में सुधार करता है। बेशक यह केवल एक ही कमांड लाइन पर निर्दिष्ट फ़ाइलों पर किया गया है और अलग कर्ल इनवोक के बीच उपयोग नहीं किया जा सकता है।