web-dev-qa-db-fra.com

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

Je souhaite accéder à une URL nécessitant 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 ça?

360
user246114

Utilisez l'indicateur -u pour inclure un nom d'utilisateur. Curl demandera un mot de passe:

curl -u username http://example.com

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

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

Il est plus sûr de faire:

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

... comme une chaîne utilisateur/mot de passe simple sur la ligne de commande est une mauvaise idée.

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

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

Remarque:

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

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

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

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

curl -u USERNAME http://server.example

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

59
Kristian

Pour transmettre en toute sécurité le mot de passe dans un script (c'est-à-dire l'empêcher de s'afficher avec ps auxf ou des journaux), vous pouvez le faire avec l'indicateur -K- (lire la configuration à partir de stdin) et un heredoc:

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

Pour que le mot de passe n'apparaisse pas dans votre .bash_history:

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

Le moyen le plus sûr consiste simplement à utiliser des variables d’environnement pour stocker/récupérer vos informations d’identité. Ainsi, une commande curl comme:

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

Appelez ensuite votre api reposante et transmettez l'en-tête http WWW_Authentication avec les valeurs codées en Base64 de API_USER et API_HASH. Le -Lk indique simplement à curl de suivre les redirections http 30x et d'utiliser une gestion non sécurisée des tls (c'est-à-dire, ignorer les erreurs ssl). Alors que le double -- n’est que le sucre syntaxique bash pour arrêter le traitement des indicateurs de ligne de commande. De plus, les options -b cookies.txt et -c cookies.txt gèrent les cookies avec -b envoyant des cookies et -c stockant les cookies localement.

Le manuel contient plus exemples d’authentification méthodes.

7
Dwight Spencer

assez facile, faites ce qui suit:

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

J'avais le même besoin en bash (Ubuntu 16.04 LTS) et les commandes fournies dans les réponses ne fonctionnaient pas dans mon cas. Je devais utiliser:

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

Les guillemets doubles dans les arguments -F ne sont nécessaires que si vous utilisez des variables. Par conséquent, à partir de la ligne de commande, ... -F 'username=myuser' ... ira bien.

Je serais heureux si un commentaire ou une modification peut expliquer pourquoi!

2
Marco

Si vous êtes sur un système doté de l'application Gnome Keyring, une solution qui évite d'exposer directement le mot de passe consiste à utiliser gkeyring.py pour extraire le mot de passe du trousseau:

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
2
Eliot Blennerhassett

D'autres réponses ont suggéré à netrc de spécifier un nom d'utilisateur et un mot de passe, en fonction de ce que j'ai lu, je suis d'accord. Voici quelques détails sur la syntaxe:

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

Comme d’autres réponses, je voudrais souligner la nécessité de prêter attention à la sécurité en ce qui concerne cette question.

Bien que je ne sois pas un expert, j'ai trouvé ces liens perspicaces:

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

Résumer:

L'utilisation des versions cryptées des protocoles (HTTPS vs HTTP) (FTPS vs FTP) peut aider à éviter les fuites de réseau.

L'utilisation de netrc peut aider à éviter les fuites de ligne de commande.

Pour aller plus loin, il semble que vous pouvez aussi chiffrer les fichiers netrc en utilisant gpg

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

Avec cela, vos informations d'identification ne sont pas "au repos" (stockées) en tant que texte brut.

2
Brian Davis

Vous pouvez utiliser une commande comme,

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

Ensuite, le mot de passe HTTP sera déclenché.

Référence: http://www.asempt.com/article/how-use-curl-http-password-protected-site

2
Deepak R

Généralement, la commande CURL est désignée par

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

si vous n'avez pas de mot de passe ou si vous voulez ignorer la commande Invite à demander un mot de passe, laissez la section du mot de passe vide.

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

2
Touseef Murtaza

Le moyen le plus sûr de passer les informations d'identification à curl consiste à les inviter à les insérer. C’est ce qui se passe lorsqu’on passe le nom d’utilisateur comme suggéré précédemment (-u USERNAME).

Mais si vous ne pouvez pas transmettre le nom d'utilisateur de cette façon? Par exemple, le nom d'utilisateur peut nécessiter de faire partie de l'URL et seul le mot de passe doit faire partie d'une charge JSON.

tl; dr: Voici comment utiliser curl en toute sécurité dans ce cas:

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

read demandera le nom d'utilisateur et le mot de passe à partir de la ligne de commande, et stockera les valeurs soumises dans deux variables pouvant être référencées dans les commandes suivantes et finalement non définies.

Je vais expliquer pourquoi les autres solutions ne sont pas idéales.

Pourquoi les variables d'environnement sont-elles dangereuses

  1. Le mode d’accès et d’exposition du contenu d’une variable d’environnement ne peut pas être suivi (ps -eww) car l’environnement est implicitement disponible pour un processus
  2. Les applications saisissent souvent tout l'environnement et le consignent à des fins de débogage ou de surveillance (parfois sur des fichiers journaux en texte clair sur disque, en particulier après le blocage d'une application).
  3. Les variables d'environnement sont transmises aux processus enfants (brisant ainsi le principe de moindre privilège)
  4. Leur maintenance est un problème: les nouveaux ingénieurs ne savent pas qu'ils sont présents et ne sont pas informés des exigences qui les entourent - par exemple, ne pas les transmettre à des sous-processus - car ils ne sont ni appliqués ni documentés.

Pourquoi est-il dangereux de taper directement dans une commande sur la ligne de commande, car votre secret devient alors visible par tout autre utilisateur exécutant ps -aux puisqu'il répertorie les commandes soumises pour chaque processus en cours d'exécution. Aussi parce que votre secret se termine alors dans l'historique bash (une fois que le shell se termine).

Pourquoi est-il dangereux de l'inclure dans un fichier local Une restriction d'accès POSIX stricte sur le fichier peut atténuer le risque dans ce scénario. Cependant, il s'agit toujours d'un fichier sur votre système de fichiers, non chiffré au repos.

0
iammyr