Це набагато більше, ніж просили ОП, але оскільки це найкращий результат для надійного передачі паролів curl
, я додаю ці рішення сюди для інших, хто приїздить сюди в пошуках цього.
ПРИМІТКА: -s
arg для read
команди не є POSIX, тому він доступний не скрізь, тому він не буде використовуватися нижче. Ми будемо використовувати stty -echo
і stty echo
замість цього.
ПРИМІТКА. Усі змінні bash, наведені нижче, замість цього можуть бути оголошені як локальні, якщо вони функціонують, а не не встановлюються.
ПРИМІТКА: perl
досить загальнодоступний у всіх системах, які я намагався, оскільки він залежність від багатьох речей, тоді як ruby
і python
ні, тому perl
тут використовується . Якщо ви можете гарантувати ruby
/ python
де ви це робите, ви можете замінити perl
команду на їх еквівалент.
ПРИМІТКА: Випробувано в bash
3.2.57 на macOS 10.14.4. Для інших оболонок / установок може знадобитися невеликий переклад.
Безпечно запропонуйте користувачеві пароль (для багаторазового використання), щоб перейти до згортання. Особливо корисно, якщо вам потрібно зателефонувати завивати кілька разів.
Для сучасних снарядів, де echo
знаходиться вбудований (перевірити через 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
Для старих оболонок, де echo
щось на зразок /bin/echo
(де все, що лунає, можна побачити у списку процесів):
Цю версію НЕ МОЖЕ ВИКОРИСТИТИ ПАРОЛЬ , замість цього див.
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
Якщо вам потрібно тимчасово зберігати пароль у файлі, повторно використовувати його для декількох команд, перш ніж очистити його (скажімо, ви використовуєте функції для повторного використання коду і не хочете повторювати код і не можете передайте значення навколо через 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'
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
Коли відлуння щось таке /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