To DUŻO więcej, niż wymagał PO, ale ponieważ jest to najlepszy wynik dla bezpiecznego przekazywania haseł curl
, dodam te rozwiązania tutaj dla innych, którzy przyjeżdżają tutaj, szukając tego.
UWAGA: -s
arg dla read
polecenia nie jest POSIX, więc nie jest dostępny wszędzie, więc nie będzie używany poniżej. Użyjemy stty -echo
i stty echo
zamiast tego.
UWAGA: Wszystkie poniższe zmienne bash mogą być zadeklarowane jako lokalne, jeśli są w funkcji, a nie są rozbrojone.
UWAGA: perl
jest dość ogólnie dostępny na wszystkich systemach, które wypróbowałem, ponieważ jest zależny od wielu rzeczy, podczas gdy ruby
i python
nie są, więc używaj perl
tutaj. Jeśli możesz zagwarantować ruby
/ python
gdzie to robisz, możesz zastąpić perl
polecenie ich odpowiednikiem.
UWAGA: Przetestowano w bash
3.2.57 na macOS 10.14.4. Niektóre małe tłumaczenia mogą być wymagane w przypadku innych powłok / instalacji.
Bezpiecznie poproś użytkownika o podanie hasła (wielokrotnego użytku) w celu zwijania. Jest to szczególnie przydatne, jeśli trzeba wywoływać curl wiele razy.
W przypadku nowoczesnych powłok, w których echo
jest wbudowany (sprawdź przez 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
Dla starszych powłok, gdzie echo
jest coś takiego /bin/echo
(gdzie cokolwiek echo można zobaczyć na liście procesów):
TA WERSJA NIE MOŻE PONOWNIE UŻYĆ HASŁA , patrz niżej.
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
Jeśli potrzebujesz tymczasowo zapisać hasło do pliku, użyj go ponownie dla wielu poleceń przed jego wyczyszczeniem (powiedz, ponieważ używasz funkcji do ponownego użycia kodu i nie chcesz powtarzać kodu i nie możesz przekazać wartość przez echo). (Tak, są nieco wymyślone, patrząc w tej formie, nie będąc funkcjami w różnych bibliotekach; Próbowałem zredukować je do minimalnego kodu potrzebnego do jego wyświetlenia.)
Gdy echo jest wbudowane (jest to szczególnie wymyślone, ponieważ echo jest wbudowane, ale zapewnia kompletność):
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
Kiedy echo jest jak /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