10

CURL を使用して GET 要求を 2 つの異なる Web ページに送信するが、同じ接続を使用する BASH コマンドを作成しようとしています。私にとっては、GET リクエストをログイン ページに送信してサーバーを認証し、2 番目のリクエストが Web ブラウザで (メタリフレッシュ タグを介して) 発生するホームページへの自動リダイレクトを模倣するようなものです。(サーバーによって生成された) ホームページのコンテンツは、認証されたユーザーとゲスト ユーザーでは異なるため、要求をチェーンする必要があります。

SOF投稿からの推奨に基づいて、最初にこのコマンドを試しました(変数$IP$PORTはすでに有効な値で定義されていると仮定します):

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

ただし、最初の GET の終わりと 2 番目の開始の間で、常に次のようなことが起こります。

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

では、SOF の投稿は間違っていたのでしょうか。とにかく、このコマンドを実行すると、2 つのリクエスト間で接続が正常に維持されます。

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

ただし、後者のコマンドよりも前者のコマンドに近いソリューションを本当に好みます。主な理由は、最初のページと 2 番目のページの出力を 2 つの異なる出力ファイルに分けるためです。だから私は次のようなことをしたい:

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

もちろん、同じ接続を再利用する必要があります。これは、page2.html のコンテンツは、同じ HTTP セッションで page1.html へのリクエストを行うことに依存しているためです。

PHP ではなく、netcat または wget を使用するソリューションも受け入れます。

4

4 に答える 4

6

curlマニュアルによると、概要は次のとおりです。

curl [options] [URL...]

つまり、同じコマンドで複数の URL を次々に指定できます。Curl は後続の URL ごとにハンドルを再利用します。

curl は複数のファイル転送に接続を再利用しようとするため、同じサーバーから多くのファイルを取得しても複数の接続/ハンドシェイクが行われません。これにより速度が向上します。もちろん、これは単一のコマンド ラインで指定されたファイルに対してのみ実行され、個別の curl 呼び出し間で使用することはできません。

于 2015-09-14T19:07:48.907 に答える
6

curl a.html && curl b.html を実行すると、必然的に 2 つの TCP (http) 接続を使用してデータが取得されます。各 curl 操作は独自のプロセスであり、独自の接続を開きます。

ただし、Web サイトはログイン情報を追跡するために TCP/HTTP 接続を使用しません。代わりに、何らかのトークンがセッションに配置され (通常は Cookie を使用)、サイトへの後続のリクエストで渡されます。サイトは、後続のリクエストでそのトークンを検証します。

Curl には、接続間で Cookie を保存する場所を示すオプション -c があります。

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

近くなります。多くのサイトは -u オプションでサポートされている http ベースの認証を使用せず、代わりにカスタム フォームを使用し、2 つ目の呼び出しでは (javascript や URL パスに何かを埋め込むのではなく) Cookie が使用されていることを前提としているため、詳しく説明します。後者の可能性が高いですが、最初のビットは当てにできません。

于 2013-03-10T07:13:55.340 に答える
1

基本的に、これが私がXidelを作成した目的です。単一のコマンド呼び出しですべての要求とアクションを記述できます。これは、ブラウザーが Cookie を保持し、接続を維持するのと同じように動作します。

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

または、最初のページから 2 番目のページへのリンクがある場合は、そのリンクを直接たどることができます。

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

ただし、http 認証や 80、8080、443 以外のポートはまだサポートされていません (バックエンドはサポートしますが、その間に無効な URL として拒否する URL 検証があります)。

于 2013-03-10T13:54:07.070 に答える