Использование cURL с именем пользователя и паролем?
Я хочу получить доступ к URL-адресу, для которого требуется имя пользователя/пароль. Я хотел бы попытаться получить доступ к нему с завитом. Сейчас я делаю что-то вроде:
curl http://api.somesite.com/test/blah?something=123
Я получаю сообщение об ошибке. Думаю, мне нужно указать имя пользователя и пароль вместе с приведенной выше командой.
Как я могу это сделать?
Ответы
Ответ 1
Используйте флаг -u
, чтобы включить имя пользователя, и curl запросит пароль:
curl -u username http://example.com
Вы также можете указать пароль в команде, но тогда ваш пароль будет отображаться в истории bash:
curl -u username:password http://example.com
Ответ 2
Это безопаснее сделать:
curl --netrc-file my-password-file http://example.com
... так как передача простой строки user/password в командной строке - плохая идея.
Формат файла паролей (в соответствии с man curl
):
machine <example.com> login <username> password <password>
Замечания:
- Имя машины не должно содержать
https://
или подобное! Просто имя хоста. - Слова "
machine
", " login
" и " password
- это просто ключевые слова; фактическая информация - это материал после этих ключевых слов.
Ответ 3
Или одно и то же, но различный синтаксис
curl http://username:[email protected]/test/blah?something=123
Ответ 4
Вы также можете просто отправить имя пользователя, написав:
curl -u USERNAME http://server.example
Затем Curl запросит пароль, и пароль не будет отображаться на экране (или если вам нужно скопировать/вставить команду).
Ответ 5
Чтобы безопасно передать пароль в script (т.е. не показывать его с помощью ps auxf или журналов), вы можете сделать это с помощью флага -K- (read config from stdin) и heredoc:
curl --url url -K- <<< "--user user:password"
Ответ 6
curl -X GET -u username:password {{ http://www.example.com/filename.txt }} -O
Ответ 7
Обычно команда CURL называется
curl https://example.com\?param\=ParamValue -u USERNAME:PASSWORD
если у вас нет пароля или вы хотите пропустить командную строку для запроса пароля, просто оставьте раздел пароля пустым.
т.е. curl https://example.com\?param\=ParamValue -u USERNAME:
Ответ 8
Простое и просто наиболее безопасный способ - использовать переменные среды для хранения/получения ваших учетных данных. Таким образом, команда curl, например:
curl -Lk -XGET -u "${API_USER}:${API_HASH}" -b cookies.txt -c cookies.txt -- "http://api.somesite.com/test/blah?something=123"
Затем вызовет ваш resti api и передаст заголовок http WWW_Authentication
с закодированными Base64 значениями API_USER
и API_HASH
. -Lk
просто говорит curl следовать http 30x redirects и использовать небезопасную обработку tls (т.е. игнорировать ошибки ssl). В то время как double --
представляет собой просто синтаксический сахар bash, чтобы остановить обработку флагов командной строки. Кроме того, флаги -b cookies.txt
и -c cookies.txt
обрабатывают файлы cookie с помощью -b
отправки файлов cookie и -c
сохранения файлов cookie локально.
В руководстве больше примеры методов проверки подлинности.
Ответ 9
Чтобы пароль как минимум не отображался в вашем .bash_history
:
curl -u user:$(cat .password-file) http://example-domain.tld
Ответ 10
Другие ответы предложили netrc указать имя пользователя и пароль, основываясь на том, что я прочитал, я согласен. Вот некоторые подробности синтаксиса:
https://ec.haxx.se/usingcurl-netrc.html
Как и другие ответы, я хотел бы подчеркнуть необходимость обратить внимание на безопасность в отношении этого вопроса.
Хотя я не эксперт, я нашел эти ссылки проницательными:
https://ec.haxx.se/cmdline-passwords.html
Обобщить:
Использование зашифрованных версий протоколов (HTTPS и HTTP) (FTPS и FTP) может помочь избежать утечки сети.
Использование netrc может помочь избежать утечки командной строки.
Чтобы сделать шаг дальше, кажется, вы также можете шифровать файлы netrc, используя gpg
https://brandur.org/fragments/gpg-curl
При этом ваши учетные данные не "покоятся" (хранятся) как обычный текст.
Ответ 11
довольно легко, сделайте следующее:
curl -X GET/POST/PUT <URL> -u username:password
Ответ 12
Самый безопасный способ передачи учетных данных в curl - это ввести их. Это то, что происходит при передаче имени пользователя, как предлагалось ранее (-u USERNAME
).
Но что, если вы не можете передать имя пользователя таким образом?
Например, имя пользователя может быть частью url, и только пароль должен быть частью полезной нагрузки json.
ТЛ; др:
Вот как безопасно использовать curl в этом случае:
read -p "Username: " U; read -sp "Password: " P; curl --request POST -d "{\"password\":\"${P}\"}" https://example.com/login/${U}; unset P U
read
запросит как имя пользователя, так и пароль из командной строки и сохранит отправленные значения в двух переменных, которые могут быть ссылками в последующих командах и, наконец, не установлены.
Я расскажу, почему другие решения не идеальны.
Почему переменные среды небезопасны
-
Режим доступа и доступа к содержимому переменной среды не может отслеживаться (ps -eww), поскольку среда неявно доступна для процесса
- Зачастую приложения захватывают всю среду и регистрируют ее для целей отладки или мониторинга (иногда в виде текстовых файлов на диске, особенно после сбоя приложения)
- Переменные среды передаются дочерним процессам (следовательно, нарушается принцип наименьших привилегий)
- Поддержание их является проблемой: новые инженеры не знают, что они там есть, и не знают о требованиях вокруг них, например, не передавать их подпроцессам, поскольку они не применяются или не документированы.
Почему небезопасно вводить его непосредственно в команду из командной строки
Потому что ваш секрет становится видимым для любого другого пользователя, выполняющего ps -aux
, поскольку в нем перечислены команды, отправленные для каждого выполняющегося в данный момент процесса.
Кроме того, потому что ваш секрет затем попадает в историю Bash (после завершения оболочки).
Почему включать его в локальный файл небезопасно
Строгое ограничение доступа POSIX к файлу может снизить риск в этом сценарии. Тем не менее, это все еще файл в вашей файловой системе, незашифрованный в состоянии покоя.
Ответ 13
Вы можете использовать команду like,
curl -u user-name -p http://www.example.com/path-to-file/file-name.ext > new-file-name.ext
Затем будет запущен HTTP-пароль.
Ссылка:
http://www.asempt.com/article/how-use-curl-http-password-protected-site
Ответ 14
Если вы используете систему с приложением Gnome keyring, решение, которое позволяет избежать прямого доступа к паролю, заключается в использовании gkeyring.py, чтобы извлечь пароль из брелока:
server=server.example.com
file=path/to/my/file
user=my_user_name
pass=$(gkeyring.py -k login -tnetwork -p user=$user,server=$server -1)
curl -u $user:$pass ftps://$server/$file -O
Ответ 15
У меня была такая же потребность в bash (Ubuntu 16.04 LTS), и команды, предоставленные в ответах, не работали в моем случае. Мне пришлось использовать:
curl -X POST -F 'username="$USER"' -F 'password="$PASS"' "http://api.somesite.com/test/blah?something=123"
Двойные кавычки в аргументах -F
необходимы, только если вы используете переменные, поэтому из командной строки ... -F 'username=myuser' ...
будет хорошо.
Я был бы рад, если комментарий или изменение могут объяснить, почему!
Ответ 16
Как вы делаете это, когда это аутентификация на основе токена.
Ответ 17
Это НАМНОГО больше, чем запрашивал ОП, но так как это лучший результат для безопасной передачи паролей в curl
, я добавляю эти решения сюда для тех, кто прибывает сюда в поисках этого.
ПРИМЕЧАНИЕ. Аргумент -s
для команды read
не является POSIX и поэтому не доступен везде, поэтому он не будет использоваться ниже. Вместо этого мы будем использовать stty -echo
и stty echo
.
ПРИМЕЧАНИЕ. Все переменные bash, приведенные ниже, могут быть объявлены как локальные, если они есть в функции, а не отменять сброс.
ПРИМЕЧАНИЕ: 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