คำสั่ง UNIX - ค้นหา


9

ฉันพยายามเรียนรู้คำสั่ง UNIX และฉันเล่นเกมนี้เพื่อเรียนรู้และฉันติดอยู่ในขณะนี้ ฉันอยู่ในเซิร์ฟเวอร์ผ่าน ssh และไดเรกทอรีเต็มไปด้วยไฟล์และโฟลเดอร์สุ่มและรหัสผ่านสำหรับระดับถัดไปอยู่ในไฟล์ใดไฟล์หนึ่ง ฉันได้รับแจ้งว่าไฟล์ดังกล่าวมีคุณสมบัติต่อไปนี้:

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

ฉันคาดเดาว่าฉันควรใช้findคำสั่งและฉันพยายามfind ! -executableแต่มันคืนไฟล์จำนวนมาก ความช่วยเหลือเดียวที่มนุษย์สามารถอ่านได้ที่ฉันพบได้ในคู่มือหรือออนไลน์คือการพิมพ์ขนาดไฟล์ที่มนุษย์อ่านได้ ดังนั้นฉันหายไปเล็กน้อยที่นั่น?

ฉันก็ลองแล้วfind ~ -size 1033bแต่ก็ไม่ได้ทำอะไรเลย แต่เมื่อฉันลองfind ~ -size -1033bมันส่งคืนไฟล์ทุกไฟล์ในไดเรกทอรี


ฉันอยากรู้มากขึ้นเกี่ยวกับเกมนี้!
ivanivan

2
@ivanivan bandit.overthewire.org
avgvstvs

คำตอบ:


16

ในการกรองชื่อไฟล์ที่มนุษย์อ่านได้คุณสามารถใช้ชื่อคลาสอักขระ[: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คำสั่งจะถูกดำเนินการ (เช่นชื่อของไฟล์ที่ผ่านการทดสอบจะถูกพิมพ์)

ฉันรู้ว่ามันเก่า แต่ฉันต้องการที่จะเพิ่มการใช้ที่find . -type f -size 1033cจะตอบสนองเหมือนกันแน่นอน
Brandon Benefield

8
find . -type f -readable -size 1033c ! -executable

โปรดทราบว่าฉันใช้cแทนbขนาดไฟล์ bสำหรับบล็อก 512 ไบต์ cสำหรับไบต์จริง


2
ฉันไม่คิดว่า-readableวิธีการที่มนุษย์สามารถอ่านได้ (เช่นไม่ binary)
hhaamu

1
@hhaamu - ถูกต้อง อย่างไรก็ตามอาจไม่ดีที่จะกรองไฟล์ที่ผู้ใช้ไม่มีสิทธิ์อ่าน! เพื่อที่จะตรวจสอบว่าไฟล์ที่มีเนื้อหาที่มนุษย์สามารถอ่านท่อชื่อที่ส่งกลับโดยการfind file
D_Bye

2

ทั้งหมดที่ฉันเขียนคือ:

find -size 1033c ! -executable

และได้รับไฟล์ เห็นได้ชัดว่าส่วนที่มนุษย์อ่านได้คือการสลัดคุณ


0
find . -readable -size 1033c \! -executable

- สามารถอ่านได้หมายความว่าบัญชีสามารถอ่านไฟล์ได้ซึ่งไม่ได้ทำให้มนุษย์สามารถอ่านได้
Anthon

0

ฉันคิดว่าสำหรับเกมอย่างไรก็ตามไวยากรณ์ที่ถูกต้องคือ:

file ./* 

คุณจะได้รับผลตอบแทนซึ่งแสดงรายการสิ่งที่แต่ละไฟล์ประกอบด้วย มันทำงานได้ดีจริงๆสำหรับสิ่งที่คุณพยายามทำในเกมโจร ลูกบอลโค้งจริงสำหรับงานนี้คือแต่ละไฟล์เริ่มต้นด้วย - (เครื่องหมายขีดกลาง)


คุณสามารถปรับปรุงโดยการเพิ่มยัติภังค์ลงในคำสั่งเช่นfile ./-*นี้
ConstantFun

0

ฉันคิดว่านี่เป็นคำตอบที่แท้จริงที่ดีที่สุดที่จะครอบคลุม 3 เงื่อนไขทั้งหมด

find inhere/ -type f -size 1033c ! -executable |xargs file | grep text

แต่อย่างที่หลาย ๆ คนกล่าวว่าสิ่งที่ปฏิบัติได้และมนุษย์สามารถอ่านได้คือการทิ้งเราดังนั้นการใช้

find inhere/ -type f -size 1033c 

ก็เพียงพอแล้ว!

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