云计算入门——Linux 命令行入门
前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。
介绍
如今,我们许多人都熟悉计算机(台式机和笔记本电脑)、智能手机和平板电脑,它们具有图形用户界面(也称为 GUI),使我们能够导航应用程序、网络和文件(如文档和照片)通过视觉体验。Windows、macOS 和 Linux 操作系统均提供各种桌面环境(例如,带有文件夹和文件的图像)和下拉菜单,所有这些都提供对计算机程序、应用程序和我们自己的媒体的访问。
尽管 GUI 对于许多用户来说是使用计算机的直观方式,但它们通常无法为我们提供对计算机的最大权力,并且它们可能会阻止我们对计算机拥有完全的管理访问权限,包括安装、修改或删除软件或文件。此外,由于 GUI 很大程度上是可视化的,因此它们通常无法像所有用户那样易于访问。
在没有 GUI 的情况下导航我们自己的个人计算机和远程云服务器的一种方法是通过基于文本的终端或命令行界面 (CLI)。
几乎所有计算机操作系统上都存在终端接口,终端模拟器也可作为平板电脑和智能手机的应用程序使用。终端通过增加管理员访问权限、增强定制环境的能力以及自动化流程的机会,为用户提供了对其机器的更全面的访问权限。它们还为用户提供访问远程计算机(例如云服务器)的能力。
本文将为刚刚接触终端环境的用户提供通过浏览器中的嵌入式 Web 终端使用命令行界面的基础知识(我们可以在下面启动该终端)。读完本文后,我们应该了解如何在 Linux(或 macOS)计算机或服务器上使用终端。
了解终端窗口
当我们第一次使用新计算机或智能手机时,我们可能希望打开它并通过检查可用的应用程序来了解如何使用它,并了解东西在哪里,以便我们可以自定义设备以适应我们的需求。我们可以通过类似的方式通过终端来熟悉计算机。
一般我们看到的窗口如下(可能没有右上角的符号):
在终端中,应该有一个美元符号$
和一个闪烁的光标。我们将在此处开始输入命令来告诉终端要做什么。
我们启动的终端是 Ubuntu 20.04 终端。Ubuntu 是一个流行的 Linux 发行版,最初基于 Unix 操作系统。macOS 操作系统也是基于 Unix 的。如果我们在 Linux 或 macOS 计算机上阅读本教程,则我们的操作系统上应该有一个终端,其工作方式与我们将在本文中使用的嵌入式终端类似。
在许多这样的Unix(或基于*nix)操作系统中,提示符末尾的符号可能是一个$
符号,也可能是一个#
符号,其含义如下:
$
或美元符号 — 我们已作为普通用户登录#
或井号标签或井号符号 — 我们以具有提升权限的用户身份登录
环境中记录的用户#
也称为 root 用户,默认情况下被视为超级用户或管理员。
我们先以普通用户身份登录,之后可以通过命令获得管理员权限sudo
。
请注意,在本地计算机的终端上工作时最好多加小心,因为我们可以作为管理员在终端上进行一些更改,从而对我们正在使用的计算机进行永久性更改。
熟悉目录
我们将通过输入命令开始使用终端。命令是用户发出的指令,传达用户希望计算机执行的操作**。**我们将在终端中输入命令,然后在准备好计算机执行给定命令时按ENTER
或RETURN
。
让我们输入以下命令,然后输入ENTER
。我们还可以复制该命令,或者通过将鼠标悬停在下面的代码块上时单击相关链接来要求它在启动的交互式终端中运行。
pwd
运行此命令后,我们将收到以下输出:
Output
/home/sammy
该pwd
命令代表“当前工作目录”,它可以让我们知道当前文件系统中的位置。
在此示例中,我们位于名为/home/sammy
的目录(或文件夹)中,它代表名为sammy
的用户。如果我们以具有提升权限的用户root
身份登录,则该目录将被称为/root
。在个人计算机上,该目录可能称为拥有该计算机的用户的名称。
现在,这个目录是空的。让我们创建一个目录来存储我们在本文中将创建的文件,例如,我们可以将其称为 files
。
我们将使用下面的命令,mkdir
代表“创建目录”。输入命令后,我们需要写入文件夹的名称,该名称会将值传递给命令,以便命令可以在创建此目录时执行。该值(文件夹的名称)称为参数**,**它是提供给命令的输入。如果我们熟悉自然语言语法,我们可以将参数视为命令动词所作用的对象。
为了创建一个名为files
的新目录,我们将编写以下内容,运行mkdir
命令并使用files
作为参数:
mkdir files
运行此命令后,除了带有闪烁光标的新行之外,我们不会收到任何输出。终端上出现这条新行后,我们就可以执行下一个命令了。
列出内容并了解权限
由于我们尚未收到有关新目录的任何具体反馈,因此我们将使用命令来了解有关当前工作目录中内容的更多信息。我们可以通过使用以下命令ls
(表示“ l i s t”)列出目录中的文件来确认新目录确实存在:
ls
我们将收到确认files
目录存在的输出:
Output
files
这为我们提供了有关当前工作目录中内容的一般信息(一般都是文件夹的名称,一长串子)。如果我们想了解更多详细信息,我们可以ls
使用所谓的标志来运行命令。在 Linux 命令中,标志由连字符和字母组成-
,将附加选项(和更多参数)传递给命令。在我们的示例中,我们将添加该-l
标志,当与 ls
配对时,该标志表示我们希望使用该选项在我们的命令中使用长列表格式。
让我们输入这个命令和标志,如下所示:
ls -l
按下ENTER
后,我们将在终端中收到以下输出:
Output
total 4
drwxr-xr-x 2 sammy sammy 4096 Nov 13 18:06 files
这里有两行输出。第一行指的是分配给该目录的计算机内存块(一般都是文件夹的名称,一长串子),第二行主要指的是文件的用户权限。
为了获得更加人类可读的输出,我们还可以传递-h
or--human-readable
标志,它将以人类可读的格式打印内存大小,如下所示。一般来说,一个连字符-
指的是单字母选项,两个连字符指--
的是用文字写出的选项。请注意,某些选项可以使用两种格式。我们可以通过将标志链接在一起将多个选项构建到命令中,如-lh
.
例如,下面的两个命令提供相同的结果,尽管它们的写法不同:
ls -lh
ls -l --human-readable
这两个命令都将返回以下输出,与上面的输出类似:
Output
total 4.0K
drwxr-xr-x 2 sammy sammy 4.0K Nov 13 18:06 files
我们会注意到我们的目录名称files
位于第二行输出的末尾。该名称指示/home/sammy
输出行正在描述用户目录中的哪个特定项目。如果目录中有另一个文件,我们将有另一行输出,其中包含该文件的详细信息。
该行的前面有一个字符和破折号的列表。我们来分解一下每个字符的含义:
字段 | 描述 |
---|---|
d | directory (or folder))——一种可以保存其他文件的文件类型,对于组织文件系统很有用;如果是这样- ,这将引用非目录文件 |
r | read — 打开和读取文件或列出目录内容的权限 |
w | write— 修改文件内容的权限;以及添加、删除、重命名目录中的文件 |
x | execute — 运行程序文件或进入和访问目录中的文件的权限 |
在第一个字符drwx`中,第一个字母`d`表示该项目`files`是一个目录。如果这是目录以外的文件,则该字符串将以连字符开头,如`-rwx`,其中第一个连字符表示非目录文件。下面的三个字母,代表目录*所有者*`rwx`的权限,表示该目录可以被文件所有者**读**、**写**、**执行。**如果这些字符中的任何一个被替换为连字符,则意味着所有者不具有该字符所代表的权限类型。
输出中接下来的三个字符是r-x
,表示目录的files
组权限。在本例中,该组具有读取和执行权限,但没有写入权限,因为w
被替换为-
. 我们稍后将讨论如何识别该组。
第一个字符串的最后三个字符r-x
表示有权访问该计算机的任何其他组的权限。在这种情况下,这些用户组还可以读取和执行,但不能写入。
输出中的数字2
是指该文件的链接数。在 Linux 中,链接提供了一种创建快捷方式的方法来帮助用户导航文件系统。当我们创建此文件时,Linux 会执行一些后台工作来创建该文件的绝对链接和该文件的自引用链接,以允许用户沿着相对路径导航。
数字后2
,单词sammy
显示两次。这部分输出提供有关与files
目录关联的所有者和组的信息。此行中的第一个实例sammy
指的是目录的所有者,我们之前看到的权限是rwx
。该用户是我们作为用户创建目录sammy
时的所有者,并且是文件的当前所有者。虽然用户是我们当前环境中的唯一用户,但类 Unix 操作系统通常有多个用户,因此了解哪个用户拥有文件的所有权是很有用的。
第二个实例sammy
指的是有权访问该files
目录的组,我们之前看到的权限是r-x
。在这种情况下,组名与所有者用户名相同sammy
。在现实环境中,操作系统上可能有其他组可以访问该目录,例如staff
或类似的用户名admin
。
该输出行的其余详细信息4.0K
是计算机上目录的内存分配以及该目录上次修改的日期,我们刚刚创建的。
通过对文件系统和权限有了更深入的了解,我们可以继续在 Linux 终端上浏览文件系统。
浏览文件系统
到目前为止,我们已经学习了如何确定文件系统中的位置、如何创建新目录、如何列出文件以及如何确定权限。
接下来让我们学习如何移动文件系统。我们已经创建了一个新目录,但我们仍然在主用户目录/home/sammy
中。为了移动到我们创建的目录/home/sammy/files
中,我们将使用cd
命令并将要移动到的目录的名称作为参数传递。该命令cd
代表“更改目录”,我们将像这样构造它**:**
cd files
同样,除了带有闪烁光标的新行之外,我们不会收到任何输出,但我们可以使用之前使用的命令检查我们是否位于/home/sammy/files
目录中:pwd
pwd
我们将得到以下输出,确认我们所在的位置:
Output
/home/sammy/files
这将验证我们是否位于用户目录/home/sammy
的/home/sammy/files
目录中。我们是否觉得这个语法很熟悉?它可能会让我们想起带有正斜杠的网站 URL,事实上,网站也是在目录中的服务器上构建的。
让我们转到服务器的主目录。无论我们位于文件系统中的哪个位置,我们始终可以使用以下命令cd /
移动到主目录:
cd /
为了确认我们已经移动并了解该目录中的内容,让我们运行 list 命令:
ls
我们将收到以下输出:
Outputbin
boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run s sbin srv sys tmp usr var
里面有很多文件!该/
目录是Linux服务器的主目录,称为“根”目录。请注意,根目录与默认的“root”用户不同。我们可以将该/
目录视为 Linux 计算机的主要动脉,因为它包含运行计算机所需的所有文件夹。例如,sys
目录保存Linux内核和系统信息虚拟文件系统。如果我们想了解有关每个目录的更多信息,可以访问Linux 基金会文档。
我们还会注意到我们已经进入过一个目录,即/home
用户文件夹。从/
目录中,我们可以将目录更改回 ,/home
然后再更改回files
,或者我们可以通过输入绝对路径直接移回该文件夹cd
:
cd /home/sammy/files
现在,如果我们运行pwd
,我们将收到/home/sammy/files
输出。
文件路径表示文件或目录在计算机或服务器上的位置。我们可以以相对或绝对方式调用文件或目录的路径。相对路径是指当我们移动到相对于当前工作目录的位置时,就像我们已经进入/home/sammy/
然后移入files/
. 绝对路径是指我们调用指向某个位置的直接行,就像我们上面使用 /home/sammy/files
所做的那样,表明我们从/
目录开始,调用/home/sammy/
用户目录,然后调用嵌套files/
目录。
此外,Linux 利用点符号来帮助用户通过相对路径进行导航。单.
代表当前所在目录,双..
代表父目录。因此,从当前位置 ( /home/sammy/files
) 开始,我们可以使用两个点返回到父/home/sammy
用户目录,如下所示:
cd ..
如果我们运行pwd
,我们将收到/home/sammy
输出,如果我们运行ls
,我们将收到files
输出。
另一个需要熟悉的重要符号是~
代表计算机的主目录。在这里,我们的主目录是/home/sammy
为 sammy 用户调用的,但在本地计算机上,它可能是我们自己的名称,如sammy-shark/
中所示。
我们可以在计算机上的任何位置键入以下内容并返回到此主目录:
cd ~
创建和修改文本文件
现在我们已经了解了 Linux 文件系统以及如何解决它的基础,让我们开始创建新文件并了解如何在命令行上操作文本。
首先,我们确保位于用户文件files/
夹的目录中/home/sammy
,我们可以通过使用 进行验证pwd
,或者更改绝对路径上的目录:
cd /home/sammy/files
下来,我们将创建一个新的文本文件。我们将创建一个.txt
文件,这是一个可以跨操作系统读取的标准文件。与文件.doc
不同,文件由未格式化的.txt
文本组成。无格式文本(包括文件中的文本)可以轻松地在命令行上使用,因此可以在以编程方式处理文本数据时使用(例如,自动进行文本分析、从文本中提取信息等)。
我们将从使用touch
命令开始,该命令可以创建新文件或修改现有文件。要使用它,我们可以使用该命令touch
并将要创建的文本文件的名称作为参数传递,如下所示。
touch ocean.txt
按ENTER
后,我们将收到新的一行命令提示符,并且我们可以列出 的当前内容files/
以确保它已创建。
ls
Output
ocean.txt
到目前为止,我们已经创建了一个ocean.txt
在创建时不包含任何文本的文件。
如果我们想创建一个用文本初始化的文本文件,我们可以使用该echo
命令,该命令用于在Linux中显示文本字符串。
我们可以echo
直接在命令行上使用,让界面在我们后面重复。传统的第一个程序可以这样"Hello, World!"
编写:
echo Hello, World!
Output
Hello, World!
echo
命令本身不允许我们将文本值存储到文本文件中。为此,我们需要输入以下内容:
echo "Sammy the Shark" > sammy.txt
上面的命令使用echo
,然后是我们要添加到文件中的文本(用引号引起来),然后是重定向运算符>
,最后是新文本文件的名称sammy.txt
。
我们可以检查我们的新文件是否存在,再次使用ls
.
ls
Output
ocean.txt sammy.txt
现在,我们的/home/sammy/files
用户文件夹中有两个文本文件。接下来,我们可以确认该文件sammy.txt
确实包含我们要求终端回显的文本。我们可以用cat
命令来做到这一点。该命令是 con cat enate 的缩写,cat
对于处理文件非常有用。其功能之一是显示文件的内容。
cat sammy.txt
运行命令后,我们将收到以下输出:
Output
Sammy the Shark
如果我们在空文件上运行cat
,我们将不会收到任何回复,因为该文件中没有文本。我们也可以将文本添加到这个现有文件中。让我们在文件中添加 Zora Neale Hurston 。
echo "Some people could look at a mud puddle and see an ocean with ships." > ocean.txt
现在,如果我们运行cat
,将收到刚刚输入的文本的输出。
cat ocean.txt
Output
Some people could look at a mud puddle and see an ocean with ships.
到目前为止,我们已经创建了文本文件并向这些文件添加了文本,但我们尚未修改这些文件。如果我们想这样做,我们可以使用命令行文本编辑器。有几种流行的选择,包括 Vim 和 Emacs、nano。在这里我们将使用 nano,这是一个不太复杂的 CLI 文本编辑器程序。
可以使用nano
命令调用 nano 文本编辑器。如果我们想编辑现有sammy.txt
文件,可以通过将文件名作为参数传递来实现。
nano sammy.txt
该文件将在我们的终端上打开:
sammy.txt
Sammy the Shark
使用键盘的箭头键,将光标移动到行尾,然后从 Sammy 的角度开始输入几行。
注意:在命令行上,我们不能使用鼠标或其他指针在文件系统和文件内进行导航。我们需要使用键盘,特别是箭头键来移动文本文件。
当我们完成文件后,它可能会显示如下内容:
sammy.txt
Sammy the Shark
Hello, I am Sammy.
I am studying computer science.
Nice to meet you!
我们的文件现在包含我们想要的文本,我们现在可以保存并关闭该文件。我们可能会注意到终端窗口底部有一些指导:
^G Get Help ^O WriteOut ^R Read File ^Y Prev Page ^K Cut Text ^C Cur Pos
^X Exit ^J Justify ^W Where Is ^V Next Page ^U UnCut Text ^T To Spell
因为我们目前已经完成了该文件的处理,所以我们想要Exit
该文件。这里,^
符号指的是键盘上的Control
orCTRL
键,上面的输出告诉我们需要将该键与X
(使用这个小写字母,而不按该SHIFT
键)组合起来才能离开文件。让我们同时按下这两个键:
CTRL x
上述内容通常内联编写为技术文档CTRL + X
或Ctrl+x
技术文档中。
此时,我们会收到以下提示:
OutputSave modified buffer?
Y Yes
N No ^C Cancel
为了保存它,我们将按y
“是”字母:
y
我们将收到如下反馈。
OutputFile Name to Write: sammy.txt
还有其他选项,包括使用CTRL + C
取消,但如果我们愿意关闭文件,则可以在此时按 ENTER
保存文件并退出。
假设我们想要制作一些其他的学习文件。则可以在files/
目录中创建一个新目录students
:
mkdir students
接下来,移动目录。mv
命令代表move ,****它允许我们更改文件的位置。该命令的构造方式是将我们要移动的文件作为第一个参数,将新位置作为第二个参数。以下两个执行将产生相同的结果。
mv sammy.txt students
mv sammy.txt students/sammy.txt
如果我们想更改文件名(如mv sammy.txt students/sammy-the-shark.txt
.
现在,如果我们运行该ls
命令,我们将看到只有ocean.txt
和students/
目录位于我们的当前目录 ( files/
) 中。让我们进入students/`文件夹。
cd students
我们可以复制该sammy.txt
文件以创建更多文件。为此,我们可以使用命令cp
,cp
代表复制。此命令的工作方式与命令类似,将原始文件作为第一个参数,将新文件作为第二个参数。
cp sammy.txt alex.txt
现在,我们可以打开alex.txt
并检查它。
nano alex.txt
到目前为止,alex.txt
和sammy.txt
相同。通过替换一些单词,我们可以将该文件修改为如下所示。请注意,我们可以使用CTRL + K
删除整行。
alex.txt
Alex the Leafy Seadragon
Hello, I am Alex.
I am studying oceanography.
Nice to meet you!
自动完成和历史记录
许多版本的命令行(包括本文中嵌入的交互式终端)允许我们自动完成并重复使用命令。这可以帮助我们更快地移动,因为它可以节省我们的打字时间。
例如,在使用cat
时,在输入完整的sammy.txt
文件名之前,按TAB
键。可以自动完成完整的文件名,以便我们的终端提示符显示以下内容:
cat sammy.txt
现在,如果我们按ENTER
,终端应将文件的内容返回到命令行。
另一个快捷方式是按UP
箭头键,这将让我们循环浏览最近运行的命令。在光标闪烁的新行中,按UP
几次箭头键可以快速访问之前的命令。
如果我们需要复制在终端中执行的所有命令,我们还可以使用适当命名的history
命令来调用此会话的整个历史记录:
history
根据之前的输入内容,我们应该收到 30 行或更多行命令,从以下输出开始:
Output 1 pwd
2 mkdir files
3 ls
4 ls -l
...
熟悉这些快捷方式将为我们提供支持,让我们更加熟练地使用命令行界面。
处理来自 Web 的文件
使用连接到互联网的命令行界面使我们可以访问网络上的所有资源,并可以以自动化的方式对其进行操作。通过该终端,我们还可以直接访问我们拥有凭据的云服务器、管理和编排云基础设施、构建我们自己的 Web 应用程序等。现在,由于我们已经学习了如何在终端上使用文本文件,因此我们将介绍如何从网络上下载文本文件,以便我们使用的机器可以使用该文本文件。
让我们回到files/
目录:
cd /home/sammy/files
从这里,我们将使用该curl
命令将数据从网络传输到浏览器上的个人交互式终端。该命令curl
代表客户端URL(网址)。
例如,拉取一个文件,我们将该文件的 URL 传递给命令curl
,如下所示。
curl https://地址/文件名.txt
一旦我们按下ENTER
,我们将收到该段落的文本作为终端的输出
Output"You like the sea, Captain?"
"Yes; I love it! The sea is everything. It covers seven tenths of the terrestrial globe.
...
"Captain Nemo," said I to my host, who had just thrown himself on one of the divans, "this
is a library which would do honor to more than one of the continental palaces, and I am
absolutely astounded when I consider that it can follow you to the bottom of the seas."
虽然在终端窗口上显示文本很有趣,但我们没有可用的文件,我们只传输了数据但尚未存储它。(我们可以通过运行ls
来验证该文件不存在)。
为了将文本保存到文件中,我们需要curl
使用-O
标志运行,这使我们能够将文本输出到文件中,并为本地副本采用与远程文件相同的名称。
curl -O https://地址/文件名.txt
我们将从终端收到文件已下载的反馈。
Output % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2671 100 2671 0 0 68487 0 --:--:-- --:--:-- --:--:-- 68487
如果我们想使用文件的特定替代名称(在本例中为jules.txt
)。
curl -o jules.txt https://地址/文件名.txt
我们现在可以像处理任何其他文本文件一样处理该文件。尝试使用cat
或使用nano
进行编辑。
在下一节中,我们将清理一些文件并退出终端。
删除文件和终止命令
与任何其他计算机一样,我们有时需要删除不再相关的文件和文件夹,并退出我们正在使用的程序。
我们需要清理一些学习文件和相关文件夹。确保我们位于students/
目录中:
cd /home/sammy/files/students
如果我们运行ls
,我们的文件夹可能会有一些文件,如下所示:
Outputalex.txt drew.txt jamie.txt jesse.txt sammy.txt taylor.txt
我们可以使用命令删除单个文件,命令rm
代表**“**删除”。我们需要将要删除的文件作为参数传递。
警告:请注意,一旦删除文件,就无法撤消。在按ENTER
之前,请确保我们要删除该文件。
rm sammy.txt
现在,如果我们运行ls
,我们会注意到sammy.txt
不再位于文件夹中:
Outputalex.txt drew.txt jamie.txt jesse.txt taylor.txt
虽然我们现在知道可以使用rm
删除单个文件,但如果我们想要删除整个students/
目录及其所有内容,则时间效率不高。
用于删除目录的命令称为**,**rmdir
代表删除目录。让我们移动到父文件夹,以便我们可以使用那里的目录(我们将无法删除当前所在的文件夹)。
cd ..
从/home/sammy/
用户目录中,我们可以rmdir
运行students
.
rmdir students
但是,这不起作用,因为我们收到以下反馈:
Outputrmdir: failed to remove 'students': Directory not empty
该命令不起作用,因为rmdir
仅适用于空目录,并且该students
目录中仍然有文件。(在这里,我们可以创建一个新的空文件夹,然后尝试rmdir
使用。可以使用rmdir
删除空文件夹。)
要删除其中仍包含文件的目录,我们需要尝试不同的选项。在计算机科学中,递归通常用于迭代自引用;因此我们可以调用主要项及其所有依赖项。使用rm
命令,我们可以递归地删除主students
目录及其所有内容依赖项。我们将使用代表递归的-r
标志,并将文件夹students
作为参数传递。
rm -r students
此时,如果我们运行ls
,我们会注意到students/`不再位于我们当前的目录中,并且它所保存的文件也都不可用,因为它们已全部被删除。
完成终端会话后,尤其是在远程服务器上工作时,可以使用exit
命令退出终端。一旦我们对本次会话中所取得的成就感到满意(因为我们将无法恢复它),我们可以输入以下内容,然后ENTER
离开终端。
exit
在我们的交互式终端上,我们将收到以下输出,确认我们的会话已结束。
Output
Session ended
此会话完成后,我们可以刷新此页面,然后启动新终端来尝试备用命令,或创建一个新文件系统来探索。
结论
恭喜!我们现在已经熟悉了终端界面,并且可以很好地利用计算机和服务器做更多事情