Использование 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>

Замечания:

  1. Имя машины не должно содержать https:// или подобное! Просто имя хоста.
  2. Слова " 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 запросит как имя пользователя, так и пароль из командной строки и сохранит отправленные значения в двух переменных, которые могут быть ссылками в последующих командах и, наконец, не установлены.

Я расскажу, почему другие решения не идеальны.

Почему переменные среды небезопасны

  1. Режим доступа и доступа к содержимому переменной среды не может отслеживаться (ps -eww), поскольку среда неявно доступна для процесса
  2. Зачастую приложения захватывают всю среду и регистрируют ее для целей отладки или мониторинга (иногда в виде текстовых файлов на диске, особенно после сбоя приложения)
  3. Переменные среды передаются дочерним процессам (следовательно, нарушается принцип наименьших привилегий)
  4. Поддержание их является проблемой: новые инженеры не знают, что они там есть, и не знают о требованиях вокруг них, например, не передавать их подпроцессам, поскольку они не применяются или не документированы.

Почему небезопасно вводить его непосредственно в команду из командной строки Потому что ваш секрет становится видимым для любого другого пользователя, выполняющего ps -aux, поскольку в нем перечислены команды, отправленные для каждого выполняющегося в данный момент процесса. Кроме того, потому что ваш секрет затем попадает в историю Bash (после завершения оболочки).

Почему включать его в локальный файл небезопасно Строгое ограничение доступа POSIX к файлу может снизить риск в этом сценарии. Тем не менее, это все еще файл в вашей файловой системе, незашифрованный в состоянии покоя.

Ответ 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