दर्ज किए गए पासवर्ड की जांच कैसे करें इस उपयोगकर्ता के लिए एक वैध पासवर्ड है?


15

परिदृश्य:

एक बैश स्क्रिप्ट में, मुझे यह जांचना होगा कि उपयोगकर्ता द्वारा दिया गया पासवर्ड मान्य उपयोगकर्ता पासवर्ड है या नहीं।

मुझे लगता है कि मेरे पास पासवर्ड पीए के साथ एक उपयोगकर्ता ए है .. स्क्रिप्ट में मैंने उपयोगकर्ता को अपना पासवर्ड दर्ज करने के लिए कहा है, इसलिए यह जांचने के लिए कि क्या दर्ज स्ट्रिंग वास्तव में उसका पासवर्ड है? ...


आपको मान्य पासवर्ड से क्या मतलब है? परीक्षण करना चाहते हैं कि क्या यह वास्तव में उपयोगकर्ता का पासवर्ड है?
एबी

@AB मान्य पासवर्ड = लॉगिन पासवर्ड जो भी आप कॉल करना चाहते हैं ... मेरा मतलब है कि इस उपयोगकर्ता के लिए इसका पासवर्ड
Maythux

@AB मुझे पता है कि यह एक सुरक्षा छेद होगा लेकिन यहां आप पहले से ही उपयोगकर्ता का नाम भी जानते हैं ... दूसरे शब्दों में इसका सिर्फ एक परीक्षण है यदि पासवर्ड इस उपयोगकर्ता के लिए है ..
Maythux

3
यहाँ आपका जवाब है: unix.stackexchange.com/a/21728/107084
AB

एक समाधान के आधार पर expectपर stackoverflow.com/a/1503831/320594
Jaime Hablutzel

जवाबों:


15

चूंकि आप इसे शेल स्क्रिप्ट में करना चाहते हैं, लिनक्स के साथ पासवर्ड की जांच करने में योगदान की एक जोड़ी ? (पर Unix.SE , एबी ने सुझाव दिया ) विशेष रूप से प्रासंगिक हैं:

  • rozcietrzewiacz के जवाब एक पासवर्ड हैश कि में एक प्रविष्टि से मेल खाता है पैदा करने पर /etc/shadowसमाधान का हिस्सा देता है।
  • डैनियल एल्डर की टिप्पणीmkpasswd डेबियन (और उबंटू) में मौजूद कमांड के विभिन्न सिंटैक्स की व्याख्या करती है ।

मैन्युअल रूप से जांचने के लिए कि क्या कोई स्ट्रिंग वास्तव में कुछ उपयोगकर्ता का पासवर्ड है, तो आपको इसे उसी हैश एल्गोरिथम के साथ उपयोगकर्ता की छाया प्रविष्टि में होना चाहिए, जिसमें उपयोगकर्ता की छाया प्रविष्टि में नमक समान हो । फिर इसकी तुलना वहां रखे पासवर्ड हैश से की जा सकती है।

मैंने एक पूर्ण, कार्यशील स्क्रिप्ट लिखी है जिसमें यह दिखाया गया है कि यह कैसे करना है।

  • यदि आप इसे नाम देते हैं chkpass, तो आप चला सकते हैं और यह मानक इनपुट से एक पंक्ति पढ़ेगा और जांच करेगा कि क्या यह पासवर्ड है।chkpass useruser
  • उपयोगिता प्राप्त करने के लिए whois जो स्थापित करें पैकेज स्थापित करें जिस mkpasswdपर यह स्क्रिप्ट निर्भर करती है।
  • सफल होने के लिए इस स्क्रिप्ट को रूट के रूप में चलाया जाना चाहिए।
  • वास्तविक काम करने के लिए इस स्क्रिप्ट या इसके किसी भी भाग का उपयोग करने से पहले, कृपया नीचे सुरक्षा नोट्स देखें।
#!/usr/bin/env bash

xcorrect=0 xwrong=1 enouser=2 enodata=3 esyntax=4 ehash=5  IFS=$
die() {
    printf '%s: %s\n' "$0" "$2" >&2
    exit $1
}
report() {
    if (($1 == xcorrect))
        then echo 'Correct password.'
        else echo 'Wrong password.'
    fi
    exit $1
}

(($# == 1)) || die $esyntax "Usage: $(basename "$0") <username>"
case "$(getent passwd "$1" | awk -F: '{print $2}')" in
    x)  ;;
    '') die $enouser "error: user '$1' not found";;
    *)  die $enodata "error: $1's password appears unshadowed!";;
esac

if [ -t 0 ]; then
    IFS= read -rsp "[$(basename "$0")] password for $1: " pass
    printf '\n'
else
    IFS= read -r pass
fi

set -f; ent=($(getent shadow "$1" | awk -F: '{print $2}')); set +f
case "${ent[1]}" in
    1) hashtype=md5;;   5) hashtype=sha-256;;   6) hashtype=sha-512;;
    '') case "${ent[0]}" in
            \*|!)   report $xwrong;;
            '')     die $enodata "error: no shadow entry (are you root?)";;
            *)      die $enodata 'error: failure parsing shadow entry';;
        esac;;
    *)  die $ehash "error: password hash type is unsupported";;
esac

if [[ "${ent[*]}" = "$(mkpasswd -sm $hashtype -S "${ent[2]}" <<<"$pass")" ]]
    then report $xcorrect
    else report $xwrong
fi

सुरक्षा नोट

यह सही दृष्टिकोण नहीं हो सकता है।

इस तरह एक दृष्टिकोण को सुरक्षित माना जाना चाहिए या नहीं और अन्यथा उपयुक्त आपके उपयोग के मामले के विवरण पर निर्भर करता है जो आपने प्रदान नहीं किया है (इस लेखन के रूप में)।

इसका ऑडिट नहीं हुआ है।

हालांकि मैंने इस स्क्रिप्ट को लिखते समय देखभाल करने की कोशिश की है, लेकिन सुरक्षा कमजोरियों के लिए इसे ठीक से ऑडिट नहीं किया गया है । यह एक प्रदर्शन के रूप में अभिप्रेत है, और यदि प्रोजेक्ट के भाग के रूप में जारी किया जाता है तो यह "अल्फ़ा" सॉफ्टवेयर होगा। इसके अलावा ...

एक अन्य उपयोगकर्ता जो "देख रहा है" उपयोगकर्ता के नमक की खोज करने में सक्षम हो सकता है ।

mkpasswdनमक डेटा को स्वीकार करने की सीमाओं के कारण , इस स्क्रिप्ट में एक ज्ञात सुरक्षा दोष है , जिसे आप उपयोग के मामले के आधार पर स्वीकार्य नहीं मान सकते हैं या नहीं। डिफ़ॉल्ट रूप से, उबंटू और अधिकांश अन्य जीएनयू / लिनक्स सिस्टम पर उपयोगकर्ता अपने कमांड-लाइन तर्कों सहित अन्य उपयोगकर्ताओं (रूट सहित) द्वारा संचालित प्रक्रियाओं के बारे में जानकारी देख सकते हैं। न तो उपयोगकर्ता के इनपुट और न ही संग्रहीत पासवर्ड हैश को किसी भी बाहरी उपयोगिता के लिए कमांड-लाइन तर्क के रूप में पारित किया जाता है। लेकिन डेटाबेस से निकाले गए नमक को कमांड-लाइन तर्क के रूप में दिया जाता है , क्योंकि यह एकमात्र तरीका है कि उपयोगिता नमक को इनपुट के रूप में स्वीकार करती है।shadowmkpasswd

अगर

  • सिस्टम पर एक अन्य उपयोगकर्ता, या
  • जो कोई भी उपयोगकर्ता खाता बनाने की क्षमता रखता है (जैसे, www-data) अपना कोड चलाते हैं, या
  • कोई भी जो अन्यथा चलने वाली प्रक्रियाओं के बारे में जानकारी देख सकता है (मैन्युअल प्रविष्टियों का निरीक्षण सहित /proc)

कमांड-लाइन तर्कों की जांच करने में सक्षम है mkpasswdक्योंकि यह इस स्क्रिप्ट द्वारा चलाया जाता है, फिर वे shadowडेटाबेस से उपयोगकर्ता के नमक की एक प्रति प्राप्त कर सकते हैं । वे हो सकता है अनुमान करने में सक्षम होना चाहिए जब कि आदेश चला जाता है, लेकिन है कि कभी कभी प्राप्त है।

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

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

आप इस समस्या से पूरी तरह से बच सकते हैं:

  • पर्ल या देता है कि कुछ अन्य भाषा में अपनी स्क्रिप्ट का हिस्सा लिखने के रूप में आप, सी कार्यों फोन गाइल्स के जवाब में दिखाया गया है करने के लिए संबंधित Unix.SE प्रश्न , या
  • बैश का उपयोग करने के बजाय अपनी पूरी स्क्रिप्ट / प्रोग्राम को ऐसी भाषा में लिखें। (आपके द्वारा प्रश्न को टैग करने के तरीके के आधार पर, ऐसा प्रतीत होता है कि आप बैश का उपयोग करना पसंद करते हैं।)

सावधान रहें कि आप इस स्क्रिप्ट को कैसे कहते हैं।

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

10.4 देखें इस पर अधिक जानकारी के लिए Linux और Unix HOWTO के लिए डेविड ए। व्हीलर के सिक्योर प्रोग्रामिंग में शेल स्क्रिप्टिंग लैंग्वेज (sh और csh डेरिवेटिव्स) । जबकि उनकी प्रस्तुति सेतुबंध लिपियों पर केंद्रित है, अन्य तंत्र कुछ ऐसी ही समस्याओं के शिकार हो सकते हैं यदि वे पर्यावरण को सही ढंग से साफ नहीं करते हैं।

अन्य नोट

यह shadowकेवल डेटाबेस से हैश पढ़ने का समर्थन करता है ।

इस स्क्रिप्ट को काम करने के लिए पासवर्ड को छायांकित किया जाना चाहिए (अर्थात, उनका हैश अलग /etc/shadowफाइल में होना चाहिए जो केवल रूट पढ़ सकता है, अंदर नहीं /etc/passwd)।

उबंटू में हमेशा ऐसा ही होना चाहिए। किसी भी स्थिति में, यदि आवश्यक हो तो स्क्रिप्ट को पासवर्ड हैश के passwdसाथ-साथ पढ़ने के लिए तुच्छ रूप से बढ़ाया जा सकता है shadow

IFSइस स्क्रिप्ट को संशोधित करते समय ध्यान रखें ।

मैंने IFS=$शुरुआत में सेट किया, क्योंकि एक छाया प्रविष्टि के हैश क्षेत्र में तीन डेटा द्वारा अलग किए गए हैं $

  • उन्होंने यह भी एक प्रमुख है $, जिसके कारण हैश प्रकार और नमक कर रहे हैं, "${ent[1]}"और "${ent[2]}"के बजाय "${ent[0]}"और "${ent[1]}", क्रमशः।

इस लिपि में एकमात्र स्थान जहां $IFSयह निर्धारित करता है कि शैल कैसे विभाजित होती है या शब्दों को जोड़ती है

  • जब इन आंकड़ों को एक क्रम में विभाजित किया जाता है, तो इसे अनछुए $( )कमांड प्रतिस्थापन से आरंभ करके :

    set -f; ent=($(getent shadow "$1" | awk -F: '{print $2}')); set +f
  • जब सरणी को पूर्ण फ़ील्ड से तुलना करने के लिए एक स्ट्रिंग में पुनर्गठित किया जाता है shadow, तो इसमें "${ent[*]}"अभिव्यक्ति:

    if [[ "${ent[*]}" = "$(mkpasswd -sm $hashtype -S "${ent[2]}" <<<"$pass")" ]]

यदि आप स्क्रिप्ट को संशोधित करते हैं और अन्य स्थितियों में शब्द विभाजन (या शब्द जुड़ना) करते हैं, तो आपको IFSअलग-अलग कमांड या स्क्रिप्ट के विभिन्न भागों के लिए अलग-अलग मान सेट करने होंगे ।

यदि आप इसे ध्यान में नहीं रखते हैं और मान लें $IFSकि आप सामान्य व्हाट्सएप ( $' \t\n') पर सेट हैं , तो आप अपनी स्क्रिप्ट को कुछ अजीब-अजीब तरीकों से व्यवहार कर सकते हैं।


8

आप इसके लिए दुरुपयोग कर सकते हैं sudosudoहै -lविकल्प, sudo विशेषाधिकारों उपयोगकर्ता है कि परीक्षण के लिए, और -Sstdin से पासवर्ड में पढ़ने के लिए। हालाँकि, कोई भी बात नहीं है कि उपयोगकर्ता के पास विशेषाधिकार का स्तर है, यदि सफलतापूर्वक प्रमाणित किया गया है, तो sudoएग्जिट स्टेटस के साथ रिटर्न। 0. इसलिए, आप किसी भी अन्य एग्जिट स्टेटस को संकेत के रूप में ले सकते हैं कि ऑथेंटिकेशन काम नहीं करता था ( sudoस्वयं को कोई समस्या नहीं है, जैसे अनुमति त्रुटियाँ या अमान्य sudoersकॉन्फ़िगरेशन)।

कुछ इस तरह:

#! /bin/bash
IFS= read -rs PASSWD
sudo -k
if sudo -lS &> /dev/null << EOF
$PASSWD
EOF
then
    echo 'Correct password.'
else 
    echo 'Wrong password.'
fi

यह स्क्रिप्ट sudoersकॉन्फ़िगरेशन पर काफी निर्भर करता है । मैंने डिफ़ॉल्ट सेटअप मान लिया है। चीजें जो इसे विफल करने का कारण बन सकती हैं:

  • targetpwया runaspwसेट है
  • listpw है never
  • आदि।

अन्य समस्याओं में शामिल हैं (धन्यवाद एलियाह):

  • गलत प्रयासों को लॉग इन किया जाएगा /var/log/auth.log
  • sudoउस उपयोगकर्ता के रूप में चलाया जाना चाहिए जिसे आप प्रमाणित कर रहे हैं। जब तक आपके पास sudoविशेषाधिकार न हों, ताकि आप चला सकें sudo -u foo sudo -lS, इसका मतलब है कि आपको स्क्रिप्ट को लक्ष्य उपयोगकर्ता के रूप में चलाना होगा।

अब, मैं यहाँ-डॉक्स इस्तेमाल करने का कारण है ईव्सड्रॉपिंग में बाधा डालना। कमांड लाइन के हिस्से के रूप में इस्तेमाल किया एक चर और अधिक आसानी से उपयोग करके पता चला है topया psप्रक्रियाओं का निरीक्षण करने के लिए या अन्य उपकरण।


2
यह तरीका बेहतरीन लग रहा है। हालाँकि यह असामान्य sudoकॉन्फिग वाले सिस्टम पर काम नहीं करेगा (जैसा कि आप कहते हैं) और /var/log/auth.logप्रत्येक प्रयास के रिकॉर्ड के साथ clutters , यह त्वरित, सरल है, और एक मौजूदा उपयोगिता का उपयोग करता है, बजाय पहिया को पुन: स्थापित करने के (इसलिए बोलने के लिए)। मैं स्थापित करने का सुझाव IFS=के लिए read, खाली स्थान के-गद्देदार उपयोगकर्ता इनपुट और गद्देदार पासवर्ड के लिए खाली स्थान के-गद्देदार उपयोगकर्ता इनपुट और गैर गद्देदार पासवर्ड के लिए झूठी सफलताओं, साथ ही झूठी विफलताओं को रोकने के लिए। (मेरे समाधान में एक समान बग था।) आप यह भी समझाना चाह सकते हैं कि इसे कैसे चलाना चाहिए, क्योंकि जिस उपयोगकर्ता का पासवर्ड चेक किया जा रहा है।
एलिया कगन

@EliahKagan के प्रत्येक असफल प्रयास को लॉग किया गया है, लेकिन हां, आप हर चीज के बारे में सही हैं।
मूरू

सफल प्रमाणीकरण भी लॉग इन हैं। sudo -l" COMMAND=list" के साथ एक प्रविष्टि लिखने का कारण बनता है । Btw (असंबंधित), जबकि ऐसा करना उद्देश्यपूर्ण नहीं है, यहाँ दस्तावेज़ के स्थान पर स्ट्रिंग का उपयोग करने से समान सुरक्षा लक्ष्य प्राप्त होता है और यह अधिक कॉम्पैक्ट होता है। चूंकि स्क्रिप्ट पहले से ही बशीज़ का उपयोग करती है read -sऔर &>, उपयोग if sudo -lS &>/dev/null <<<"$PASSWD"; thenकरना कम पोर्टेबल नहीं है। मैं आपको सुझाव नहीं दे रहा हूं कि आपके पास जो है वह बदलना चाहिए (यह ठीक है)। बल्कि, मैं इसका उल्लेख करता हूं ताकि पाठकों को पता हो कि उनके पास भी यह विकल्प है।
एलियाह कगन

@ एलियाकगन आह। मुझे लगा कि sudo -lकुछ अक्षम है - शायद यह तब रिपोर्ट कर रहा था जब कोई उपयोगकर्ता एक कमांड चलाने की कोशिश करता है जिसे उन्हें अनुमति नहीं है।
मूरू

@ एलियाकगन वास्तव में। मैंने पहले भी इस तरह से हेर्स्ट्रेस का इस्तेमाल किया है । मैं यहां एक गलत धारणा के तहत काम कर रहा था, जिसके कारण वंशानुगतता थी, लेकिन फिर मैंने उन्हें वैसे भी रखने का फैसला किया।
मूरू

5

एक अन्य विधि (संभवतः अपने सैद्धांतिक अनुप्रयोगों के लिए इसकी सैद्धांतिक सामग्री के लिए अधिक दिलचस्प है)।

उपयोगकर्ता के पासवर्ड में संग्रहीत हैं /etc/shadow

यहां संग्रहीत पासवर्ड एन्क्रिप्ट किए गए हैं, नवीनतम उबंटू रिलीज़ में उपयोग कर रहे हैं SHA-512

विशेष रूप से, पासवर्ड निर्माण पर, स्पष्ट पाठ में पासवर्ड के माध्यम से नमकीन और एन्क्रिप्ट किया गया है SHA-512

एक समाधान तब दिए गए पासवर्ड को नमक / एन्क्रिप्ट करने के लिए होगा और इसे दिए गए उपयोगकर्ता के /etc/shadowप्रवेश में संग्रहीत एन्क्रिप्ट किए गए उपयोगकर्ता के पासवर्ड से मिलान करेगा ।

प्रत्येक उपयोगकर्ता /etc/shadowप्रविष्टि में पासवर्ड कैसे संग्रहीत किए जाते हैं, इसका त्वरित विराम देने के लिए , यहां पासवर्ड के साथ /etc/shadowउपयोगकर्ता के लिए एक नमूना प्रविष्टि है :foobar

foo:$6$lWS1oJnmDlaXrx1F$h4vuzZVBwIE1Z6vT7N.spwbxYig9e/OHOIH.VDv9JPaC3.OtTusPFzma7g.R/oSZFW5QOI7IDdDY01G0zTGQE/:16566:0:99999:7:::
  • foo: उपयोगकर्ता नाम
  • 6: पासवर्ड का एन्क्रिप्शन प्रकार
  • lWS1oJnmDlaXrx1F: पासवर्ड का एन्क्रिप्शन नमक
  • h4vuzZVBwIE1Z6vT7N.spwbxYig9e/OHOIH.VDv9JPaC3.OtTusPFzma7g.R/oSZFW5QOI7IDdDY01G0zTGQE/: SHA-512नमकीन / एन्क्रिप्टेड पासवर्ड

दिए barगए उपयोगकर्ता के लिए दिए गए पासवर्ड का मिलान करने के लिए foo, सबसे पहले नमक प्राप्त करना है:

$ sudo getent shadow foo | cut -d$ -f3
lWS1oJnmDlaXrx1F

फिर एक पूर्ण नमकीन / एन्क्रिप्टेड पासवर्ड प्राप्त करना चाहिए:

$ sudo getent shadow foo | cut -d: -f2
$6$lWS1oJnmDlaXrx1F$h4vuzZVBwIE1Z6vT7N.spwbxYig9e/OHOIH.VDv9JPaC3.OtTusPFzma7g.R/oSZFW5QOI7IDdDY01G0zTGQE/

फिर दिए गए पासवर्ड को नमकीन / एन्क्रिप्ट किया जा सकता है और नमकीन / एन्क्रिप्ट किए गए उपयोगकर्ता के पासवर्ड के साथ मिलान किया जा सकता है /etc/shadow:

$ python -c 'import crypt; print crypt.crypt("bar", "$6$lWS1oJnmDlaXrx1F")'
$6$lWS1oJnmDlaXrx1F$h4vuzZVBwIE1Z6vT7N.spwbxYig9e/OHOIH.VDv9JPaC3.OtTusPFzma7g.R/oSZFW5QOI7IDdDY01G0zTGQE/

उनका मिलान होता है! सब कुछ एक bashस्क्रिप्ट में डाल दिया :

#!/bin/bash

read -p "Username >" username
IFS= read -p "Password >" password
salt=$(sudo getent shadow $username | cut -d$ -f3)
epassword=$(sudo getent shadow $username | cut -d: -f2)
match=$(python -c 'import crypt; print crypt.crypt("'"${password}"'", "$6$'${salt}'")')
[ ${match} == ${epassword} ] && echo "Password matches" || echo "Password doesn't match"

आउटपुट:

$ ./script.sh 
Username >foo
Password >bar
Password matches
$ ./script.sh 
Username >foo
Password >bar1
Password doesn't match

1
sudo getent shadow>> sudo grep ...। नहीं तो अच्छा है। यह वही है जो मैंने मूल रूप से सोचा था, फिर बहुत आलसी हो गया।
मुरु ११'१५

@ ममरू धन्यवाद। निश्चित रूप से अच्छा लग रहा है, इसलिए अद्यतन किया गया है, लेकिन फिर भी मुझे यकीन नहीं है कि अगर इस मामले में getent+ grep+ cut> grep+cut
kos

1
EEK। getentआप के लिए खोज कर सकते हैं। मैंने संपादन की स्वतंत्रता ली।
मुरु

@ मूरू तुम वास्तव में होना चाहिए, अब मैं बात देख रहा हूँ!
कोस

2
मुझे लगता है कि यह वास्तव में काफी व्यावहारिक है, हालांकि मैं पक्षपाती हो सकता हूं: यह वही तरीका है जिसका मैंने इस्तेमाल किया। आपका कार्यान्वयन और प्रस्तुति हालांकि काफी अलग है - यह निश्चित रूप से एक मूल्यवान उत्तर है। जबकि मैं mkpasswdउपयोगकर्ता इनपुट और मौजूदा नमक (और अतिरिक्त सुविधाओं और डायग्नोस्टिक्स शामिल) से एक हैश उत्पन्न करता था, आपने इसके बजाय एक साधारण पायथन प्रोग्राम को कोडित mkpasswdकिया है जो सबसे महत्वपूर्ण कार्यक्षमता को कार्यान्वित करता है और जिसका उपयोग करता है। मैं सुझाव है कि आप सेट IFS=जब पासवर्ड इनपुट, और बोली पढ़ने ${password}के साथ "है, तो पासवर्ड प्रयासों सफेद स्थान के साथ स्क्रिप्ट नहीं टूटते।
एलियाह कगन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.