
我正在嘗試學習 UNIX 命令,我正在玩這個遊戲來學習,但我現在真的陷入了困境。我透過 ssh 在伺服器中,目錄充滿了隨機檔案和資料夾,下一層的密碼位於其中一個檔案內。我被告知該文件具有以下屬性:
- 人類可讀的
- 1033字節
- 不可執行的
我猜我應該使用該find
命令,並且我嘗試了,find ! -executable
但返回了一堆文件。我在手冊或線上找到的唯一人類可讀的幫助是以人類可讀的方式列印出檔案大小。所以我有點迷失了?
我也嘗試過,find ~ -size 1033b
但沒有返回任何結果。但是當我嘗試時find ~ -size -1033b
它返回了目錄中的每個文件。
答案1
要過濾掉人類可讀的檔名,您可以使用[: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
這就是 -part 的工作原理file
:
- 這
-exec
謂詞針對滿足所有先前條件(類型、大小、不可執行)的sh -c 'file -b $0 | grep -q text' FILENAME
每個執行。FILENAME
- 對於每個文件,shell (
sh
) 都會運行這麼短的時間腳本:file -b $0 | grep -q text
,替換$0
為檔案名稱。 - 這
file
程式確定每個文件的內容類型並輸出該資訊。此-b
選項可防止列印每個測試文件的名稱。 grep
過濾來自程式的輸出file
,搜尋包含的行"文字"。 (您自己看看該命令的典型輸出file
是什麼樣子的。)- 但
grep
不輸出過濾後的文本,因為它有-q
(安靜)給出選項。它所做的只是改變它的退出狀態為任一0
(表示“true” - 找到過濾的文本)或 1(表示“錯誤” - 文本"文字"沒有出現在file
) 的輸出。 - 來自的真/假退出狀態由to
grep
進一步傳遞,並作為整個“ ”測試的最終結果。sh
find
-exec sh -c 'file $0 | grep -q text' {} \;
- 如果上述測試返回真的,
-print
命令被執行(即列印被測試文件的名稱)。
答案2
find . -type f -readable -size 1033c ! -executable
請注意,我使用c
而不是b
文件大小。 b
適用於 512 位元組區塊。 c
用於實際位元組。
答案3
我寫的只是:
find -size 1033c ! -executable
並得到了文件。顯然,人類可讀的部分會讓你失望。
答案4
我認為對於遊戲來說,正確的語法是:
file ./*
您將獲得一個返回,其中列出了每個文件的組成部分。它非常適合您在 Bandit 遊戲中想要實現的目標。此任務的真正曲線球是每個檔案都以 -(連字符)開頭。