Các lệnh UNIX - tìm


9

Tôi đang cố gắng học các lệnh UNIX và tôi đang chơi trò chơi này để học và tôi thực sự bị mắc kẹt vào lúc này. Tôi đang ở trong một máy chủ thông qua ssh và thư mục chứa đầy các tệp và thư mục ngẫu nhiên và mật khẩu cho cấp độ tiếp theo nằm trong một trong các tệp. Tôi đã được thông báo rằng tập tin có các thành phần sau:

  • con người có thể đọc được
  • 1033 byte
  • không thực thi

Tôi đoán rằng tôi nên sử dụng findlệnh và tôi đã thử find ! -executablenhưng điều đó đã trả lại một tải các tệp. Sự giúp đỡ duy nhất có thể đọc được của con người mà tôi có thể tìm thấy trong hướng dẫn hoặc trực tuyến là in ra các kích cỡ tệp ở dạng người có thể đọc được. Vì vậy, tôi có một chút mất ở đó?

Ngoài ra tôi đã cố gắng find ~ -size 1033bnhưng điều đó không trả lại. Nhưng khi tôi thử find ~ -size -1033bnó trả lại mọi tập tin trong thư mục.


Tôi thực sự muốn biết thêm về trò chơi này!
ivanivan

2
@ivanivan bandit.overthewire.org
avgvstvs

Câu trả lời:


16

Để 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).

Tôi biết điều này đã cũ nhưng tôi muốn thêm rằng việc sử dụng find . -type f -size 1033ccũng sẽ trả lại chính xác phản hồi tương tự.
Lợi ích Brandon

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

Lưu ý rằng tôi đã sử dụng cthay vì bcho kích thước tập tin. bdành cho các khối 512 byte. cdành cho byte thực tế.


2
Tôi không nghĩ -readablecó nghĩa là con người có thể đọc được (tức là không phải nhị phân)
hhaamu

1
@hhaamu - đúng rồi. Tuy nhiên, có thể không tệ khi lọc các tệp mà người dùng không có quyền đọc! Để xác định xem một tập tin chứa nội dung người có thể đọc, ống tên được trả về bởi findđến file.
D_Bye

2

tất cả những gì tôi viết là:

find -size 1033c ! -executable

và đã nhận được các tập tin. Rõ ràng phần con người có thể đọc được là để ném bạn đi.


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

có thể đọc được có nghĩa là các tệp có thể được đọc bởi tài khoản, điều đó không làm cho chúng nhất thiết phải có thể đọc được.
Anthon

0

Tôi nghĩ cho trò chơi tuy nhiên cú pháp đúng là:

file ./* 

Bạn nhận được một danh sách liệt kê những gì mỗi tập tin được bao gồm. Nó hoạt động thực sự tốt cho những gì bạn đang cố gắng thực hiện trong trò chơi Bandit. Quả bóng đường cong thực sự cho nhiệm vụ này là mỗi tệp bắt đầu bằng - (dấu gạch nối).


Bạn có thể cải thiện điều này bằng cách thêm dấu gạch nối vào lệnh đó như thế file ./-*này.
ConstantFun

0

Tôi nghĩ rằng đây là câu trả lời thực tế tốt nhất sẽ bao gồm cả 3 điều kiện

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

Nhưng như nhiều người nói, người thực thi và con người có thể đọc được là để ném chúng ta đi, vì vậy sử dụng

find inhere/ -type f -size 1033c 

là khá đủ

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.