Это НАМНОГО больше, чем запрашивал ОП, но так как это лучший результат для безопасной передачи паролей curl, я добавляю эти решения сюда для тех, кто прибывает сюда в поисках этого.
ПРИМЕЧАНИЕ: команда -sarg for readне является POSIX и поэтому доступна не везде, поэтому она не будет использоваться ниже. Мы будем использовать stty -echoи stty echoвместо.
ПРИМЕЧАНИЕ. Все переменные bash, приведенные ниже, могут быть объявлены как локальные, если они есть в функции, а не в unset.
ПРИМЕЧАНИЕ: perlдовольно широко доступен во всех системах, которые я пробовал, потому что это зависимость для многих вещей, тогда как rubyи pythonнет, поэтому perlздесь используется . Если вы можете гарантировать ruby/ pythonгде вы делаете это, вы можете заменить perlкоманду их эквивалентом.
ПРИМЕЧАНИЕ. Протестировано в bash3.2.57 на macOS 10.14.4. Небольшой перевод может потребоваться для других оболочек / установок.
Надежно запросите у пользователя (многоразовый) пароль для перехода к curl. Особенно полезно, если вам нужно вызывать curl несколько раз.
Для современных оболочек, где 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
Если вам понадобится временно сохранить пароль в файле, повторно использовать его для нескольких команд перед его очисткой (скажем, потому что вы используете функции для повторного использования кода и не хотите повторять код и не можете передать значение через эхо). (Да, в этой форме они выглядят немного изобретательно и не являются функциями в разных библиотеках; я попытался сократить их до минимального кода, необходимого для его отображения.)
Когда эхо является встроенным (это особенно надумано, так как эхо является встроенным, но предусмотрено для полноты):
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