我正在尝试学习 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 游戏中想要实现的目标。此任务的真正曲线球是每个文件都以 -(连字符)开头。