认识 Linux

你一定听说过操作系统,比如 Windows 或者安卓,我们用它来管理文件、运行软件或者 App。Linux 也是一套操作系统。它既可以安装在个人电脑上作为日常桌面,也是全球很多服务器运行的基础。

说到 Linux,很多人的刻板印象就是命令窗口,就像电影中黑客在一个黑底绿字的窗口里高速敲击键盘那样。

黑底绿字、满屏命令输出的终端窗口

但其实这是一个误解。Linux 也是可以安装图形桌面的,事实上很多美化效果非常好看,用户同样可以用鼠标点击打开应用。只是在服务器工作中,我们大部分情况下都是直接连接服务器运行简短的命令,这时使用命令行会更高效。

经过美化的 Linux 图形桌面 图:ItroVertise,Wikimedia Commons,CC BY-SA 4.0

本模块会从最基本的命令输入开始,逐步介绍 Linux 的目录结构、文件编辑、管道与重定向、文本检索以及用户权限,最后完成一次真实的文件排查练习。

内核与发行版

Linux 起源于 1991 年芬兰大学生 Linus Torvalds 编写并开源的操作系统内核。全球开发者协作维护至今,使其成长为广泛使用的 Linux 内核(Kernel)。

内核直接与 CPU、内存和硬件交互,协调所有软件运行。把 Linux 内核、常用命令行工具、系统服务、软件包管理器以及桌面环境组合起来,就形成了可直接安装使用的 Linux 发行版(Distribution)。

Ubuntu、Debian、Kali、Fedora、Arch Linux 和 Linux Mint 等 Linux 发行版

常见发行版各有定位:

  • Ubuntu:社区资源丰富,兼顾桌面易用性与服务器稳定性;
  • Debian:以极高的稳定性和开源原则著称,是众多发行版的基石;
  • Kali Linux:面向渗透测试与数字取证,基于 Debian 开发并预装了大量安全工具。

不同发行版预装的软件和界面可能不同,但底层的命令、目录结构和权限规则高度一致。

Linux 图形桌面与文件管理器(GNOME / Nautilus,显示主目录)

上图是一台 AlmaLinux(GNOME 桌面)的图形界面:文件管理器打开在当前用户主目录,左侧任务栏可以看到终端与浏览器入口。不过,在服务器与安全工作中更常用、更高效的是终端与命令行。(图片来源:Wikimedia Commons,AlmaLinux OS Foundation,GPLv2+)

命令行与 Shell

在图形界面双击文件夹,或在终端输入命令列出目录,本质上都是向计算机发出操作请求。后者称为命令行界面(CLI,Command Line Interface):输入文字指令,按回车执行,读取系统返回的结果。

在服务器运维与安全工作中,命令行不可替代主要有三个原因:一是生产服务器为节省资源与减少攻击面通常不装图形界面,只能通过 SSH 远程操作;二是命令行可以把重复操作写成脚本自动执行;三是 Linux 的小工具可以通过管道自由组合,几秒内就能处理海量日志。

Windows(PowerShell、CMD)和 macOS 也有自带的终端应用,只是命令习惯不同,例如查看目录在 Windows CMD 中用 dir,在 Linux 中用 ls。

命令行环境由两部分配合组成:

  • 终端(Terminal):负责接收键盘输入并把执行结果展示在屏幕上的窗口;
  • Shell(壳程序):在后台读取、解析并执行命令的解释器。Linux 中最常见的默认 Shell 是 Bash(Bourne Again SHell)。

看懂终端提示符

我们先看一段终端输出:

crow@trainer:~$ pwd
/home/crow
crow@trainer:~$

第一行开头的 crow@trainer:~$ 是 Shell 打印出来的提示符(Prompt),包含了几项基础信息:

组成部分示例含义说明
crow当前登录用户名表示当前用户身份
@连接符分隔用户名和主机名
trainer主机名当前计算机的名称
:分隔符分隔主机名与当前所在的工作路径
~当前目录波浪号 ~ 代表当前用户的主目录,例如 /home/crow
$权限提示符$ 表示普通用户;如果是超级管理员 root,末尾会变成 #

提示符后面的 pwd 是我们输入的命令(Print Working Directory,打印当前工作目录)。按下回车后,第二行输出了 /home/crow。第三行再次出现提示符 crow@trainer:~$,说明上一条命令已经跑完,正在等待下一条指令。

接着输入 ls(List,列出目录内容)并回车:

crow@trainer:~$ ls
notes.txt  secret/

屏幕上列出了当前目录里的两个项目:文件 notes.txt 和文件夹 secret/。

要查看文件里写了什么,可以用 cat 命令。命令名后面空一格,跟上文件名:

注意

cat 源自 concatenate(拼接),最初用来把多个文件接在一起输出,查看单个文件只是它最常用的一种用法。如果不好记,可以理解成:让猫把内容抓出来。

crow@trainer:~$ cat notes.txt

在 cat notes.txt 这条命令里,cat 是命令名,空格后面的 notes.txt 是参数(Argument),用来告诉命令操作哪个文件。命令与参数之间必须用空格隔开;如果连写成 catnotes.txt,Shell 会把整串当成一个命令名去找,然后报错说找不到。

切换目录

进入子目录使用 cd 命令(Change Directory):

  • 进入子目录:cd secret。进去后可以用 pwd 看当前路径,再用 ls 看里面的文件;
  • 返回上一级目录:cd ..。注意 cd 和两个英文点 .. 之间也要空一格,.. 代表当前目录的父目录。

下面在模拟器里试一下:

找到一个文件

模拟实验

阅读当前目录的 notes.txt,根据其中的目标,自己列出目录、找到 flag.txt 并读取内容。模拟器会在目标文件被读取后完成任务,无需手工提交其中的字符串。

点击此处启动:
题解 Hint