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