Quiero acceder a una URL que requiere un nombre de usuario / contraseña. Me gustaría intentar acceder a él con curl. En este momento estoy haciendo algo como:
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?
curl
credentials
usuario246114
fuente
fuente
print -- '-u username:password' > somewhere && curl -K somewhere http://...
--netrc-file
) es más segura. Mantiene la contraseña fuera del historial, ps, su script, etc. Esa es la única forma que uso en todos mis scripts y para todos los usos autenticados decurl
.Es más seguro hacer:
... como pasar una cadena de usuario / contraseña simple en la línea de comando, es una mala idea.
El formato del archivo de contraseña es (según
man curl
):Nota:
https://
o similar! Solo el nombre de host.machine
', 'login
' y 'password
' son solo palabras clave; La información real es el material después de esas palabras clave.fuente
-K <file>
o--config <file>
recibir banderas de rizo a través de un archivo o entrada estándar. (Advertencia: no debe confundirse con-k
o--insecure
!).netrc
archivo de texto sin formato con permisos estrictamente apropiados, de modo que solo su usuario pueda leerlo, que otros mecanismos (por ejemplo, argumentos de línea de comandos) que permiten que otros usuarios lean la información.O lo mismo pero diferente sintaxis
fuente
start "" "http://username:[email protected]/test/blah?something=123"
. Se puede iniciar desde cualquier lugar. Eso también se aplica a los inicios de sesión ftp; DTambién puede enviar el nombre de usuario escribiendo:
Curl le pedirá la contraseña, y la contraseña no será visible en la pantalla (o si necesita copiar / pegar el comando).
fuente
Para pasar de forma segura la contraseña en un script (es decir, evitar que aparezca con ps auxf o logs), puede hacerlo con el indicador -K- (lea la configuración de stdin) y un heredoc:
fuente
--config
opción (-K) ... posiblemente una mejor solución sería poner "--user user: password" en un archivo y simplemente-K the file
tener una copia de la contraseña en lugar de una copia en cada script . Mucho más fácil asegurar un solo archivo.cat "${password_filepath}" | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-
. Tuve que poner-K-
antes de la url para el viejo macOS bash, YMMV.Por lo general, el comando CURL se denomina
si no tiene ninguna contraseña o desea omitir el símbolo del sistema para solicitar una contraseña, simplemente deje la sección de contraseña en blanco.
es decir
curl https://example.com\?param\=ParamValue -u USERNAME:
fuente
fuente
Para que la contraseña no aparezca en tu
.bash_history
:fuente
ps auxw |grep curl
en el momento adecuado. Del mismo modo, la contraseña se registrará si se ejecuta a través desudo
bastante fácil, haz lo siguiente:
fuente
Otras respuestas han sugerido netrc para especificar nombre de usuario y contraseña, de acuerdo con lo que he leído, estoy de acuerdo. Aquí hay algunos detalles de sintaxis:
https://ec.haxx.se/usingcurl-netrc.html
Al igual que otras respuestas, me gustaría enfatizar la necesidad de prestar atención a la seguridad con respecto a esta pregunta.
Aunque no soy un experto, encontré estos enlaces interesantes:
https://ec.haxx.se/cmdline-passwords.html
Para resumir:
El uso de las versiones encriptadas de los protocolos (HTTPS vs HTTP) (FTPS vs FTP) puede ayudar a evitar la fuga de la red.
Usar netrc puede ayudar a evitar fugas en la línea de comandos.
Para ir un paso más allá, parece que también puede cifrar los archivos netrc usando gpg
https://brandur.org/fragments/gpg-curl
Con esto, sus credenciales no están "en reposo" (almacenadas) como texto sin formato.
fuente
La forma más simple y sencilla sería utilizar variables de entorno para almacenar / recuperar sus credenciales. Por lo tanto, un comando curl como:
Luego llamaría a su API de descanso y pasaría el
WWW_Authentication
encabezado http con los valores codificados en Base64 deAPI_USER
yAPI_HASH
. El-Lk
simplemente dice rizo seguir http 30x y vuelve a dirigir a utilizar TLS inseguros manipulación (es decir, ignorar los errores SSL). Mientras que el doble--
es solo bash syntax sugar para detener el procesamiento de las banderas de línea de comando. Además, las banderas-b cookies.txt
y-c cookies.txt
manejan las cookies-b
enviando cookies y-c
almacenando cookies localmente.El manual tiene más ejemplos de métodos de autenticación .
fuente
Puedes usar comandos como,
Entonces se activará la contraseña HTTP.
Referencia: http://www.asempt.com/article/how-use-curl-http-password-protected-site
fuente
La forma más segura de pasar credenciales a curl es que se le solicite que las inserte. Esto es lo que sucede al pasar el nombre de usuario como se sugirió anteriormente (
-u USERNAME
).¿Pero qué pasa si no puede pasar el nombre de usuario de esa manera? Por ejemplo, el nombre de usuario puede necesitar ser parte de la url y solo la contraseña debe ser parte de una carga útil de json.
tl; dr: así es cómo usar curl de forma segura en este caso:
read
solicitará tanto el nombre de usuario como la contraseña desde la línea de comandos, y almacenará los valores enviados en dos variables que pueden ser referencias en comandos posteriores y finalmente desarmarse.Voy a explicar por qué las otras soluciones no son ideales.
¿Por qué las variables de entorno no son seguras?
¿Por qué no es seguro escribirlo directamente en un comando en la línea de comando? Porque su secreto termina siendo visible para cualquier otro usuario que se ejecute,
ps -aux
ya que enumera los comandos enviados para cada proceso en ejecución. También porque su secrte termina en el historial de bash (una vez que finaliza el shell).¿Por qué no es seguro incluirlo en un archivo local? La restricción estricta de acceso POSIX en el archivo puede mitigar el riesgo en este escenario. Sin embargo, todavía es un archivo en su sistema de archivos, sin cifrar en reposo.
fuente
Tenía la misma necesidad en bash (Ubuntu 16.04 LTS) y los comandos proporcionados en las respuestas no funcionaron en mi caso. Tuve que usar:
Las comillas dobles en los
-F
argumentos solo son necesarias si está utilizando variables, por lo tanto, desde la línea de comando... -F 'username=myuser' ...
estará bien.Aviso de seguridad relevante: como el Sr. Mark Ribau señala en los comentarios, este comando muestra la contraseña (variable $ PASS, expandida) en la lista de procesos.
fuente
Si está en un sistema que tiene la aplicación Gnome keyring, una solución que evita exponer la contraseña directamente es usar gkeyring.py para extraer la contraseña del llavero:
fuente
Esto es MUCHO más de lo que solicitó el OP, pero dado que este es un resultado superior para pasar contraseñas de forma segura
curl
, estoy agregando estas soluciones aquí para otros que llegan aquí buscando eso.NOTA:
-s
arg forread
command no es POSIX, por lo que no está disponible en todas partes, por lo que no se utilizará a continuación. Vamos a utilizarstty -echo
y en sustty echo
lugar.NOTA: Todas las variables de bash a continuación podrían declararse como locales si están en una función, en lugar de desarmarse.
NOTA:
perl
generalmente está disponible en todos los sistemas que he probado debido a que es una dependencia para muchas cosas, mientras queruby
ypython
no lo está, por lo que lo usoperl
aquí. Si puede garantizarruby
/python
dónde está haciendo esto, puede reemplazar elperl
comando con su equivalente.NOTA: Probado en
bash
3.2.57 en macOS 10.14.4. Es posible que se requiera una pequeña traducción para otros shells / instalaciones.Solicite de forma segura a un usuario una contraseña (reutilizable) para pasar a curl. Particularmente útil si necesita llamar a curl varias veces.
Para proyectiles modernos, ¿dónde
echo
está incorporado?which echo
):Para los shells más antiguos, ¿dónde
echo
está algo así/bin/echo
(donde sea que se vea lo que se puede ver en la lista de procesos):ESTA VERSIÓN NO PUEDE REUTILIZAR LA CONTRASEÑA , vea más abajo en su lugar.
Si necesita almacenar la contraseña temporalmente en un archivo, volver a usarla para varios comandos antes de borrarla (por ejemplo, porque está usando funciones para la reutilización de código y no quiere repetir el código y no puede pasar el valor a través de echo). (Sí, estos son un poco artificiales, ya que en este formulario no se encuentran funciones en diferentes bibliotecas; intenté reducirlos al código mínimo necesario para mostrarlo).
Cuando echo está incorporado (esto es especialmente artificial, ya que echo está incorporado, pero se proporciona para completar):
Cuando echo es algo como
/bin/echo
:fuente