Gebruik je cURL met een gebruikersnaam en wachtwoord?

Ik wil toegang tot een URL waarvoor een gebruikersnaam/wachtwoord vereist is. Ik zou graag proberen toegang te krijgen met curl. Op dit moment doe ik iets als:

curl http://api.somesite.com/test/blah?something=123

Ik krijg een foutmelding. Ik denk dat ik een gebruikersnaam en wachtwoord moet opgeven samen met de bovenstaande opdracht.

Hoe kan ik dat doen?


Antwoord 1, autoriteit 100%

Gebruik de -uvlag om een gebruikersnaam op te nemen, en curl zal om een wachtwoord vragen:

curl -u username http://example.com

Je kunt ook het wachtwoord in de opdracht opnemen, maar dan is je wachtwoord zichtbaar in de bash-geschiedenis:

curl -u username:password http://example.com

Antwoord 2, autoriteit 39%

Het is veiliger om te doen:

curl --netrc-file my-password-file http://example.com

…omdat het een slecht idee is om een gewone gebruiker/wachtwoordreeks op de opdrachtregel door te geven.

De indeling van het wachtwoordbestand is (volgens man curl):

machine <example.com> login <username> password <password>

Opmerking:

  1. De machinenaam mag geenbevatten https://of iets dergelijks! Alleen de hostnaam.
  2. De woorden ‘machine‘, ‘login‘ en ‘password‘ zijn slechts trefwoorden; de eigenlijke informatie is het spul na die zoekwoorden.

Antwoord 3, autoriteit 11%

Of hetzelfde maar een andere syntaxis

curl http://username:[email protected]/test/blah?something=123

Antwoord 4, autoriteit 8%

U kunt de gebruikersnaam ook gewoon door te schrijven:

curl -u USERNAME http://server.example

Curl zal u dan om het wachtwoord vragen en het wachtwoord zal niet zichtbaar zijn op het scherm (of als u de opdracht moet kopiëren/plakken).


Antwoord 5, autoriteit 4%

Om het wachtwoord veilig in een script door te geven (d.w.z. te voorkomen dat het wordt weergegeven met ps auxf of logs), kunt u dit doen met de -K- vlag (lees configuratie van stdin) en een heredoc:

curl --url url -K- <<< "--user user:password"

Antwoord 6, autoriteit 2%

Gewoonlijk wordt het CURL-commando aangeduid als

curl https://example.com\?param\=ParamValue -u USERNAME:PASSWORD

Als u geen wachtwoord heeft of de opdrachtprompt wilt overslaan om om een wachtwoord te vragen, laat u het wachtwoordgedeelte leeg.

d.w.z. curl https://example.com\?param\=ParamValue -u USERNAME:


Antwoord 7, autoriteit 2%

curl -X GET -u username:password  {{ http://www.example.com/filename.txt }} -O

Antwoord 8

vrij eenvoudig, doe het onderstaande:

curl -X GET/POST/PUT <URL> -u username:password

Antwoord 9

Om het wachtwoord in ieder geval niet te laten verschijnen in je .bash_history:

curl -u user:$(cat .password-file) http://example-domain.tld

Antwoord 10

Andere antwoorden hebben netrc voorgesteld om gebruikersnaam en wachtwoord op te geven, op basis van wat ik heb gelezen, ga ik akkoord. Hier zijn enkele syntaxisdetails:

https://ec.haxx.se/usingcurl-netrc.html

Net als andere antwoorden, wil ik de noodzaak benadrukken om aandacht te besteden aan beveiliging met betrekking tot deze vraag.

Hoewel ik geen expert ben, vond ik deze links inzichtelijk:

https://ec.haxx.se/cmdline-passwords.html

Om samen te vatten:

Het gebruik van de versleutelde versies van de protocollen(HTTPS vs HTTP) (FTPS vs FTP) kan netwerklekkage helpen voorkomen.

Het gebruik van netrckan lekkage van de opdrachtregel helpen voorkomen.

Om nog een stap verder te gaan, het lijkt erop dat je de netrc-bestanden ook kunt versleutelen met gpg

https://brandur.org/fragments/gpg-curl

Hiermee worden uw inloggegevens niet “in rust” (opgeslagen) als platte tekst.


Antwoord 11

U kunt een commando gebruiken zoals,

curl -u user-name -p http://www.example.com/path-to-file/file-name.ext > new-file-name.ext

Dan wordt het HTTP-wachtwoord geactiveerd.

Referentie:
http://www.asempt.com/article/how -use-curl-http-password-protected-site


Antwoord 12

Ik had dezelfde behoefte in bash (Ubuntu 16.04 LTS) en de opdrachten in de antwoorden werkten in mijn geval niet. Ik moest gebruiken:

curl -X POST -F 'username="$USER"' -F 'password="$PASS"' "http://api.somesite.com/test/blah?something=123"

Dubbele aanhalingstekens in de -F-argumenten zijn alleen nodig als je variabelen gebruikt, dus vanaf de opdrachtregel ... -F 'username=myuser' ...komt goed.

Relevante beveiligingskennisgeving: als Mr. Mark Ribauwijst in opmerkingen dit commando toont het wachtwoord ($PASS variabele, uitgevouwen) in de proceslijst!


Antwoord 13

De meest veilige manier zou zijn om omgevingsvariabelen te gebruiken om uw inloggegevens op te slaan/op te halen. Dus een curl-commando zoals:

curl -Lk -XGET -u "${API_USER}:${API_HASH}" -b cookies.txt -c cookies.txt -- "http://api.somesite.com/test/blah?something=123"

Zou dan je rustgevende api aanroepen en de http WWW_Authentication-header doorgeven met de Base64-gecodeerde waarden van API_USERen API_HASH. De -Lkvertelt curl gewoon om http 30x omleidingen te volgen en onveilige tls-afhandeling te gebruiken (dwz negeer SSL-fouten). Terwijl de dubbele --gewoon bash-syntaxissuiker is om de verwerking van opdrachtregelvlaggen te stoppen. Bovendien verwerken de vlaggen -b cookies.txten -c cookies.txtcookies waarbij -bcookies verzendt en -ccookies lokaal opslaan.

De handleiding bevat meer voorbeelden van authenticatie-methoden.


Antwoord 14

De veiligste manier om inloggegevens door te geven aan curl, is door gevraagd te worden ze in te voegen. Dit is wat er gebeurt bij het doorgeven van de gebruikersnaam zoals eerder gesuggereerd (-u USERNAME).

Maar wat als je de gebruikersnaam op die manier niet kunt doorgeven?
De gebruikersnaam moet bijvoorbeeld deel uitmaken van de url en alleen het wachtwoord moet deel uitmaken van een json-payload.

tl;dr:
Zo gebruik je curl in dit geval veilig:

read -p "Username: " U; read -sp "Password: " P; curl --request POST -d "{\"password\":\"${P}\"}" https://example.com/login/${U}; unset P U

readvraagt om zowel de gebruikersnaam als het wachtwoord vanaf de opdrachtregel, en slaat de ingediende waarden op in twee variabelen die referenties kunnen zijn in volgende opdrachten en uiteindelijk worden uitgeschakeld.

Ik ga uitleggen waarom de andere oplossingen niet ideaal zijn.

Waarom zijn omgevingsvariabelen onveilig

  1. Toegangs- en belichtingsmodus van de inhoud van een omgevingsvariabele, kan niet worden gevolgd (PS -EWW), aangezien de omgeving impliciet beschikbaar is voor een proces
  2. Vaak pakken apps de hele omgeving en loggen het voor foutopsporing of bewakingsdoeleinden (soms op logbestanden plain-tekst op schijf, vooral na een app crasht)
  3. Milieuvariabelen worden doorgegeven aan kinderprocessen (daarom het beginsel van de minst privilege)
  4. Het behoud van ze is een probleem: nieuwe ingenieurs weten niet dat ze er zijn en zijn zich niet bewust van eisen om hen heen – bijvoorbeeld om ze niet door te geven aan subprocessen – sinds ze niet worden afgedwongen of gedocumenteerd.

Waarom is het onveilig om het rechtstreeks in een opdracht op de opdrachtregel te typen
Omdat uw geheim dan ook zichtbaar is door een andere gebruiker die ps -auxwordt uitgevoerd, aangezien deze opdrachten zijn ingediend voor elk actief proces.
Ook omdat uw SECTE vervolgens eindigt in de bashgeschiedenis (zodra de schaal eindigt).

Waarom is het onveilig om het op te nemen in een lokaal bestand
Strikte Posix-toegangsbeperking op het bestand kan het risico in dit scenario verzachten. Het is echter nog steeds een bestand op uw bestandssysteem, niet-versleuteld in rust.


Antwoord 15

In sommige API werkt het misschien niet (zoals Rabbitmq).

Er is alternatief:

curl http://username:[email protected]
curl http://admin:[email protected]

Antwoord 16

Als u op een systeem hebt dat een GNOME-sleutelring-app heeft, is een oplossing die niet wordt blootgesteld aan het blootstellen van het wachtwoord is het gebruik van gkeyring. py om het wachtwoord uit de sleutelring te extraheren:

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

Antwoord 17

Dit is veel meer dan het OP Vraag om, maar aangezien dit een topresultaat is voor veilig doorgeven van wachtwoorden naar curl, voeg ik deze oplossingen hier voor anderen aan die hier naartoe aankomen.


OPMERKING: -sARG VOOR readOpdracht is niet POSIX, en dus is niet overal beschikbaar, dus het zal niet hieronder worden gebruikt. We gebruiken stty -echoen stty echoin plaats daarvan.

OPMERKING: Alle BASH-variabelen hieronder kunnen in plaats daarvan worden gedeclareerd als locals als in een functie, in plaats van het ongedaan maken.

OPMERKING: perlis vrij algemeen beschikbaar op alle systemen die ik heb geprobeerd, omdat het een afhankelijkheid is voor veel dingen, terwijl rubyen pythonzijn niet, dus met perlhier. Als u kunt garanderen ruby/ pythonWaar u dit doet, kunt u de perlopdracht vervangen door hun equivalent.

Opmerking: getest in bash3.2.57 op MacOS 10.14.4. Sommige kleine vertaling is mogelijk vereist voor andere schelpen / installaties.


Vraag een gebruiker veilig voor een (herbruikbaar) wachtwoord om door te gaan naar krullen. Bijzonder handig als u meerdere keren curl wilt bellen.

Voor moderne schelpen, waar echois een ingebouwde (cheque via 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

Voor oudere schelpen, waar echozoiets is als /bin/echo(waar het ook echos te zien is in de proceslijst):
Deze versie kan het wachtwoord niet hergebruiken, zie in plaats daarvan naar beneden.

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


Als u toevallig het wachtwoord tijdelijk naar een bestand wilt opslaan, om het opnieuw te gebruiken voor meerdere opdrachten voordat u het opruimt (zeg omdat u functies gebruikt voor het hergebruik van de code opnieuw kan de waarde niet via echo passeren). (Ja, deze zijn een beetje bekeken in deze vorm die niet functioneert in verschillende bibliotheken; ik probeerde ze te verminderen naar de minimumcode die nodig is om het te laten zien.)

Wanneer ECHO ingebouwd is (dit is vooral gekunsteld, aangezien Echo een ingebouwde, maar is voorzien in volledigheid):

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

Wanneer echo zoiets is als /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

Other episodes