Speichern Sie Cookies zwischen zwei Curl-Anforderungen

73

Ich weiß, dass cURLich meine empfangenen Cookies / Header mit verwenden kann

curl --head www.google.com

Und ich weiß, dass ich meiner Anfrage mit Headern hinzufügen kann

curl --cookie "Key=Value" www.google.com

Ich arbeite derzeit daran, ein Problem zu testen, für das dauerhafte Cookies erforderlich sind, und es kann viele davon geben.

Wie kann ich Cookies zwischen zwei cURLAnfragen effizient aufbewahren ?

Verwenden Sie nach Möglichkeit eine temporäre Datei zur Speicherung.

Matt Clark
quelle

Antworten:

86

Verwenden Sie den Parameter --cookie-jaroder --dump-header, um empfangene Cookies in einer Datei zu speichern. Der --cookieParameter kann die Cookies aus dieser Datei später zurücklesen.

-b, --cookie <name = data>

(HTTP) Übergeben Sie die Daten als Cookie an den HTTP-Server. Es handelt sich angeblich um die Daten, die zuvor vom Server in einer Zeile "Set-Cookie:" empfangen wurden. Die Daten sollten das Format "NAME1 = VALUE1; NAME2 = VALUE2" haben.

Wenn in der Zeile kein '=' Symbol verwendet wird, wird es als Dateiname behandelt, aus dem zuvor gespeicherte Cookie-Zeilen gelesen werden. Diese sollten in dieser Sitzung verwendet werden, wenn sie übereinstimmen. Wenn Sie diese Methode verwenden, wird auch die Cookie-Engine aktiviert, mit der Curl auch eingehende Cookies aufzeichnet. Dies kann nützlich sein, wenn Sie dies in Kombination mit der Option -L, --location verwenden. Das Dateiformat der Datei, aus der Cookies gelesen werden sollen, sollte aus einfachen HTTP-Headern (Set-Cookie-Stil) oder dem Netscape / Mozilla-Cookie-Dateiformat bestehen.

Die mit -b, --cookie angegebene Datei wird nur als Eingabe verwendet. Es werden keine Cookies in die Datei geschrieben. Verwenden Sie zum Speichern von Cookies die Option -c, --cookie-jar .

Seien Sie vorsichtig, wenn Sie diese Option verwenden und mehrere Übertragungen auftreten können. Wenn Sie NAME1 = VALUE1 verwenden; Format oder verwenden Sie in einer Datei das Set-Cookie-Format und geben Sie keine Domäne an. Dann wird das Cookie für eine beliebige Domäne gesendet (auch nachdem Weiterleitungen befolgt wurden) und kann nicht durch ein vom Server festgelegtes Cookie geändert werden. Wenn die Cookie-Engine aktiviert ist und ein Server ein Cookie mit demselben Namen setzt, werden beide bei einer zukünftigen Übertragung an diesen Server gesendet, wahrscheinlich nicht so, wie Sie es beabsichtigt haben. Um diese Probleme zu beheben, legen Sie eine Domain in Set-Cookie fest (dazu gehören auch Subdomains) oder verwenden Sie das Netscape-Format.

Wenn diese Option mehrmals verwendet wird, wird die letzte verwendet.

-c, --cookie-jar <Dateiname>

(HTTP) Geben Sie an, in welche Datei Curl nach einem abgeschlossenen Vorgang alle Cookies schreiben soll. Curl schreibt alle Cookies, die zuvor aus einer bestimmten Datei gelesen wurden, sowie alle Cookies, die von Remote-Servern empfangen wurden . Wenn keine Cookies bekannt sind, werden keine Daten geschrieben. Die Datei wird im Netscape-Cookie-Dateiformat geschrieben. Wenn Sie den Dateinamen auf einen einzelnen Bindestrich "-" setzen, werden die Cookies in stdout geschrieben.

Diese Befehlszeilenoption aktiviert die Cookie-Engine, mit der Curl aufgezeichnet und Cookies verwendet werden. Eine andere Möglichkeit, es zu aktivieren, ist die Verwendung der Option -b, --cookie.

Wenn das Cookie-Glas nicht erstellt oder beschrieben werden kann, schlägt der gesamte Curl-Vorgang nicht fehl oder meldet sogar einen Fehler eindeutig. Wenn Sie -v verwenden, wird eine Warnung angezeigt. Dies ist jedoch das einzige sichtbare Feedback, das Sie zu dieser möglicherweise tödlichen Situation erhalten.

Seit 7.43.0 werden Cookies, die im Set-Cookie-Format ohne Domainnamen importiert wurden, von dieser Option nicht exportiert.

Wenn diese Option mehrmals verwendet wird, wird der zuletzt angegebene Dateiname verwendet.

-D, --dump-header <Datei>

Schreiben Sie die Protokollheader in die angegebene Datei.

Diese Option ist praktisch, wenn Sie die Header speichern möchten, die eine HTTP-Site an Sie sendet. Cookies aus den Headern können dann in einem zweiten Curl-Aufruf mit der Option -b, --cookie gelesen werden! Die Option -c, --cookie-jar ist eine bessere Möglichkeit, Cookies zu speichern .

Bei Verwendung in FTP werden die Antwortzeilen des FTP-Servers als "Header" betrachtet und somit dort gespeichert.

Wenn diese Option mehrmals verwendet wird, wird die letzte verwendet

Alternativ können Sie anstelle der Befehlszeilen- cURL-App Code schreiben, der die libCurl-Bibliothek verwendet . Dadurch haben Sie eine direktere Kontrolle über die Verarbeitung von Cookies. libCurl bietet verschiedene Funktionen für HTTP-Cookies:

Optionen für curl_easy_getinfo():

Optionen für curl_easy_setopt():

Anschließend können Sie die Cookies speichern, wie Sie möchten, und sie nach Bedarf späteren HTTP-Sitzungen zuweisen.

Remy Lebeau
quelle
heh, ich hatte die -cFlagge vor langer Zeit gefunden, nachdem ich diese Frage gestellt hatte - ich habe nie bemerkt, dass hier eine Antwort gepostet wurde. Vielen Dank.
Matt Clark
@ Dw1 Ja, das ist der richtige Weg
Remy Lebeau
--cookie-jarDie -bOption (oder ) speichert nichts, wenn die Antwort keinen Set-CookieHeader enthält, oder? Musste mich bei einer Site mit Re-Captcha anmelden, musste aber darauf zurückgreifen eine Problemumgehung indem ich den curlBefehl von Chrome speicherte, der bereits die Cookies enthielt , und nur das -b -(zum Drucken stdout) hinzufügte , aber keine Freude.
Toraritte
29

curl -b cookie.txt -c cookie.txt <url>oder curl --cookie cookie.txt --cookie-jar cookie.txt <url>speichert und sendet gespeicherte Cookies.

dw1
quelle
1
Vielen Dank für ein sehr präzises Beispiel.
Eric Manley
2

Ich möchte allen hier dafür danken, dass sie mir geholfen haben, eine Lösung für die Anmeldung bei meiner WordPress-Site mit CURL zu finden. Dies ist mein kleiner Beitrag, ich hoffe, dass er auch jemandem helfen wird, der in Zukunft darüber stolpert

Für Windows 10 Builds, die neuer als 1706 sind, können Sie Curl über die Befehlszeile verwenden.

curl -c c:\Users\<your-name>\Desktop\cookie.txt -F "log=<your username>" -F "pwd=<your-pwd>" https://acme.net/wp-login.php

In Ihrem Terminal wird keine Antwort angezeigt. Es aktualisiert sich nur von selbst, aber Ihr Cookie ist bereits gespeichert.

Geben Sie dann Folgendes ein, um die soeben gespeicherten Cookies zu lesen und zu senden.

curl -b c:\Users\<your-name>\Desktop\cookie.txt -L https://acme.net/my-profile/

Die gesamte Webseite, auf die nur angemeldete Benutzer zugreifen sollten, wird in Ihrem Terminal gerendert, einschließlich aller Daten, die dynamisch über Javascript geladen werden.

Auch wenn der Endpunkt Ihrer WP-Anmelde-URL "/ register / log-in" oder "/ login" ist, empfehle ich dennoch, "/wp-login.php" als Endpunkt zu verwenden. Dies liegt daran, dass einige WP-Themen eine Anmelde-Nonce in einer versteckten Eingabe auf ihrer Anmeldeseite haben. Die native WP-Anmeldeseite hat dies nicht.

andere Quellen, auf die Sie verweisen können:

https://wpmayor.com/login-to-wordpress-dashboard-via-curl/

https://gist.github.com/subfuzion/08c5d85437d5d4f00e58

https://www.youtube.com/watch?v=B4ilccLUQVs

https://makandracards.com/makandra/48262-how-to-use-cookies-with-curl

Bruce Tong
quelle