Questo è MOLTO più di quanto richiesto dall'OP, ma poiché si tratta di un risultato eccezionale per il passaggio sicuro delle password curl
, sto aggiungendo queste soluzioni qui per gli altri che arrivano qui a cercarlo.
NOTA: -s
arg per read
comando non è POSIX, quindi non è disponibile ovunque, quindi non verrà utilizzato di seguito. Useremo stty -echo
e stty echo
invece.
NOTA: tutte le variabili bash di seguito potrebbero invece essere dichiarate come locali se in una funzione, piuttosto che essere disabilitate.
NOTA: perl
è abbastanza generalmente disponibile su tutti i sistemi che ho provato perché è una dipendenza per molte cose, mentre ruby
e python
non lo sono, quindi uso perl
qui. Se puoi garantire ruby
/ python
dove lo stai facendo, puoi sostituire il perl
comando con il loro equivalente.
NOTA: testato in bash
3.2.57 su macOS 10.14.4. Potrebbe essere necessaria una piccola traduzione per altre shell / installazioni.
Richiedere in modo sicuro a un utente che una password (riutilizzabile) passi all'arricciatura. Particolarmente utile se è necessario chiamare più volte l'arricciatura.
Per le shell moderne, dove echo
è integrato (controllare tramite 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
Per le shell più vecchie, dove si echo
trova qualcosa di simile /bin/echo
(dove qualsiasi cosa si trovi nella lista dei processi):
QUESTA VERSIONE NON PU RE RIUTILIZZARE LA PASSWORD , vedere invece in basso.
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 ti capita di dover archiviare temporaneamente la password in un file, riutilizzarla per più comandi prima di cancellarla (ad esempio perché stai utilizzando le funzioni per il riutilizzo del codice e non vuoi ripetere il codice e non puoi passare il valore in giro tramite eco). (Sì, questi sono un po 'forzati guardando in questa forma non essendo funzioni in diverse librerie; ho cercato di ridurli al codice minimo necessario per mostrarlo.)
Quando l'eco è incorporato (questo è particolarmente elaborato, poiché l'eco è incorporato, ma fornito per completezza):
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 l'eco è qualcosa di simile /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