Tìm tập tin con người có thể đọc được


14

Tôi đang cố gắng tìm một cách hiệu quả để thực hiện cấp độ 5 của thử thách tên cướp OverTheWire .

Dù sao, tôi có một loạt các tập tin và chỉ có một tập tin tôn trọng các tiêu chí sau:

  • Người có thể đọc được
  • Kích thước 1033 byte
  • Không thể thực thi

Ngay bây giờ, tôi đang sử dụng findlệnh và tôi có thể tìm thấy các tệp phù hợp với 2 tiêu chí cuối cùng:

find . -size 1033c ! -executable

Tuy nhiên, tôi không biết làm thế nào để cảm thán các tập tin không thể đọc được. Các giải pháp tôi tìm thấy cho thử thách đó sử dụng -readabletham số thử nghiệm, nhưng tôi không nghĩ rằng nó hoạt động. -readablechỉ xem xét các quyền của tệp chứ không nhìn vào nội dung của nó, trong khi mô tả thách thức yêu cầu tệp ASCII hoặc một cái gì đó tương tự.


1
Làm thế nào để bạn xác định con người có thể đọc được? Không nhị phân?
terdon

1
lệnh tập tin là bạn của bạn :)
Romeo Ninov


2
Con người là một trong những loài thông minh nhất được biết đến trên trái đất. Họ cũng là người duy nhất biết sử dụng máy tính. Họ có thể đọc hầu hết các tệp với điều kiện họ có thể tìm ra loại và nắm giữ các khóa mã hóa cho mã hóa.
Stéphane Chazelas

1
CHỨNG MINH SPOILER !!
Dan Bolser

Câu trả lời:


16

Có, bạn có thể sử dụng findđể tìm kiếm các tệp không thể thực thi có kích thước phù hợp và sau đó sử dụng fileđể kiểm tra ASCII. Cái gì đó như:

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

Câu hỏi, tuy nhiên, không đơn giản như nó nghe. "Con người có thể đọc được" là một thuật ngữ mơ hồ khủng khiếp. Có lẽ, bạn có nghĩa là văn bản. OK, nhưng loại văn bản nào? Ký tự Latin chỉ ASCII? Unicode đầy đủ? Ví dụ, hãy xem xét ba tệp này:

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

Đây là tất cả các văn bản và con người có thể đọc được. Bây giờ, hãy xem những gì filelàm cho họ:

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

Vì vậy, findlệnh trên sẽ chỉ tìm thấy file1(vì lợi ích của ví dụ này, hãy tưởng tượng các tệp đó có 1033 ký tự). Bạn có thể mở rộng findđể tìm chuỗi text:

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

Với -w, grepsẽ chỉ in các dòng textđược tìm thấy dưới dạng một từ độc lập. Đó nên là khá gần với những gì bạn muốn, nhưng tôi không thể đảm bảo rằng không có loại tập tin khác mà mô tả cũng có thể bao gồm các chuỗi text.


4

Mặc dù -execchủ yếu được sử dụng để làm một cái gì đó với các tệp được tìm thấy, nhưng nó cũng có thể hoạt động như một bài kiểm tra. Do đó, chúng tôi có thể thêm nó vào các tiêu chí khác của bạn:

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

Hãy nhớ rằng, greptrả về giá trị khác không khi mẫu không được tìm thấy và sh -c "COMMAND"sẽ trả về kết quả đánh giá (miễn là nó hợp lệ). Vì vậy, điều này sẽ chỉ in các tệp trong đó file <filename>phun ra một cái gì đó kết thúc bằng text, ví dụ "văn bản Unicode UTF-8" hoặc "văn bản ASCII", chứ không phải "văn bản ASCII không mở rộng ISO, với các chuỗi thoát".

Trong một dòng duy nhất, nó thậm chí kết thúc ngắn hơn so với đi qua xargs:

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

Hãy nhớ rằng bạn có thể thay thế sh -c 'file {} | grep "text$"'bằng bất kỳ lệnh tùy chỉnh. Nếu bạn muốn kiểm tra một cái gì đó rất phức tạp, có thể là một ý tưởng tốt hơn để cung cấp một tập lệnh shell và sử dụng thay thế:

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

về lâu dài, dễ bảo trì hơn lịch sử của vỏ của bạn:

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

Đẹp! Lưu ý, tuy nhiên, kết hợp đó text$sẽ loại trừ những thứ được công nhận là shell script. Bất cứ điều gì với một shebang được xác định là một kịch bản, và những thứ đó hoàn toàn có thể đọc được.
terdon

@terdon đúng, nhưng tập lệnh có xu hướng được thực thi: D. Điều đó đang được nói, một kịch bản thích hợp cũng sẽ nhận ra các tệp PDF. Nhưng mặt khác, một tệp PDF có chứa hình ảnh con người có thể đọc được không? Là một PNG của một số văn bản có thể đọc được ? Có lẽ. Tôi đoán một bài kiểm tra hoàn thành sẽ là thử thách.
Zeta


1

Bạn chỉ cần sử dụng:

find inhere -size 1033c

Nó sẽ cung cấp cho bạn tệp duy nhất chứa mật khẩu.


Tại sao + 1033c trả lại nhiều tệp hơn? nó giống như một dấu hiệu lớn hơn hoặc bằng?
szeitlin

1

Chỉ cần chạy như sau với nội dung của thư mục:

$ 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}'

Vui lòng thử các lệnh kết hợp này. nó hoạt động trên trạm của tôi.


0

Bạn có thể thử cái này

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

Thử thách của bạn không cho phép grep. tệp mật khẩu sẽ được báo cáo là "văn bản ASCII, với các dòng rất dài"


0

Để lọc tên tệp có thể đọc được của con người, bạn có thể sử dụng tên lớp ký tự[:print:] ( có thể in ) . Bạn sẽ tìm thấy nhiều hơn về các lớp như vậy trong hướng dẫn cho .grep

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

Về ý nghĩ thứ hai, yêu cầu "có thể đọc được của con người" có thể đề cập đến nội dung của tệp, thay vì tên của nó. Nói cách khác, bạn sẽ tìm kiếm các tệp văn bản . Đó là một chút khó khăn hơn. Như @D_Bye đề xuất trong một nhận xét, sau đó bạn nên sử dụng filelệnh để xác định loại nội dung tệp. Nhưng nó không phải là một ý tưởng tốt để chạy filetheo một đường ống, bởi vì nó sẽ làm phức tạp nhiệm vụ hiển thị tên của tệp. Đây là những gì tôi đề nghị:

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

Đây là ngắn gọn cách thức filehoạt động của -part:

  • Vị -execngữ thực thi sh -c 'file -b $0 | grep -q text' FILENAMEcho từng FILENAMEđiều kiện thỏa mãn tất cả các điều kiện trước đó (loại, kích thước, không thể thực thi).
  • Đối với mỗi tệp đó, shell ( sh) chạy tập lệnh ngắn này : file -b $0 | grep -q text, thay thế $0bằng tên tệp.
  • Các filechương trình xác định loại nội dung của mỗi tập tin và kết quả đầu ra thông tin này. Các -bngăn chặn tùy chọn in tên của mỗi tập tin thử nghiệm.
  • greplọc đầu ra đến từ filechương trình, tìm kiếm các dòng có chứa "văn bản" . (Xem cho chính mình, một đầu ra điển hình của filelệnh trông như thế nào.)
  • Nhưng grepkhông xuất văn bản đã lọc, vì nó có -qtùy chọn (im lặng) được cung cấp. Những gì nó làm, chỉ là thay đổi trạng thái thoát của nó thành 0(đại diện cho "true" - văn bản đã lọc được tìm thấy) hoặc 1 (có nghĩa là "lỗi" - văn bản "văn bản" không xuất hiện trong đầu ra từ file).
  • Các đúng / sai trạng thái thoát đến từ grepđược truyền hơn nữa bằng cách shđể findvà đóng vai trò như là kết quả cuối cùng của toàn bộ " -exec sh -c 'file $0 | grep -q text' {} \;" thử nghiệm.
  • Trong trường hợp kiểm tra trên trả về đúng , -printlệnh được thực thi (tức là tên của tệp được kiểm tra được in).

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:~$ 

Đơn giản chỉ cần sử dụng tệp inhere / * và cat / home / bandit4 / inhere / -file07

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

sẽ giúp bạn tập tin từ bài tập



-1
du --human-readable | find -not -executable -size 1033c

sẽ nhận được kết quả của bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.