Я хочу получить доступ к URL, который требует имя пользователя / пароль. Я хотел бы попробовать получить к нему доступ с помощью curl. Прямо сейчас я делаю что-то вроде:
curl http://api.somesite.com/test/blah?something=123
Я получаю ошибку. Я думаю, мне нужно указать имя пользователя и пароль вместе с приведенной выше командой.
Как я могу это сделать?
curl
credentials
user246114
источник
источник
print -- '-u username:password' > somewhere && curl -K somewhere http://...
--netrc-file
) более безопасен. Он хранит пароль вне истории, ps, вашего скрипта и т. Д. Это единственная форма, которую я использую во всех моих скриптах и для всех аутентифицированных способов использованияcurl
.Это безопаснее сделать:
... так как передача простой строки user / password в командной строке - плохая идея.
Формат файла паролей (согласно
man curl
):Замечания:
https://
или подобное! Просто имя хоста.machine
', 'login
' и 'password
' являются просто ключевыми словами; фактическая информация - это материал после этих ключевых слов.источник
-K <file>
или--config <file>
для получения флагов скручивания через файл или стандартный ввод. (Предупреждение: не путать с-k
или--insecure
!).netrc
файл открытого текста с соответствующими строгими разрешениями, чтобы его мог прочитать только ваш пользователь, чем другие механизмы (например, аргументы командной строки), которые позволяют другим пользователям читать информацию.Или то же самое, но другой синтаксис
источник
start "" "http://username:password@api.somesite.com/test/blah?something=123"
. Его можно запустить из любого места. Это также относится кВы также можете просто отправить имя пользователя, написав:
Curl попросит вас ввести пароль, и пароль не будет отображаться на экране (или, если вам нужно скопировать / вставить команду).
источник
Чтобы безопасно передать пароль в сценарии (то есть предотвратить его появление с помощью ps auxf или logs), вы можете сделать это с флагом -K- (чтение конфигурации из stdin) и heredoc:
источник
--config
опцию (-K) ... возможно, лучшим решением было бы поместить "--user user: password" в файл и просто,-K the file
чтобы у вас была только одна копия пароля, а не копия в каждом скрипте , Гораздо проще обезопасить один файл.cat "${password_filepath}" | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-
. Мне пришлось поставить-K-
перед URL для старого MacOS Bash, YMMV.Обычно команда CURL называется
если у вас нет пароля или вы хотите пропустить командную строку для запроса пароля, просто оставьте раздел пароля пустым.
т.е.
curl https://example.com\?param\=ParamValue -u USERNAME:
источник
источник
Чтобы пароль как минимум не всплывал в вашем
.bash_history
:источник
ps auxw |grep curl
в нужное время. Точно так же пароль будет зарегистрирован, если запущен черезsudo
довольно легко, сделайте следующее:
источник
Другие ответы предложили 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
При этом ваши учетные данные не «в состоянии покоя» (хранятся) в виде простого текста.
источник
Проще говоря, самым безопасным способом было бы использование переменных среды для хранения / получения ваших учетных данных. Таким образом, команда curl вроде:
Затем вызовет ваш API apful и передаст
WWW_Authentication
заголовок http с закодированными в Base64 значениямиAPI_USER
иAPI_HASH
. Команда-Lk
just указывает curl следовать перенаправлениям http 30x и использовать небезопасную обработку tls (т.е. игнорировать ошибки ssl). В то время как double--
- это просто синтаксис bash, чтобы остановить обработку флагов командной строки. Кроме того,-b cookies.txt
и-c cookies.txt
флаги обрабатывать печенье с-b
отправкой печенья и-c
хранить печенье локально.В руководстве есть больше примеров методов аутентификации .
источник
Вы можете использовать команду, как,
Затем будет активирован пароль HTTP.
Ссылка: http://www.asempt.com/article/how-use-curl-http-password-protected-site
источник
Самый безопасный способ передачи учетных данных в curl - это ввести их. Это то, что происходит при передаче имени пользователя, как предлагалось ранее (
-u USERNAME
).Но что, если вы не можете передать имя пользователя таким образом? Например, имя пользователя может быть частью URL-адреса, и только пароль должен быть частью полезной нагрузки json.
tl; dr: Вот как безопасно использовать curl в этом случае:
read
запросит имя пользователя и пароль из командной строки и сохранит отправленные значения в двух переменных, которые могут быть ссылками в последующих командах и, наконец, не установлены.Я расскажу, почему другие решения не идеальны.
Почему переменные среды небезопасны
Почему небезопасно вводить его непосредственно в команду в командной строке, потому что ваш секрет в конечном итоге становится видимым для любого другого пользователя, работающего из-за того,
ps -aux
что в нем перечислены команды, отправленные для каждого выполняющегося в данный момент процесса. Кроме того, потому что ваш секрет затем попадает в историю Bash (после завершения оболочки).Почему включать его в локальный файл небезопасно Строгое ограничение доступа POSIX к файлу может снизить риск в этом сценарии. Тем не менее, это все еще файл в вашей файловой системе, незашифрованный в состоянии покоя.
источник
У меня была такая же потребность в bash (Ubuntu 16.04 LTS), и команды, приведенные в ответах, не работали в моем случае. Я должен был использовать:
Двойные кавычки в
-F
аргументах нужны только если вы используете переменные, поэтому с командной строкой... -F 'username=myuser' ...
все будет в порядке.Соответствующее примечание по безопасности: как отметил г-н Марк Рибау в комментариях, эта команда отображает пароль (переменная $ PASS, расширенная) в списке процессов!
источник
Если вы работаете в системе, в которой есть приложение для набора ключей Gnome, решение, которое позволяет не раскрывать пароль напрямую, это использовать gkeyring.py для извлечения пароля из набора ключей:
источник
Это НАМНОГО больше, чем запрашивал ОП, но так как это лучший результат для безопасной передачи паролей
curl
, я добавляю эти решения сюда для тех, кто прибывает сюда в поисках этого.ПРИМЕЧАНИЕ: команда
-s
arg forread
не является 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
):Для старых оболочек, где
echo
что-то вроде/bin/echo
(где все, что эхо, можно увидеть в списке процессов):ЭТА ВЕРСИЯ НЕ МОЖЕТ ПОВТОРЯТЬ ПАРОЛЬ , см. Ниже.
Если вам понадобится временно сохранить пароль в файле, повторно использовать его для нескольких команд перед его очисткой (скажем, потому что вы используете функции для повторного использования кода и не хотите повторять код и не можете передать значение через эхо). (Да, в этой форме они выглядят немного изобретательно и не являются функциями в разных библиотеках; я попытался сократить их до минимального кода, необходимого для его отображения.)
Когда эхо является встроенным (это особенно надумано, так как эхо является встроенным, но предусмотрено для полноты):
Когда эхо-что-то вроде
/bin/echo
:источник