566 votes

Utilisation de cURL avec un nom d'utilisateur et un mot de passe ?

Je veux accéder à une URL qui nécessite un nom d'utilisateur / mot de passe. J'aimerais essayer d'y accéder avec curl. En ce moment, je fais quelque chose comme :

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

Je reçois une erreur. Je suppose que je dois spécifier un nom d'utilisateur et un mot de passe avec la commande ci-dessus.

Comment puis-je faire cela ?

796voto

Finbarr Points 8420

Utilisez le drapeau -u pour inclure un nom d'utilisateur, et curl demandera un mot de passe :

curl -u username http://example.com

Vous pouvez également inclure le mot de passe dans la commande, mais alors votre mot de passe sera visible dans l'historique de bash :

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

126 votes

Notez que si vous le faites à partir de la console, le mot de passe restera dans l'historique ce qui est ... incorrect. Vous devriez spécifier simplement -u utilisateur et CURL vous demandera le mot de passe en mode no-echo.

0 votes

Notez que l'intégration de l'utilisateur:pass dans l'URL échouera si vous avez un proxy http_proxy ou https_proxy exporté

25 votes

@CristianVrabie Techniquement correct, mais incorrect si vous l'exécutez à partir d'un script automatisé qui n'autorise pas les invites. Je serais curieux de connaître une solution à ce problème.

332voto

Pierre D Points 872

Il est plus sûr de faire :

curl --netrc-file mon-fichier-mot-de-passe http://example.com

...car transmettre une simple chaîne utilisateur/mot de passe en ligne de commande est une mauvaise idée.

Le format du fichier de mot de passe est (selon le manuel de curl) :

machine  login  password 

Remarque :

  1. Le nom de la machine ne doit pas inclure https:// ou similaire ! Seulement le nom d'hôte.
  2. Les mots 'machine', 'login', et 'password' sont simplement des mots clés ; les informations réelles sont celles après ces mots clés.

10 votes

Oui, cela empêche le mot de passe d'apparaître dans la liste des processus et l'historique des commandes. Une façon beaucoup plus préférable de le faire, et seulement un peu plus de travail :)

8 votes

Cela devrait certainement être la réponse acceptée; les mots de passe en ligne de commande sont une pratique horrible. (Et c'est un fait largement connu.)

6 votes

Vous pouvez également utiliser le drapeau -K ou --config pour recevoir les drapeaux curl via un fichier ou une entrée standard. (Attention : ne pas confondre avec -k ou --insecure !)

85voto

Daniel Magnusson Points 2945

Ou la même chose mais avec une syntaxe différente

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

2 votes

J'utilise cette syntaxe, car elle peut être utilisée dans de nombreuses autres situations. Comme à partir d'une fenêtre CMD Windows sans cURL et sans wGet, en utilisant start "" "http://username:password@api.somesite.com/test/blah?somethi‌​ng=123". Elle peut être lancée n'importe où. Cela s'applique également aux connexions FTP ;D.

10 votes

Il faut encoder l'URL du nom d'utilisateur & du mot de passe pour utiliser des caractères spéciaux.

2 votes

Je sais que la plupart des gens savent qu'il ne faut pas envoyer de mots de passe (ou même de noms d'utilisateur) dans l'URL comme dans cet exemple car c'est facile à intercepter. Cela dit, je ne le déconseille pas mais utilisez-le uniquement lorsque vous savez ce que vous faites.

65voto

Kristian Points 300

Vous pouvez également simplement envoyer le nom d'utilisateur en écrivant :

curl -u NOM_UTILISATEUR http://server.example

Curl vous demandera alors le mot de passe, et le mot de passe ne sera pas visible à l'écran (ou si vous avez besoin de copier/coller la commande).

33voto

Matt Fleming Points 431

Pour transmettre de manière sécurisée le mot de passe dans un script (c'est-à-dire l'empêcher d'apparaître avec ps auxf ou les journaux), vous pouvez le faire avec le drapeau -K- (lire la configuration à partir de stdin) et un heredoc :

curl --url url -K- <<< "--user user:password"

2 votes

Merci pour la référence à l'option --config (-K)... peut-être serait-il mieux de mettre "--user utilisateur:motdepasse" dans un fichier et simplement -K le fichier pour n'avoir qu'une seule copie du mot de passe plutôt qu'une copie dans chaque script. Beaucoup plus facile de sécuriser un seul fichier.

1 votes

Option similaire, où seul le mot de passe est dans le fichier : cat "${password_filepath}" | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-. J'ai dû mettre -K- avant l'URL pour le vieux bash de macOS, à vous de voir.

0 votes

Cela ressemble à la solution idéale à utiliser avec Jenkins.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X