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 for read
command no es POSIX, por lo que no está disponible en todas partes, por lo que no se utilizará a continuación. Vamos a utilizar stty -echo
y en su stty 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 que ruby
y python
no lo está, por lo que lo uso perl
aquí. Si puede garantizar ruby
/ 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
):
url='https://example.com'
printf "Username: "
read username
printf "Password: "
stty -echo # disables echoing user input, POSIX equivalent for 'read -s'
read pass
printf "\n" # we need to move the line ahead
stty echo # re-enable echoing user input
echo ${pass} | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-
unset username
unset pass
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.
url='https://example.com'
printf "Username: "
read username
printf "Password: "
stty -echo # disables echoing user input, POSIX equivalent for 'read -s'
perl -e '
my $val=<STDIN>;
chomp $val;
print STDERR "\n"; # we need to move the line ahead, but not send a newline down the pipe
print $val;
' | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-
stty echo # re-enable echoing user input
unset username
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):
url='https://example.com'
filepath="$(mktemp)" # random path, only readable by current user
printf "Username: "
read username
printf "Password: "
stty -echo # disables echoing user input, POSIX equivalent for 'read -s'
read pass
echo "${pass}" > "${filepath}"
unset pass
printf "\n" # we need to move the line ahead
stty echo # re-enable echoing user input
cat "${filepath}" | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-
rm "${filepath}" # don't forget to delete the file when done!!
unset username
Cuando echo es algo como /bin/echo
:
url='https://example.com'
filepath="$(mktemp)" # random path, only readable by current user
printf "Username: "
read username
printf "Password: "
stty -echo # disables echoing user input, POSIX equivalent for 'read -s'
$(perl -e '
my $val=<STDIN>;
chomp $val;
open(my $fh, ">", $ARGV[0]) or die "Could not open file \"$ARGV[0]\" $\!";
print $fh $val;
close $fh;
' "$filepath")
printf "\n" # we need to move the line ahead
stty echo # re-enable echoing user input
cat "${filepath}" | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-
rm "${filepath}" # don't forget to delete the file when done!!
unset username