लगातार मशीन यूनिक आईडी जनरेट करें


20

क्या हम प्रत्येक पीसी के लिए एक अद्वितीय आईडी उत्पन्न कर सकते हैं, कुछ uuuidgen जैसा, लेकिन यह कभी नहीं बदलेगा जब तक कि हार्डवेयर परिवर्तन न हों? मैं CPUID और MACADDR को मर्ज करने के बारे में सोच रहा था और उन्हें एक सुसंगत ID जनरेट करने के लिए है, लेकिन मुझे नहीं पता कि उन्हें bash script का उपयोग करके पार्स कैसे किया जाता है, मुझे क्या पता कि मैं CPUID कैसे प्राप्त कर सकता हूं

dmidecode -t 4 | grep ID

तथा

ifconfig | grep ether

फिर मुझे उन हेक्स स्ट्रिंग्स को संयोजित करने और उन्हें शेक 1 या md5 का उपयोग करके तय लंबाई हेक्स स्ट्रिंग बनाने की आवश्यकता है।
मैं उस आउटपुट को पार्स कैसे कर सकता हूं?


4
इस पद्धति का उपयोग करके आप जिस समस्या को हल करने का प्रयास कर रहे हैं वह वास्तव में क्या है?
डार्कहॉग

1
मैं डार्कहॉग के साथ हूं। आम तौर पर इस तरह की चीजों को इस दिन और उम्र में करने की कोशिश करना एक बुरा विचार है। वर्चुअलाइजेशन ने भौतिक हार्डवेयर प्रकार के व्यर्थ में सॉफ्टवेयर को बांधने का अभ्यास किया है। आमतौर पर एक बेहतर जवाब है यदि आप अपनी आवश्यकताओं की बारीकी से जांच करते हैं (जो कि डार्कहॉग पर चला रहा है)।
कैलफूल

4
मैं किसी मशीन में किसी सॉफ्टवेयर को बाँधने के लिए इसका उपयोग नहीं करता, यह linux Mining rig है जिसे क्लाउड कंट्रोल और मॉनिटरिंग सर्विस को स्वयं पहचानने की आवश्यकता है, बजाय हजारों रिग मैन्युअल रूप से नामांकित करने के लिए, मुझे उनकी हार्डवेयर आईडी
uray

1
@ user77710: अगर ऐसा है, तो क्या आप वास्तव में हार्डवेयर की परवाह करते हैं? अगर कोई मौजूद नहीं है, तो मशीन पर केवल यूयूआईडी क्यों न बनाएं। यह एक UUID की बात है - वे सार्वभौमिक रूप से अद्वितीय हैं (उनके अतिव्यापी होने की संभावनाएं खगोलीय रूप से असंभव हैं)। serverfault.com/questions/103359/how-to-create-a-uuid-in-bash
कैलफूल

1
@JoeRounceville - मेरा मतलब यह नहीं था कि SecureBoot ही समाधान था - हालाँकि यह स्व-हस्ताक्षरित प्रमाणपत्रों का समर्थन करता है - बल्कि इसकी विधि । लेकिन यह सिस्टम के फर्मवेयर द्वारा प्रस्तुत एक एपीआई का उपयोग करता है - और किसी भी यूईएफआई सिस्टम में कई यूयूआईडी होंगे क्योंकि आपको प्रत्येक फर्मवेयर चर के नाम पर पहले से ही सेटअप की आवश्यकता हो सकती है - मेरा उत्तर देखें। इसके अलावा, आपको bashकिसी भी linux पर UUID जेनरेट करने के लिए किसी भी एप्लिकेशन - या - की आवश्यकता नहीं है । cat /proc/sys/kernel/random/uuid
मिकसेवेर

जवाबों:


21

इन दोनों के बारे में कैसे:

$ sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g'
52060201FBFBEBBF
$ ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g'
0126c9da2c38

फिर आप उनके साथ गठबंधन कर सकते हैं:

$ echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \
       $(ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g') | sha256sum 
59603d5e9957c23e7099c80bf137db19144cbb24efeeadfbd090f89a5f64041f  -

अनुगामी डैश को निकालने के लिए, एक और पाइप जोड़ें:

$ echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \
       $(ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g') | sha256sum |
  awk '{print $1}'
59603d5e9957c23e7099c80bf137db19144cbb24efeeadfbd090f89a5f64041f

जैसा कि @mikeserv उनके उत्तर में बताता है , इंटरफ़ेस नाम बूटों के बीच बदल सकता है । इसका मतलब यह है कि जो आज है, वह आज eth1 हो सकता है, इसलिए अगर आप अपने लिए जीआरपी करते eth0हैं , तो आपको अलग-अलग बूट्स पर एक अलग मैक एड्रेस मिल सकता है। मेरा सिस्टम इस तरह से व्यवहार नहीं करता है इसलिए मैं वास्तव में परीक्षण नहीं कर सकता लेकिन संभव समाधान हैं:

  1. HWaddrके उत्पादन में Grep, ifconfigलेकिन उन सभी को रखें, न कि केवल एक विशिष्ट NIC के अनुरूप। उदाहरण के लिए, मेरे सिस्टम पर मेरे पास है:

    $ ifconfig | grep HWaddr
    eth1      Link encap:Ethernet  HWaddr 00:24:a9:bd:2c:28  
    wlan0     Link encap:Ethernet  HWaddr c4:16:19:4f:ac:g5  

    दोनों मैक पतों को पकड़कर और उनके माध्यम से पास करके sha256sum, आपको एक अनूठा और स्थिर नाम प्राप्त करने में सक्षम होना चाहिए, इसके बावजूद कि एनआईसी को क्या कहा जाता है:

    $ echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \
         $(ifconfig | grep -oP 'HWaddr \K.*' | sed 's/://g') | sha256sum |
          awk '{print $1}'
    662f0036cba13c2ddcf11acebf087ebe1b5e4044603d534dab60d32813adc1a5    

    ध्यान दें कि हैश ऊपर क्योंकि मैं द्वारा दिया दोनों MAC पते गुजर रहा से अलग है ifconfigकरने के लिए sha256sum

  2. इसके बजाय अपनी हार्ड ड्राइव के यूयूआईडी के आधार पर एक हैश बनाएं:

    $ blkid | grep -oP 'UUID="\K[^"]+' | sha256sum | awk '{print $1}'
    162296a587c45fbf807bb7e43bda08f84c56651737243eb4a1a32ae974d6d7f4

यह अच्छा है, लेकिन कैसे पीछे हटने के निशान से छुटकारा पाने के लिए '-'?
१६:१४ को

@ user77710 अद्यतन जवाब देखें।
terdon

1
मुझे लगता है कि cpuid बदतर है ... wikipedia.org/wiki/cpuid
mikeserv

@mikeserv आह, हाँ वास्तव में, मैं आपकी बात देख रहा हूँ। धन्यवाद, उत्तर संपादित
terdon

एक ही होस्ट पर सभी अतिथि ओएस के लिए एक ही आईडी बनाता है।
नितिनकुमार अम्बेकर

23

सबसे पहले, कृपया ध्यान दें कि CPUID निश्चित रूप से है नहीं बाद में एक इंटेल पेंटियम III से किसी भी प्रणाली के लिए एक सामान्य सुलभ विशिष्ट पहचान करने मार्कर। मैक पते के साथ हैशिंग होने पर, निश्चित रूप से अद्वितीय मार्कर हो सकते हैं, यह केवल एमएसीएस के अद्वितीय गुणों के कारण होता है और उस मामले में सीपीयूआईडी परिस्थितिजन्य से अधिक कुछ नहीं है। इसके अलावा, परिणामी हैश मदरबोर्ड के यूयूआईडी की तुलना में कोई अधिक अद्वितीय होने की संभावना नहीं है, और इसे पुनर्प्राप्त करना बहुत आसान है और इस प्रक्रिया के गलत होने की संभावना बहुत कम है। से wikipedia.org/wiki/cpuid :

EAX = 3 : प्रोसेसर सीरियल नंबर

इसे भी देखें: पेंटियम III Pent गोपनीयता के मुद्दों पर विवाद

यह प्रोसेसर के सीरियल नंबर को लौटाता है। प्रोसेसर सीरियल नंबर इंटेल पेंटियम III पर पेश किया गया था, लेकिन गोपनीयता की चिंताओं के कारण, यह सुविधा अब बाद के मॉडल (पीएसएन फीचर बिट हमेशा साफ हो जाती है) पर लागू नहीं होती है। Transmeta के इफिसन और क्रूसो प्रोसेसर भी इस सुविधा को प्रदान करते हैं। एएमडी सीपीयू हालांकि, इस सुविधा को किसी भी सीपीयू मॉडल में लागू नहीं करते हैं।

आप एक पार्स क्युपिड अपने आप को देख कर cat /proc/cpuinfoया बस कर सकते हैं lscpu

यह आपको लिनक्स कर्नेल द्वारा मान्यता प्राप्त नेटवर्क इंटरफेस के लिए मैक पते के सभी मिलता है, मुझे लगता है:

ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'

उस सूची को फ़िल्टर करना आवश्यक हो सकता है यदि इसमें बेतरतीब ढंग से उत्पन्न मैक के साथ आभासी nics शामिल हो सकते हैं। आप ipसीधे कॉल में झंडे के साथ ऐसा कर सकते हैं । ip a helpऐसा करने के बारे में जानकारी के लिए देखें ।

यह भी ध्यान रखें कि ipयदि आप उपयोग करते हैं ifconfig, तो यह समस्या अद्वितीय नहीं है और इससे भी निपटा जाना चाहिए , लेकिन यह अधिक विश्वसनीय तरीके से नियंत्रित किया जा सकता है ip- जो iproute2नेटवर्क सूट का हिस्सा है और इसे सक्रिय रूप से बनाए रखा जाता है - इसके साथ ifconfig- जो एक सदस्य है के net-toolsपैकेज और पिछले देखा एक लिनक्स 2001 में रिलीज । अपनी अंतिम रिलीज़ के बाद से कर्नेल में बदलती विशेषताओं के कारण, कुछ नेटवर्किंग सुविधा फ़्लैगifconfig को गलत पहचानने के लिए जाना जाता है और यदि संभव हो तो इसके उपयोग से बचा जाना चाहिए।

हालांकि, समझें, जैसे कर्नेल इंटरफ़ेस नामों के साथ फ़िल्टर करना eth[0-9]ऐसा करने का एक विश्वसनीय साधन नहीं है, क्योंकि ये udevबूट प्रक्रिया के दौरान समानता का पता लगाने के उनके आदेश के आधार पर बदल सकते हैं । कृपया उस पर अधिक के लिए प्रिडिक्टेबल नेटवर्क नाम देखें ।

क्योंकि dmidecodeमेरे सिस्टम पर पहले से स्थापित नहीं है क्योंकि मैंने हार्ड डिस्क धारावाहिकों की एक सूची बनाई है जैसे:

lsblk -nro SERIAL

क्या lsblk --helpहै कि सूची को परिष्कृत करने पर कुछ सुराग के लिए - डिस्क प्रकार के आधार पर, कहते हैं। भी विचार करें lspciऔर / या lsusbहो सकता है।

उनका संयोजन आसान है:

{ ip a | sed ... ; lsblk ... ; } | #abbreviated... for brevity...
    tr -dc '[:alnum:]' | #deletes all chars not alphanumeric - including newlines
    sha256sum #gets your hash

जैसा कि आपने मुझे सूचित किया है कि आप अपने अनूठे आईडी से उपयोगकर्ता के संसाधनों को समाप्त कर रहे हैं, और हार्ड डिस्क पर भरोसा नहीं किया जा सकता है क्योंकि मैंने सोचा था कि मैं अपनी फीस को बदल दूंगा।

माना जाता है, मैंने फिर से फाइल सिस्टम में देखा और /sys/class/dmi/idफ़ोल्डर पाया । मैंने कुछ फ़ाइलों की जाँच की:

cat ./board_serial ./product_serial

###OUTPUT###
To be filled by O.E.M.
To be filled by O.E.M.

हालांकि, यह एक बहुत अच्छा लगता है, लेकिन मैं आउटपुट प्रकाशित नहीं करूंगा:

sudo cat /sys/class/dmi/id/product_uuid

मुझे उम्मीद है कि जहां dmidecodeभी इसकी जानकारी मिलती है, वास्तव में यह ऐसा दिखता है । के अनुसार man dmidecodeआप भी तर्क निर्दिष्ट करने के द्वारा एक महान सौदा है कि उपकरण के आपके उपयोग को आसान बनाने में कर सकते हैं:

dmidecode -s system-uuid

अधिक सरल अभी भी, आप बस फ़ाइल पढ़ सकते हैं। ध्यान दें कि यह विशेष फ़ाइल विशेष रूप से एक मदरबोर्ड को पहचानती है। यहाँ 2007 कर्नेल पैच से एक अंश है जो मूल रूप से /sysfsआभासी फ़ाइल सिस्टम में इन निर्यातों को लागू करता है :

+DEFINE_DMI_ATTR_WITH_SHOW(bios_vendor,      0444, DMI_BIOS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(bios_version,         0444, DMI_BIOS_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(bios_date,        0444, DMI_BIOS_DATE);
+DEFINE_DMI_ATTR_WITH_SHOW(sys_vendor,       0444, DMI_SYS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(product_name,         0444, DMI_PRODUCT_NAME);
+DEFINE_DMI_ATTR_WITH_SHOW(product_version,   0444, DMI_PRODUCT_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(product_serial,    0400, DMI_PRODUCT_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(product_uuid,         0400, DMI_PRODUCT_UUID);
+DEFINE_DMI_ATTR_WITH_SHOW(board_vendor,         0444, DMI_BOARD_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(board_name,       0444, DMI_BOARD_NAME);
+DEFINE_DMI_ATTR_WITH_SHOW(board_version,     0444, DMI_BOARD_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(board_serial,         0400, DMI_BOARD_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(board_asset_tag,   0444, DMI_BOARD_ASSET_TAG);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_vendor,    0444, DMI_CHASSIS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_type,         0444, DMI_CHASSIS_TYPE);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_version,   0444, DMI_CHASSIS_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_serial,    0400, DMI_CHASSIS_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_asset_tag, 0444, DMI_CHASSIS_ASSET_TAG);

आप सिस्टम की पहचान करने के लिए अकेले उस डेटा का उपयोग करने में सक्षम हो सकते हैं - यदि मदरबोर्ड पर्याप्त है। लेकिन आप इस जानकारी को सिस्टम के एमएसीएस के साथ उसी तरह से जोड़ सकते हैं जैसे मैंने दिखाया कि आप हार्ड डिस्क के साथ क्या कर सकते हैं:

sudo sh <<\CMD | tr -dc '[:alnum:]' | sha256sum
        ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
        cat /sys/class/dmi/id/product_uuid 
CMD

लिनक्स कर्नेल भी आपके लिए UUIDs उत्पन्न कर सकता है:

cat /proc/sys/kernel/random/uuid #new random uuid each time file is read

या:

cat /proc/sys/kernel/random/boot_id #randomly generated per boot

दी, यह अनियमित रूप से उत्पन्न होता है और आपको आईडी असाइनमेंट को पुनर्विचार करना होगा, लेकिन यह कम से कम प्राप्त करने के लिए जितना आसान हो उतना आसान है । और यह बहुत ठोस होना चाहिए यदि आप इसे कुंजी करने का साधन पा सकते हैं।

अंतिम, UEFI सिस्टम पर यह करना बहुत आसान हो जाता है - क्योंकि हर EFI फर्मवेयर पर्यावरण चर में अपना UUID शामिल होता है। पर्यावरण चर {Platform,}LangCodes-${UUID}हर यूईएफआई प्रणाली पर मौजूद होना चाहिए, रिबूट और यहां तक ​​कि सबसे फर्मवेयर उन्नयन और संशोधनों को बनाए रखना चाहिए , और efivarfsलोड किए गए मॉड्यूल के साथ कोई भी लिनक्स सिस्टम या तो दोनों नामों को सूचीबद्ध कर सकता है:

printf '%s\n' /sys/firmware/efi/efivars/*LangCodes-*

पुराना रूप - LangCodes-${UUID}जाहिर तौर पर अब पदावनत हो गया है , और नए सिस्टम पर होना चाहिए PlatformLangCodes-${UUID}, लेकिन कल्पना के अनुसार, प्रत्येक यूईएफआई प्रणाली में एक या दूसरे को उपस्थित होना चाहिए। थोड़े से प्रयास से, आप अपने स्वयं के रिबूट लगातार चर को परिभाषित कर सकते हैं, और शायद कर्नेल के यूयूआईडी जनरेटर का अधिक उपयोग उस तरह से कर सकते हैं। यदि रुचि है, तो एफईआईटूलस में देखें


इसमें हार्डडिस्क या कोई डिस्क नहीं है, इसकी माइनिंग रिग, यदि आप नहीं जानते कि यह क्या देख रहा है तो यह diit.cz/sites/default/files/images/3988/- वर्चुअल मशीन सिंगल पर 6 GPU नहीं चला सकता है मदरबोर्ड
यूरे

वैसे भी यह किसी भी यादृच्छिक संख्या का उपयोग कभी नहीं करना चाहिए के रूप में यह consistenly मशीन नामकरण करने के उद्देश्य से हराया, वे आईडी बूट के रूप में परिवर्तन नहीं होना चाहिए
Uray

@ user77710 - डांग, यार, वह चीज मस्त है। क्या वह एक मशीन है? संभवतः आप सही हैं, लेकिन यह एक्सडीएमएक्स और क्रोमियम के कुछ कॉम्बो के साथ संभव हो सकता है - कुछ वितरित ग्राफिक्स सामान। वैसे भी, यह कोई फर्क नहीं पड़ता - मैं इसे पीछे की ओर था। कौन अपने पैसे से खुद को हराना चाहेगा? मैं कुछ सॉफ़्टवेयर लाइसेंसिंग चीज़ या कुछ सोच रहा था - आप बैंक खाते कर रहे हैं।
15

उन्हें आप वहाँ मिला कुछ निफ्टी ट्रिक्स, +1।
terdon

@terdon - प्रशंसा की बहुत सराहना की जाती है, लेकिन, अधिकांश भाग के लिए, वे चाल नहीं हैं। ip2विशेष रूप से पार्स करने के लिए डिज़ाइन किया गया है, और यह हो सकता है कि मैं इसे अच्छी तरह से नहीं कर रहा हूं - मुझे संदेह है कि एक ही चीज लगभग बिना किया जा सकता है grep/sed। संभवतः उतना ही आसानी से किया जा सकता है udevadm। और प्रत्येक EFI पर्यावरण चर नाम को विशिष्ट रूप से इन प्रकार की स्थितियों के लिए विशिष्ट रूप से पहचाना जाता है।
1

19

कई आधुनिक वितरण एक फ़ाइल /etc/machine-idको जहाज करते हैं जिसमें संभवत: अद्वितीय हेक्साडेसिमल 32-वर्ण स्ट्रिंग है। यह सिस्टमड से उत्पन्न होता है, जहां एक मेनपेज में अधिक जानकारी होती है , और यह आपके उद्देश्य के लिए उपयुक्त हो सकता है।


+1, @ XZS, आप यहां URL से संबंधित जानकारी भी जोड़ सकते हैं।
रमेश

1
यह अच्छा है, और मुझे इसी तरह की जानकारी मिली और लगभग इसका उपयोग किया ... लेकिन मैं पहले से ही एक अलग मार्ग के लिए प्रतिबद्ध था। फिर भी, यह ध्यान दिया जाना चाहिए कि यह dbusविशिष्ट है, मुझे लगता है, और यदि कोई ऑपरेटिंग सिस्टम मिटाया / पुनः स्थापित किया गया हो तो बदल जाता है।
मिकसेर्व

यह बहुत ही सुंदर है।
जिनेकोड

5

कई लिनक्स मशीनों पर, फ़ाइल /var/lib/dbus/machine-idमें प्रत्येक लिनक्स वितरण के लिए एक अद्वितीय आईडी होती है और इसे कॉल टू एक्सेस किया जा सकता है dbus_get_local_machine_id()। यह संभवत: /etc/machine-idउपर्युक्त जैसा है। यह वर्चुअल लिनक्स इंस्टॉलेशन पर भी काम करता है। मैंने इसे वर्तमान उबंटू, SuSE और CentOS वितरण पर जाँच लिया है।


1
फेडोरा 19 + 20 में वह फाइल मौजूद नहीं है। यह यहाँ है: /etc/machine-id
स्लम

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

0

हार्डवेयर बदलने पर आपको मशीन आईडी की आवश्यकता है? क्या मशीन आईडी का इस्तेमाल किसी चीज की सुरक्षा के लिए किया जा रहा है? मेरा मानना ​​है कि "सुसंगत" मशीन आईडी का सबसे अच्छा तरीका यह है कि सिस्टम पर कहीं एक यादृच्छिक स्ट्रिंग संग्रहीत किया जाए और इस तरह यदि कोई हार्डवेयर बदलता है, तो मशीन आईडी भी नहीं बदलेगी। यह वर्चुअलाइज्ड सिस्टम के लिए भी अच्छा है जहां हार्डवेयर की पहुंच प्रतिबंधित है और मैक आईडी 00: 00: 00: 00 है

आईडी बनाने और प्राप्त करने के लिए इस श स्क्रिप्ट की तरह कुछ आज़माएँ:

#!/bin/sh
FILE="/etc/machine-id"

if [ ! -f $FILE ]; then
    cat /dev/urandom|tr -dc A-Z0-9|head -c32 > $FILE;
fi

cat $FILE;

चूँकि आपका /dev/urandomलिनक्स वैसे भी लिनक्स को इंगित करता है, आप बस वही कर सकते हैं cat /proc/sys/kernel/random/uuid >$FILEजो हर रीड पर ठीक से स्वरूपित UUID उत्पन्न करता है। फिर भी, किसी भी डिस्क-कार्यान्वित दृढ़ता को हटाने के अधीन है, और, बशर्ते कि स्वीकार्य है, और प्रदान dbusकिया गया है, आपको संभवतः करना चाहिए जैसा कि @XZS ने इसके बजाय सुझाव दिया है।
2

0

अन्य उत्तर हार्डवेयर से आईडी निकालने के कई तरीके देते हैं। आप पहचानकर्ता या कई के रूप में हार्डवेयर के एक टुकड़े का उपयोग करने का निर्णय ले सकते हैं। यह समस्याग्रस्त है अगर आपको मनमाने ढंग से हार्डवेयर के टुकड़ों को बदलना या बदलना है।

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

टीपीएम मॉड्यूल और सुरक्षित बूट हार्डबोर्ड पर एक इंस्टॉलेशन के साथ मदरबोर्ड और अन्य हार्डवेयर को बांधने का एक साधन प्रदान कर सकता है।

यदि आप जो पूरा करना चाहते हैं, उसके बारे में अधिक जानकारी दें तो यह इन मामलों में हमेशा थोड़ा आसान होता है।

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