Îmi doresc să acceseze un URL care necesită un nume de utilizator/parolă. Am'd place să încercați să accesați cu curl. Acum am'm a face ceva de genul:
curl http://api.somesite.com/test/blah?something=123
Primesc o eroare. Cred că trebuie să specificați un nume de utilizator și parolă, împreună cu comanda de mai sus.
Cum pot face asta?
Folosi -u
de pavilion pentru a include un nume de utilizator, și curl va solicita o parolă:
curl -u username http://example.com
Puteți include, de asemenea, parola de la comanda, dar apoi parola va fi vizibil în bash istorie:
curl -u username:password http://example.com
Este mai sigur să faci:
curl --netrc-file my-password-file http://example.com
...ca trece simplu utilizator/parola șir pe linia de comandă este o idee rea.
Formatul de fișier parola este (ca pe om răsuci
):
machine <example.com> login <username> password <password>
Notă:
', '
login`', iar ' "parola" ' sunt doar cuvinte cheie; informațiile reale este chestii dupa acele cuvinte cheie.Sau acelasi lucru dar sintaxă diferită
curl http://username:[email protected]/test/blah?something=123
Pentru a transmite în siguranță parola într-un script (de exemplu, o împiedică să apară cu ps auxf sau busteni), o poti face cu a -K - flag (citit de configurare de la stdin) și un heredoc:
curl --url url -K- <<< "--user user:password"
curl -X GET -u username:password {{ http://www.example.com/filename.txt }} -O
De obicei, se RĂSUCI de comandă se referă la ca
curl https://example.com\?param\=ParamValue -u USERNAME:PASSWORD
dacă tu nu't au nici o parolă sau doriți să săriți peste linia de comandă la cerere pentru parola simplu lăsați parola secțiune goală.
de exemplu curl https://example.com\?param\=ParamValue -u USERNAME:
Pur și simplu pune cel mai sigur mod ar fi de a utiliza variabile de mediu pentru a stoca/prelua acreditările. Astfel o buclă de comandă, cum ar fi:
curl -Lk -XGET -u "${API_USER}:${API_HASH}" -b cookies.txt -c cookies.txt -- "http://api.somesite.com/test/blah?something=123"
Apoi ar apela api odihnitor și să treacă http WWW_Authentication
antet cu Base64 codificat-valori de API_USER " și " API_HASH. A
-Lkdoar spune răsuci să urmeze http 30x redirecționează și de a folosi nesigur tls manipulare (ie ignora erori ssl). În timp ce la dublu
--este doar bash sintaxa zahăr pentru a opri procesarea liniei de comandă steaguri. În plus,
- b cookies.txt " și " - c cookies.txt steaguri ocupe de cookie-uri cu -b
trimiterea cookie-urile și -c
stocheze cookie-uri pe plan local.
Manualul are mai multe exemple de autentificare metode.
Alte răspunsuri au sugerat netrc pentru a specifica numele de utilizator și parola, bazat pe ceea ce am'am citit, sunt de acord. Aici sunt unele sintaxa detalii:
https://ec.haxx.se/usingcurl-netrc.html
Ca și alte răspunsuri, aș dori să subliniez necesitatea de a acorda o atenție la securitate cu privire la această întrebare.
Deși eu nu sunt un expert, am gasit aceste link-uri eficiente:
https://ec.haxx.se/cmdline-passwords.html
Pentru a rezuma:
Folosind versiunile criptate ale protocoalelor (HTTPS vs HTTP) (FTPS vs FTP) poate ajuta la evitarea Rețeaua de Scurgere.
Folosind netrc poate ajuta la evitarea Linie de Comandă de Scurgere.
Să mergem un pas mai departe, se pare că puteți cripta, de asemenea, netrc fișiere folosind gpg
https://brandur.org/fragments/gpg-curl
Cu acest acreditările nu sunt "la restul" (stocate) ca text simplu.
Cel mai sigur mod de a trece de acreditare curl este să vi se solicite să introduceți-le. Aceasta este ceea ce se întâmplă atunci când trece numele de utilizator cum a sugerat mai devreme (-u USERNAME
).
Dar ce se întâmplă dacă puteți't trece numele de utilizator așa? De exemplu, numele de utilizator ar putea avea nevoie să fie parte a url-ul și doar parola să fie parte dintr-un json utilă.
tl;dr: Acesta este modul de a folosi curl în condiții de siguranță în acest caz:
read -p "Username: " U; read -sp "Password: " P; curl --request POST -d "{\"password\":\"${P}\"}" https://example.com/login/${U}; unset P U
"citește" va solicita atât pentru numele de utilizator și parola din linia de comandă, și de a stoca valorile prezentate în două variabile care pot fi trimiterile din comenzile următoare și în cele din urmă unset.
Am'm va elabora pe ce alte soluții nu sunt ideale.
De ce sunt variabilele de mediu nesigur
De ce este periculos să tastați într-o comandă în linia de comandă direct
Pentru că secretul apoi sfârșește prin a fi vizibile de către orice alt utilizator care rulează ps-aux
din care listează comenzile prezentate pentru fiecare proces care rulează în prezent.
De asemenea, pentru că secrte apoi se termină în bash istorie (după coajă se termină).
De ce este periculos să-l includă într-un fișier local Strict POSIX restricție de acces la fișier poate reduce riscul în acest scenariu. Cu toate acestea, este încă un fișier de pe sistemul de fișiere, necriptat la restul.
Am avut aceeași nevoie în bash (Ubuntu 16.04 LTS) și comenzile furnizate în răspunsurile nu a reușit să funcționeze în cazul meu. Am avut de a utiliza:
curl -X POST -F 'username="$USER"' -F 'password="$PASS"' "http://api.somesite.com/test/blah?something=123"
Ghilimele duble în -F
argumente sunt necesare doar daca're folosind variabile, astfel de la linia de comandă ... -F 'utilizator=myuser' ...
va fi bine.
Securitate relevante Observație: ca Domnul Mark Ribau puncte în comentarii această comandă afișează parola ($PASS variabil, extins) în processlist!
Dacă sunteți pe un sistem care are chei Gnome app o soluție care evită expunerea parola direct este de a utiliza gkeyring.py pentru a extrage parola de la breloc:
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
Acest lucru este MULT mai mult decât OP cerut, dar din moment ce acest lucru este un rezultat de top pentru a trece în siguranță parolele pentru curl
a, I'm adăugarea acestor soluții aici pentru alții care vin aici în căutarea pentru asta.
NOTĂ: -s
arg pentru a "citi" comanda nu este POSIX, și deci nu este disponibil peste tot, așa că a câștigat't fi folosit de mai jos. Vom folosi stty -ecou " și " stty echo
în loc.
NOTĂ: Toate bash variabile de mai jos ar putea fi, în schimb a declarat ca localnicii dacă într-o funcție, mai degrabă decât de dezactivare.
NOTĂ: perl
este destul de general disponibile pe toate sistemele de am'am incercat din cauza aceasta fiind o dependență pentru multe lucruri, întrucât "ruby" și "pitonul" nu sunt, deci, folosind perl
aici. Dacă vă pot garanta "ruby" /python
unde're face acest lucru, puteți înlocui perl
comanda cu echivalentul lor.
NOTĂ: Testat în bash
3.2.57 pe macOS 10.14.4. Unele mici traducere poate fi necesară pentru alte scoici/instalări.
Sigur prompt de un utilizator pentru o (reutilizabile) parola pentru a trece la curl. Deosebit de util dacă aveți nevoie pentru a apela răsuci de mai multe ori.
Pentru moderne de scoici, unde "echo" este un built-in (verificare prin care echo`):
url='https://example.com' printf "Utilizator: " citi numele de utilizator printf "Parola: " stty -echo # dezactivează ecou de intrare de utilizator, POSIX echivalent pentru 'citeste -s' citește trece printf "\n" # avem nevoie pentru a muta linia mai departe stty echo # re-activa ecou de intrare de utilizator echo ${treacă} | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K- unset de utilizator unset trece
Pentru mai în vârstă scoici, unde "echo" este ceva de genul /bin/echo
(în cazul în care orice echos poate fi văzut în lista de proces):
ACEASTĂ VERSIUNE NU REUTILIZAȚI PAROLA, a se vedea mai jos în loc.
url='https://example.com' printf "Utilizator: " citi numele de utilizator printf "Parola: " stty -echo # dezactivează ecou de intrare de utilizator, POSIX echivalent pentru 'citeste -s' perl-e ' mea $val=<STDIN>; chomp $val; print STDERR "\n"; # avem nevoie pentru a muta linia înainte, dar nu trimite un newline pe teava print $val; ' | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K- stty echo # re-activa ecou de intrare de utilizator unset de utilizator
Dacă se întâmplă să nevoie pentru a stoca temporar parola într-un fișier, pentru a-l re-folosi pentru mai multe comenzi înainte de compensare (spun pentru că're folosind funcții pentru codul de re-utilizare și don't doriți să repetați codul și poate't trece valoarea în jurul valorii de prin ecou). (Da, sunt un pic contrived căutarea în acest formular nu sunt funcții, în diferite biblioteci; am încercat să le reducă la minimum codul necesar să-l arate.)
Când echo este construit-in (acest lucru este deosebit de contrived, deoarece echo este un built-in, dar cu condiția de exhaustivitate): `` url='https://example.com' filepath="$(mktemp)" # cale aleatoriu, citite doar de către utilizatorul curent printf "Utilizator: " citi numele de utilizator printf "Parola: " stty -echo # dezactivează ecou de intrare de utilizator, POSIX echivalent pentru 'citeste -s' citește trece echo "${treacă}" > "${filepath}" unset trece printf "\n" # avem nevoie pentru a muta linia mai departe stty echo # re-activa ecou de intrare de utilizator
pisica "${filepath}" | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-
rm "${filepath}" nu't uita pentru a șterge fișierul atunci când ați terminat!! unset de utilizator ``
Când echo este ceva de genul /bin/echo
:
``
url='https://example.com'
filepath="$(mktemp)" # cale aleatoriu, citite doar de către utilizatorul curent
printf "Utilizator: "
citi numele de utilizator
printf "Parola: "
stty -echo # dezactivează ecou de intrare de utilizator, POSIX echivalent pentru 'citeste -s'
$(perl-e '
mea $val=
pisica "${filepath}" | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-
rm "${filepath}" nu't uita pentru a șterge fișierul atunci când ați terminat!! unset de utilizator ``