dd स्किप करना | हेक्साडेसिमल के रूप में ऑफसेट की तलाश करें


11
# dd if=2013-Aug-uptime.csv bs=1 count=1 skip=3 2> /dev/null
d
# dd if=2013-Aug-uptime.csv bs=1 count=1 skip=0x3 2> /dev/null
f

दूसरा कमांड एक अलग मूल्य क्यों देता है?

क्या ddहेक्साडेसिमल मान के रूप में ऑफसेट को छोड़ना संभव है ?

जवाबों:


18

दूसरा कमांड एक अलग मूल्य क्यों देता है?

ऐतिहासिक कारणों से, गुणक ऑपरेटर ddमाना जाता xहै। तो 0x30 होने का मूल्यांकन किया जाता है।

क्या हेक्साडेसिमल मान के रूप में dd से ऑफसेट को पास करना संभव है?

सीधे तौर पर नहीं, जहां तक ​​मुझे पता है। ऑपरेटर का उपयोग करने के साथ-साथ गुणा xभी, आप किसी भी संख्या bको "512 गुणा (0x200) से Kगुणा और " 1024 से गुणा "(0x400) के साथ कर सकते हैं। जीएनयू आप भी प्रत्यय का उपयोग कर सकते डीडी के साथ M, G, T, P, E, Zऔर Yगुणा 2 से 20 की शक्ति, 30, 40, 50, 60, 70, 80 या 90 में क्रमश: का मतलब है, और आप ऊपरी का उपयोग करें या छोड़कर मामले कम कर सकते हैं के लिए bप्रत्यय। (कई अन्य संभावित प्रत्यय हैं। उदाहरण के लिए, EB"10 18 से गुणा करें " और PiB"2 50 से गुणा करें " का अर्थ है । info coreutils "block size"अधिक जानकारी के लिए देखें , यदि आपके पास जीएनयू इंस्टॉलेशन है।)

आपको अनुपस्थित के बिंदु पर उपरोक्त आर्कन, एनाक्रोनॉस्टिक और जीकी मिल सकते हैं। चिंता न करने के लिए: आप अकेले नहीं हैं। सौभाग्य से, आप बस इसे अनदेखा कर सकते हैं और अपने शेल के अंकगणितीय प्रतिस्थापन का उपयोग कर सकते हैं (बैश और अन्य पॉज़िक्स आज्ञाकारी गोले काम करेंगे, साथ ही साथ कुछ गैर-पॉज़िक्स गोले भी)। शेल हेक्साडेसिमल संख्याओं को समझता है, और यह सामान्य तरीके से लिखे गए अंकगणित ऑपरेटरों की एक पूरी श्रृंखला की अनुमति देता है। आपको बस इसके साथ अभिव्यक्ति को घेरना है $((...)):

# dd if=2013-Aug-uptime.csv bs=1 count=$((0x2B * 1024)) skip=$((0x37))

ध्यान दें कि $((...))POSIX अंकगणितीय विस्तार है, यह बिल्कुल भी विशिष्ट नहीं है, आपको इसका उपयोग bashकरने के लिए उपयोग करने की आवश्यकता नहीं है , कोई भी POSIX शेल करेगा। हालांकि ध्यान दें कि सहित कई गोले में bash, यह शब्द विभाजन से गुजरता है इसलिए उद्धृत किया जाना चाहिए।
स्टीफन चेजलस

@ स्टेफ़ेनचेज़लस: यह सच है, यह विशिष्ट नहीं है। हालाँकि, इसके लिए उद्धरण की आवश्यकता नहीं है। (स्थिति: "अभिव्यक्ति को तब मान लिया जाएगा जब यह दोहरे-उद्धरणों में थी, सिवाय इसके कि अभिव्यक्ति के अंदर एक डबल-कोट विशेष रूप से व्यवहार नहीं किया गया है।") यदि अभिव्यक्ति में एक चर थे, और इसके मूल्य में एक विभाजक शामिल था, तब यह एक मान्य संख्या नहीं होगी; $((...))कुछ भी नहीं बदलेगा चारों ओर उद्धरण डाल । केवल मामला मैं सोच सकता हूं कि उद्धरण कुछ भी करेंगे यदि आपके पास कुछ ऐसा था IFS=4लेकिन यह सभी प्रकार के अन्य अराजकता का कारण होगा।
रिसी

आपके द्वारा उद्धृत अनुभाग इस बारे में है कि अंदर क्या है $((...))POSIX स्पष्ट है कि विस्तार $((...))शब्द विभाजन के अधीन है । सूची के संदर्भ में अयोग्य घोषित किए गए किसी भी कमांड / अंकगणितीय / चर विस्तार को छोड़कर विभाजन + ग्लोब ऑपरेटर है। IFS = 4 को सेट करने पर सभी प्रकार की समस्याएँ उत्पन्न नहीं होंगी यदि आप विभाजन + ग्लोब ऑपरेटर का उपयोग नहीं करते हैं जहाँ इसकी आवश्यकता नहीं है / चाहते हैं, और हर बार आपको IFS को उस विभाजन + ग्लोब ऑपरेटर की आवश्यकता होती है।
स्टीफन चेजलस

@ स्टेफ़ेनचेज़लस: हाँ, संख्यात्मक परिणाम शब्द-विभाजन के अधीन है। लेकिन यह एक पूर्णांक है। यदि आप IFSकिसी ऐसी चीज़ पर सेट करते हैं जिसमें अंक शामिल हैं, तो कुछ ऐसा नहीं है जो मुझे विश्वास है कि मैंने कभी किया है, तो आपको उद्धृत करने की आवश्यकता होगी। संभवतः, यदि कोई ऐसा कर रहा था, तो किसी को इसकी आवश्यकता होगी, क्योंकि यह शायद ही कोई ऐसा हो जो आकस्मिक रूप से करने की संभावना है। या, कम से कम, यह शायद ही कुछ है जो मुझे करने की संभावना है, अवधि। मुझे आपके लिए बोलने का मतलब नहीं है।
रिस्की

1
@ogurets: आप किस शेल का उपयोग कर रहे हैं? (कृपया संस्करण शामिल करें)।
रिसी

0

मुझे पता है कि यह एक पुराना धागा है, लेकिन यह मुद्दा अभी भी उतना ही उलटा है, जितना सच में, मेरे जैसे बेवकूफ जाने-अनजाने याद करते हैं और बैश इतिहास से एक 'cp fileA fileB' को निकालते हैं, जब fileB अभी तक चेक-इन नहीं किया गया है, तो वह समर्थित नहीं है अप-निफ्टर के बाद कई घंटे तक कोडिंग करना

इस थ्रेड में अवधारणाओं के लिए धन्यवाद मैं अपनी खोई हुई फ़ाइल को पूरी तरह से पुनर्प्राप्त करने में सक्षम था, हालांकि मैंने 32Gb डिस्क और बहुत कम रैम (उबंटू 18.04 चल रहा है) के साथ एक रिमोट वर्चुअल प्राइवेट सर्वर पर मेरा खो दिया, और मेरे सभी अटैचमेंट्स 'grep' का उपयोग करके ऊपर 'अपर्याप्त स्मृति' के साथ जल्दी मर जाएगा

मेरे मामले में यह hexdump -C /dev/sdX1 | grep 'shortString'मेरे बचाव में आया था । Grep के विपरीत, यह केवल हेक्स का एक बहुत ही नैरो ट्रॉयल ASCII प्रतिनिधित्व प्रदर्शित करता है, इसलिए यह केवल एक छोटी सी अनोखी स्ट्रिंग की तलाश में महत्वपूर्ण है, और यह भी ध्यान रखें कि यहां तक ​​कि लपेटा जा सकता है। एक बार जब यह कुछ हेक्स पते का उत्पादन करता था, जहां एक मैच होता था, तो मैं ऊपर दिए गए समान तरीके से 'dd' का उपयोग करने में सक्षम था, सिवाय इसके कि मुझे लगा कि यह 4096 के ब्लॉक आकार में डिफ़ॉल्ट होना चाहिए, इसलिए मुझे न केवल हेक्स बाइट्स पते को दशमलव में बदलें लेकिन इसे dd के स्किप पैरामीटर के लिए 4k ब्लॉकों में स्केल करने के लिए इसे 4096 से विभाजित करें - अनजाने में, यदि यह संख्या dd के लिए बहुत बड़ी है तो त्रुटि संदेश ऐसा लगता है कि यह skip=अमान्य होने की शिकायत कर रहा है बजाय इसके पास किए नंबर के। ।

$((0xabcd))कुदोस उन लोगों के लिए जिन्होंने ईएएसटी के साथ बैश का उपयोग करने के बारे में युक्तियों को जोड़ा है।

बस मेरा अंतिम शब्द - मेरे मामले में एक ही फ़ाइल की कई प्रतियां थीं जो सभी निकटता में थीं। लेकिन हेक्सडंप द्वारा बताए गए उच्चतम पते से सबसे कम पते को घटाकर मैं एक ~ 5 एमबी क्षेत्र को पहचानने में सक्षम था, जिसका मतलब था कि मैं सबसे कम एड्रेस पर dd को लक्षित कर सकता हूं और उस पूरे क्षेत्र को एक अस्थायी फ़ाइल में निकाल सकता हूं। विम एडिटर अब बाइनरी कंटेंट को काफी शालीनता से संभालता है ताकि आप उसके बाद टेंपफाइल की जांच कर सकें और आवश्यकतानुसार उसे रीशैप कर सकें।

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