tryhackme-网络安全基础-命令行- Linux Shells-23

tryhackme-Cyber Security 101-Command Line-Linux Shells
房间地址:https://tryhackme.com/room/linuxshells
这是网络安全入门的基础模块的计算机科学基础知识:Linux Shells,序号 01 表示第一篇文章,当你不知道从哪里开始的时候,你可以按照数字顺序来进行参考即可。

Linux Shells

Task 1 Introduction to Linux Shells

作为操作系统的常规用户,我们广泛使用图形用户界面 (GUI) 来执行大多数操作。只需点击几下不同的选项,即可完成任务。但是,您可以通过在操作系统的命令行界面 (CLI) 中编写命令来执行几乎所有任务,而无需使用 GUI。Shell 为您在命令行界面中编写的命令提供了一些强大的功能。这种与操作系统交互的方式更高效,也更节省资源。

假设您在一家餐厅,有两种点菜方式。第一种是从菜单上点菜,服务员会为您上菜。第二种是自己在厨房烹饪您想要的菜肴。对于 Linux 系统来说,这里的厨房就是操作系统,使用操作系统的 GUI 就像是从菜单上点菜,服务员会为您上菜。但是,使用命令行界面意味着您必须亲自前往厨房(操作系统)烹饪您想要的菜肴。在这个例子中,Shell 会通过提供一些菜谱建议来帮助您烹饪您想要的菜肴。使用命令行界面 (CLI) 在 Linux 系统中执行操作,可以让您在执行任务时拥有更强大的功能和控制力。

您可能在电影中看到过一些黑客场景,这些场景展示了一些炫酷的终端,其中执行了许多命令。这是因为大多数 Linux 用户更喜欢使用 Shell 在命令行界面 (CLI) 上编写命令来执行操作,而不是使用 GUI。本课程将教我们如何与 Linux Shell 交互。我们还将探索 Linux 中可用的各种 Shell,并在最后编写一些 Shell 脚本。
学习目标

学习与 Linux Shell 交互
使用基本的 Shell 命令
探索可用的 Linux Shell 类型
编写一些 Shell 脚本

课程先决条件

Linux 基础模块
https://tryhackme.com/module/linux-fundamentals

Task 2 How To Interact With a Shell?

我们已为这间房间准备了一台虚拟机。首先,请点击下方“启动虚拟机”按钮启动虚拟机。虚拟机将以分屏视图启动。

启动虚拟机

如果虚拟机未显示,请点击页面顶部的蓝色“显示分屏视图”按钮。虚拟机将以图形用户界面 (GUI) 的形式打开。您也可以使用以下 SSH 凭据,通过 Attackbox 或您自己的 VPN 连接计算机连接到虚拟机:
Username user
Password user@Tryhackme
IP MACHINE_IP

机器在分屏视图中打开后,您将看到 shell 提示符,可以接受命令。

user@tryhackme:~$ 

大多数 Linux 发行版都使用 Bash(Bourne Again Shell)作为默认 shell。但是,打开终端时显示的默认 shell 取决于您的 Linux 发行版。

注意:在接下来的任务中,我们将讨论不同类型的 shell。

您应该已经在本房间的先决条件中提到的 Linux 基础模块中学习了基本的 Linux 命令。让我们简要讨论一些我们在 shell 中最常用的命令。

与 shell 交互时,您必须位于要执行操作的目录中。默认情况下,在大多数 Linux 发行版中打开 shell 时,您将位于您的主目录中。要查看当前工作目录,您可以执行 pwd 命令,即 Print Working Directory(打印工作目录),如下面的终端所示:

user@tryhackme:~$ pwd
/home/user

从上述命令的执行结果中可以看到,您当前的工作目录是 /home/ubuntu。

不过,您也可以更改目录。为此,您可以使用 cd(Change Directory 的缩写)命令,如下面的终端所示:

user@tryhackme:~$ cd Desktop
user@tryhackme:~$/Desktop$

使用操作系统图形用户界面 (GUI) 时,可以直接在屏幕上看到目录内容。但是,使用命令行界面 (shell) 时,要查看目录内容,必须输入以下命令:

user@tryhackme:~$ ls
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos

如果要读取文件内容,可以在 shell 中输入以下命令:

user@tryhackme:~$ cat filename.txt
this is a sample file
this is the second line of the file

grep 命令是 Linux 用户中非常常用的命令。这个强大的命令可以搜索文件中的任何单词或模式。假设你想在一个大文件中查找特定的条目,你可以使用 grep 命令并配合相应的模式,它会帮你提取出来。它还可以帮助你在大文件中搜索特定的关键字。

下面的终端示例展示了如何使用 grep 命令在一个大型文本文件中搜索单词“THM”。输出结果显示了包含该单词的文本文件行。

user@tryhackme:~$ grep THM dictionary.txt
The flag is THM

Task 3 Types of Linux Shells

与 Windows 操作系统中的命令提示符和 PowerShell 类似,Linux 也提供了多种 shell,每种 shell 都有其独特的功能和特性。

不同的 Linux 发行版中安装了多个 shell。要查看当前使用的 shell,请键入以下命令:

user@tryhackme:~$ echo $SHELL
/bin/bash

您还可以列出 Linux 操作系统中可用的 shell。/etc/shells 文件包含了 Linux 系统上所有已安装的 shell。您可以通过在终端中输入 cat /etc/shells 来列出 Linux 操作系统中可用的 shell:

user@tryhackme:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen
/bin/zsh
/usr/bin/zsh

要在这些 shell 之间切换,您可以输入操作系统中已有的 shell 名称,它将打开,如下所示:

user@tryhackme:~$ zsh
tryhackme% 

如果您想永久更改默认 shell,可以使用命令:chsh -s /usr/bin/zsh。这将把 zsh 设置为终端的默认 shell。

Linux shell 有很多种类型。我们将讨论其中几种及其特性。

  • Bourne Again Shell

Bourne Again Shell (Bash) 是大多数 Linux 发行版的默认 shell。打开终端后,Bash 就会出现,供您输入命令。在 Bash 出现之前,sh、ksh 和 csh 等 shell 各有不同的功能。Bash 作为这些 shell 的增强版,融合了它们各自的功能。这意味着它既拥有这些旧 shell 的许多特性,也具备一些自身独有的功能。Bash 的一些主要特性如下:

Bash 是一个广泛使用的 shell,具备脚本编写功能。

它提供 Tab 键自动补全功能,这意味着如果您正在输入命令,可以按下键盘上的 Tab 键。它会根据可能的匹配项自动补全命令,或者提供多个补全建议。

Bash 会保存一个历史记录文件,记录您输入的所有命令。您可以使用上下箭头键快速使用之前的命令,而无需再次输入。您也可以输入 history 命令来显示所有之前的命令。

  • Friendly Interactive Shell

友好交互式 Shell (Fish) 并非大多数 Linux 发行版的默认 Shell。顾名思义,它比其他 Shell 更注重用户友好性。Fish 的一些主要功能如下:

它提供非常简单的语法,非常适合初学者。

与 Bash 不同,它具有自动拼写纠错功能。

您可以使用 Fish 自定义命令提示符,并添加一些炫酷的主题。

Fish 的语法高亮功能会根据命令的不同部分进行颜色区分,从而提高命令的可读性。它还可以通过独特的颜色帮助我们快速发现错误。

Fish 还像本文提到的其他 Shell 一样,提供脚本编写、Tab 键自动补全和命令历史记录等功能。

  • Z Shell

大多数 Linux 发行版默认不安装 Z Shell (Zsh)。它被认为是一个现代 shell,融合了早期一些 shell 的功能。Zsh 的一些主要特性如下:

Zsh 提供高级 Tab 键自动补全功能,并且能够编写脚本。

与 fish 类似,它也提供命令自动拼写纠错功能。

它提供了丰富的自定义选项,这可能会导致其运行速度比其他 shell 慢。

它还提供 Tab 键自动补全、命令历史记录功能以及其他一些特性。

选择最佳的 Linux shell 取决于您的使用需求及其功能。本文讨论的 shell 只是 Linux 中众多 shell 中的一部分。您可以比较这些不同 shell 的功能,并根据您的任务选择最合适的 shell。

Task 4 Shell Scripting and Components

shell 脚本本质上就是一组命令。假设一项重复性任务需要你使用 shell 输入多个命令。与其每次重复执行该任务时都逐个输入这些命令(这​​会耗费你大量时间),不如将它们组合成一个脚本。要执行所有这些命令,你只需运行该脚本,所有命令就会被执行。前面提到的所有 shell 都具备脚本编写功能。脚本编写可以帮助我们实现任务自动化。在学习如何编写脚本之前,我们需要了解,尽管 Linux shell 具备脚本编写功能,但这并不意味着你只能使用 shell 来编写脚本。脚本编写也可以使用各种编程语言。然而,本部分主要介绍如何使用 shell 编写脚本。

第一步是打开终端并选择一个 shell。我们选择 bash shell,它是大多数发行版中默认且广泛使用的 shell。

与我们在 shell 中输入的其他命令不同,我们需要先使用任何文本编辑器创建一个文件来存放脚本。该文件必须以 .sh 为扩展名,这是 bash 脚本的默认扩展名。以下终端显示了脚本文件的创建过程:

user@tryhackme:~$ nano first_script.sh

每个脚本都应该以 shebang 开头。shebang 是一组字符,添加到脚本开头,以 #! 开头,后跟执行脚本时要使用的解释器名称。由于我们是用 bash 编写脚本,所以让我们在 shebang 中将其定义为解释器。

#!/bin/bash

现在我们已经准备好编写第一个脚本了。脚本有一些基本的组成部分,它们共同构成了一个高效的脚本。让我们学习并运用这些脚本结构,自己编写一个脚本吧。

  • Variables

变量用于存储值。假设你需要在脚本中多次使用一些复杂的值,例如 URL、文件路径等。与其反复记忆和输入这些值,不如将它们存储在一个变量中,并在需要的地方使用变量名。

以下脚本在屏幕上显示字符串:“嘿,你叫什么名字?” 这是通过 echo 命令实现的。脚本的第二行包含代码 read nameread 用于从用户获取输入,name 是用于存储输入的变量。最后一行使用 echo 显示用户的欢迎信息,以及存储在变量中的用户姓名。

# Defining the Interpreter 
#!/bin/bash
echo "Hey, what’s your name?"
read name
echo "Welcome, $name"

现在,按 CTRL+X 保存脚本。按 Y 确认,然后按 ENTER 键。

要执行脚本,首先需要确保脚本具有执行权限。要授予脚本执行权限,可以在终端中输入以下命令:

user@tryhackme:~$ chmod +x first_script.sh

现在脚本已获得执行权限,请在脚本名称前加上 ./ 来执行它。之所以在脚本名称前加上 ./ 而不是直接输入脚本名称,是因为 ./ 会告诉 shell 执行当前目录中的文件。如果不在脚本名称前加上 ./,shell 会在 PATH 环境变量(包含除当前目录之外的所有目录)中搜索脚本,但如果找不到,就会报错。下面的终端显示了我们使用了这些变量的脚本:

user@ubuntu:~$ ./first_script.sh
Hey, What's your name?
John
Welcome, John
  • Loops

循环,顾名思义,就是重复执行的操作。例如,你有很多好友,想给他们发送同一条消息。与其逐个发送,不如在脚本中创建一个循环,将好友列表和消息传递给循环,它就会将消息发送给所有好友。

为了更好地理解循环,我们来编写一个循环,在屏幕上显示从 1 到 10 的所有数字。首先,创建一个名为 loop_script.sh 的新文件,然后输入以下代码。按 Ctrl+X 保存文件,然后输入 y 确认,最后按 Enter 键。

# Defining the Interpreter 
#!/bin/bash
for i in {1..10};
do
echo $i
done

第一行代码定义了变量 i,它会从 1 循环到 10,每次循环执行以下代码。do 表示循环代码的开始,done 表示循环代码的结束。在它们之间,我们需要编写循环中要执行的代码。for 循环会将括号中的每个数字赋值给变量 i,每次循环都会执行一次。echo $i 会在每次循环中显示变量 i 的值。

现在,让我们赋予脚本执行权限后执行它。

user@tryhackme:~$ ./loop_script.sh
1
2
3

上述终端的输出仅显示 3 个数字以作演示。但是,按照脚本逻辑执行时,它会显示 1 到 10 的数字。

  • Conditional Statements

条件语句是脚本编写中不可或缺的一部分。它们可以帮助你仅在满足特定条件时执行特定代码;否则,你可以执行其他代码。假设你想编写一个脚本,向用户显示一个秘密。但是,你希望这个秘密只对某些用户显示,例如高权限用户。你可以创建一个条件语句,首先询问用户的名字,如果该名字与高权限用户的名字匹配,则显示该秘密。

首先,创建一个名为 conditional_script.sh 的新文件,然后输入以下代码。按 Ctrl+X 保存文件,然后输入 y 确认,最后按 Enter 键。

# Defining the Interpreter 
#!/bin/bash
echo "Please enter your name first:"
read name
if [ "$name" = "Stewart" ]; then
        echo "Welcome Stewart! Here is the secret: THM_Script"
else
        echo "Sorry! You are not authorized to access the secret."
fi

上述脚本以用户名作为输入,并将其存储在一个变量中(详见“变量”部分)。条件语句以 if 开头,并将该变量的值与字符串“Stewart”进行比较;如果匹配,则向用户显示密钥,否则不显示。fi 用于结束条件判断。

以下是终端输出,显示了当用户名与脚本中定义的授权用户名匹配时脚本的执行情况:

user@tryhackme:~$ ./conditional_script.sh
Please enter your name first:
Stewart
Welcome, Stewart! Here is the secret: THM_Script

但是,以下终端显示了当用户名与脚本中定义的授权用户名不匹配时脚本的执行情况:

user@tryhackme:~$ ./conditional_script.sh
Please enter your name first:
Alex
Sorry! You are not authorized to access the secret.
  • Comments

有时候,代码会非常冗长。在这种情况下,过一段时间后再查看代码或与他人分享时,可能会感到困惑。解决这个问题的一个简单方法是在代码的不同部分添加注释。注释是我们为了便于理解而添加到代码中的句子。注释以#号开头,后面跟一个空格,然后是需要添加的句子。例如,让我们重写一下我们在条件语句部分讨论过的脚本,并添加注释。使用nano编辑器打开conditional_script.sh文件,然后添加以#号开头的注释。按Ctrl+X保存文件,然后输入y确认,最后按回车键。

# Defining the Interpreter
#!/bin/bash

# Asking the user to enter a value.
echo "Please enter your name first:"

# Storing the user input value in a variable.
read name

# Checking if the name the user entered is equal to our required name.
if [ "$name" = "Stewart" ]; then

# If it equals the required name, the following line will be displayed.
echo "Welcome Stewart! Here is the secret: THM_Script"

# Defining the sentence to be displayed if the condition fails.
else
        echo "Sorry! You are not authorized to access the secret."
fi

看看带注释的脚本是不是更简洁易懂。注释不会影响脚本的运行。一个好的脚本总是会包含一些注释。上面的示例每一行都配有注释,这只是对注释概念的一种更清晰的解释。不过,添加注释的最佳方式是在脚本的主要和复杂部分添加注释。

注意:其他类型的变量、循环和条件语句也可以用来完成不同的任务。此外,也可以在一条注释中添加多行注释。但这不在本次讨论的范围内。

Task 5 The Locker Script

在之前的任务中,我们学习了 shell 脚本中的变量、循环和条件语句。现在,让我们运用这些知识创建一个包含所有这些组件的 shell 脚本。

需求

用户在银行拥有一个保险箱。为了确保保险箱的安全,我们需要编写一个脚本来验证用户身份。脚本执行时,应要求用户输入姓名、公司名称和密码 (PIN)。如果用户输入的信息正确,则允许其进入;否则,拒绝其访问。

用户名:John

公司名称:Tryhackme

密码:7385

# Defining the Interpreter 
#!/bin/bash 

# Defining the variables
username=""
companyname=""
pin=""

# Defining the loop
for i in {1..3}; do
# Defining the conditional statements
        if [ "$i" -eq 1 ]; then
                echo "Enter your Username:"
                read username
        elif [ "$i" -eq 2 ]; then
                echo "Enter your Company name:"
                read companyname
        else
                echo "Enter your PIN:"
                read pin
        fi
done

# Checking if the user entered the correct details
if [ "$username" = "John" ] && [ "$companyname" = "Tryhackme" ] && [ "$pin" = "7385" ]; then
        echo "Authentication Successful. You can now access your locker, John."
else
        echo "Authentication Denied!!"
fi

脚本执行

user@tryhackme:~$ ./locker_script.sh
Enter your Username:
John
Enter your Company name:
Tryhackme
Enter your PIN:
1349
Authentication Denied!!

Task 6 Practical Exercise

我们在所连接的 Ubuntu 机器的默认用户目录 /home/user 下放置了一个脚本。该脚本会在指定目录下的所有文件(扩展名为 .log)中搜索特定的关键字。

注意:执行脚本文件之前,需要对其进行一些修改。按照任务 2 中的说明打开机器后,您将能够以普通用户身份登录。但是,我们建议您切换到 root 用户,以便在指定目录的所有文件中搜索该标志。要切换到 root 用户,您只需输入以下命令并输入该用户的密码(凭据包含在任务 2 中):

user@tryhackme:~$ sudo su
[sudo] password for user: 
root@tryhackme:/home/user#

您可以通过注意以下细节来修改脚本文件:

标记:thm-flag01-script

目录:/var/log

提示:在脚本文件中查找空的双引号"",并将其填入。请确保双引号之间没有空格。

Task 7 Conclusion

在这个房间里,我们学习了 shell 的重要性,并深入探索了 Linux shell 的世界,了解了它们的主要类型。我们对 shell 脚本及其在自动化任务中的作用有了更深入的理解。最后,我们编写了一些很棒的 shell 脚本,并完成了一个实践实验,该实验涉及一个能够从不同目录中查找神秘内容的脚本。

posted @ 2025-10-29 04:12  sec875  阅读(11)  评论(0)    收藏  举报