2013-03-10 60 views
6

我想寫一個BASH命令,它使用CURL向兩個不同的網頁發送GET請求,但使用相同的連接。對我來說,就像發送GET請求到登錄頁面以向服務器進行身份驗證,然後第二個請求模仿將在Web瀏覽器中發生的自動重定向到主頁(通過meta刷新標籤)。我需要鏈接請求,因爲主頁的內容(由服務器生成)對於訪客用戶而言與認證用戶不同。BASH CURL:在請求之間不要關閉連接時按順序運行

我第一次嘗試根據建議,從SOF post此命令(假設變量$IP$PORT已經與有效值定義):

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

不過,我總是得到這樣的端之間發生這種情況第一個GET和第二個開始:

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

那麼SOF的帖子是錯的嗎?不管怎麼說,這樣的命令將成功地保持連接打開兩個請求之間:

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的請求。

我也開放給使用netcat或wget的解決方案,但不是PHP!

+0

關於'&&':這只是一個Bash符號,用於一個接一個地運行兩個命令,限制第二個命令只在第一個命令成功時運行。 (換句話說,如果'curl -u user:pass $ {IP}:$ {PORT}/login.php'返回一個錯誤,那麼'curl $ {IP}:$ {PORT}/index.php'將不會被運行。)它與保持連接打開沒有任何關係,或者類似的東西。 – ruakh 2013-03-10 07:24:01

回答

5

捲曲a.html & & curl b.html必須使用兩個TCP(http)連接來獲取數據。每個捲曲操作都是自己的過程,並會打開自己的連接。

但是,網站不使用TCP/HTTP連接來跟蹤登錄信息。相反,某些類型的令牌被放置在會話中(通常使用cookie),該會話在隨後的請求中傳遞給站點。該網站在後續請求中驗證該令牌。

捲曲有一個選項-c以指示​​餅乾應存儲連接

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

之間將更加緊密。我說因爲許多網站不使用-u選項支持的基於http的身份驗證,而是使用自定義表單,其次調用假定使用cookie(而不是將內容嵌入到javascript或url路徑中)。後者很可能,但我不會指望第一位。

0

原則上,這是我做了我Xidel的,你可以寫在一個命令調用所有的請求和行動,它的行爲類似於瀏覽器保存的cookies,以及連接活着:

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

或者如果從第一頁到第二個鏈接,就可以直接點擊該鏈接:

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

但是,它不支持除80,8080和443 HTTP認證或其他端口,但(後端會支持它,但在它之間是拒絕它爲無效的URL)的URL驗證

2

根據curl manual的簡介如下:

curl [options] [URL...]

這意味着,你可以陸續在同一命令中指定多個URL一個。捲曲將重用手柄每個後續網址:

捲曲將嘗試重用多個文件傳輸連接,因此從同一個服務器獲取許多文件不會做多重連接/握手。這提高了速度。當然,這僅在單個命令行上指定的文件上執行,並且不能在單獨的捲曲調用之間使用。