2010-04-07 56 views
272

Quiero acceder a una URL que requiere un nombre de usuario/contraseña. Me gustaría intentar acceder con curl. En este momento estoy haciendo algo como:¿Utiliza cURL con nombre de usuario y contraseña?

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

Me sale un error. Supongo que necesito especificar un nombre de usuario y contraseña junto con el comando anterior.

¿Cómo puedo hacer eso?

Respuesta

447

Utilice la bandera -u para incluir un nombre de usuario, y el rizo se solicite una contraseña:

curl -u username http://example.com 

También puede incluir la contraseña en el comando, pero luego su contraseña será visible en la historia bash:

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

Esta es la solución que también busco .... funciona bien desde el símbolo del sistema. –

+81

Tenga en cuenta que si hace esto desde la consola, la contraseña permanecerá en el historial que es ... incorrecta. Debe especificar solo -u usuario y CURL le pedirá la contraseña en modo no-echo. –

+19

@CristianVrabie Técnicamente correcto, pero incorrecto si lo está ejecutando desde un script automatizado que no permite las solicitudes. Sería curioso sobre una solución a ese problema. – Ligemer

57

O lo mismo pero diferente sintaxis

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

Utilizo esa sintaxis, porque se puede usar en muchas situaciones más. Me gusta de un cmd de Windows sin cURL y sin wGet, usando 'start" "" http: // username: [email protected]/test/blah? Something = 123 "'.Se puede lanzar desde cualquier lugar. Esto también se aplica a los inicios de sesión FTP: D – erm3nda

+4

¿Esto también funciona si el nombre de usuario contiene @ sign – Mounhim

+6

Necesita codificar URL el nombre de usuario y la contraseña para usar caracteres divertidos – diachedelic

54

también puede simplemente enviar el nombre de usuario al escribir:

curl -u USERNAME http://server.example 

Curl a continuación, le pide la contraseña y la contraseña no será visible en la pantalla (o si es necesario copiar/pegar el comando) .

143

Es más seguro que hacer:

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

... como pasar la cadena de usuario/contraseña al descubierto en la línea de comandos es una mala idea.

El formato del archivo de contraseñas es (según man curl):

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

(Las palabras 'machine', 'login', y 'password' son sólo palabras; la información real es la materia después de esas palabras clave).

+9

Sí, eso mantiene la contraseña fuera de la lista de procesos y el historial de comandos. Es la forma preferible de hacer esto, y solo un poco más de trabajo :) –

+7

Esto definitivamente debería ser la respuesta aceptada; las contraseñas en la línea de comandos son una práctica horrible. (Y este es un hecho ampliamente conocido.) – ELLIOTTCABLE

+2

Esta es una respuesta más aceptable. – Xofo

5

para permitir que la contraseña no menos pop-up en su .bash_history:

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

En este caso, la contraseña aún terminará en la lista de procesos, p. es visible para alguien que hace 'ps auxw | grep curl' en el momento correcto. Del mismo modo, la contraseña se registrará si se ejecuta a través de 'sudo' –

+0

Con este método, la contraseña está presente en un archivo (.password-file) que puede ser más inseguro que el historial .bash. Lo bueno de esto es que solo es la contraseña: la URL y el nombre de usuario no se filtran en el archivo .password. –

7

llano y simplemente poner la forma más segura sería el uso de variables de entorno para almacenar/recuperar sus credenciales. Así, un comando curl como:

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

entonces llame a su API de descanso y pasar la cabecera http WWW_Authentication con los valores codificados de base 64 y API_USERAPI_HASH. El -Lk simplemente le dice a curl que siga las redirecciones http 30x y que use el manejo inseguro de tls (es decir, ignore los errores ssl). Mientras que el doble -- es simplemente azúcar de sintaxis bash para detener el procesamiento de indicadores de línea de comando. Además, las banderas -b cookies.txt y -c cookies.txt manejan las cookies con -b enviando cookies y -c almacenando cookies localmente.

El manual tiene más métodos de examples of authentication.

+0

Tenga en cuenta que el uso de "-Lk" puede abrirlo a ataques de hombre en el medio (MITM), por lo que tenga cuidado con esa opción. – GuyPaddock

+0

Esto no funciona ... ya que bash expande esas variables por usted, la expansión aparece en la lista de procesos. –

2

Si usted está en un sistema que tiene Gnome llavero APP una solución que evite la exposición de la contraseña es directamente para utilizar las gkeyring.py para extraer la contraseña del archivo de claves:

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 
7

Para pasar de forma segura la contraseña en una secuencia de comandos (es decir, evitar que aparezcan con auxf ps o registros) que puede hacerlo con la bandera -K- (config leer de la entrada estándar) y heredoc:

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

Gracias por la referencia a la opción '--config' (-K) ... posiblemente una mejor solución sería poner" --user user: password "en un archivo y simplemente' -K el archivo' para que tenga solo una copia de la contraseña en lugar de una copia en cada script. Mucho más fácil para asegurar un solo archivo. –

1

que tenían la misma necesidad en bash (Ubuntu 16.04 LTS) y los comandos proporcionados en las respuestas no han funcionado en mi caso. Tuve que usar:

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

Las comillas dobles en los argumentos -F sólo son necesarios si usted está usando las variables, tanto desde la línea de comandos ... -F 'username=myuser' ... va a estar bien.

Estaría encantado si un comentario o edición puede explicar por qué!

2
curl -X GET -u username:password {{ http://www.example.com/filename.txt }} -O 
Cuestiones relacionadas