Chcę uzyskać dostęp do adresu URL, który wymaga nazwy użytkownika / hasła. Chciałbym spróbować uzyskać do niego dostęp za pomocą curl. Teraz robię coś takiego:
curl http://api.somesite.com/test/blah?something=123
Dostaję błąd Chyba muszę podać nazwę użytkownika i hasło wraz z powyższym poleceniem.
Jak mogę to zrobić?
curl
credentials
użytkownik246114
źródło
źródło
print -- '-u username:password' > somewhere && curl -K somewhere http://...
--netrc-file
) jest bezpieczniejsza. Trzyma hasło poza historią, ps, twoim skryptem itp. Jest to jedyna forma, której używam we wszystkich moich skryptach i dla wszystkich uwierzytelnionych zastosowańcurl
.Bezpieczniej jest robić:
... ponieważ przekazywanie zwykłego ciągu użytkownika / hasła w wierszu poleceń jest złym pomysłem.
Format pliku hasła to (zgodnie z
man curl
):Uwaga:
https://
lub podobna! Tylko nazwa hosta.machine
”, „login
” i „password
” to tylko słowa kluczowe; rzeczywiste informacje są po słowach kluczowych.źródło
-K <file>
lub--config <file>
otrzymać flagi curl za pomocą pliku lub standardowego wejścia. (Ostrzeżenie: nie należy mylić z-k
lub--insecure
!).netrc
plik z odpowiednio ścisłymi prawami, więc tylko Twój użytkownik może go czytać, niż inne mechanizmy (np args linii komend), które pozwalają innych użytkowników odczytać te informacje.Lub ta sama rzecz, ale inna składnia
źródło
start "" "http://username:[email protected]/test/blah?something=123"
. Można go uruchomić z dowolnego miejsca. Dotyczy to także loginów ftp; DMożesz również wysłać nazwę użytkownika, pisząc:
Curl poprosi Cię o hasło, a hasło nie będzie widoczne na ekranie (lub jeśli będziesz musiał skopiować / wkleić polecenie).
źródło
Aby bezpiecznie przekazać hasło w skrypcie (tj. Zapobiec wyświetlaniu się go przy pomocy ps auxf lub logów), możesz to zrobić z flagą -K- (czytaj konfigurację ze standardowego wejścia) i heredoc:
źródło
--config
opcji (-K) ... być może lepszym rozwiązaniem byłoby umieszczenie w pliku „--user user: password” i po prostu-K the file
posiadanie tylko jednej kopii hasła zamiast kopii w każdym skrypcie . Znacznie łatwiej zabezpieczyć pojedynczy plik.cat "${password_filepath}" | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-
. Musiałem umieścić-K-
przed adresem URL starego basha dla systemu macOS, YMMV.Zwykle polecenie CURL określa się jako
jeśli nie masz hasła lub chcesz pominąć wiersz polecenia, aby poprosić o hasło, po prostu pozostaw pole hasła puste.
to znaczy
curl https://example.com\?param\=ParamValue -u USERNAME:
źródło
źródło
Aby hasło nie wyświetlało się w
.bash_history
:źródło
ps auxw |grep curl
we właściwym czasie. Podobnie hasło zostanie zarejestrowane, jeśli zostanie uruchomione przezsudo
całkiem proste, wykonaj następujące czynności:
źródło
Inne odpowiedzi sugerują, że netrc określa nazwę użytkownika i hasło, w oparciu o to, co przeczytałem, zgadzam się. Oto kilka szczegółów składni:
https://ec.haxx.se/usingcurl-netrc.html
Podobnie jak inne odpowiedzi, chciałbym podkreślić potrzebę zwrócenia uwagi na bezpieczeństwo w odniesieniu do tego pytania.
Chociaż nie jestem ekspertem, uważam te linki za wnikliwe:
https://ec.haxx.se/cmdline-passwords.html
Podsumowując:
Korzystanie z zaszyfrowanych wersji protokołów (HTTPS vs HTTP) (FTPS vs FTP) może pomóc uniknąć wycieku sieci.
Korzystanie z netrc może pomóc uniknąć wycieku z wiersza poleceń.
Aby pójść o krok dalej, wydaje się, że możesz także szyfrować pliki netrc za pomocą gpg
https://brandur.org/fragments/gpg-curl
Dzięki temu twoje poświadczenia nie są „w spoczynku” (przechowywane) jako zwykły tekst.
źródło
Najprościej i najprościej najbezpieczniej byłoby użyć zmiennych środowiskowych do przechowywania / odzyskiwania danych uwierzytelniających. Zatem polecenie zwijania, takie jak:
Następnie wywołałby Twój spokojny interfejs API i przekazał
WWW_Authentication
nagłówek http z zakodowanymi wartościami Base64 wartościAPI_USER
iAPI_HASH
. Po-Lk
prostu mówi curl, aby śledził przekierowania http 30x i używał niepewnej obsługi tls (tj. Ignorował błędy ssl). Podczas gdy double--
to tylko bash cukier składniowy, aby zatrzymać przetwarzanie flag wiersza poleceń. Ponadto flagi-b cookies.txt
i-c cookies.txt
obsługują pliki cookie z-b
wysyłaniem plików cookie i-c
lokalnym przechowywaniem plików cookie.Podręcznik zawiera więcej przykładów metod uwierzytelniania .
źródło
Możesz użyć polecenia typu
Następnie uruchomione zostanie hasło HTTP.
Odniesienie: http://www.asempt.com/article/how-use-curl-http-password-protected-site
źródło
Najbezpieczniejszym sposobem przekazywania poświadczeń do zwijania jest monit o ich wprowadzenie. Tak się dzieje po przekazaniu nazwy użytkownika, jak sugerowano wcześniej (
-u USERNAME
).Ale co jeśli nie możesz przekazać nazwy użytkownika w ten sposób? Na przykład nazwa użytkownika może być częścią adresu URL, a tylko hasło należy do ładunku Json.
tl; dr: Oto jak bezpiecznie używać curl w tym przypadku:
read
wyświetli monit o podanie zarówno nazwy użytkownika, jak i hasła z wiersza poleceń, i zapisze przesłane wartości w dwóch zmiennych, które mogą być odniesieniami w kolejnych poleceniach, a na końcu zostaną cofnięte.Omówię, dlaczego inne rozwiązania nie są idealne.
Dlaczego zmienne środowiskowe są niebezpieczne?
Dlaczego wpisywanie go bezpośrednio w wierszu polecenia jest niebezpieczne, ponieważ Twój sekret jest następnie widoczny dla każdego innego uruchomionego użytkownika,
ps -aux
ponieważ zawiera listę poleceń przesłanych dla każdego aktualnie uruchomionego procesu. Także dlatego, że twoja secrte kończy się w historii bash (po zakończeniu powłoki).Dlaczego umieszczenie go w pliku lokalnym jest niebezpieczne Ścisłe ograniczenie dostępu do pliku POSIX może zmniejszyć ryzyko w tym scenariuszu. Jest to jednak nadal plik w systemie plików, niezakodowany w spoczynku.
źródło
Miałem taką samą potrzebę w bash (Ubuntu 16.04 LTS), a polecenia podane w odpowiedziach nie działały w moim przypadku. Musiałem użyć:
Podwójne cudzysłowy w
-F
argumentach są potrzebne tylko wtedy, gdy używasz zmiennych, więc z wiersza poleceń... -F 'username=myuser' ...
będzie dobrze.Ważne informacje dotyczące bezpieczeństwa: jak wskazuje Mark Ribau w komentarzach, polecenie to pokazuje hasło (zmienna $ PASS, rozwinięta) na liście procesów!
źródło
Jeśli korzystasz z systemu z aplikacją kluczy Gnome, rozwiązaniem, które pozwala uniknąć bezpośredniego ujawnienia hasła, jest użycie pliku gkeyring.py w celu wyodrębnienia hasła z klucza :
źródło
To DUŻO więcej, niż wymagał PO, ale ponieważ jest to najlepszy wynik dla bezpiecznego przekazywania haseł
curl
, dodam te rozwiązania tutaj dla innych, którzy przyjeżdżają tutaj, szukając tego.UWAGA:
-s
arg dlaread
polecenia nie jest POSIX, więc nie jest dostępny wszędzie, więc nie będzie używany poniżej. Użyjemystty -echo
istty echo
zamiast tego.UWAGA: Wszystkie poniższe zmienne bash mogą być zadeklarowane jako lokalne, jeśli są w funkcji, a nie są rozbrojone.
UWAGA:
perl
jest dość ogólnie dostępny na wszystkich systemach, które wypróbowałem, ponieważ jest zależny od wielu rzeczy, podczas gdyruby
ipython
nie są, więc używajperl
tutaj. Jeśli możesz zagwarantowaćruby
/python
gdzie to robisz, możesz zastąpićperl
polecenie ich odpowiednikiem.UWAGA: Przetestowano w
bash
3.2.57 na macOS 10.14.4. Niektóre małe tłumaczenia mogą być wymagane w przypadku innych powłok / instalacji.Bezpiecznie poproś użytkownika o podanie hasła (wielokrotnego użytku) w celu zwijania. Jest to szczególnie przydatne, jeśli trzeba wywoływać curl wiele razy.
W przypadku nowoczesnych powłok, w których
echo
jest wbudowany (sprawdź przezwhich echo
):Dla starszych powłok, gdzie
echo
jest coś takiego/bin/echo
(gdzie cokolwiek echo można zobaczyć na liście procesów):TA WERSJA NIE MOŻE PONOWNIE UŻYĆ HASŁA , patrz niżej.
Jeśli potrzebujesz tymczasowo zapisać hasło do pliku, użyj go ponownie dla wielu poleceń przed jego wyczyszczeniem (powiedz, ponieważ używasz funkcji do ponownego użycia kodu i nie chcesz powtarzać kodu i nie możesz przekazać wartość przez echo). (Tak, są nieco wymyślone, patrząc w tej formie, nie będąc funkcjami w różnych bibliotekach; Próbowałem zredukować je do minimalnego kodu potrzebnego do jego wyświetlenia.)
Gdy echo jest wbudowane (jest to szczególnie wymyślone, ponieważ echo jest wbudowane, ale zapewnia kompletność):
Kiedy echo jest jak
/bin/echo
:źródło