研读文档


Linux 启明道场.

本模块将带你学习最重要的 Linux 技能之一:查找程序的使用帮助。 这项技能会在你的学习之旅中发挥很大作用。 从下面的内容开始吧!


查阅文档最常见的原因,就是想弄明白各种程序到底该怎么用;其中一个具体问题,就是在命令行中应该传入哪些参数。 本模块主要围绕这一问题展开,借此带你掌握理解程序用法的思路。 后面的内容会介绍在系统中获取程序帮助的各种方法,但首先,我们从阅读文档本身开始。

要正确使用程序,很大程度上取决于是否正确指定了参数。 回想一下 -a,也就是 ls -a 中的选项。你在 隐藏文件 挑战中见过它,该挑战属于理解命令模块:其中的 -a 是一个参数,告诉 ls 同时列出隐藏文件和非隐藏文件。 因为我们想要列出隐藏文件,所以在那个场景下,给 ls 加上 -a 参数就是正确的用法。

本挑战的程序是 /challenge/challenge,你需要正确调用它,才能获得 flag。 假设它的文档如下:

欢迎阅读 /challenge/challenge 的文档!要正确运行这个程序,你需要传入 --giveflag 参数。祝你好运!

有了这些信息,去拿到 flag 吧!

大多数命令的使用方法都很直接,但也有一些命令的用法相当复杂。 例如,sed 和 awk 的参数甚至是用某种专门的编程语言编写的完整程序!当然,我们现在还不会深入这些内容。 而在 cd 和 awk 之间,还有一些命令需要给参数再传入参数……

听起来有点离奇,但你其实已经在 find 挑战中见过这种情况,它属于理解命令模块。 find 有一个 -name 参数,而 -name 本身又需要一个参数,用于指定要搜索的名称。 许多其他命令也采用类似的方式。

以下是本关 /challenge/challenge 的文档:

欢迎阅读 /challenge/challenge 的文档! 传入 --printfile 参数后,这个程序会将指定文件的内容输出到终端。 --printfile 接收的参数是要读取的文件路径。 例如,/challenge/challenge --printfile /etc/hostname 会输出容器的主机名!

根据这份文档,去拿到 flag 吧!

这一关将介绍 man 命令。 man 是 manual(手册)的缩写,会显示作为参数传入的命令的手册页面,前提是该命令有手册。 例如,假设我们想了解 yes 命令(没错,真有这个命令):

hacker@dojo:~$ man yes

这会显示 yes 的手册页,大致如下:

YES(1)                           用户命令                          YES(1)

NAME
       yes - 不断输出字符串,直到进程被终止

SYNOPSIS
       yes [STRING]...
       yes OPTION

DESCRIPTION
       反复输出一行文本,包含所有指定的 STRING;未指定时输出 'y'。

       --help 显示此帮助信息并退出

       --version
              输出版本信息并退出

AUTHOR
       由 David MacKenzie 编写。

REPORTING BUGS
       GNU coreutils 在线帮助:<https://www.gnu.org/software/coreutils/>
       翻译问题请报告至 <https://translationproject.org/team/>

COPYRIGHT
       版权所有 © 2020 Free Software Foundation, Inc. 许可证 GPLv3+:GNU
       GPL 第 3 版或更新版本 <https://gnu.org/licenses/gpl.html>。
       这是自由软件:你可以自由修改和重新分发。
       在法律允许的范围内,本软件不提供任何担保。

SEE ALSO
       完整文档 <https://www.gnu.org/software/coreutils/yes>
       也可在本地查看:info '(coreutils) yes invocation'

GNU coreutils 8.32               2022 年 2 月                          YES(1)

重要的章节包括:

NAME(1)                           CATEGORY                          NAME(1)

NAME
	本节给出此页面介绍的命令或概念的名称及简短说明。

SYNOPSIS
	本节简要说明使用方法。用法说明有标准的格式。
	通常,每行代表一种有效的命令调用方式,
	可以按以下形式理解:

	COMMAND [OPTIONAL_ARGUMENT] SINGLE_MANDATORY_ARGUMENT
	COMMAND [OPTIONAL_ARGUMENT] MULTIPLE_ARGUMENTS...

DESCRIPTION
	本节详细介绍命令或概念,
	并说明各个选项的具体用途。

SEE ALSO
	其他可能有用的手册页或在线资源。

COLLECTION                        DATE                          NAME(1)

你可以用方向键和 PgUp/PgDn 翻阅手册页。 阅读完毕后,按 q 退出。

手册页保存在一个集中管理的数据库中。 如果你好奇,它位于 /usr/share/man 目录中,但你不需要直接操作这个目录,只需要用 man 命令查询即可。 man 命令的参数不是文件路径,而是条目本身的名称。例如,要查阅 yes 的手册页,应运行 man yes,而不是 man /usr/bin/yes。后者虽然给出了 yes 程序的实际路径,却会让 man 显示乱码。

这一关的挑战程序有一个隐藏选项,使用它就能让程序输出 flag。 你必须通过 challenge 的手册页找到这个选项!

你可以用方向键和 PgUp/PgDn 翻阅手册页,也可以按 / 搜索。 搜索后,按 n 跳到下一个结果,按 N 跳到上一个结果。 还可以用 ? 代替 /,向前面的内容搜索!

阅读 challenge 的手册页,找出能给你 flag 的选项。

这一关有点棘手:挑战程序的手册页被改成了一个随机名称,藏了起来。 好在所有手册页都保存在一个可搜索的数据库中,你可以搜索这个数据库,找到隐藏的挑战手册页! 要弄清楚如何搜索所需的手册页,请运行 man man,阅读 man 命令自己的手册页!


提示 1:man man 会介绍 man 命令本身的进阶用法。你需要利用这些知识,找出如何搜索隐藏的手册页;该手册页会告诉你怎样使用 /challenge/challenge。

提示 2:虽然手册页的名称是随机的,但获取 flag 时,你实际运行的仍然是 /challenge/challenge!

有些程序没有手册页,但在传入一个特殊参数时,会告诉你如何使用它们。 这个参数通常是 --help,也常见 -h;少数情况下会是 -?、help,或者 /? 之类不常见的写法,不过最后这种写法在 Windows 上更常见。

这一关中,你将练习通过 --help 阅读程序的使用文档。 试试吧!

有些命令直接内置在 shell 中,而不是带有手册页和帮助选项的独立程序。 它们称为内置命令。 内置命令的调用方式与其他命令相同,但 shell 会在内部处理它们,而不会启动其他程序。 运行内置命令 help,就能查看 shell 内置命令的列表,如下所示:

hacker@dojo:~$ help

将某个内置命令的名称作为参数传给 help,就能查看它的帮助信息。 我们来看一个之前已经用过的内置命令:cd!

hacker@dojo:~$ help cd
cd: cd [-L|[-P [-e]] [-@]] [dir]
    切换 shell 的工作目录。
    
    将当前目录切换到 DIR。默认的 DIR 是 shell 变量
    HOME 的值。
...

这些信息很有用! 这个挑战将带你练习用 help 查询内置命令的帮助。 本挑战的 challenge 命令是一个 shell 内置命令,而不是独立程序。 和之前一样,你需要查阅它的帮助,找出应该传给它的秘密值!


30天排行榜:

此排行榜反映本模块在道场上线后各挑战的解出情况。

排名 黑客 徽章 得分
#1 symbol ma'r'cen't 🐧 belt 7
#2 symbol first 🐧 belt 7