Ich möchte auf eine URL zugreifen, für die ein Benutzername / Passwort erforderlich ist. Ich würde gerne versuchen, mit Curl darauf zuzugreifen. Im Moment mache ich so etwas wie:
curl http://api.somesite.com/test/blah?something=123
Ich bekomme eine Fehlermeldung. Ich denke, ich muss einen Benutzernamen und ein Passwort zusammen mit dem obigen Befehl angeben.
Wie kann ich das machen?
curl
credentials
user246114
quelle
quelle
print -- '-u username:password' > somewhere && curl -K somewhere http://...
--netrc-file
) sicherer ist. Es hält das Passwort aus dem Verlauf, ps, Ihrem Skript usw. heraus. Dies ist die einzige Form, die ich in allen meinen Skripten und für alle authentifizierten Verwendungen von verwendecurl
.Es ist sicherer zu tun:
... da das Übergeben einer einfachen Benutzer- / Kennwortzeichenfolge in der Befehlszeile eine schlechte Idee ist.
Das Format der Passwortdatei ist (gemäß
man curl
):Hinweis:
https://
oder ähnlich sein! Nur der Hostname.machine
', 'login
' und 'password
' sind nur Schlüsselwörter; Die eigentliche Information ist das Zeug nach diesen Schlüsselwörtern.quelle
-K <file>
oder--config <file>
Curl-Flags per Datei- oder Standardeingabe empfangen. (Warnung: nicht zu verwechseln mit-k
oder--insecure
!).netrc
mit entsprechend strengen Berechtigungen zu verwenden, damit nur Ihr Benutzer sie lesen kann, als andere Mechanismen (z. B. Befehlszeilenargumente), mit denen andere Benutzer die Informationen lesen können.Oder das Gleiche, aber eine andere Syntax
quelle
start "" "http://username:[email protected]/test/blah?something=123"
. Es kann von überall gestartet werden.Sie können den Benutzernamen auch einfach schriftlich senden:
Curl fragt Sie dann nach dem Passwort und das Passwort wird nicht auf dem Bildschirm angezeigt (oder wenn Sie den Befehl kopieren / einfügen müssen).
quelle
Um das Passwort in einem Skript sicher zu übergeben (dh zu verhindern, dass es mit ps auxf oder logs angezeigt wird), können Sie dies mit dem -K-Flag (Konfiguration von stdin lesen) und einem Heredoc tun:
quelle
--config
Option (-K) ... möglicherweise wäre eine bessere Lösung, "--user user: password" in eine Datei einzufügen und einfach-K the file
so, dass Sie nur eine Kopie des Passworts haben, statt einer Kopie in jedem Skript . Es ist viel einfacher, eine einzelne Datei zu sichern.cat "${password_filepath}" | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-
. Ich musste-K-
die URL für die alte MacOS-Bash YMMV vorlegen.Normalerweise wird der Befehl CURL als bezeichnet
Wenn Sie kein Passwort haben oder die Eingabeaufforderung überspringen möchten, um ein Passwort anzufordern, lassen Sie einfach den Passwortabschnitt leer.
dh
curl https://example.com\?param\=ParamValue -u USERNAME:
quelle
quelle
Damit das Passwort nicht in Ihrem
.bash_history
:quelle
ps auxw |grep curl
der es zur richtigen Zeit tut . Ebenso wird das Passwort protokolliert, wenn es übersudo
ziemlich einfach, mach das folgende:
quelle
Andere Antworten haben netrc vorgeschlagen, Benutzername und Passwort anzugeben, basierend auf dem, was ich gelesen habe. Ich stimme zu. Hier sind einige Syntaxdetails:
https://ec.haxx.se/usingcurl-netrc.html
Wie bei anderen Antworten möchte ich die Notwendigkeit hervorheben, bei dieser Frage auf die Sicherheit zu achten.
Obwohl ich kein Experte bin, fand ich diese Links aufschlussreich:
https://ec.haxx.se/cmdline-passwords.html
Zusammenfassen:
Die Verwendung der verschlüsselten Versionen der Protokolle (HTTPS vs HTTP) (FTPS vs FTP) kann dazu beitragen, Netzwerklecks zu vermeiden.
Die Verwendung von netrc kann dazu beitragen, Befehlszeilenlecks zu vermeiden.
Um noch einen Schritt weiter zu gehen, können Sie die netrc-Dateien anscheinend auch mit gpg verschlüsseln
https://brandur.org/fragments/gpg-curl
Damit werden Ihre Anmeldeinformationen nicht als Klartext "in Ruhe" (gespeichert).
quelle
Der einfachste und einfachste Weg wäre, Umgebungsvariablen zum Speichern / Abrufen Ihrer Anmeldeinformationen zu verwenden. So ein Curl-Befehl wie:
Würde dann Ihre erholsame API aufrufen und den http-
WWW_Authentication
Header mit den Base64-codierten Werten vonAPI_USER
und übergebenAPI_HASH
. Das-Lk
nur weist curl an, http 30x-Weiterleitungen zu folgen und unsichere tls-Behandlung zu verwenden (dh SSL-Fehler zu ignorieren). Während das Double--
nur Bash-Syntax ist, stoppt Sugar die Verarbeitung von Befehlszeilenflags. Darüber hinaus behandeln die Flags-b cookies.txt
und-c cookies.txt
Cookies mit dem-b
Senden von Cookies und dem-c
lokalen Speichern von Cookies.Das Handbuch enthält weitere Beispiele für Authentifizierungsmethoden .
quelle
Sie können Befehl wie verwenden,
Dann wird das HTTP-Passwort ausgelöst.
Referenz: http://www.asempt.com/article/how-use-curl-http-password-protected-site
quelle
Der sicherste Weg, Anmeldeinformationen an Curl zu übergeben, besteht darin, sie zum Einfügen aufzufordern. Dies geschieht, wenn der Benutzername wie zuvor vorgeschlagen übergeben wird (
-u USERNAME
).Aber was ist, wenn Sie den Benutzernamen nicht so weitergeben können? Beispielsweise 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 in diesem Fall sicher:
read
fordert in der Befehlszeile zur Eingabe von Benutzername und Kennwort auf und speichert die übermittelten Werte in zwei Variablen, die in nachfolgenden Befehlen referenziert und schließlich deaktiviert werden können.Ich werde näher darauf eingehen, warum die anderen Lösungen nicht ideal sind.
Warum sind Umgebungsvariablen unsicher?
Warum ist es unsicher, es direkt in einen Befehl in der Befehlszeile einzugeben, da Ihr Geheimnis dann für jeden anderen Benutzer sichtbar ist, der ausgeführt wird,
ps -aux
da hier die Befehle aufgelistet sind, die für jeden aktuell ausgeführten Prozess gesendet wurden. Auch weil Ihr Geheimnis dann in der Bash-Historie landet (sobald die Shell endet).Warum ist es unsicher, 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 immer noch um eine Datei in Ihrem Dateisystem, die im Ruhezustand unverschlüsselt ist.
quelle
Ich hatte das gleiche Bedürfnis in Bash (Ubuntu 16.04 LTS) und die in den Antworten angegebenen Befehle funktionierten in meinem Fall nicht. Ich musste verwenden:
Doppelte Anführungszeichen in den
-F
Argumenten sind nur erforderlich, wenn Sie Variablen verwenden. Daher ist die Verwendung über die Befehlszeile... -F 'username=myuser' ...
in Ordnung.Relevanter Sicherheitshinweis: Wie Herr Mark Ribau in Kommentaren zeigt, zeigt dieser Befehl das Passwort (Variable $ PASS, erweitert) in der Prozessliste an!
quelle
Wenn Sie sich auf einem System mit Gnome-Schlüsselbund-App befinden, können Sie das Kennwort nicht mit gkeyring.py extrahieren, um das Kennwort aus dem Schlüsselbund zu extrahieren:
quelle
Dies ist VIEL mehr als das OP verlangt, aber da dies ein Top-Ergebnis für die sichere Weitergabe von Passwörtern ist
curl
, füge ich diese Lösungen hier für andere hinzu, die hier ankommen und danach suchen.HINWEIS: Der Befehl
-s
arg forread
ist nicht POSIX und daher nicht überall verfügbar. Daher wird er im Folgenden nicht verwendet. Wir werdenstty -echo
undstty echo
stattdessen verwenden.HINWEIS: Alle unten aufgeführten Bash-Variablen können stattdessen in einer Funktion als lokale deklariert werden, anstatt sie zu deaktivieren.
HINWEIS:
perl
ist ziemlich allgemein auf allen Systemen verfügbar Ich habe versucht , weil es eine Abhängigkeit für viele Dinge zu sein, währendruby
undpython
nicht ist, so verwendetperl
hier. Wenn Sie können garantieren ,ruby
/python
wo Sie dies tun, können Sie die ersetzenperl
Befehl mit ihren Äquivalent.HINWEIS: Getestet in
bash
3.2.57 unter macOS 10.14.4. Für andere Shells / Installationen ist möglicherweise eine kleine Übersetzung erforderlich.Fordern Sie einen Benutzer sicher auf, ein (wiederverwendbares) Kennwort an curl zu übergeben. Besonders nützlich, wenn Sie Curl mehrmals aufrufen müssen.
Wo
echo
ist für moderne Muscheln ein eingebauter (Check viawhich echo
):Bei älteren Shells, wo
echo
ist so etwas/bin/echo
(wo was auch immer es in der Prozesslistewiedergibt ): DIESE VERSION KANN DAS PASSWORT NICHT WIEDERVERWENDEN , siehe stattdessen weiter unten.
Wenn Sie das Kennwort vorübergehend in einer Datei speichern müssen, um es vor dem Löschen für mehrere Befehle wiederzuverwenden (z. B. weil Sie Funktionen zur Wiederverwendung von Code verwenden und den Code nicht wiederholen möchten und nicht können Geben Sie den Wert per Echo weiter. (Ja, diese sind in dieser Form etwas erfunden und funktionieren nicht in verschiedenen Bibliotheken. Ich habe versucht, sie auf den Mindestcode zu reduzieren, der zum Anzeigen erforderlich ist.)
Wenn Echo eingebaut ist (dies ist besonders erfunden, da Echo eingebaut ist, aber der Vollständigkeit halber bereitgestellt wird):
Wenn Echo so etwas wie
/bin/echo
:quelle