wake-up-neo.com

CURL mit einem Benutzernamen und Passwort verwenden?

Ich möchte auf eine URL zugreifen, die einen Benutzernamen/ein Passwort erfordert. Ich möchte versuchen, mit curl darauf zuzugreifen. Im Moment mache ich so etwas wie:

curl http://api.somesite.com/test/blah?something=123

Ich bekomme einen Fehler. Ich denke, ich muss einen Benutzernamen und ein Passwort zusammen mit dem obigen Befehl angeben.

Wie kann ich das machen?

360
user246114

Verwenden Sie das Flag -u, um einen Benutzernamen anzugeben. Curl fordert zur Eingabe eines Kennworts auf:

curl -u username http://example.com

Sie können das Kennwort auch in den Befehl einschließen, dann wird Ihr Kennwort jedoch im Bash-Verlauf angezeigt:

curl -u username:password http://example.com
564
Finbarr

Es ist sicherer zu tun:

curl --netrc-file my-password-file http://example.com

... da das Übertragen einer einfachen Benutzer-/Passwort-Zeichenfolge in der Befehlszeile eine schlechte Idee ist.

Das Format der Passwortdatei ist (wie in man curl):

machine <example.com> login <username> password <password>

Hinweis:

  1. Maschinenname muss nicht https:// oder ähnliches enthalten! Nur der Hostname.
  2. Die Wörter 'machine', 'login' und 'password' sind nur Schlüsselwörter. Die eigentliche Information ist das Zeug nach diesen Schlüsselwörtern.
189
Pierre D

Oder dasselbe aber eine andere Syntax

curl http://username:[email protected]/test/blah?something=123
68

Sie können den Benutzernamen auch einfach senden, indem Sie schreiben:

curl -u USERNAME http://server.example

Curl fragt Sie dann nach dem Passwort und das Passwort ist nicht auf dem Bildschirm sichtbar (oder ob Sie den Befehl kopieren/einfügen müssen).

59
Kristian

Um das Kennwort in einem Skript sicher zu übergeben (d. H. Zu verhindern, dass es mit ps auxf oder logs angezeigt wird), können Sie es mit dem Flag -K- (read config from stdin) und einem heredoc tun:

curl --url url -K- <<< "--user user:password"
13
Matt Fleming
curl -X GET -u username:password  {{ http://www.example.com/filename.txt }} -O
11
user128364

Damit das Passwort nicht in Ihrem .bash_history angezeigt wird:

curl -u user:$(cat .password-file) http://example-domain.tld
8
sjas

Die sicherste Methode wäre die Verwendung von Umgebungsvariablen zum Speichern/Abrufen Ihrer Anmeldeinformationen. Also ein Curl-Befehl wie:

curl -Lk -XGET -u "${API_USER}:${API_HASH}" -b cookies.txt -c cookies.txt -- "http://api.somesite.com/test/blah?something=123"

Würde dann Ihre restful-API aufrufen und den http WWW_Authentication-Header mit den Base64-codierten Werten von API_USER und API_HASH übergeben. Der -Lk weist curl nur an, http 30x-Umleitungen zu folgen und unsichere tls-Handhabung zu verwenden (dh, ssl-Fehler zu ignorieren). Während der doppelte -- nur Bash-Syntaxzucker ist, um die Verarbeitung von Befehlszeilenflags zu stoppen. Darüber hinaus behandeln die Flags -b cookies.txt und -c cookies.txt Cookies, indem -b Cookies sendet und -c lokal speichert.

Das Handbuch enthält weitere Beispiele für die Authentifizierung Methoden.

7
Dwight Spencer

ziemlich einfach, mach das unten:

curl -X GET/POST/PUT <URL> -u username:password
4
Preyas

Ich hatte das gleiche Bedürfnis in bash (Ubuntu 16.04 LTS) und die in den Antworten enthaltenen Befehle funktionierten in meinem Fall nicht. Ich musste verwenden:

curl -X POST -F 'username="$USER"' -F 'password="$PASS"' "http://api.somesite.com/test/blah?something=123"

Anführungszeichen in den -F-Argumenten werden nur benötigt, wenn Sie Variablen verwenden. Daher wird ... -F 'username=myuser' ... von der Befehlszeile aus in Ordnung sein.

Ich würde mich freuen, wenn ein Kommentar oder ein Grund erklären kann!

2
Marco

Wenn Sie sich auf einem System befinden, das über die Gnome-Schlüsselring-App verfügt, ist eine Lösung, die das direkte Offenlegen des Kennworts verhindert, die Verwendung von gkeyring.py , um das Kennwort aus dem Schlüsselring zu extrahieren:

server=server.example.com
file=path/to/my/file
user=my_user_name
pass=$(gkeyring.py -k login -tnetwork -p user=$user,server=$server -1)

curl -u $user:$pass ftps://$server/$file -O

Andere Antworten haben vorgeschlagen, dass netrc Benutzername und Passwort angibt, basierend auf dem, was ich gelesen habe. Hier sind einige Syntaxdetails:

https://ec.haxx.se/usingcurl-netrc.html

Wie andere Antworten möchte ich die Notwendigkeit betonen, bei dieser Frage die Sicherheit zu beachten.

Obwohl ich kein Experte bin, fand ich diese Links aufschlussreich:

https://ec.haxx.se/cmdline-passwords.html

Zusammenfassen:

Die Verwendung der verschlüsselten verschlüsselten Versionen der Protokolle (HTTPS vs HTTP) (FTPS vs FTP) kann dazu beitragen, Netzwerklecks zu vermeiden.

Die Verwendung von netrc kann dazu beitragen, das Auslaufen von Befehlszeilen zu vermeiden.

Um einen Schritt weiter zu gehen, können Sie die netrc-Dateien auch mit gpg verschlüsseln

https://brandur.org/fragments/gpg-curl

Damit werden Ihre Anmeldeinformationen nicht als Klartext "in Ruhe" (gespeichert).

2
Brian Davis

Sie können Befehl wie verwenden,

curl -u user-name -p http://www.example.com/path-to-file/file-name.ext > new-file-name.ext

Dann wird das HTTP-Passwort ausgelöst.

Referenz: http://www.asempt.com/article/how-use-curl-http-password-protected-site

2
Deepak R

Normalerweise beziehen sich CURL-Befehle auf

curl https://example.com\?param\=ParamValue -u USERNAME:PASSWORD

wenn Sie kein Kennwort haben oder den Befehl überspringen möchten, um ein Kennwort anzufordern, lassen Sie den Kennwortabschnitt einfach leer.

d.h. curl https://example.com\?param\=ParamValue -u USERNAME:

2
Touseef Murtaza

Die sicherste Möglichkeit, Anmeldeinformationen an curl zu übergeben, besteht darin, sie einzufügen. Dies passiert, wenn Sie den Benutzernamen wie oben vorgeschlagen übergeben (-u USERNAME).

Aber was ist, wenn Sie den Benutzernamen nicht so übergeben können? Zum Beispiel muss der Benutzername möglicherweise Teil der URL sein und nur das Kennwort muss Teil einer JSON-Nutzlast sein.

tl; dr: So verwenden Sie Curl sicher in diesem Fall:

read -p "Username: " U; read -sp "Password: " P; curl --request POST -d "{\"password\":\"${P}\"}" https://example.com/login/${U}; unset P U

read fordert in der Befehlszeile zur Eingabe von Benutzername und Kennwort auf und speichert die übergebenen Werte in zwei Variablen, auf die in nachfolgenden Befehlen verwiesen werden kann, und deaktiviert sie schließlich.

Ich werde näher darauf eingehen, warum die anderen Lösungen nicht ideal sind.

Warum sind Umgebungsvariablen unsicher

  1. Zugriff und Belichtungsmodus des Inhalts einer Umgebungsvariablen können nicht verfolgt werden (ps -eww), da die Umgebung implizit für einen Prozess verfügbar ist
  2. Häufig greifen Apps auf die gesamte Umgebung zu und protokollieren sie zu Debug- oder Überwachungszwecken (manchmal in Protokolldateien als Klartext auf der Festplatte, insbesondere nach einem Absturz einer App).
  3. Umgebungsvariablen werden an untergeordnete Prozesse weitergegeben (wodurch das Prinzip der geringsten Berechtigungen verletzt wird)
  4. Ihre Wartung ist ein Problem: Neue Ingenieure wissen nicht, dass sie dort sind, und kennen die Anforderungen in ihrer Umgebung nicht - beispielsweise, um sie nicht an Unterprozesse weiterzuleiten -, da sie nicht durchgesetzt oder dokumentiert werden.

Warum ist es unsicher, es direkt in einen Befehl in der Befehlszeile einzugeben? Weil Ihr Geheimnis dann für jeden anderen Benutzer sichtbar ist, der ps -aux ausführt, da darin Befehle aufgelistet sind, die für jeden derzeit ausgeführten Prozess gesendet werden. Auch, weil Ihr Geheimnis dann in der Bash-Geschichte endet (sobald die Shell endet).

Warum ist es nicht sicher, es in eine lokale Datei aufzunehmen Eine strikte POSIX-Zugriffsbeschränkung für die Datei kann das Risiko in diesem Szenario verringern. Es handelt sich jedoch weiterhin um eine Datei in Ihrem Dateisystem, die im Ruhezustand unverschlüsselt ist.

0
iammyr