type
status
date
slug
summary
tags
category
icon
password
本文相关内容:踏上学习Linux基础知识的旅程,学习在交互式终端上运行一些最基本的Linux命令。

Part 1
简介
欢迎来到“Linux 基础”系列的第一部分。你很可能使用的是 Windows 或 Mac 机器,这两者在视觉设计和操作方式上都有很多不同,就像 Windows、iOS 和 MacOS 一样,Linux只是另一种操作系统,也是世界上最流行的操作系统之一,Linux系统正在为智能汽车、安卓设备、超级计算机、家用电器、企业服务器等提供动力。
本文将为你提供以下Linux基础内容:
- 在交互式Linux机器中运行你的第一个命令
- 介绍一些用于与文件系统交互的基本Linux命令
- 向你介绍用户和组如何在Linux上工作(以及这对渗透测试人员意味着什么)
Linux的一些背景知识
Linux在哪里使用?
相比于Windows系统,Linux操作系统要轻量级得多,你会惊讶地发现,你每天都有机会以某种形式使用Linux系统,Linux能够支持以下功能:
- 用于搭建用户访问的网站
- 用于车载娱乐信息系统和相关控制面板
- 销售点(PoS-Point of Sale)系统,如商店的收银台
- 关键基础设施,如交通灯控制器或工业传感器
Linux的特色
“Linux”这个名字实际上是基于UNIX(另一种操作系统)的多个操作系统的总称,由于UNIX是开源的,所以Linux的变体也各种各样——操作系统的不同用途催生出了不同的Linux变体。
例如,Ubuntu和Debian是比较常见的Linux发行版,Linux的可扩展非常强,也就是说,你可以把Ubuntu作为服务器(比如网站和web应用程序)运行,也可以把它作为一个成熟的个人操作系统运行。在本文中,我们将使用Ubuntu系统进行练习。
tips:Ubuntu服务器可以在只有512MB内存的系统上运行。
tips:类似于不同版本的Windows(7、8和10),Linux也有许多不同的版本以及发行版。
答题

运行简单的Linux命令
正如我们之前所讨论的那样,使用 Ubuntu 等Linux操作系统的关键原因是由于Linux操作系统的轻量级,但是,这并非意味着Linux并非没有缺点,例如,如果我们没有为Linux系统安装GUI,那么在Linux操作系统中通常就没有 GUI(图形用户界面,能提供与机器交互的桌面环境)可供我们使用。
如果我们想要与没有GUI的Linux操作系统发生交互,我们就必须通过“终端”来完成(即使系统安装了GUI,还是免不了依赖于“终端”来和Linux系统进行交互)。
“终端”是纯粹基于文本的,Linux操作系统的“终端”(Terminal)界面类似于下图:

我们可以通过终端命令来实现一些基本的操作,如导航到文件、输出文件内容以及创建文件等,这些命令的含义有时候是不言自明的。
让我们先了解以下两个基本命令:
echo
:输出我们所提供的任何文本内容;
whoami
:显示我们当前登录的用户名。
以下是相关命令的示例:

答题
使用和本文相关的实验房间所提供的Linux虚拟机进行操作:

使用Linux命令与文件系统交互
我们只介绍了“ echo”和“ whoami”命令,这还不能帮助我们实现导航到文件系统、读取文件内容以及写入内容到文件等操作;所以我们还需要学习更多的命令。
与文件系统交互
如前所述,能够在不依赖桌面环境的情况下浏览所登录的Linux机器是非常重要的,我们可以使用以下命令:
ls
:该命令的全名是“listing”;
cd
:该命令的全名是“change directory”;
cat
:该命令的全名是“concatenate”;
pwd
:该命令的全名是“print working directory”。
tips:上述四个命令是不言自明的,我们可以从上面四个命令的全名中猜测出各个命令的用途。
列出当前目录中的文件(ls)
在我们查找任何文件或文件夹的内容之前,我们需要知道Linux机器的当前目录下存在什么,我们可以使用
ls
命令(ls是listing的缩写)来列出当前目录中的文件。
在上面的截图中,我们可以看到当前有以下目录/文件夹:
- Important Files
- My Documents
- Notes
- Pictures
根据以上文件夹的名称,你可能会猜测到这些文件夹将包含什么内容。
tips:你可以直接列出某个目录(文件夹)下的内容,而无需事先导航到对应目录,如使用
ls Pictures
命令将直接列出Pictures目录下的内容。更改当前目录(cd)
现在我们知道当前目录下存在哪些文件夹,我们可以使用
cd
命令(change directory的简称)来切换到对应目录中;例如,如果我们想打开“Pictures”目录,就可以执行cd Pictures
命令来切换目录,然后再使用ls
命令——即可列出“Pictures”目录下的内容。
如上图所示,在Pictures目录下有四个jpg图像文件。
查看文件内容(cat)
当我们知道文件的存在之后,我们还可能想要查看文件的具体内容,此时我们可以使用
cat
命令,该命令可以简单地查看文本文件(或其他文件)的内容。“
cat
”是concatating的缩写,该命令可用于输出文件的具体内容(不仅仅是文本文件)。在下面的截图中,我们可以看到如何使用
ls
和cat
来查看“Documents”目录下的文件具体内容:
让我们来分析一下上图内容:
- 我们首先使用了
ls
命令,这让我们知道这台机器的“Documents”文件夹中有哪些文件可用,如上图中的“todo.txt”文件;
- 然后,我们使用
cat todo.txt
命令来输出这个“todo.txt”文件的内容,随后显示的内容为“Here's something important for me to do later!”
tips:我们也可以使用
cat /home/ubuntu/Documents/todo.txt
命令直接输出目标文本文件的内容。用户名、密码、配置设置等敏感信息有时候也可能会存储在文件中,因此,我们可以尝试使用
cat
命令来查看一些可能包含敏感信息的文件的具体内容。查找当前工作目录的完整路径(pwd)
在你使用终端浏览Linux机器的过程中,你当前的工作目录名称可以通过终端提示符得知;但是我们很容易忘记我们当前在文件系统中的确切位置(即当前工作目录的完整路径),这时我们就可以使用
pwd
命令来进行查看,pwd
表示打印工作目录的完整路径(print working directory)。假设我们目前在“Documents”文件夹中——但是该文件夹在Linux机器文件系统的哪个具体位置呢?
我们可以使用
pwd
命令进行查看,如下图所示:
让我们来分析一下上图内容:
- 根据当前的终端提示符,我们已经知道我们在“Documents”目录中,假设我们不知道“Documents”在系统中的具体位置。
- 我们可以使用
pwd
(打印工作目录)命令找到这个“Documents”文件夹的完整路径。
- 在输入
pwd
命令之后,Linux会告诉我们这个“Documents”目录存储在当前机器上的“/home/ubuntu/Documents”路径。
- 现在,如果我们发现自己在其他目录中,我们就可以使用
cd /home/ubuntu/Documents
将当前工作目录重新更改为“Documents”目录。
答题
使用和本文相关的实验房间所提供的Linux虚拟机进行操作:

查找文件
Linux的一个可取之处是使用它可能会帮助我们提高工作效率,话虽如此,你的效率当然取决于你对Linux命令的熟悉程度;随着时间的推移,当你习惯与操作系统(如Ubuntu)进行交互时,那些常用的Linux命令将开始变成你的肌肉记忆。
在Linux终端界面中,我们可以使用一组命令来快速搜索用户(在整个系统中)可以访问的文件,而不只是一直使用
cd
和ls
来查找文件位置。使用“find”命令
find命令既可以非常简单地使用,也可以和其他参数或命令组合使用,这取决于你具体想要做什么。
假设我们可以看到如下的一个可用目录列表:

- Desktop
- Documents
- Pictures
- folder1
一个目录可以包含更多的目录或文件,当我们为了寻找特定的文件而不得不查看每一个目录时,这就变得令人头疼了,所以我们可以使用find命令来简化上述过程。
假设我们已经知道我们正在寻找的文件的名称-但我们不知道它的确切位置,比如,我们想找到"password.txt"文件。
如果我们已经知道文件名,我们就可以简单地使用
find -name password .txt
命令,这将在当前目录下的每个文件夹中查找指定的文件,如下所示:
如上图所示,find命令已经设法找到目标文件——相关路径是folder1/passwords.txt;但是,如果我们不知道文件的具体名称或者想要搜索每个具有相同扩展名(如“.txt”)的文件,我们应该怎么做?
我们可以简单地使用通配符(
*
)来搜索任何以“.txt”(或者其他扩展名)结尾的文件和目录。假设我们希望找到当前目录中的每个.txt文件,我们就可以构造
find -name *.txt
命令,这样我们就能够找到当前目录下的每个.txt文件以及它们的具体位置:
如上图所示,我们已经成功找到了:
- 位于./folder1目录下的passwords.txt文件;
- 位于./Document目录下的todo.txt文件。
使用“grep”命令
另一个值得学习的实用程序是
grep
命令的使用,grep
命令能够允许我们在文件的内容中搜索我们正在寻找的特定值。以web服务器的访问日志为例,假设某个web服务器的access.log有244条日志记录。

在此处,使用像
cat
这样的命令并不能很好地解决内容查找问题,例如,如果我们想搜索这个日志文件,以查看某个用户/IP地址访问了哪些内容,考虑到我们想要找到一个特定的值,所以用cat
命令直接查看这个包含244个条目的日志文件内容并不是那么有效。我们可以尝试使用
grep
来搜索一个文件的全部内容,以找到我们想要查找的特定值;以上述的访问日志文件为例,假设我们希望找到IP地址“81.143.211.90”访问过的所有内容(注意,这是虚构的),我们可以如下操作:使用grep "81.143.211.90" access.log
命令。
如上图所示,我们已经使用
grep
命令搜索了access.log文件,然后终端界面向我们显示了一些条目,这些条目都是在access.log日志文件中与目标IP相关的内容。tips:“grep”的全称为Global search REgular expression and Print out the line(全局搜索正则表达式并打印成行)
答题
使用和本文相关的实验房间所提供的Linux虚拟机进行操作:

Shell操作符介绍
学习Linux操作符能够加强你对Linux命令的了解,有一些重要的操作符值得我们注意。
本小节将简单介绍以下几个基础操作符:
&
:此操作符允许你在终端的后台运行命令。
&&
:此操作符允许你在终端的一行中组合多个命令。
>
:这个操作符是一个重定向器——这意味着我们可以从命令中获取输出(例如使用cat输出一个文件)并将其定向到其他地方,当我们将输出重定向到一个有内容的文本文件时,原文件的文本内容会被自动覆盖。
>>
:此操作符执行与>
操作符相同的功能,但最终效果是附加输出内容到原文件内容的结尾而不是直接替换(这意味着不会覆盖任何内容)。
接下来,让我们简单地介绍一下以上四种操作符。
操作符 "&"
这个操作符允许我们在后台执行命令。
假设我们现在想复制一个大文件,这将花费很长时间,并且在复制文件期间我们无法做任何其他事情;因此,我们可以选择使用"&"操作符将命令后台化,该操作符的作用是允许我们执行一个命令并将其放置在后台,而当命令在后台执行时,我们就可以继续利用终端来做其他事情。
操作符"&&"
我们可以使用"&&"操作符来组合我们要执行的命令列表,并且使用该操作符组合的每个有效命令都会得到执行,例如
command1 && command2
,但是要注意的一点是:只有在command1
命令执行成功时,command2
命令才会随后得到执行。操作符 ">"
这个操作符就是所谓的重定向器。使用该操作符时,我们可以从命令中获取输出内容,并能将该输出内容发送到其他地方。
一个很好的例子是使用">"操作符重定向
echo
命令的输出,假设我们想要创建一个名为,并且要求它的内容为“hey”,我们就可以使用以下命令:echo hey > welcome

tips:如果上图例子中的“welcome”文件本身就有内容,那么使用上述之后,“welcome”文件的原内容将被“hey”所覆盖。
操作符 ">>"
这个操作符其实也是一个输出重定向器,就像我们前面所讨论的操作符(">")一样;然而, ">>"操作符的不同之处在于:它不会覆盖原文件中的任何内容,而是会将输出内容附加到原文件内容的最后。
在前面的例子中,我们有一个包含“hey”内容的文件“welcome”,如果我们使用
echo
命令组合 ">"操作符向文件中添加“hello”,那么“welcome”文件的内容将只有“hello”而没有“hey”(因为使用">"操作符会覆盖原文件的内容)。当我们使用 ">>"操作符时,重定向的输出内容将附加到原文件内容的末尾,而不会直接替换(覆盖)原文件的内容:
echo hello >> welcome

答题
阅读本小节的内容,并且使用和本文相关的实验房间所提供的Linux虚拟机进行操作。

小结
本文所介绍的内容是你在与 Linux 机器交互时将要使用的最基本功能,只要你经常使用这些Linux命令,你将能够很快熟悉这些Linux基础内容。
现在快速回顾一下,本文简单介绍了以下内容:
- 了解关于Linux的一些简单背景知识。
- 与Linux机器进行简单交互。
- 运行一些最基本的Linux命令。
- 介绍如何简单地与Linux中的文件系统进行交互,使用
find
和grep
等命令来更有效地查找目标文件。
- 通过了解一些 shell 操作符来增强你的命令使用基础。
Part2
简介
欢迎来到“Linux基础”系列的第二部分,在本文中我们将开始了解能够登录和控制远程Linux机器终端的基本技能,并且,我们还将学习以下内容:
- 介绍参数标志和参数开关以便我们更高效地使用Linux命令;
- 通过学习更多命令,如复制文件和移动文件等,加强我们对Linux文件系统的了解;
- 介绍访问权限控制机制,并且了解如何识别当前用户是否具有相关的访问权限,以确保文件和文件夹的安全;
- 介绍一些Linux中的常见目录。
使用 SSH 访问 Linux 机器
SSH协议是Secure Shell的简称,使用该协议是连接到远程Linux机器的常用方法,通过SSH我们可以使用命令行来与远程Linux机器进行交互。
我们将部署两台机器:
- TryHackMe所提供的Linux目标虚拟机
- TryHackMe所提供的攻击机或者你的本地Kali虚拟机
什么是SSH &它是如何工作的?(简单了解)
Secure Shell或SSH 是一种能够对计算机设备之间的通信数据进行加密的协议。使用了SSH协议之后,计算机设备之间需要通过网络传输的数据将被加密处理,一旦加密数据到达远程机器,就会开始解密过程,如下图所示:

在本文中我们只需要对SSH有一个基础了解即可:
- SSH能够允许我们通过本地设备上针对另一个设备远程执行命令。
- 使用了SSH协议之后,设备之间所发送的任何数据 在通过网络传输时都会经过加密处理。
使用SSH登录Linux机器
SSH的语法非常简单,我们只需要提供以下内容:
- 远程计算机的IP地址;
- 远程计算机上可用于登录的有效帐户及凭据。
在本文中,我们将以"tryhackme"用户帐户登录到远程Linux机器,相关的登录密码是"tryhackme"。
首先,我们需要在TryHackMe攻击机(或者你的本地Kali虚拟机)上打开一个终端;我们要在攻击机终端输入的SSH命令类似于
ssh tryhackme@MACHINE_IP
,在实际执行SSH命令时,我们需要将示例中的MACHINE_IP
替换为Linux目标机的实际IP地址;当输入SSH命令并按下回车键之后,我们会被询问是否信任主机(输入"yes"即可),然后还要为"tryhackme"帐户提供密码(输入"tryhackme"即可)。
现在我们应该成功通过SSH连接到远程Linux机器,我们接下来所输入的任何命令都将在远程机器上执行——而不会在我们自己的机器上执行。
注意:当你在ssh登录提示中输入密码时,并没有可见的反馈——你将无法在键入密码时看到任何文本或符号出现,我们只需输入密码并按enter即可。
实践操作
输入命令:

Linux命令的参数标志和参数开关
大多数Linux命令都允许提供参数,这些参数将由连字符以及被称为标志或开关的特定关键字标识。
接下来我们将讨论如何识别哪些命令允许提供参数,以及如何理解这些命令的具体功能。
在使用Linux命令时,除非另有指定,否则它将执行默认行为;例如,
ls
命令能够列出工作目录下的内容,但是,这并不会显示隐藏文件;所以,我们有时候需要使用参数标志和参数开关来扩展命令的行为。以
ls
为例,ls
能够告诉我们当前目录下只有一个名为“folder1”的文件夹(请注意,下面截图中的内容仅为示例):
然而,在使用
-a
参数(--all
的缩写)对ls
命令进行扩展之后,我们会得到一个包含更多文件和文件夹内容的输出结果,例如下图中的.hiddenfolder
。
tips:名称中带"
.
"表示隐藏文件或者隐藏文件夹,带".
"的文件、文件夹无法通过简单的ls
命令被列出。允许提供参数的命令还可以使用
--help
选项,该选项会列出此Linux命令能够使用的参数信息(并会提供相关的简要描述和示例):
事实上,
--help
选项也是man page (manual page的缩写)的格式化输出,man page是关于Linux系统命令和应用程序的使用文档。The Man(ual) Page
man page(手册页)是了解Linux机器上可用的系统命令和应用程序的重要信息来源,我们可以在Linux上访问man page,也可以通过网络在线访问man page。
如果要在Linux上访问man page文档,我们可以使用
man
并将其与具体的Linux命令组合,以ls
为例,我们可以使用man ls
来查看ls
命令的手册页:
答题
通过SSH会话对目标Linux虚拟机进行操作:

可与文件系统交互的更多命令
在“Linux基础”系列的第一部分,我们介绍了与Linux机器上的文件系统进行交互的一些基本命令。
在本小节中,我们将学习更多可以与文件系统交互的命令,以允许我们:
- 创建文件和文件夹
- 移动文件和文件夹
- 删除文件和文件夹
更具体地说,我们将学习以下命令:
- touch(全称为-touch):创建文件;
- mkdir(全称为-make directory):创建目录,即创建文件夹;
- cp(全称为-copy):复制文件或者文件夹;
- mv(全称为-move):移动文件或者文件夹;
- rm(全称为-remove):移除文件或者文件夹,即删除文件或者文件夹;
- file(全称为-file):确定文件类型。
tips:与使用
cat
命令类似,我们可以为以上这些命令指定一个完整的文件路径,比如,directory1/directory2/note 。创建文件和文件夹(touch, mkdir)
在Linux上创建文件和文件夹是一个简单的过程。首先,我们将介绍如何创建一个文件,
touch
命令只接受一个参数——我们想要给我们创建的文件所赋予的名称;例如,我们可以使用touch note
创建“note”文件。值得注意的是,使用touch
只会创建一个空白文件,你还需要使用echo
之类的命令或nano
之类的文本编辑器来向空白文件添加内容。
创建文件夹与创建文件的过程类似,我们只需要使用
mkdir
命令并提供我们想要赋予给目录的名称即可;例如,我们可以使用mkdir mydirectory
创建一个目录“mydirectory”。
删除文件和文件夹(rm)
我们可以使用
rm
命令简单地删除文件,但是,如果我们希望删除一个文件夹(目录)的话,我们就需要使用-R
参数开关。
复制和移动文件、文件夹(cp, mv)
复制和移动文件是Linux机器上的重要功能,
cp
命令可以结合以下两个参数使用:- 现有文件的名称;
- 复制时希望分配给新文件的名称。
使用
cp
命令能够将现有文件的全部内容复制到新文件中,在下图的示例中,我们将“note”文件复制到“note2”文件。
移动文件所使用的
mv
命令也需要两个参数,就像cp
命令一样;然而,mv
命令不会复制并创建一个新文件,而是合并或修改我们作为参数提供的第二个文件。我们不仅可以使用
mv
命令将文件移动到新文件夹下,还可以使用mv
命令重命名文件或文件夹;例如,在下图的示例中,我们使用mv
将文件“note2”重命名为“note3”,现在“note3”文件将拥有“note2”文件的全部内容(“note2”文件会消失)。
确定文件类型(file)
一个文件通常会有所谓的扩展名,例如,文本文件的扩展名通常是“.txt”,但是文件扩展名并不是文件所必要的(一个文本文件的名称也可以不带.txt)。
我们可以使用
file
命令来确定一个文件的类型,例如,我们可以使用file
来确认“note”文件是否确实是一个文本文件:file note

答题
通过SSH会话对目标Linux虚拟机进行操作:

访问权限介绍
在Linux机器上,某些用户可能无权访问一些文件或文件夹,我们之前已经探讨了一些命令,这些命令可用于确定与文件或文件夹相关的访问权限。
在前面的知识点小节中,我们已经学习了如何通过参数标志和参数开关来扩展命令的使用;当我们使用
ls
命令结合-lh
参数开关时,我们可以看到如下示例内容:
如上图所示,我们使用
ls -lh
命令列出了当前目录下的文件和文件夹的权限分配情况。tips:
-l
使用长列表格式列出内容;-h
全称为--human-readable(顾名思义,以可读形式列出内容) 。以上输出结果对于确定文件或文件夹的某些特征以及我们是否有权访问它们非常重要,一个文件或文件夹可以有几个特征,这些特征决定了允许执行哪些操作以及哪些用户或组有能力执行给定的操作,例如:
- Read(读取):对应的权限标志为“r”;
- Write(写入):对应的权限标志为“w”;
- Execute(执行):对应的权限标志为“x”。
假设现在有一个文件名称为“cmnatic. pem”,它的文件权限分配情况如下是"-rw-------",我们对“cmnatic. pem”文件进行分析:
- “-”表示“cmnatic. pem”的类型是一个文件;
- “rw-------”表示只有“cmnatic.pem”文件的所有者才能读写该文件,并且此文件所有者无权执行该文件。
关于权限分配指示符的说明:
修改权限:
简述用户和组之间的区别
我们在Linux基础知识第一部分(即普通用户和系统用户之间的区别)中简要地探讨了这一点。Linux的伟大之处在于,Linux系统中的权限可以划分得很细致,从技术上讲,在一个用户拥有一个文件的同时,如果对权限进行设置,那么另一组用户也可以对同一文件拥有相同或不同的权限集,而不会影响文件所有者本身。
让我们把权限划分的概念放到现实世界中,我们知道运行web服务器的系统用户必须具有有效的针对web应用程序的文件读写权限;然而,类似于提供网络托管服务的公司 将不得不允许他们的客户在不成为web服务器系统用户的情况下 就能为他们的网站上传自己的文件——而这可能会危及所有其他客户的安全。
下面我们将学习在用户之间进行切换所需的命令。
切换用户
由于有
su
命令,所以在Linux中切换用户变得非常简单。除非你是root用户(或者通过sudo使用root权限),否则你需要知道以下内容来完成用户帐户的切换:- 我们希望切换到的有效用户名称;
- 有效用户的密码。
在实际使用
su
命令时,我们可以将其与参数开关相结合以扩展命令的使用,例如,我们可以指定用户切换后执行命令或指定用户切换后要使用的特定shell。你可以通过阅读su
的手册页(man su
)以了解更多信息。简单地说,通过向
su
命令提供-l
(或者--login
)参数开关,我们可以启动一个更类似于实际用户登录系统的shell——我们可以继承新用户的更多属性,如环境变量等。我们可以使用简单的
su
命令切换到user2用户:su user2
,此时我们得到的新会话会将我们放置到前一个用户的主目录中。
我们也可以使用
su
命令结合参数开关-l
切换到user2用户:su -l user2
,此时我们的新会话会自动将我们放到新用户的主目录中。
答题
通过SSH会话对目标Linux虚拟机进行操作:

Linux中的常用目录
/etc目录
这个目录是Linux系统上最重要的目录之一,"/etc"文件夹(目录)是存储操作系统所使用的系统文件的常见位置。
例如,下图显示的etc/sudoers文件包含了 能够以root用户权限运行
sudo
命令或其他Linux命令的用户和组的列表;下图还显示了etc/passwd和etc/shadow文件,这两个文件对于Linux也是特殊的,因为它们显示了系统如何以被称为sha512的加密格式存储每个用户的密码。
tips:etc是etcetera的缩写,etcetera的意思是——“等等;附加物”。
/var目录
接下来我们要介绍的是"/var"目录,其中"var"是" variable data"(可变数据)的缩写,此目录是Linux系统中的主要目录之一,存储着在系统中运行的服务、应用程序所频繁访问或写入的数据;例如,来自于服务和应用程序运行时的日志文件将被写入到此目录下(
/var/log
),其他不一定与特定用户相关联的数据(如数据库等)也会被存储到"/var"目录下。
/root目录
与"/home"目录不同,"/root"文件夹实际上是"root"系统用户的主目录;除了理解这是"root"用户的主目录之外,这个文件夹没有其他内容。基于逻辑上的假设,用户会将其数据默认保存在"/home/root"目录中。

/tmp目录
该目录是Linux中的唯一目录,"/tmp"目录中的"tmp"是"temporary"(临时)的缩写,它是不稳定的,可用于存储只需要被访问一次或两次的数据;"/tmp"在存储数据时与计算机上的内存类似,一旦计算机重新启动,"/tmp"文件夹中的内容则将会被自动清除。
我们要知道的是:在默认情况下,任何用户都可以写入内容到这个"/tmp"文件夹,这意味着一旦我们访问了一台机器,"/tmp"就可以作为存储脚本等内容的极佳选择。

答题
通过阅读本小节的内容回答以下问题:

小结
本文涵盖了相当多的Linux基础知识,让我们简单回顾一下本文所包含的学习内容:
- 学习使用SSH远程连接到Linux机器;
- 通过了解参数标志、参数开关以及每个命令的相关信息(手册页)来加强对Linux命令的使用;
- 学习使用一些常用命令与文件系统及其内容进行交互;
- 简要介绍了文件权限和怎样切换当前用户;
- 介绍Ubuntu Linux在默认情况下的常用目录,了解我们应该如何使用存储在这些常用目录中的数据。
Part 3
简介
欢迎来到“Linux基础”系列的第三部分(也是最后一部分)。到目前为止,在本系列文章中,你已经学习了一些基本概念并使用了一些重要的命令;接下来,本文将展示一些你可能经常会用到的实用工具和应用程序,你还将通过了解Linux中的自动化任务、包管理、服务日志及应用程序日志来提高你的Linux技能。
环境准备
在TryHackMe攻击机或者你的本地Kali机上,使用以下凭据 通过SSH远程访问TryHackMe实验房间所提供的Linux目标机器:
- IP Address:MACHINE\_IP(在与本文相关的TryHackMe实验房间中部署目标机器,即可得到一个对应的目标IP地址)
- Username:tryhackme
- Password:tryhackme
tips:语法示例——
ssh tryhackme@MACHINE_IP
。终端文本编辑器
到目前为止(在本系列的文章中),我们使用过
echo
命令与操作符(>
和>>
)的组合,实现了写入文本内容到指定文件中;但是当我们处理具有多行内容的文件时,前述写入方式并不是一种有效的处理数据的方法,此时我们就需要使用文本编辑器来处理文件内容。有很多文本编辑器可供Linux终端使用,它们都有各种各样的友好性和实用性,接下来我们将简单介绍以下两种终端文本编辑器:
- nano编辑器
- vim编辑器
Nano编辑器简介
Nano很容易上手,如果要使用nano创建或编辑文件,我们只需输入
nano filename
命令(在实际执行时,将"filename"替换为你所希望编辑的文件名即可)。一旦我们按下回车键执行nano命令,nano编辑器将会被启动,然后我们就可以开始输入或修改文件的文本内容;我们可以使用“向上”和“向下”方向键浏览文本的每一行,也可以使用键盘上的“Enter”键开始新的一行。
Nano编辑器有一些很容易记住的功能,包括以下内容:
- 搜索文本
- 复制和粘贴
- 跳转到某行号对应的行
- 找出你当前所在行的行号
你可以通过按“Ctrl”键(在Linux上会被表示为
^
)并结合相应的字母来使用nano编辑器的功能;例如,如果我们要退出编辑器界面,我们可以按“Ctrl”+“X”退出Nano编辑器。VIM编辑器简介
VIM是一个更高级的文本编辑器,虽然你不需要知道VIM的所有高级特性,但是使用VIM编辑器特性 对于提高你的Linux技能有很大帮助。

尽管需要更长的时间来熟悉,但是VIM编辑器有很多优点,包括以下内容:
- 可自定义——你可以自主选择修改键盘快捷键;
- 语法高亮显示——如果你正在编写或维护代码,这可能非常有用,VIM编辑器是软件开发人员的流行选择之一;
- VIM编辑器可以在没有安装nano的所有终端上工作(VIM编辑器可以完全替代nano编辑器);
答题
通过SSH会话对目标Linux虚拟机进行操作:

Linux常见实用程序介绍
下载文件-wget
计算机设备的一个相当基本的特征是具有传输文件的能力,例如,你可能想要从网上下载一个程序、一个脚本或者一张图片。
在本小节我们将介绍
wget
命令的使用,这个命令允许我们通过HTTP从网络上下载文件——就像你在浏览器中访问文件一样;在使用wget
命令下载文件时,我们还需要提供所希望下载的资源的地址,例如,如果我们想下载一个名为“myfile.txt”的文件到本地Linux机器上,假设我们已经知道了目标资源文件的网址,我们所使用的命令看起来会是下面这样:\\传输文件-scp \\
SCP(secure copy)是一种能够安全复制文件的方法,与常规的
cp
复制命令不同,使用scp
命令可以在两台计算机之间传输文件,并且该命令将使用SSH协议来提供身份验证和数据加密功能。基于SOURCE(源)和DESTINATION(目的地),SCP能够允许你:
- 将文件和目录从当前系统中复制到远程系统;
- 从远程系统中复制文件和目录到当前系统。
使用
scp
命令的前提是:我们已经知道当前的本地系统和远程系统上有效用户的名称及其密码。接下来我们要将一个示例文件从我们的本地机器复制到远程机器,假设我们已经知道如下信息:
- 远程系统的IP地址——192.168.1.30;
- 远程系统上的有效用户名称——ubuntu;
- 本地系统上的文件名——important.txt;
- 我们希望将文件存储在远程系统上所使用的新文件名称——transferred.txt。
有了以上这些信息,我们就可以编写
scp
命令将文件从本地系统中复制到远程系统:现在,让我们颠倒过来,让我们使用
scp
命令从远程计算机上复制文件到本地计算机。同样,我们需要事先知道以下信息:
- 远程系统的IP地址——192.168.1.30;
- 远程系统上的有效用户名称——ubuntu;
- 远程系统上的文件名——documents.txt;
- 我们希望将文件存储在本地系统上所使用的新文件名称——notes.txt
有了以上这些信息,我们就可以编写
scp
命令从远程系统上复制文件到本地计算机:托管文件到web服务器
Ubuntu机器预先打包了python3,而Python能够提供了一个轻量级且易于使用的web模块,称为“HTTPServer”;该模块能够将你的计算机变成一个快捷和简易的web服务器,你可以使用它来托管你本地计算机上的文件,然后就可以通过其他计算机设备使用
curl
和wget
等命令进行文件下载操作。Python3的“HTTPServer”默认将托管你当前运行命令时所在的目录中的文件,但这可以通过添加在手册页中找到的参数选项来更改。
我们可以直接在本地计算机的终端中运行
python3 -m http.server
命令以启动“HTTPServer”模块,如下例所示(没有指定端口则会使用8000端口):tips:如果需要指定该简易web服务器所绑定的端口,则可以使用像
python3 -m http.server 1234
这样的命令(其中的1234为指定的端口号)。现在,我们就可以在其他计算机设备上使用
wget
并通过指定本地计算机的IP地址和文件名来下载文件。Python3所提供的这个“HTTPServer”模块的一个缺陷是无法编制索引,因此必须知道我们所希望下载的文件的确切名称和位置。除了Python3所提供的“HTTPServer”模块之外,你还可以使用Updog来托管文件,Updog能提供一个更高级但仍属于轻量级的web服务器以便你托管本地计算机上的文件。
Updog的GitHub项目链接:https://github.com/sc0tfree/updog
下面是通过Python3的"HTTPServer"模块下载所托管的文件的示例(承接前面的本地文件托管示例):
在上面的示例中,我们可以看到
wget
命令成功地将名为“file”的文件下载到我们的机器上,这个http请求会被HTTPServer记录(就像任何web服务器一样):tips: 关于Python3"HTTPServer"模块的文档—— https://docs.python.org/3/library/http.server.html 。
答题
通过SSH会话对目标Linux虚拟机进行操作:
使用 Python3 的“HTTPServer”模块在目标机器的“tryhackme”用户的主目录中启动 Web 服务器。

在本地攻击机上下载刚才启动的简易web服务器所托管的文件。

flag为:THM{WGET\_WEBSERVER} 。

Linux进程基础
进程(Process)是指在你的计算机中正在运行的程序,它们由操作系统内核进行管理,并且每个进程都会有一个与之关联的ID,这个ID被称为PID。PID会根据进程启动的顺序而递增,也就是说,第60个进程的PID即为60。
查看进程(Viewing Processes)
Linux
ps
(英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器。我们可以使用
ps
命令来列出正在运行的进程的一个列表,该列表将提供一些附加信息,如进程的PID、进程的状态码、进程相关的CPU占用情况、正在执行的实际程序或命令的名称等。
从上图中我们可以看到:我们第一次执行
ps
命令时,ps
本身的进程PID是204,然后当我们再次执行ps
命令时,ps
本身的进程PID增加到了205(这说明PID确实会根据进程启动的顺序而递增)。如果我们要查看由其他用户运行的进程和那些不在会话中运行的进程(即系统进程),我们需要为
ps
命令提供aux
参数:ps aux

从上图中我们可以看到现在总共有5个进程,相关的用户名称为“root”和“cmnatic”。
另一个非常有用的命令是
top
命令,此命令能为你提供有关系统上正在运行的进程的实时统计信息,而不仅是一次性视图;top
命令所提供的统计信息将每几秒钟刷新一次,但是每当你使用方向键浏览各行信息时也会进行刷新。
关于ps命令的使用参考:https://www.runoob.com/linux/linux-comm-ps.html
终止进程(Managing Processes)
我们可以通过发送一些信号来终止进程,这些终止进程的信号有多种类型,这主要与系统内核如何“干净”地处理进程有关。
如果我们要终止一个命令(在Linux中,我们可以把进程理解为正在运行的命令),我们可以使用适当命名的
kill
命令与我们所希望kill的相关PID组合在一起;例如,我们想要kill一个PID为1337的进程,我们可以使用以下命令:kill 1337
下面是当进程被杀死时我们可以发送给进程的一些信号(使用
kill -l
可列出当前所支持的所有信号类型):- SIGTERM(
kill -15
):终止进程,但允许它事先执行一些清理任务;
- SIGKILL(
kill -9
):默认信号,9
参数可以省略,表示终止进程并且不做任何事后清理;
- SIGSTOP(
kill -19
):停止或者挂起进程;
- SIGHUP(
kill -1
):重启进程;
- SIGCONT(
kill -18
):继续进程。
进程如何启动
操作系统(OS)使用名称空间并最终能将计算机上的可用资源分配给(如CPU、RAM和高优先级)进程,你可以把这个过程想象成将你的计算机资源分成几片——类似于切割一块蛋糕;在切片内的进程将拥有一定的计算机资源,然而,这部分资源也只是所有进程实际可用的一小部分。
名称空间对于安全性非常重要,因为它是将一个进程与其他进程隔离的方式——只有相同名称空间中的进程才能相互看到。
我们之前讨论过PID是如何工作的,这就是名称空间可发挥作用的地方;PID为1的进程为系统启动时会自动运行的进程,这个进程在Ubuntu中是系统的初始化(init)进程,比如
systemd
,它能够用于提供一种在操作系统和用户之间管理用户进程的方法。一旦系统启动并初始化,
systemd
就会成为首先自动运行的进程之一,而我们想要运行的任何程序或软件都将作为systemd
进程的子进程启动;虽然这些子进程由systemd
控制,但仍将作为单独的进程运行(尽管会共享来自systemd
的资源),这能使我们更容易识别各个进程。
在系统启动时启动进程/服务
一些应用程序可以在我们的计算机系统启动时启动,例如,web服务器、数据库服务器或文件传输服务器等,这些软件通常很关键,因而经常被管理员告知在系统启动期间启动。
为了在系统启动时启动进程/服务,我们可以使用
systemctl
命令,该命令允许我们与systemd
进程(守护进程)交互;systemctl
是一个易于使用的命令,它采用以下语法格式:systemctl [option] [service]
如果我们要让apache服务启动,我们可以使用
systemctl start apache2
,如果想让apache服务停止,我们只需将[option]
替换成stop
即可。我们可以为
systemctl
命令设置以下四个选项:- Start
- Stop
- Enable
- Disable
Linux前台和后台介绍
进程可以以两种状态运行:在前台运行、在后台运行。
你在Linux终端中运行的命令,如“echo”将在终端的前台运行,
echo
命令是一个很好的例子,因为echo
命令的输出将在前台返回,并且无法在后台返回:
如上图所示:当我们运行
echo "Hi THM"
命令时,我们能在终端前台看到命令的输出;但当我们在echo "Hi THM"
之后添加&
操作符之后,我们只能在终端前台看到echo
进程的ID(而不是命令的输出)——因为此时echo
命令正在后台运行。前后台机制对于复制文件之类的命令非常有用,因为这将允许我们同时在终端前台和终端后台执行不同的命令;以使用复制文件命令为例,后台化此命令意味着——我们不必等待文件复制命令执行完成,就能同时执行其他命令。
当我们在执行脚本之类的程序文件时,我们也可以让这个进程后台化,此处不依赖于
&
操作符,而是需要我们在键盘上使用Ctrl + Z
来设置进程的后台化,这也是一种“暂停”脚本运行或命令执行的有效方法,如下图所示:
由上图可知:示例脚本会持续输出内容 "This will keep on looping until I stop!",直到我们停止或者挂起与该脚本对应的进程,我们可以通过在键盘上使用Ctrl + Z(在终端界面由T^Z表示)来停止示例脚本的运行。
前台化进程
假设现在有一个进程("background.sh"脚本)在后台运行,我们可以通过使用
ps aux
命令来确认这一点:
我们已经知道,在键盘上使用
Ctrl + Z
或者在命令中添加&
操作符能够使进程后台化;同样,我们还可以通过使用fg
命令将后台进程重新前台化。
答题
tips:阅读本小节的内容以帮助回答以下问题
通过SSH会话对目标Linux虚拟机进行操作:

隐藏的flag为:THM{PROCESSES} 。

Linux定时任务
用户可能希望设置某个操作或任务在系统启动后得到执行,例如:运行一些命令、备份指定文件、启动某个程序等等。
为了对操作或任务的执行进行定时设置,我们接下来将讨论
cron
进程,更具体地说:我们将学习如何通过crontab
与cron
进程进行交互,crontab
是在系统引导期间所启动的进程之一,它负责促进和管理cron jobs(定时任务)。
crontab是一个特殊的文件,其格式可被
cron
进程识别以逐步执行crontab的每一行,crontab需要具有以下 6 个特定字段值:- MIN:每多少分钟(minute )执行;
- HOUR:每多少小时(hour)执行 ;
- DOM:在一个月的每哪一天(Day Of the Month)执行 ;
- MON:在一年的每哪个月(Month of the year)执行;
- DOW:在一个星期的每哪一天(Day Of the Week)执行;
- CMD:实际上将被执行的命令(command)。
以备份文件为例,你可能希望每12小时备份一次"cmnatic"用户的"Documents",我们将为此使用以下格式命令:
crontab的一个有趣特性是支持通配符(
*
),如果我们不希望为某个特定的字段提供一个值,我们就可以用*
代替;如上面的定时任务示例(备份文件),我们不关心这个任务执行的月份、日期以及年份——我们只关心它做到每12小时执行一次,所以我们只需放置星号来代替我们所不关心的值。我们可以使用在线的“Crontab Generator”工具,它可以帮助生成符合格式的crontab命令;我们还可以使用“Cron Guru”工具,它会分析crontab执行的时间点。
我们可以通过使用
crontab -e
命令并且选择一个编辑器(比如Nano)来编辑crontab文件的内容:
tips:我们通过
crontab
命令可以添加、删除、编辑自动化任务(定时任务)。答题
通过SSH会话对目标Linux虚拟机进行操作:


Linux软件包管理
介绍软件包和软件存储库
当开发人员希望向Linux社区提交软件时,他们会将其提交到“apt”存储库,如果获得Linux官方批准,那么他们所提交的程序和工具将被发布到公共区域。
Linux最可取的两个特性在这里脱颖而出:具有用户可访问性、能够发挥开源工具的优点。
当我们在 Ubuntu 20.04 Linux 机器上的/etc/apt目录中使用
ls
命令时,能够看到以下文件,这些文件可用作网关/注册表。
虽然操作系统供应商将维护他们自己的存储库,但你也可以选择将一些社区存储库添加到你的源列表中,这将允许你扩展Linux操作系统的功能。
例如:我们可以使用
add-apt-repository
命令添加其他存储库到我们的系统,在实际使用这个命令时,我们可以择优添加系统资源供应商所提供的存储库(一些系统资源供应商会拥有一个更接近我们机器的地理位置的存储库)。管理存储库(添加和删除)
通常我们可以使用
apt
命令将软件安装到我们的Linux系统中,apt
命令是apt包管理软件的一部分;apt包管理软件(即包管理器)包含了一整套工具,这些工具允许我们管理软件包和软件源,同时还能帮助我们安装软件或者删除软件。添加存储库的一种方法是使用我们上面提到的
add-apt-repository
命令,但是我们也可以手动添加和删除存储库。虽然你也可以选择使用其他包安装程序(如
dpkg
)来安装软件,但是使用apt包管理器的好处是:每当我们更新系统时,它都会检查包含我们添加的软件的存储库是否有更新。在接下来的示例中,我们将把Sublime text文本编辑器作为一个存储库添加到Ubuntu机器中(这个文本编辑器并不是默认的Ubuntu存储库的一部分);在我们添加软件时,我们所下载的软件的完整性是通过使用所谓的GPG (Gnu Privacy Guard)密钥来保证的,这些密钥本质上是开发人员所提供的安全检查,能够表明“这是我们的软件”,如果当前密钥与操作系统所信任的密钥(即开发人员使用的密钥)不匹配,那么计算机就不会执行下载软件的操作。
因此,我们首先需要添加Sublime Text 3开发人员所使用的GPG密钥。(此过程需要访问互联网)
添加存储库的示例:
1.下载GPG密钥并使用apt-key信任这个密钥:
wget -qO - <https://download.sublimetext.com/sublimehq-pub.gpg> | sudo apt-key add -
2.现在我们已经将密钥添加到我们的可信列表中,我们可以开始将Sublime Text 3的存储库添加到我们的apt源列表中;一个好的做法是为我们添加的每个不同的社区/第三方存储库都分配一个单独的文件。
2.1让我们在 /etc/apt/sources.list.d目录中创建一个名为sublime-text.list的文件:

2.2使用Nano或其他文本编辑器,添加并保存Sublime text 3存储库到刚才新创建的文件中:

2.3在我们添加了以上条目之后,我们需要更新apt包以识别这个新条目——这是通过使用
apt update
命令完成的。2.4成功更新apt包之后,我们现在可以继续安装我们所信任的并且已经添加到apt包中的软件——
apt install sublime-text
删除软件包的方法很简单,我们可以使用
add-apt-repository --remove ppa:PPA_Name/ppa
命令来完成,也可以通过手动删除之前添加的文件来完成。当我们成功删除了软件包之后,我们还需要使用
apt remove [software-name-here]
来清理apt包,例如:apt remove sublime-text
。tips:在删除软件包时,我们要将上述示例命令中的
PPA_Name
替换为我们期望删掉的PPA
的名称(该名称在以上示例中为“sublime-text”)。Linux日志
我们在 Linux 基础知识第一部分中简要介绍了日志文件以及它们所在的位置,现在,让我们快速回顾一下:这些包含日志信息的文件和文件夹位于
/var/log
目录中,主要包含了在系统上所运行的应用程序、服务的日志记录信息。操作系统 (OS) 擅长通过一个被称为“轮换-rotating”的过程来自动管理日志信息。
以下是Linux机器上正在运行的三个服务以及和这些服务相关的日志信息(此处仅为示例):
- Apache2 web服务器;
- fail2ban服务(此服务的日志信息可用于监视攻击者所尝试的暴力操作);
- UFW服务,用作防火墙;

通过查看这些服务日志,能够很好地监视系统运行状况以及保护系统的安全;而且,像web server这样的服务所对应的日志文件,还包含了关于每个请求的信息——这将允许网站开发人员或网站管理员诊断web服务的性能,并且有助于调查网络入侵者的活动。
关于web服务,下面两种类型的日志文件是值得我们注意的:
- access log
- error log

tips:日志文件会存储关于操作系统如何运行的信息,还会存储用户所执行的操作,例如身份验证尝试。
答题
通过SSH会话对目标Linux虚拟机进行操作:

小结
欢迎来到Linux基础模块的末尾,随着你与Linux交互时间的增加,你对Linux的熟悉程度也将会得到提高。
本文主要介绍了以下内容:
- 关于两种终端文本编辑器(nano和vim)的简介;
- 了解Linux中的一般实用程序,如下载文件、传输文件、使用python web服务器托管本地内容;
- 了解Linux中的进程;
- 通过学习crontab定时任务、软件包管理和日志检查来维护和自动化你的Linux系统。
可参考的Linux中文学习资源:
- Linux 常用命令英文全拼:https://www.runoob.com/w3cnote/linux-command-full-fight.html
你可以通过以下TryHackMe实验房间继续扩展你的Linux基础学习:
- Bash Scripting(Bash脚本基础) - https://tryhackme.com/room/bashscripting
- Regular Expressions(正则表达式基础) - https://tryhackme.com/room/catregex
- Author:Pass`Miao
- URL:whypass.top/article/1ac80a1f-83f0-8046-a079-e21e20eed762
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!