मानव-पढ़ने योग्य फ़ाइलों का पता लगाएं


14

मैं OverTheWire दस्यु चुनौती के स्तर 5 को करने के लिए एक कुशल तरीका खोजने की कोशिश कर रहा हूं ।

वैसे भी, मेरे पास फ़ाइलों का एक गुच्छा है, और केवल एक ही है जो निम्नलिखित मानदंडों का सम्मान करता है:

  • मानव पठनीय
  • आकार में 1033 बाइट्स
  • गैर-निष्पादन

अभी, मैं findकमांड का उपयोग कर रहा हूं , और मैं 2 अंतिम मानदंडों से मेल खाने वाली फाइलों को खोजने में सक्षम हूं:

find . -size 1033c ! -executable

हालाँकि, मैं नहीं जानता कि गैर-मानव-पठनीय फ़ाइलों को कैसे किया जाए। उस चुनौती के लिए मुझे मिले समाधान -readableपरीक्षण पैरामीटर का उपयोग करते हैं , लेकिन मुझे नहीं लगता कि यह काम करता है। -readableकेवल फ़ाइलों की अनुमतियों को देखता है, और इसकी सामग्री पर नहीं, जबकि चुनौती विवरण ASCII फ़ाइल या ऐसा कुछ पूछते हैं।


1
आप मानव पठनीय को कैसे परिभाषित करते हैं? बाइनरी नहीं?
terdon

2
फ़ाइल कमांड आपका दोस्त है :)
रोमियो निनोव

शायद इसके डुप्लिकेट: stackoverflow.com/questions/14505218/…
zuazo

3
मनुष्य पृथ्वी पर सबसे बुद्धिमान ज्ञात प्रजातियों में से एक है। वे भी केवल एक कंप्यूटर के साथ निपुण के लिए जाना जाता है। वे ज्यादातर फाइलें पढ़ सकते हैं बशर्ते वे टाइप कर पता लगा सकें और एनक्रिप्टेड के लिए एन्क्रिप्शन कीज पकड़ सकें।
स्टीफन चेज़लस

1
बिगड़ने की चेतावनी!!
डैन बोल्सर

जवाबों:


17

हां, आप findसही आकार की गैर-निष्पादन योग्य फ़ाइलों को देखने के लिए उपयोग कर सकते हैं और फिर fileASCII के लिए जांच कर सकते हैं। कुछ इस तरह:

find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII

हालांकि, यह सवाल उतना सरल नहीं है जितना लगता है। A मानव पठनीय ’एक बहुत ही अस्पष्ट शब्द है। निश्चित रूप से, आपका मतलब है पाठ। ठीक है, लेकिन किस तरह का पाठ? लैटिन चरित्र ASCII ही? पूर्ण यूनिकोड? उदाहरण के लिए, इन तीन फ़ाइलों पर विचार करें:

$ cat file1
abcde
$ cat file2
αβγδε
$ cat file3
abcde
αβγδε
$ cat file4
#!/bin/sh
echo foo

ये सभी पाठ और मानव पठनीय हैं। अब, आइए देखें कि fileउनमें से क्या है:

$ file *
file1: ASCII text
file2: UTF-8 Unicode text
file3: UTF-8 Unicode text
file4: POSIX shell script, ASCII text executable

तो, findऊपर दी गई कमांड केवल खोजेगी file1(इस उदाहरण के लिए, आइए कल्पना करें कि उन फाइलों में 1033 अक्षर थे)। आप findस्ट्रिंग देखने के लिए विस्तार कर सकते हैं text:

find . -type f -size 1033c ! -executable -exec file {} + | grep -w text

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


4

जबकि -execज्यादातर का उपयोग फाइलों के साथ कुछ करने के लिए किया जाता है, जहां पाया जाता है, यह परीक्षण के रूप में भी कार्य कर सकता है। इसलिए, हम इसे आपके अन्य मानदंडों में जोड़ सकते हैं:

find . \
  -size 1033c \
  -not -executable \
  -exec sh -c 'file {} | grep "text$"' \;

याद रखें, grepजब पैटर्न नहीं मिला था तो गैर-शून्य देता है, और sh -c "COMMAND"मूल्यांकन के परिणाम (जब तक यह वैध है) वापस कर देगा। तो यह केवल उन फाइलों को प्रिंट करेगा जहां file <filename>कुछ ऐसा होता है जो text"यूटीएफ -8 यूनिकोड टेक्स्ट 'या" एएससीआईआई टेक्स्ट "के साथ समाप्त होता है , लेकिन" नॉन-आईएसओ एक्सटेंडेड-एएससीआईआई टेक्स्ट, एस्केप सीक्वेंस के साथ "।

एक ही पंक्ति में, यह खत्म होने से भी कम समय के लिए समाप्त होता है xargs:

find . -size 1033c -not -executable -exec sh -c 'file {} | grep "text$"' \;

ध्यान रखें कि आप sh -c 'file {} | grep "text$"'किसी भी कस्टम कमांड से बदल सकते हैं । यदि आप किसी बहुत जटिल चीज़ की जांच करना चाहते हैं, तो शेल स्क्रिप्ट प्रदान करना और इसके बजाय उसका उपयोग करना बेहतर विचार हो सकता है:

find . -size 1033c -not -executable -exec is_human_readable.sh {} \;

जो, लंबे समय में, आपके शेल के इतिहास की तुलना में बनाए रखना आसान है:

#!/bin/sh
file "$@" | grep "text$" > /dev/null

अच्छा! ध्यान दें, हालांकि, यह मिलान text$शेल स्क्रिप्ट के रूप में मान्यता प्राप्त चीजों को बाहर कर देगा। शेबंग के साथ कुछ भी एक स्क्रिप्ट के रूप में पहचाना जाता है, और वे पूरी तरह से मानव पठनीय हैं।
terdon

@terdon सच है, लेकिन स्क्रिप्ट निष्पादन योग्य होते हैं: D। कहा जा रहा है, एक उचित स्क्रिप्ट को भी पीडीएफ को पहचानना चाहिए। लेकिन दूसरी तरफ, क्या एक पीडीएफ जिसमें छवि मानव पठनीय है ? क्या कुछ पाठ का PNG पठनीय है ? शायद। मुझे लगता है कि एक पूर्ण परीक्षा ... चुनौतीपूर्ण होगी।
ज़ेटा


1

आपको केवल उपयोग करने की आवश्यकता है:

find inhere -size 1033c

यह आपको केवल वही फाइल देगा जिसमें पासवर्ड है।


+ 1033c अधिक फाइलें क्यों लौटाता है? क्या यह एक बड़ा या समान चिह्न है-?

1

बस निर्देशिका की सामग्री के खिलाफ निम्नलिखित चलाएँ:

$ file -- *
-file00: data
-file01: data
-file02: data
-file03: data
-file04: data
-file05: data
-file06: data
-file07: ASCII text
-file08: data
-file09: data
$ cat -- \-file07
<output>

0
find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: '{print $1}'

कृपया इस संयुक्त आदेश का प्रयास करें। यह मेरे स्टेशन पर काम करता है।


0

आप यह कोशिश कर सकते हैं

find . -size 1033c ! -executable -exec file {} +

आपकी चुनौती अनुमति नहीं देती है grep। पासवर्ड फ़ाइल को "ASCII पाठ, बहुत लंबी लाइनों के साथ" बताया जाएगा


0

मानव-पठनीय फ़ाइल नामों को फ़िल्टर करने के लिए, आप [:print:]( प्रिंट करने योग्य ) वर्ण वर्ग के नाम का उपयोग कर सकते हैं । आपको मैनुअल में ऐसी कक्षाओं के बारे में अधिक जानकारी मिलेगी grep

find . -type f -size 1033c -name "[[:print:]]*" ! -executable

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

find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print

यह संक्षेप में है कि कैसे file-पार्ट काम करता है:

  • -execविधेय कार्यान्वित sh -c 'file -b $0 | grep -q text' FILENAMEप्रत्येक के लिए FILENAMEकि संतुष्ट सभी पिछले शर्तों (प्रकार, आकार, गैर निष्पादन योग्य)।
  • उन फ़ाइलों में से प्रत्येक के लिए, एक शेल ( sh) इस लघु स्क्रिप्ट को चलाता है :, फ़ाइल नाम के साथ file -b $0 | grep -q textबदल रहा है $0
  • fileकार्यक्रम प्रत्येक फ़ाइल की सामग्री प्रकार निर्धारित करता है और इस जानकारी को आउटपुट। -bविकल्प रोकता प्रत्येक परीक्षण किया फ़ाइल का नाम मुद्रण।
  • grepfileप्रोग्राम से आने वाले आउटपुट को फ़िल्टर करता है , "टेक्स्ट" वाली लाइनों की खोज करता है । (अपने लिए देखें, fileकमांड का एक सामान्य आउटपुट कैसा दिखता है।)
  • लेकिन grepफ़िल्टर्ड टेक्स्ट को आउटपुट नहीं करता है, क्योंकि इसमें -q(शांत) विकल्प दिया गया है। यह क्या करता है, बस इसकी निकास स्थिति को या तो बदल दें 0(जो "सत्य" का प्रतिनिधित्व करता है - फ़िल्टर किया गया पाठ पाया गया था) या 1 (जिसका अर्थ है "त्रुटि" - पाठ "पाठ" से आउटपुट में प्रकट नहीं हुआ था file)।
  • से आने वाली सच्ची / झूठी निकास स्थिति को और पूरी तरह से " " परीक्षण के अंतिम परिणाम के रूप में grepपारित किया shजाता है ।find-exec sh -c 'file $0 | grep -q text' {} \;
  • उपरोक्त परीक्षण सही होने पर , -printआदेश निष्पादित किया जाता है (यानी परीक्षण की गई फ़ाइल का नाम मुद्रित होता है)।

0
bandit4@bandit:~$ ls
inhere

bandit4@bandit:~$ file inhere/*


inhere/-file00: data
inhere/-file01: data
inhere/-file02: data
inhere/-file03: data
inhere/-file04: data
inhere/-file05: data
inhere/-file06: data
inhere/-file07: ASCII text
inhere/-file08: data
inhere/-file09: data

bandit4@bandit:~$ pwd 

/home/bandit4

bandit4@bandit:~$ cat /home/bandit4/inhere/-file07

koReBOKuIDDepwhWk7jZC0RTdopnAYKh
bandit4@bandit:~$ 

बस फ़ाइल इन इन / / का उपयोग करें और बिल्ली / घर / बैंडिट 4 / इनो / -फाइल07

0
find  -type f ! -executable -size 1033c

आपको अभ्यास से फ़ाइल मिल जाएगी



0

मुझे लगता है कि सबसे ऊपर बताए गए और grep का उपयोग करते हुए इस बैंडिट स्तर के लिए पासवर्ड खोजने का तरीका सबसे वर्णनात्मक कमांड है।

find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII

लेकिन, 'फाइल' कमांड का अधिक उपयोग करने के बाद, मुझे मानव-पठनीय फ़ाइलों (इस स्तर में उर्फ ​​एएससीआईआई) का पता लगाने के लिए काफी आसान महसूस हुआ, इस तरह से एक पूरी निर्देशिका फ़ाइल प्रकारों की जाँच करके। इनहेरी निर्देशिका '-filexx' नाम के साथ फाइल रखती है या जल्दी से पूरी इनहेर डायरेक्टरी की जाँच करती हैfile ./*

यहाँ मेरा दृष्टिकोण था।

bandit4@bandit:~/inhere$ file ./*
./-file00: data
./-file01: data
./-file02: data
./-file03: data
./-file04: data
./-file05: data
./-file06: data
./-file07: ASCII text
./-file08: data
./-file09: data

bandit4@bandit:~/inhere$ cat ./-file07
koReBOKuIDDepwhWk7jZC0RTdopnAYKh

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