Isso é MUITO mais do que o OP pediu, mas como esse é o melhor resultado para a passagem segura de senhas curl
, estou adicionando essas soluções aqui para outras pessoas que chegam aqui procurando por isso.
NOTA: -s
arg para o read
comando não é POSIX e, portanto, não está disponível em todos os lugares, portanto não será usado abaixo. Vamos usar stty -echo
e, em stty echo
vez disso.
NOTA: Todas as variáveis bash abaixo podem ser declaradas como locais se estiverem em uma função, em vez de serem desmarcadas.
NOTA: perl
é muito geralmente disponíveis em todos os sistemas que eu tentei, devido a ser uma dependência para muitas coisas, enquanto ruby
e python
não são, portanto, usando perl
aqui. Se você pode garantir ruby
/ python
onde está fazendo isso, pode substituir o perl
comando pelo equivalente.
NOTA: Testado em bash
3.2.57 no macOS 10.14.4. Alguma pequena tradução pode ser necessária para outros shells / instalações.
Solicite com segurança ao usuário uma senha (reutilizável) a ser transmitida. Particularmente útil se você precisar chamar o enrolamento várias vezes.
Para cascas modernas, onde echo
está um embutido (verifique via 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 shells mais antigos, onde echo
é algo parecido /bin/echo
(onde tudo o que ecoa pode ser visto na lista de processos):
ESTA VERSÃO NÃO PODE REUTILIZAR A SENHA , veja em baixo.
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
Se você precisar armazenar temporariamente a senha em um arquivo, reutilizá-la para vários comandos antes de limpá-la (por exemplo, você está usando funções para reutilização de código e não deseja repetir o código e não pode passe o valor através de eco). (Sim, eles parecem um pouco engenhosos neste formulário, não sendo funções em bibliotecas diferentes; tentei reduzi-los ao código mínimo necessário para mostrá-lo.)
Quando o eco é embutido (isso é especialmente artificial, pois o eco é um embutido, mas é fornecido com integridade):
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
Quando eco é 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