ค้นหาไฟล์ที่มนุษย์อ่านได้


14

ฉันกำลังพยายามที่จะหาวิธีที่มีประสิทธิภาพในการทำ5 ระดับของความท้าทายโจร

อย่างไรก็ตามฉันมีไฟล์เป็นจำนวนมากและมีเพียงไฟล์เดียวที่ตรงตามเกณฑ์ต่อไปนี้:

  • มนุษย์สามารถอ่านได้
  • ขนาด 1033 ไบต์
  • ไม่สามารถทำงานได้

ตอนนี้ฉันกำลังใช้findคำสั่งและฉันสามารถค้นหาไฟล์ที่ตรงกับเกณฑ์สองข้อสุดท้าย:

find . -size 1033c ! -executable

อย่างไรก็ตามฉันไม่รู้วิธีแก้ตัวไฟล์ที่ไม่ใช่ที่มนุษย์อ่านได้ วิธีแก้ไขปัญหาที่ฉันพบสำหรับความท้าทายนั้นใช้-readableพารามิเตอร์ทดสอบ แต่ฉันคิดว่ามันไม่ได้ผล -readableดูเฉพาะสิทธิ์ของไฟล์ไม่ใช่เนื้อหาในขณะที่คำอธิบายการท้าทายขอไฟล์ ASCII หรืออะไรทำนองนั้น


1
คุณกำหนดให้มนุษย์อ่านได้อย่างไร ไม่ใช่ไบนารี
terdon

2
คำสั่งไฟล์เป็นเพื่อนของคุณ :)
โรมิโอ Ninov

อาจจะซ้ำกันของ: stackoverflow.com/questions/14505218/…
zuazo

3
มนุษย์เป็นหนึ่งในสายพันธุ์ที่ฉลาดที่สุดในโลก พวกเขายังเป็นคนเดียวที่รู้จักกับคอมพิวเตอร์ พวกเขาสามารถอ่านไฟล์ส่วนใหญ่ได้หากพวกเขาสามารถหาประเภทและรับกุญแจเข้ารหัสสำหรับเข้ารหัสได้
Stéphane Chazelas

1
แจ้งเตือนสปอยเลอร์!!
Dan Bolser

คำตอบ:


17

ใช่คุณสามารถใช้findเพื่อค้นหาไฟล์ที่ไม่สามารถทำงานได้ที่มีขนาดเหมาะสมจากนั้นใช้fileเพื่อตรวจสอบ ASCII สิ่งที่ต้องการ:

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

อย่างไรก็ตามคำถามนั้นไม่ง่ายอย่างที่คิด 'มนุษย์อ่านได้' เป็นคำที่คลุมเครืออย่างน่ากลัว สมมุติว่าคุณหมายถึงข้อความ ตกลง แต่เป็นข้อความอะไร ตัวอักษรละติน ASCII เท่านั้น? Unicode เต็มหรือไม่ ตัวอย่างเช่นพิจารณาไฟล์ทั้งสามนี้:

$ 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เช่น "UTF-8 Unicode text` หรือ" ASCII text "แต่ไม่ใช่" ข้อความที่ไม่ใช่ ISO แบบขยาย ASCII พร้อมกับลำดับ escape "

ในบรรทัดเดียวมันจะยิ่งสั้นลงกว่าที่จะไป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$นั้นจะไม่รวมสิ่งที่รับรู้ว่าเป็นเชลล์สคริปต์ สิ่งใดก็ตามที่มี Shebang นั้นถูกระบุว่าเป็นสคริปต์และสิ่งเหล่านั้นสามารถอ่านได้อย่างสมบูรณ์แบบ
terdon

@terdon จริง แต่สคริปต์มักจะปฏิบัติการได้: D ที่ถูกกล่าวว่าสคริปต์ที่เหมาะสมควรรู้จัก PDF แต่ในทางกลับกัน PDF ที่มีรูปภาพมนุษย์อ่านได้หรือไม่ PNG ของข้อความบางส่วนสามารถอ่านได้หรือไม่? อาจ. ฉันเดาว่าการทดสอบแบบสมบูรณ์จะ ... ท้าทาย
Zeta


1

คุณจะต้องใช้:

find inhere -size 1033c

มันจะให้ไฟล์เดียวที่มีรหัสผ่าน


ทำไม + 1033c ส่งคืนไฟล์มากกว่านี้ เป็นเช่นเครื่องหมายที่มากกว่าหรือเท่ากับ?
szeitlin

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ตัวเลือกที่ป้องกันไม่ให้พิมพ์ชื่อของแฟ้มการทดสอบแต่ละ
  • grepกรองเอาท์พุทที่มาจากfileโปรแกรมค้นหาบรรทัดที่มีข้อความ "" (ดูด้วยตัวคุณเองว่าลักษณะทั่วไปของ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:~$ 

เพียงใช้ไฟล์ inhere / * และ cat / home / bandit4 / inhere / -file07



0

ฉันคิดว่าวิธีการค้นหารหัสผ่านสำหรับระดับโจรนี้ที่กล่าวถึงข้างต้นส่วนใหญ่โดยใช้ find และ grep เป็นคำสั่งที่สื่อความหมายมากที่สุด

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

แต่หลังจากใช้คำสั่ง 'file' มากกว่าฉันก็พบว่ามันค่อนข้างง่ายในการค้นหาไฟล์ที่มนุษย์สามารถอ่านได้ (aka ASCII ในระดับนี้) ด้วยวิธีนี้โดยการตรวจสอบประเภทไฟล์ไดเรกทอรีทั้งหมด ไดเร็กทอรี inhere เก็บไฟล์ที่มีชื่อ '-filexx' หรือตรวจสอบไดเร็กทอรี inhere ทั้งหมดอย่างรวดเร็ว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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.