उपयोगकर्ता नाम और पासवर्ड के साथ cURL का उपयोग कर रहे हैं?


465

मैं एक URL का उपयोग करना चाहता हूं जिसके लिए उपयोगकर्ता नाम / पासवर्ड की आवश्यकता है। मैं इसे कर्ल के साथ एक्सेस करने की कोशिश करना चाहता हूं। अभी मैं कुछ ऐसा कर रहा हूं:

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

मुझे एक त्रुटि मिलती है। मुझे लगता है कि मुझे उपरोक्त आदेश के साथ एक उपयोगकर्ता नाम और पासवर्ड निर्दिष्ट करने की आवश्यकता है।

मैं उसे कैसे कर सकता हूँ?

जवाबों:


692

-uउपयोगकर्ता नाम शामिल करने के लिए ध्वज का उपयोग करें , और पासवर्ड के लिए कर्ल संकेत देगा:

curl -u username http://example.com

आप पासवर्ड को कमांड में भी शामिल कर सकते हैं, लेकिन फिर आपका पासवर्ड बैश इतिहास में दिखाई देगा:

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

109
ध्यान दें कि यदि आप कंसोल से ऐसा करते हैं तो पासवर्ड इतिहास में रहेगा जो गलत है ... गलत है। आपको बस -u उपयोगकर्ता को निर्दिष्ट करना चाहिए और CURL आपको नो-ईको मोड में पासवर्ड मांगेगा।
क्रिस्टियन व्रेबी

25
@CristianVrabie तकनीकी रूप से सही है, लेकिन अगर आप इसे एक स्वचालित स्क्रिप्ट से चला रहे हैं जो प्रॉम्प्ट की अनुमति नहीं देती है। उस समस्या के समाधान के बारे में उत्सुक होंगे।
Ligemer

26
@OmarOthman यदि आप एक स्क्रिप्ट से कर्ल चला रहे हैं, तो क्रेडेंशियल (स्पष्ट रूप से) आपके इतिहास में समाप्त नहीं होंगे, लेकिन वे ps (1) में दिखाई देंगे। तय:print -- '-u username:password' > somewhere && curl -K somewhere http://...
बस किसी

7
@Jay पर्यावरण चर का मूल्यांकन कमांड निष्पादन से पहले किया जाएगा। पासवर्ड अभी भी पीएस आउटपुट में दिखाई देगा।
रॉबर्ट वॉन

8
बिंदु पर विश्वास करने के लिए नहीं, लेकिन मेरा मानना ​​है कि मेरा उत्तर ( stackoverflow.com/a/27894407/758174 अर्थात उपयोग करना --netrc-file) अधिक सुरक्षित है। यह पासवर्ड को इतिहास, पीएस, आपकी लिपि इत्यादि से बाहर रखता है। यह एकमात्र ऐसा रूप है जिसका उपयोग मैं अपनी सभी लिपियों में और सभी प्रमाणित कृतियों के लिए करता हूं curl
पियरे डी

251

यह करना अधिक सुरक्षित है:

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

... कमांड लाइन पर एक सादे उपयोगकर्ता / पासवर्ड स्ट्रिंग पास करने के रूप में, एक बुरा विचार है।

पासवर्ड फ़ाइल का प्रारूप इस प्रकार है man curl:

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

ध्यान दें:

  1. मशीन नाम में शामिल या समान नहीं होना चाहिए https://! बस होस्टनाम।
  2. शब्द ' machine', ' login' और ' password' ' ' केवल खोजशब्द हैं; वास्तविक जानकारी उन कीवर्ड के बाद सामान है।

10
हाँ, यह प्रक्रिया लिस्टिंग और कमांड इतिहास से पासवर्ड को बाहर रखता है। ऐसा करने के लिए बहुत बेहतर तरीका है, और केवल थोड़ा और काम :)
एसी केपहर्ट

8
यह निश्चित रूप से स्वीकृत उत्तर होना चाहिए; कमांड-लाइन पर पासवर्ड एक भयानक अभ्यास है। (और यह एक व्यापक रूप से ज्ञात तथ्य है।)
एलएलआईओटीकेटीबल

6
आप फ़ाइल या मानक इनपुट के माध्यम से झंडे का उपयोग कर सकते हैं -K <file>या --config <file>कर्ल झंडे प्राप्त कर सकते हैं । (चेतावनी: भ्रमित होने -kया नहीं --insecure!)
रफ़लविंड

2
यह कर्ल विधि इतिहास और प्रक्रिया की स्थिति से बाहर क्रेडेंशियल्स रखती है, लेकिन उपयोगकर्ता नाम-पासवर्ड-फ़ाइल में क्लीयरटेक्स्ट में उपयोगकर्ता नाम और पासवर्ड छोड़ देती है, जिससे एक और हमला वेक्टर बन जाता है - इतिहास फ़ाइल में जानकारी होने की तुलना में बदतर: बैश, उदाहरण के लिए, स्वचालित रूप से अनुमतियों को प्रतिबंधित करता है इतिहास फ़ाइल के। यदि उपयोगकर्ता स्क्रिप्ट / पासवर्ड सेट करने के लिए स्क्रिप्ट के साथ पर्यावरण चर का उपयोग करता है तो एक समान समस्या उत्पन्न होती है। यदि स्क्रिप्ट सुरक्षित नहीं है, तो न तो क्रेडेंशियल हैं।
स्टीवन आसानी से इस्तेमाल होने वाली

5
@SteventheEasilyAmused मैं असहमत हूं, स्पष्ट .netrcरूप से सख्त अनुमतियों के साथ क्लीयरटेक्स्ट फ़ाइल का उपयोग करना बेहतर है , इसलिए केवल आपका उपयोगकर्ता इसे पढ़ सकता है, अन्य तंत्र (जैसे कमांड लाइन आर्ग्स) की तुलना में जो अन्य उपयोगकर्ताओं को जानकारी पढ़ने देता है।
केन विलियम्स

76

या एक ही बात लेकिन अलग वाक्यविन्यास

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

1
मैं उस वाक्य रचना का उपयोग करता हूं, क्योंकि बहुत अधिक स्थितियों में इसका उपयोग किया जा सकता है। जैसे कि कोई cURL और कोई wGet के साथ Windows cmd से, का उपयोग कर start "" "http://username:password@api.somesite.com/test/blah?something=123"। इसे कहीं से भी लॉन्च किया जा सकता है। यह भी ftp
logins

8
आपको URL को उपयोगकर्ता नाम और पासवर्ड का उपयोग करके मजाकिया अक्षरों का उपयोग करना चाहिए
diachedelic

2
मुझे पता है कि ज्यादातर लोग यूआरएल में पासवर्ड (या यहां तक ​​कि उपयोगकर्ता नाम) को इस तरह से नहीं जानते हैं क्योंकि यह सूंघना आसान है। उस के साथ कहा; मैं इसे अनधिकृत नहीं करता, लेकिन केवल तभी उपयोग करता हूं जब आप जानते हैं कि आप क्या कर रहे हैं।
14

1
यह suuuuuper पुरातन है और इसका उपयोग नहीं किया जाना चाहिए । यह एफ़टीपी दिनों से है: o
Qix - MONICA WIST MISTREATED

2
दुर्भाग्य से, यह प्रक्रिया सूची में दिखाई देने वाले पासवर्ड को छोड़ देता है।
मार्क रिबॉ सेप

63

आप केवल उपयोगकर्ता का नाम लिखकर भी भेज सकते हैं:

curl -u USERNAME http://server.example

कर्ल तब आपसे पासवर्ड मांगेगा, और पासवर्ड स्क्रीन पर दिखाई नहीं देगा (या यदि आपको कमांड को कॉपी / पेस्ट करने की आवश्यकता है)।


27

किसी स्क्रिप्ट में पासवर्ड को सुरक्षित रूप से पास करने के लिए (यानी इसे ps auxf या लॉग के साथ दिखाने से रोकें) आप इसे -K- फ्लैग (स्टड से कॉन्फिग पढ़ें) और एक हेरेडोक के साथ कर सकते हैं:

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

2
--configविकल्प (-K) के संदर्भ के लिए धन्यवाद ... संभवतः एक बेहतर समाधान एक फ़ाइल में "--user उपयोगकर्ता: पासवर्ड" डालना होगा और बस -K the fileइसलिए आपके पास पासवर्ड की केवल एक प्रति है, बल्कि प्रत्येक स्क्रिप्ट में एक प्रति है । एक फ़ाइल को सुरक्षित करने के लिए बहुत आसान है।
क्रिस कॉगडन

1
इसी तरह का विकल्प, जहां फ़ाइल में केवल पासवर्ड है cat "${password_filepath}" | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-:। मुझे -K-पुराने macOS बैश, YMMV के लिए url के सामने रखना पड़ा ।
मार्क रिबाऊ

12

आमतौर पर CURL कमांड के रूप में जाना जाता है

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

यदि आपके पास कोई पासवर्ड नहीं है या पासवर्ड प्रॉम्प्ट के लिए कमांड प्रॉम्प्ट को छोड़ना चाहते हैं तो पासवर्ड सेक्शन को खाली छोड़ दें।

अर्थात curl https://example.com\?param\=ParamValue -u USERNAME:


1
नोट: पासवर्ड शेल इतिहास और प्रक्रिया सूची में दिखाई देगा।
मार्क रिबॉ सेप


8

पासवर्ड कम से कम अपने में न भरने दें .bash_history:

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

6
इस स्थिति में, पासवर्ड अभी भी प्रक्रिया सूची में समाप्त हो जाएगा, उदाहरण के लिए यह ps auxw |grep curlसही समय पर किसी को दिखाई दे रहा है । इसी तरह, पासवर्ड लॉग किया जाएगा यदि रन के माध्यम सेsudo
एडम काट्ज़

1
इस पद्धति के साथ पासवर्ड तब एक फ़ाइल (.password-file) में मौजूद होता है जो कि .bash इतिहास से अधिक असुरक्षित हो सकता है। इसके बारे में अच्छी बात यह है कि यह केवल पासवर्ड है - URL और उपयोगकर्ता नाम .password-file में लीक नहीं हुए हैं।
स्टीवन आसानी से इस्तेमाल होने वाली

7

बहुत आसान है, नीचे करें:

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

प्रश्न पर सुरक्षा की कोई आवश्यकता नहीं है
विक्टर पोलो डी गिवेस मोनटेरो

1
नोट: पासवर्ड शेल इतिहास और प्रक्रिया सूची में दिखाई देगा
मार्क रिबाउ

6

अन्य उत्तरों ने यूजरनेम और पासवर्ड निर्दिष्ट करने के लिए netrc का सुझाव दिया है, जो मैंने पढ़ा है, उसके आधार पर मैं सहमत हूं। यहाँ कुछ वाक्यविन्यास विवरण हैं:

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

अन्य उत्तरों की तरह, मैं इस प्रश्न के संबंध में सुरक्षा पर ध्यान देने की आवश्यकता पर बल देना चाहूंगा।

हालांकि मैं एक विशेषज्ञ नहीं हूं, मुझे ये कड़ियाँ बहुत सुखद लगीं:

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

संक्षेप में:

प्रोटोकॉल के एन्क्रिप्टेड संस्करणों (HTTPS बनाम HTTP) (FTPS vs FTP) का उपयोग करके नेटवर्क रिसाव से बचने में मदद मिल सकती है।

Netrc का उपयोग कमांड लाइन रिसाव से बचने में मदद कर सकता है।

एक कदम आगे जाने के लिए, ऐसा लगता है कि आप gpg का उपयोग करके netrc फ़ाइलों को एन्क्रिप्ट कर सकते हैं

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

इसके साथ आपके क्रेडेंशियल सादे पाठ के रूप में "आराम पर" (संग्रहीत) नहीं हैं।


5

प्लेन और बस सबसे सुरक्षित तरीका यह होगा कि आप अपने क्रेडेंशियल्स को स्टोर / रिकवर करने के लिए पर्यावरण चर का उपयोग करें। इस प्रकार एक कर्ल आदेश:

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

तब आप अपने बाकी के एप को कॉल करेंगे और http पास करेंगे WWW_Authentication बेस हेडर के इनकोडिंग मानों के साथ हेडरAPI_USER और API_HASH-Lkबस कर्ल http 30x रीडायरेक्ट पालन करने के लिए और हैंडलिंग असुरक्षित TLS का उपयोग करने के लिए कहता है (यानी ssl त्रुटियों को अनदेखा)। जबकि डबल --कमांड कमांड झंडे को संसाधित करने से रोकने के लिए सिर्फ बैश सिंटैक्स चीनी है। इसके अलावा, -b cookies.txtऔर -c cookies.txtझंडे कुकीज़ को स्थानीय रूप से कुकीज़ -bभेजने और कुकीज़ को -cरखने के साथ संभालते हैं ।

मैनुअल में प्रमाणीकरण विधियों के अधिक उदाहरण हैं


1
इस बात को ध्यान में रखें कि "-Lk" का उपयोग आपको मानव-में-मध्य (MITM) हमलों के लिए खोल सकता है, इसलिए उस विकल्प के साथ सावधानी बरतें।
ग्यूपैडपॉक

4
यह काम नहीं करता है ... चूंकि बैश आपके लिए उन चरों को विस्तारित करता है, इसलिए विस्तार प्रक्रिया सूची में दिखाई देता है।
क्रिस कॉगडन


4

कर्ल को क्रेडेंशियल्स पास करने का सबसे सुरक्षित तरीका उन्हें सम्मिलित करने के लिए प्रेरित करना है। यह तब होता है जब पहले सुझाए गए अनुसार उपयोगकर्ता नाम पास करना (-u USERNAME )।

लेकिन क्या होगा अगर आप इस तरह से उपयोगकर्ता नाम नहीं दे सकते हैं? उदाहरण के लिए उपयोगकर्ता नाम url का हिस्सा होना चाहिए और केवल पासवर्ड ही json पेलोड का हिस्सा होना चाहिए।

tl; dr: यह है कि इस मामले में सुरक्षित रूप से कर्ल का उपयोग कैसे किया जाए:

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है जो उस समय से चल रहा है जब प्रत्येक वर्तमान में चल रही प्रक्रिया के लिए कमांड को सूचीबद्ध किया गया है। इसके अलावा, क्योंकि आपकी गोपनीयता तब बैश इतिहास (एक बार शेल समाप्त होने पर) में समाप्त हो जाती है।

इसे स्थानीय फ़ाइल में शामिल करने के लिए असुरक्षित क्यों है फ़ाइल पर सख्त POSIX पहुँच प्रतिबंध इस परिदृश्य में जोखिम को कम कर सकता है। हालाँकि, यह अभी भी आपके फ़ाइल सिस्टम पर एक फ़ाइल है, बाकी पर अनएन्क्रिप्टेड।


2
ऐसा लगता है कि यह विधि अभी भी प्रक्रिया सूची में पासवर्ड दिखाएगी?
मार्क रिबाऊ

4

मुझे बैश (उबंटू 16.04 एलटीएस) में समान आवश्यकता थी और जवाब में प्रदान की गई कमांड मेरे मामले में काम करने में विफल रही। मुझे उपयोग करना था:

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

-Fयदि आप चर का उपयोग कर रहे हैं, तो तर्कों में दोहरे उद्धरण चिह्नों की आवश्यकता है, इस प्रकार कमांड लाइन ... -F 'username=myuser' ...ठीक होगी।

प्रासंगिक सुरक्षा सूचना: जैसा कि श्री मार्क रिबॉउ टिप्पणियों में बताते हैं कि यह कमांड प्रक्रिया सूची में पासवर्ड ($ पास चर, विस्तारित) दिखाता है!


1
ऐसा लगता है कि अभी भी प्रक्रिया सूची में $ PASS का मूल्य दिखता है?
मार्क रिबाऊ

हाँ, दुर्भाग्य से यह करता है।
मार्को

1

यदि आप एक ऐसे सिस्टम पर हैं जिसमें Gnome कीरिंग ऐप एक समाधान है जो सीधे पासवर्ड को उजागर करने से बचता है तो यह है कि कीरिंग से पासवर्ड निकालने के लिए 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

1
नोट: पासवर्ड प्रक्रिया सूची में दिखाई देगा। (और इतिहास अगर यह एक स्क्रिप्ट का हिस्सा नहीं है।)
मार्क रिबाऊ

1

यह ओपी द्वारा पूछे जाने की तुलना में अधिक है, लेकिन चूंकि यह सुरक्षित रूप से पासवर्ड पारित करने के लिए एक शीर्ष परिणाम है curl, मैं इन समाधानों को उन अन्य लोगों के लिए यहां जोड़ रहा हूं जो यहां खोज रहे हैं।


नोट: कमांड के -sलिए arg readPOSIX नहीं है, और इसलिए यह हर जगह उपलब्ध नहीं है, इसलिए इसका उपयोग नीचे नहीं किया जाएगा। हम उपयोग करेंगे stty -echoऔर stty echoइसके बजाय।

ध्यान दें: नीचे दिए गए सभी बैश वैरिएबल को स्थानीय लोगों के रूप में घोषित किया जा सकता है यदि किसी फ़ंक्शन में, परेशान करने के बजाय।

ध्यान दें: perl बहुत आम तौर पर सभी प्रणालियों पर उपलब्ध है जो मैंने कोशिश की है क्योंकि यह कई चीजों के लिए एक निर्भरता है, जबकि rubyऔर pythonइसलिए, यहां उपयोग नहीं कर perlरहे हैं। यदि आप गारंटी दे सकते हैं ruby/ pythonजहां आप ऐसा कर रहे हैं, तो आप perlकमांड को उनके समकक्ष से बदल सकते हैं ।

नोट: bashmacOS 10.14.4 पर 3.2.57 में परीक्षण किया गया। अन्य गोले / संस्थापन के लिए कुछ छोटे अनुवाद की आवश्यकता हो सकती है।


कर्ल को पास करने के लिए एक (पुन: प्रयोज्य) पासवर्ड के लिए उपयोगकर्ता को सुरक्षित रूप से संकेत दें। विशेष रूप से उपयोगी है अगर आपको कर्ल को कई बार कॉल करने की आवश्यकता है।

आधुनिक गोले के लिए, जहां 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.