Bash-基础笔记-全-
Bash 基础笔记(全)
001:访问与导航 🚀
在本节课中,我们将要学习Bash的基础知识,包括如何访问Bash终端、理解文件系统结构以及使用基本命令进行导航和文件操作。这些是使用命令行界面的核心技能。
什么是Bash? 🤔
Bash是一个Shell。它代表“Bourne Again Shell”。Shell是一个命令行解释器,这意味着它提供了一种方式,让你可以输入人类可读的命令来让计算机执行操作。
在Linux系统中,如今默认的Shell几乎都是Bash。它存在于我使用过的每一个Linux发行版中。Bash并非Linux上唯一的命令行解释器,你还可以使用Korn Shell、C Shell、Zsh等。如果你对此非常感兴趣,Fish Shell也是一个值得一看的很酷的选择。但今天,我们将讨论Bash,因为它具有普遍性。它无处不在,不仅存在于Linux上,也存在于Unix和Mac上。你甚至可以在Windows系统上安装Bash。因此,Bash正在成为一种通用语言,可以用来操作世界上几乎任何计算机。
为何使用命令行? 💻
在这个图形用户界面(GUI)无处不在的时代,为什么还需要在终端中输入命令呢?这看起来似乎有些过时。但它非常高效。在终端中,你可以比使用GUI更快地完成任务。在GUI中,你需要点击、等待加载、找到要点击的框等。而在Bash中,你只需输入两三个不同的命令,系统就会去执行你的指令,完成后你就可以关闭它。

访问Bash终端 🖥️
首先,我们将讨论如何访问Bash。在Linux上,最明显的方法是打开一个终端模拟器,就像这里桌面上打开的这个。在我们的示例中,我们使用的是Ubuntu Mate 16.04。但我要告诉你的大部分内容都是完全通用的。如果我发出的命令是Ubuntu特有的,我会让你知道。无论你使用哪个Linux发行版,你都可以打开一个终端。
每个桌面环境都有自己的终端模拟器版本。如果你使用基于GNOME的桌面环境,如Cinnamon、Unity或GNOME本身,那么你将拥有GNOME终端。如果你使用XFCE,它可能是XFCE4终端。你可以安装任意多个不同的终端模拟器。Ubuntu Mate预装了一个名为Tilda的便捷工具。Tilda会一直运行,在你登录账户时启动并自动登录。要访问它,只需按下F12键。Tilda非常有用,因为在会话期间的任何时候,如果你想快速进入终端查看某些内容,只需按F12,输入命令即可。例如,即使右上角显示了日期,我也可以通过发出命令让Bash告诉我日期,所以拥有它确实非常有用。
除了使用终端模拟器,还有其他方法可以访问系统上的终端,即访问一个真正的终端,也称为TTY。
理解TTY 🖱️

在计算机的早期,当计算机填满整个房间时,人们通过电传打字机访问计算机。这就是为什么它们被称为TTY。Linux系统在启动时会自动启动8个TTY,通常将桌面环境放在TTY 7上。因此,如果你在看这个视频时发出切换到另一个TTY的命令,你的桌面环境将继续在TTY 7上运行,你只是切换走了,你的屏幕会显示类似这样的内容,然后你可以切换回来。如果你愿意,可以同时登录所有TTY,每个TTY可以执行不同的操作。
要进入一个看起来像这样的屏幕,可以按Ctrl + Alt + F1到F8中的任意一个功能键,这将带你进入不同的TTY。在这个示例图片中,拍摄者使用的是Ubuntu 12.10,他当前在TTY 3上登录。在登录时,你需要输入用户名和密码,然后你就登录了系统,这就是你将看到的界面。要退出TTY,你可以切换离开,或者确保你注销登录,因为如果计算机要继续运行,你肯定不希望一直保持登录状态。你可以通过输入logout命令来注销,然后它会将你返回到下一个用户登录的提示符。然后使用Ctrl + Alt + F7或F8(取决于你的发行版将实际桌面放在哪个TTY上)返回到你原来的位置。
为什么需要使用TTY?如果你的GUI界面停止工作怎么办?或者也许有其他人登录了计算机,你只是想快速潜入执行几个命令然后退出。你实际上不必登录桌面。它可以停留在桌面管理器的登录屏幕上,你仍然可以使用TTY获得访问权限。因此,如果桌面崩溃了,你需要进行故障排除或需要重启计算机,而桌面完全锁死了,你总是可以从TTY进行操作。这就是为什么知道如何进入TTY非常有用。就我个人而言,我经常使用TTY来运行机器更新等操作。
认识Bash提示符 📝
现在让我们看看我们的屏幕。你会看到,此时我面前只有一个提示符。我将清屏。你也可以使用Ctrl + L来清屏,如果你的终端支持的话(有些支持,有些不支持)。当然,大多数终端模拟器都支持。但clear命令也可以清屏。现在只有这个闪烁的提示符。这有什么用?它没有告诉我该做什么。显然,要使用Bash,你需要先做一些研究,学习一些命令和导航工具。

那么这个提示符告诉我们什么?它告诉我我以用户“Joe”的身份登录。这是我的账户,并且我正在一台名为“E-machine”的机器上运行。这是我们所在的本地机器。但如果你使用像SSH(安全外壳)这样的程序登录到另一个系统,这个提示符可能会告诉你,你正在城镇另一端或世界另一端的另一台计算机上。

然后你会看到这里有一个小波浪号~。这告诉我们,我们位于自己的主目录中,我们在Linux系统上的个人空间里。美元符号$告诉我们,我们正在以普通用户权限运行。我们不是以管理员身份运行,因此不能执行管理命令。我们将在本系列后面一点讨论权限和特权。现在,只需知道美元符号告诉你,你正在以普通用户身份运行。
理解工作目录 📂
当你开始使用Bash时,需要理解的一个基本概念是:Bash期望你始终位于计算机文件系统的某个位置。这意味着你总是在某个地方。你的提示符会告诉你你在哪里。但如果由于某种原因,它没有显示,或者你感到困惑,真的无法弄清楚自己在这里做什么,那么你可以使用我要展示的第一个命令:pwd。它代表“present working directory”或“print working directory”。我听过两种说法。当你输入这个命令时,它只是简单地输出一些信息,准确地告诉你你在文件系统中的位置。
Linux文件系统概述 🌳
让我们花点时间谈谈Linux文件系统,以便你对它的工作原理有一个基本概念。
这里有一张文件系统树的图片。需要提前注意的是,“文件系统”这个术语除了我在这里讨论的含义外,还有另一种用法。文件系统可以是两件事之一:它可以是系统组织文件和目录的方式,也可以是用于将数据写入硬盘的系统。所以你会听到文件系统以两种方式被使用。另一个以两种不同方式使用的概念是“根”。你会听到Linux系统上的“根用户”,也会听到文件系统的“根”。文件系统的根用一个斜杠/表示。这意味着文件系统的开始。其他所有东西都位于根文件夹中。Linux上的文件系统可以包含许多不同的存储设备,它还可以包含连接到世界各地计算机的网络共享。因此,Linux机器上的文件系统与你习惯的(比如Windows机器上的)有很大不同。在Windows上,你有A、B、C、D等驱动器,每个驱动器都有自己的文件系统,你关心自己在哪个驱动器上。在Linux中,我们不在乎你在任何给定时间位于哪个驱动器上,这使它具有非常好的可扩展性。你可以有一个像我们这里使用的小型桌面机器这样的小系统,也可以有一个包含许多不同计算机和大量不同用户的大型系统,每个人都可以以完全相同的方式访问文件系统。
文件系统中你会发现一些基本目录。顺便说一下,“目录”和“文件夹”这两个词在计算机科学中可以互换。多年前的计算机科学课上,他们教我们目录是一个包含许多其他文件的文件,有点像文件柜中的文件夹,你可以把单张纸放进去,甚至可以在文件夹里放更多的文件夹。所以这些术语可以互换,取决于你如何使用它们。通常,如果你在GUI环境中工作,在文件管理器中查看一个文件夹,我们称之为文件夹;如果你在命令行工作,则称之为目录。但它们是完全相同的东西。因此,目录(文件夹)在Linux系统中非常重要。这张图是简化的,实际上里面还有很多内容,我稍后会展示给你看。但这些是你作为一个用户真正需要知道并了解其存在的目录。
在根目录/下,第一个列出的是/etc。在/etc文件夹中,存放着系统本身的配置文件。因此,如果你要使用管理员权限更改整个系统的某些参数,你可能会发现自己正在编辑/etc文件夹中的一个文件。
/dev文件夹代表“设备”,那是你计算机上的每一个设备。连接到该计算机的所有东西都由/dev文件夹中的一个文件表示。你的硬盘、鼠标、键盘,在Unix和Linux世界中,一切都被表示为一个文件,无论它是什么。甚至计算机上运行的进程也由文件表示。所以它们必须有地方存放。这就是/dev文件夹。
/home文件夹是所有用户信息保存的地方。当你的账户创建时,你的文件夹就在/home文件夹内创建。在这个例子中,有Cory、Mako和Jonno的文件夹。然后它显示你所有的照片、文档等都在那个单独的文件夹里。那个文件夹是你的。你有权限查看、更改、修改、删除、添加该文件夹中的所有内容,因为它自动属于你,并且与你在系统上相关的一切都存放在那里。一个Linux系统可以有一个用户,也可以有数百个用户,其工作方式都一样。

下一个要讨论的文件夹是“通用系统资源”或/usr,这里存放着影响整个系统的文件和文件夹。例如,你的桌面可能将其所有主题存储在那里。所以当你切换主题时,这些主题实际上位于通用系统资源文件夹中。你在Linux上安装的一些程序,其二进制可执行文件也放在那里,所以这是一个需要了解的重要文件夹。此外,在该文件夹内还有另一个名为/lib的文件夹,它是“库”的缩写,那里存放着应用程序用来获得不同功能的重要文件。所以时不时会有人说,如果你想让它做那个,你需要安装这个lib文件,它们就放在那里,至少大多数时候是这样。
最后一个要讨论的是/var目录。/var是所有系统日志和临时数据存放的地方。有时,如果你试图排除故障,可能需要去/var目录查看特定的日志,以了解系统正在做什么。以上就是Linux文件系统的基本概述。
基础导航命令 🧭
现在让我们回到终端,再次清屏。我们将开始学习如何在系统中移动。在本视频中,我们将学习非常基础的命令。在我们继续学习更高级的概念之前,我们先休息一下。所以快结束了,再讨论几个命令,这样你就可以开始探索你的系统,看看里面有什么。
你将经常使用的第一个命令是ls。它是“list storage”的缩写。这显示了你所在文件夹中实际有什么。记住,我展示了pwd,它准确地显示了你在文件系统中的位置。而ls是查看你所在目录内容的方式。所以如果我输入ls,然后输入/,这意味着我现在要查看根文件夹。它会显示系统中的内容。如你所见,我们得到了很多我们刚刚讨论过的不同目录。而且还有更多内容。
要返回你的主文件夹,你只需输入cd。你不需要指定那个文件夹。或者说,我们还没讲到那个,但我们马上会讲到。我们现在还在主文件夹中。
现在,让我们谈谈如何在文件夹之间移动。假设我们想移动到根文件夹。命令是cd。我有点超前了。如果我们想回到主文件夹,我们只需输入cd。它直接带我们回去。另外,你可以使用cd ~,它也会带你到主文件夹。不带参数的cd会自动带你到主文件夹。
现在,让我们谈谈如何更改文件夹。让我们再次ls。假设我们想查看音乐文件夹里有什么。那么输入cd Music。请记住,在终端中输入命令时,它是区分大小写的。所以如果我输入Music,它会带我到音乐文件夹。好了,让我们列出存储内容。现在我们看到一个名为“pop”的文件夹。然而,如果我输入cd pop(没有大写),它不会让我进去,因为这不是同一个东西。那些对使用DOS有美好回忆的人可能会对此感到困惑,因为在Windows世界中,大小写无关紧要,没有区别。你可以用14种不同的方式输入“POP”,它总会带你到“pop”文件夹,或者随便什么大小写组合。我不知道是不是有14种,但总之。
让我们回到主文件夹。这就是你在系统中查看的方式。
让我们更深入地研究一下ls命令,因为它做的不仅仅是显示文件夹中的文件。如果我输入ls -a,它会显示该文件夹中是否有任何隐藏文件。确实有。在Linux和Unix中,要隐藏一个文件,你需要在文件名前加一个点.,这样它就不会自动显示出来。在GUI中,让我们这样做,我来展示一下这是如何工作的。我将在文件管理器中打开我的主文件夹。你会看到我看到了所有这些文件夹。如果我想查看隐藏文件,按Ctrl + H。现在我可以看到该目录中所有隐藏的文件和文件夹。所以在这里,我们通过ls命令末尾加上-a选项来做同样的事情。
但还有更多。如果你不仅想看到文件夹里有什么,还想了解它的所有详细信息,那么我们可以执行ls -al。当我这样做时,现在我会得到一长串列表,它显示了关于当前目录中不同文件和文件夹的各种信息。在左边,所有这些看似乱码的东西,它显示了附加到文件夹或文件的权限。我们将在本系列后面更多地讨论这个问题。它显示了文件的所有者。在这个例子中,是我,Joe。这个文件由root拥有,root是系统的根用户或超级用户。它属于哪个组?嗯,它属于Joe组。所以任何在名为“Joe”的组中的人都可以访问这个文件。然后是创建日期、大小、创建日期以及文件或文件夹的实际名称。学习ls能做什么非常有用。
操作文件与目录 📄
让我们再次清屏,Ctrl + L。我们将开始学习如何操作文件。我们将创建它们。
首先,让我们创建一个目录,以便有个地方可以操作。我们将这个目录称为“junk”。创建目录的命令是mkdir(make directory),我们将其命名为“junk”,全部用小写,这样我就记得不要……你知道,确保我能进入它,因为我会忘记。让我们看看它是否出现了。是的,它在那里。让我们跳进我们的目录,就叫它“junk”。
现在,即使它显示给我们看,让我们获取我们所在位置的完整路径。pwd。现在你看到我在/home/joe/junk。在继续之前,让我解释一下绝对路径和相对路径的区别。
如果我想进入这个目录或另一个类似的目录,让我们快速切换到根目录。好了,我现在在根目录。你会看到那里有home文件夹。如果我想回到我刚创建的junk文件夹,那么此时,我必须输入所谓的绝对路径。我必须告诉系统它的确切位置。所以我们要输入/home/joe/junk。现在我已经给出了从文件系统根目录开始的完整路径。现在我回到了junk。
然而,既然我已经在这里了,我不必全部输入。所以我可以直接告诉系统,如果这里还有另一个目录,让我们先向上移动一级目录。你注意到现在我不必输入全部内容了。所以如果我想再次跳到Music文件夹,它直接带我去,因为它是当前工作目录中的一个目录。这被称为相对路径。好了,这就是绝对路径和相对路径的区别。
让我再展示一个很酷的小技巧。这是一个你不常听说的命令,但我实际上经常使用它。假设你正在文件系统中工作,你想同时处于两个目录中。你想在两个目录之间来回切换。那么你可以使用一个名为pushd的命令。我要告诉它我想进入/home/sindy。好了,我实际上要进入另一个用户的目录来展示这个。好了,现在我进入了那个目录。现在,假设我在文件系统的其他地方做所有这些工作,我只想跳回我刚在的目录。那么现在我发出命令popd。它直接把我放回原来的地方。所以我不必发出绝对或相对路径去任何地方。知道这个很酷。没有多少人知道pushd和popd命令。
创建与删除文件 🛠️
好了,接下来我们要讨论的是操作文件。我们想对文件做一些事情。所以我要做的第一件事是跳进我们创建的junk目录,我们要在这里放一些文件。文件通常由程序创建。所以想想你的文字处理器,它将内容保存为文件;如果你录制音频,它会保存为.wav或.mp3等。程序本身会生成文件。但是如果你需要,如何创建一个文件呢?你可以使用一个程序,但如果你周围没有程序,你仍然可以做到。
Linux中一个非常灵活且出奇有用的命令是touch。touch命令,如果我输入正确,会创建文件。我们把这个叫做file1。我们让touch执行,ls看看它是否做到了。现在我们有了一个file1和一个file2。我们里面有一个文件。你也可以让touch一次创建多个文件。让我们创建file2和file3,使用touch命令。但现在我们有了三个小文件可以操作。目前,这些只是空文件,里面什么都没有。但如果你需要为某些事情创建标志文件,或者你只需要在某个地方创建一个空文件开始,你可能会发现这很有用。这是touch的第一个功能。touch的第二个功能是修改现有文件的日期。所以假设由于某种原因,你有一个文件已经六个月没有访问了。你想确保你的备份程序抓取它,因为通常这些程序的工作方式是查看文件的访问或修改日期,然后说:“好的,这个改变了,我们备份它。”所以我可以在现有文件上使用touch命令。它没有给我任何输出。但如果我执行ls -l,你会看到file1上的时间实际上现在比另外两个我创建的文件更新。这就是touch的作用。
移动、重命名与删除文件 🔄
好了,再次清屏。我们已经创建了文件。我们能对它们做什么呢?首先,让我们谈谈删除文件。这是一个你需要稍微警惕的命令,因为与在GUI环境中工作不同,当你在GUI中点击一个文件并按删除键或从右键菜单中选择删除时,它不会进入回收站。在Bash的世界里没有回收站。所以一旦你删除了某个东西,它就消失了。命令是rm(remove),我们要删除file3。没有输出意味着它完成了该做的事。让我们ls一下,确保文件消失了。现在我们里面有两个文件。
接下来我们需要讨论的是一个允许我们更改文件名的命令。在这种情况下,我们使用移动命令mv。我们可以使用这个命令将文件从一个目录移动到另一个目录,或者我们可以将同一个文件移动到另一个文件名。假设我们想更改file1,我们想把file1的名字改成file1.txt。没有输出意味着它完成了。ls确认一下。好了。现在我们知道如何创建文件,知道如何删除它们,知道如何移动它们。所以我们有所进展了。我们实际上在用计算机做事情。我意识到在这一点上,你可能在想“所有这些有什么用?”,但这些是你绝对必须知道的概念。
在我们结束之前,让我们谈谈使用mv命令移动到另一个目录。好了,让我们在junk目录内创建另一个目录。我们把这个叫做files。执行ls。我们的目录在那里。现在我们要把file1.txt移动到那个目录。所以我们使用mv。现在我们要说,我们要把它放进去。让我们看看,把名字放进去。确保我做对了。你知道,我不是每天都做这个。我们……我们在相对路径中,所以我可以直接放……实际上,我们这里可能需要使用绝对路径。所以让我们输入/home/joe/junk/file1.txt。我们想把它移动到files目录。如果我在末尾加上那个额外的斜杠,它是在告诉系统我只想把它移动到目录里,而不是试图将文件名更改为目录名(系统不会让我这样做)。让我们看看这个是否有效。嗯,如果我打错字的话,它不会工作。阅读障碍是一种可怕的疾病。好了,现在那个命令应该真的有效了。它没有给我任何输出。但让我们看看它是否在这里。嗯,它确实对它做了什么。让我们进入files目录。ls。是的,它移到那里了。这就是mv命令的工作原理,以及你需要了解的关于mv命令的一切。回到我的主目录。
现在,这是一个非常重要的命令。我们将学习如何删除一个目录。这是一个你需要非常、非常、非常小心的命令,因为如果你在错误的目录上发出错误的命令,你可能会让你的整个主文件夹消失。所以使用这个命令时一定要非常小心。rm -r,-r选项使其递归,然后我们要删除名为junk的目录。我们刚刚做的一切都消失了。
总结 📚
以上就是关于导航文件系统、更改路径、创建文件和删除文件的基础入门。在下一个视频中,我们将讨论如何在这些文件中放入内容。

本节课中我们一起学习了Bash的基础访问方式、Linux文件系统的结构、以及使用pwd、ls、cd、mkdir、touch、rm、mv等命令进行导航和文件操作。掌握这些是进一步学习命令行强大功能的第一步。
002:创建与编辑文本文件 📝

在本节课中,我们将学习如何在Bash终端中读取和编辑文本文件。这是Linux系统管理、配置和脚本编写的基础技能,因为系统配置、程序设置乃至脚本本身都以文本文件的形式存在。
读取文件内容
上一节我们介绍了基本的Bash命令,本节中我们来看看如何查看文件内容,而无需打开任何编辑器。
使用 cat 命令
cat 命令是“concatenate”(连接)的缩写。它的主要功能是将一个或多个文件的内容连接起来并输出到屏幕。对于短小的文件,这是快速查看内容的好方法。
命令格式:
cat 文件名
例如,查看名为 junk.txt 的文件:
cat junk.txt
执行后,文件内容会直接显示在终端上。
使用 less 命令分页查看
当文件内容很长,一屏显示不下时,使用 cat 会导致内容快速滚过屏幕。此时,less 命令更为合适,它可以让你逐页浏览文件。
命令格式:
less 文件名
在 less 的浏览界面中,你可以使用空格键向下翻页,按 q 键退出。
组合使用 cat 与 less
你可以将 cat 的输出通过“管道”(|)传递给 less,从而在连接多个文件的同时实现分页浏览。
命令格式:
cat 文件1 文件2 | less
这个命令会先将两个文件的内容合并,然后通过 less 分页显示。
创建与追加文件内容
有时,你不需要打开编辑器,只想快速创建文件或在文件末尾添加一行文本。
使用 echo 命令创建文件

echo 命令可以将文本输出到屏幕。结合输出重定向符号(>),可以将文本写入一个新文件。

命令格式:
echo “文本内容” > 新文件名
例如,创建一个名为 junk2.txt 的文件:
echo “cat is great too” > junk2.txt
使用 echo 命令追加内容
如果不想覆盖文件原有内容,而是想在文件末尾添加新行,需要使用追加符号(>>)。
命令格式:
echo “新增的文本内容” >> 已有文件名
例如,向 junk2.txt 文件追加一行:
echo “This is an appended line” >> junk2.txt
使用文本编辑器 Nano
虽然命令行操作很高效,但对于复杂的编辑任务,使用一个文本编辑器更为方便。Nano 是一个简单易用的命令行文本编辑器,适合初学者。
启动 Nano 并创建文件

直接在终端输入 nano 命令,即可启动编辑器并开始创建新文件。

命令格式:
nano
或者,直接编辑一个已存在的文件:
nano 文件名
Nano 的基本操作
Nano 编辑器界面底部会显示常用的快捷键提示。以下是两个最核心的操作:

- 保存文件:按下
Ctrl + O(即 Control 键和字母 O),然后输入文件名并按回车确认。 - 退出 Nano:按下
Ctrl + X。如果文件有未保存的修改,Nano 会询问你是否保存。

编辑系统文件

系统配置文件(通常位于 /etc 目录下)受到权限保护。普通用户可以用 nano 查看,但无法直接保存修改。


如果需要编辑这类文件,必须使用 sudo 命令来获取管理员权限。
命令格式:
sudo nano 系统文件路径
例如,编辑 /etc/fstab 文件:
sudo nano /etc/fstab
输入你的用户密码后,即可进行编辑和保存。

本节课中我们一起学习了在Bash中处理文本文件的核心技能:使用 cat 和 less 查看文件,使用 echo 快速创建和追加内容,以及使用 nano 编辑器进行更复杂的文本编辑。这些是后续学习系统管理、Shell脚本编写的重要基础。下一节,我们将探讨文件权限与特权管理。
003:权限与许可
在本节课中,我们将要学习两个核心概念:使用超级用户权限(sudo)以及理解和管理Linux系统中的文件权限。掌握这些知识对于安全地管理系统和文件至关重要。
复制文件与目录
上一节我们介绍了基本的文件操作,本节中我们来看看如何使用 cp 命令来复制文件和目录。cp 命令用于创建文件或目录的副本,这在修改配置文件前创建备份时非常有用。
以下是 cp 命令的基本用法:
- 复制文件:
cp 源文件 目标文件- 例如,
cp junk.txt junk.back.txt会创建junk.txt的一个副本,命名为junk.back.txt。
- 例如,
- 复制文件到其他目录:
cp 源文件 目标目录/- 例如,
cp junk.txt ~/会将junk.txt复制到你的家目录。
- 例如,
- 使用通配符批量复制:
cp *.txt 目标目录/- 例如,
cp *.txt ~/会将所有以.txt结尾的文件复制到家目录。通配符*代表任意字符序列。
- 例如,
使用通配符(正则表达式)时需要格外小心,一个错误的命令可能会意外删除大量文件。
使用超级用户权限
在Linux中,某些操作需要更高的权限。Ubuntu及其衍生版默认不启用 root(超级用户)账户,而是通过 sudo 命令来临时授予管理员权限。
sudo 代表“superuser do”。在命令前加上 sudo,即可使用管理员权限执行该命令。
sudo apt autoremove
执行上述命令时,系统会提示你输入当前用户的管理员密码。输入密码后,命令将以 root 权限运行。
sudo 权限会持续一段时间(默认为15分钟),在此期间再次使用 sudo 无需重复输入密码。这既保证了安全,又提供了便利。
如果需要连续执行多个需要 root 权限的命令,可以切换到 root 用户环境:
sudo -i
执行后,命令提示符会从 $ 变为 #,表示你正处于 root 用户环境。此时执行命令无需再输入 sudo。请注意,root 用户和普通用户的命令历史是分开的。要退出 root 环境,输入 exit。
重要提醒:root 用户拥有对系统的绝对控制权,可以执行任何操作,包括破坏系统。因此,使用 root 权限时必须非常谨慎。通常,一个系统上只应有一个管理员账户。
理解文件权限
Linux严格强制执行文件权限。每个文件和目录都有三组权限,分别针对三类用户:
- 文件所有者(Owner)
- 所属用户组(Group)
- 其他用户(Others/World)
使用 ls -l 命令可以查看详细的权限信息。输出结果类似于:
-rw-r--r-- 1 joe joe 0 Apr 10 10:00 junk.txt

开头的10个字符(如 -rw-r--r--)表示权限和类型:
- 第1位:
-表示普通文件,d表示目录。 - 第2-4位:文件所有者的权限(
rw-)。 - 第5-7位:所属用户组的权限(
r--)。 - 第8-10位:其他用户的权限(
r--)。

权限字符的含义:
r:读取权限。w:写入权限。x:执行权限(对于文件)或进入权限(对于目录)。-:无相应权限。
修改文件权限
我们可以使用 chmod 命令来修改文件权限。有两种主要方法:数字表示法和符号表示法。
数字表示法(推荐)
这种方法使用三个八进制数字来设置权限,每个数字对应一组用户(所有者、组、其他)。每个权限对应一个数值:
r(读) = 4w(写) = 2x(执行) = 1

将需要的权限数值相加,即可得到该组的权限值。
例如,要将 junk.txt 的权限设置为:所有者可读可写可执行(4+2+1=7),组用户可读可写(4+2=6),其他用户无权限(0),则命令为:
chmod 760 junk.txt
符号表示法
这种方法使用 u(所有者)、g(组)、o(其他)、a(全部)与 +(添加)、-(移除)、=(设置)符号来修改权限。
例如:
- 为所有者添加执行权限:
chmod u+x junk.txt - 移除组用户的写权限:
chmod g-w junk.txt - 设置其他用户只有读权限:
chmod o=r junk.txt
你可以使用通配符批量修改权限:
chmod 644 *.txt
修改文件所有者
有时需要更改文件的所有者,例如将文件移交给另一个用户。这需要使用 chown 命令,并且通常需要 root 权限。
命令格式为:sudo chown 新所有者:新所属组 文件名
例如,将文件 root.txt 的所有者和组都改为用户 joe:
sudo chown joe:joe root.txt
只有文件所有者或 root 用户才能更改文件权限,但 root 用户可以更改任何文件的所有者。

本节课中我们一起学习了如何使用 cp 命令复制文件,如何通过 sudo 获取和管理超级用户权限,以及如何查看、修改文件和目录的权限 (chmod) 与所有权 (chown)。理解并正确应用这些概念是进行系统管理和维护的基础。下一节,我们将学习如何在系统中查找文件和程序,以及如何获取所需的帮助信息。
004:查找文档与文件 📚🔍
在本节课中,我们将学习如何在命令行中查找已安装命令和程序的信息,以及如何在系统中查找文件和文件内容。掌握这些技能对于高效使用Bash至关重要。
概述
上一节我们讨论了文件权限及其修改方法。本节中,我们将重点学习如何获取帮助信息、定位程序以及搜索文件和内容。一个优秀的系统管理员并非需要记住所有命令,而是要知道如何找到所需信息。
查找命令信息 📖
当你了解某个命令能完成所需任务,但不确定具体用法时,可以查阅手册。

使用 man 命令
man 命令是“manual”(手册)的缩写,用于打开命令的参考手册页。
man man


几乎所有与终端运行相关的已安装程序都有手册页。例如:




man mv
man htop
man firefox


但请注意,并非所有命令都有手册页,例如 cd 命令就没有。
使用 info 命令
如果 man 页面未能提供所需信息,可以尝试 info 系统,其用法类似。
info mv
info 页面可能包含更详细或不同表述的信息。
定位已安装程序 🗺️
如果你输入一个命令却收到“未找到命令”的错误,可以使用 which 命令来确认程序是否安装及其位置。
which htop
该命令会打印出 htop 二进制文件所在的路径,例如 /usr/bin/htop。在编写脚本时,使用绝对路径可以避免混淆。
理解 PATH 变量
当终端启动时,它会设置一个 PATH 变量,告诉Bash在哪些目录中查找你输入的命令。
要查看当前的 PATH 变量,请执行:
echo $PATH
输出结果是一系列由冒号分隔的目录路径。Bash会按顺序在这些目录中搜索命令。出于安全考虑,你的家目录通常不在 PATH 中,以防止恶意程序覆盖系统命令。
在系统中查找文件 🔎
在图形界面中,你可以使用文件管理器的搜索工具。但在命令行中,你需要使用 find 工具。
基本 find 用法
find 命令功能强大,可以根据名称、大小、日期等多种参数进行搜索。我们先从最简单的按名称查找开始。
假设当前目录(junk)下有大量文件,要查找名为 example.txt 的文件:
find . -name "example.txt"

命令中的点 . 表示在当前目录中查找。
你也可以在其他目录中搜索,例如在 /etc 目录中查找 fstab 文件:
find /etc -name "fstab"
注意:如果没有管理员权限,搜索某些系统目录时可能会遇到权限错误。
警告:在根目录 / 下进行全盘搜索可能非常耗时,并会产生大量权限错误。可以使用 Ctrl+C 来终止命令。
find 还支持使用正则表达式进行更复杂的搜索,相关语法请查阅手册。
在文件中查找内容 📄
当你需要在一个很长的文本文件中确认是否存在某条信息,或提取特定内容时,grep 命令非常有用。

基本 grep 用法
最简单的形式是搜索文件中包含特定字符串的行。
假设文件 junk.txt 内容如下:
Nano is cool.
Some other line.
Nano is awesome.
使用 grep 查找包含“nano”的行(默认区分大小写):
grep nano junk.txt
输出结果为:
Nano is cool.
Nano is awesome.
重定向 grep 输出
你可以将 grep 的搜索结果保存到另一个文件中,这对于从大型数据库或日志文件中提取信息非常方便。
grep nano junk.txt > grep_results.txt

这条命令不会在屏幕显示结果,而是将所有包含“nano”的行写入 grep_results.txt 文件。之后你可以用 nano 或 cat 查看这个新文件。

grep 命令拥有众多高级选项,建议通过 man grep 进一步学习。
总结
本节课我们一起学习了在Bash环境中查找信息的核心技能:
- 使用
man和info命令查阅命令手册。 - 使用
which命令定位程序的安装路径,并理解了PATH变量的作用。 - 使用
find命令在文件系统中搜索特定文件。 - 使用
grep命令在文件内部搜索特定内容,并能将结果重定向到新文件。

下一节课,我们将进入第5部分,学习用户管理,包括创建用户、删除用户、修改密码以及设置用户组。
005:用户账户与密码管理 👤🔐

在本节课中,我们将学习如何在Linux系统中通过Bash命令行管理用户账户和密码。这对于系统管理员是一项核心技能,即使你只是个人用户,了解这些操作也很有帮助。
上一节我们介绍了文件权限,本节中我们来看看如何管理系统的使用者。
创建新用户
首先,我们学习如何向系统添加一个新用户。使用 adduser 命令可以完成此操作。
以下是创建用户“Bob”的步骤:
- 执行命令
sudo adduser Bob。 - 输入管理员密码以授权。
- 系统会创建用户Bob、同名用户组以及家目录
/home/Bob。 - 根据提示为Bob设置密码。
- 可以按需填写用户的详细信息(如全名、电话等),这些信息在大型机构中很有用。
切换用户与检查账户


创建账户后,我们可以使用 su 命令切换到该用户以验证账户是否正常工作。

代码示例:切换用户
su - Bob
注意:su - Bob 中的连字符 - 确保切换到新用户的同时也进入其家目录。如果省略连字符,则会停留在当前目录。
登录后,可以运行 whoami 等命令确认当前用户。使用 exit 命令可以退出并返回原账户。



此外,无需完全切换用户,也可以以其他用户身份执行单条命令:
su -c "groups Bob" Bob
这条命令会以Bob的身份执行 groups Bob,查看Bob属于哪些用户组。
管理用户密码
作为管理员,你可能需要修改用户的密码。使用 passwd 命令可以实现。
代码示例:修改用户密码
sudo passwd Bob
重要提示:执行 passwd 命令时务必指定用户名。如果不指定,系统会默认修改root账户的密码。
如果用户违反了规则,你可以临时锁定其账户:
sudo passwd -l Bob
账户锁定后,用户将无法登录。当问题解决后,可以使用以下命令解锁账户:
sudo passwd -u Bob
删除用户账户
当用户不再需要访问系统时,可以删除其账户。使用 deluser 命令。

代码示例:删除用户
sudo deluser Bob
默认情况下,此命令仅删除用户账户,但会保留其家目录中的文件。如果需要彻底删除用户及其所有文件,需要手动删除其家目录:
sudo rm -r /home/Bob

修改用户信息
chfn 命令用于修改创建用户时填写的指纹信息(如全名、办公室等)。这在需要更正或补充信息时很有用。
代码示例:修改用户信息
sudo chfn CindyB
执行命令后,会进入交互界面,可以依次修改或确认各项信息。

本节课中我们一起学习了Bash环境下用户账户与密码的核心管理操作。我们掌握了如何创建用户、切换身份、修改密码、锁定/解锁账户以及删除用户。记住,在家庭环境中可能很少需要管理用户组,但在企业或学校等大型系统中,结合 usermod 和 groupadd 等命令管理用户组是常见任务。下一节,我们将探讨如何通过命令行管理软件包。
006:软件包管理 🛠️
在本节课中,我们将学习如何在Ubuntu系统中使用命令行管理软件包。我们将涵盖更新系统、安装/卸载软件、搜索软件包以及处理.deb文件和PPA(个人软件包存档)等核心操作。
更新系统与软件包
在管理软件之前,首先需要更新本地的软件包缓存。这能确保系统了解仓库中所有软件包的最新状态。
执行以下命令更新缓存:
sudo apt update
此命令会连接所有已配置的软件仓库,检查可用的新软件包、已移除的软件包以及现有软件包的升级信息。
更新缓存后,可以升级已安装的软件包。有两种升级方式:
- 安全升级:升级大多数软件包,但跳过内核等敏感系统组件。
sudo apt upgrade - 完全升级:升级所有软件包,包括系统内核。
sudo apt dist-upgrade
通常,为了获得最新的系统功能和安全更新,建议使用dist-upgrade。
安装与卸载软件
安装软件非常简单,只需知道软件包名称即可。
以下是安装名为htop的系统监控工具的命令:
sudo apt install htop
要卸载软件,可以使用remove命令。这会移除软件但保留其配置文件。
sudo apt remove htop
如果想彻底清除软件及其所有配置文件,则使用purge命令:
sudo apt purge htop
提示:你可以在一条命令中安装或卸载多个软件包,只需用空格分隔它们的名称。
搜索软件包
如果你不确定软件包的确切名称,或者想查看仓库中可用的软件,可以使用搜索功能。
以下命令会搜索名称或描述中包含“firefox”的软件包:
apt-cache search firefox


由于结果可能很多,你可以使用管道符|将输出传递给less命令,以便逐页浏览:
apt-cache search firefox | less
从 .deb 文件安装软件
并非所有软件都来自官方仓库。一些专有软件(如Google Chrome)以.deb文件格式提供。你需要先下载文件,然后手动安装。
首先,使用wget工具下载.deb文件。这是一个通用的网络下载工具。
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
下载完成后,使用dpkg命令进行安装:


sudo dpkg -i google-chrome-stable_current_amd64.deb
如果安装过程中提示缺少依赖,可以运行以下命令尝试自动安装依赖:
sudo apt install -f
使用 PPA(个人软件包存档)
PPA 允许你安装比官方仓库更新或未收录的软件。例如,要为网络摄像头软件guvcview添加一个PPA:
sudo add-apt-repository ppa:jonathonf/guvcview
sudo apt update
添加PPA并更新缓存后,你就可以像安装普通软件一样安装或更新来自该PPA的软件:
sudo apt install guvcview
# 或直接更新所有软件(包括来自PPA的)
sudo apt dist-upgrade
移除 PPA
当你不再需要某个PPA时,建议先卸载从其安装的软件,然后移除PPA源。
- 卸载软件:
sudo apt remove guvcview - 移除PPA源文件。PPA源文件位于
/etc/apt/sources.list.d/目录下,通常以.list结尾。你可以列出并删除对应的文件:cd /etc/apt/sources.list.d/ ls sudo rm jonathonf-ubuntu-guvcview*.list
系统清理与维护
为了保持系统整洁并释放磁盘空间,可以定期执行一些清理命令。
- 自动移除无用包:移除那些作为依赖被安装,但现在已不被任何程序需要的“孤儿”软件包。
sudo apt autoremove - 清理软件包缓存:系统会缓存下载的软件包以便重用。以下两个命令用于管理缓存:
sudo apt clean:彻底清除所有缓存包。sudo apt autoclean:仅清除已过时(仓库中已有新版本)和对应软件已卸载的缓存包。这是更安全的选择。
总结

本节课我们一起学习了Ubuntu系统下命令行软件包管理的核心操作:
- 使用
apt update和apt dist-upgrade更新系统。 - 使用
apt install和apt remove/purge安装与卸载软件。 - 使用
apt-cache search搜索软件包。 - 使用
dpkg -i安装本地的.deb文件。 - 使用
add-apt-repository添加PPA,以及如何安全地移除PPA。 - 使用
autoremove、clean和autoclean进行系统清理。
掌握这些命令能让你更高效、更精确地控制系统中的软件。要了解更多高级选项和参数,别忘了查阅 man 手册(例如 man apt 或 man dpkg)。
007:系统管理工具 🛠️
在本节课中,我们将学习一系列实用的系统管理工具。这些工具能帮助你查看计算机的运行状态、管理进程、监控网络和存储设备等。我们将遵循Unix哲学,即使用许多功能单一但高效的小工具,并通过组合它们来完成更复杂的任务。
内存与磁盘空间监控 💾
上一节我们介绍了Unix哲学,本节中我们来看看如何监控系统资源。首先,我们可以使用 free 命令查看内存使用情况。
命令:
free -h
-h 选项使输出更易读(human-readable)。
接下来,使用 df 命令查看已挂载文件系统的磁盘空间使用情况。
命令:
df -h
如果你想深入了解哪个目录占用了大量空间,可以使用 du 命令。它会列出指定目录(默认为当前目录)下所有子目录的大小。
命令:
du | less
由于输出可能很长,我们通过管道 | 将其传递给 less 命令,以便逐页查看。按 q 键退出 less。
实时监控与日志查看 🔍
有时,我们不仅需要快照,还想观察资源随时间的变化。watch 命令可以定期执行指定命令并显示输出。
命令:
watch -n 0.1 date
此命令每0.1秒执行一次 date 命令,近乎实时地显示时间。按 Ctrl+C 退出。
当系统出现问题时,查看内核日志是有效的排查手段。dmesg 命令显示Linux内核最近的操作记录。
命令:
dmesg
如果只想查看最新的几条记录,可以使用 tail 命令。
命令:
dmesg | tail
tail 默认显示输入内容的最后10行。
系统日志通常存放在 /var/log 目录下。例如,查看系统日志的最后10条记录:
命令:
tail /var/log/syslog
如果需要将日志内容分享给他人,可以将其重定向到文件中。
命令:
tail /var/log/syslog > logtail.txt
对于使用 systemd 初始化系统的较新Linux发行版,可以使用 journalctl 查看启动日志。
命令:
journalctl
这会显示系统启动过程中的详细日志,有助于诊断启动错误。


进程管理 ⚙️
进程是系统中正在运行的程序或服务。top 命令提供了一个动态的、全面的进程视图。
命令:
top
top 会显示系统概览和按CPU使用率排序的进程列表。
另一个更强大的工具是 htop,它提供了彩色界面和更多交互功能。
命令:
htop
在 htop 中,你可以查找、终止进程或调整进程优先级。
如果某个应用程序无响应,可以使用 killall 命令强制终止它。
命令:
killall 程序名
例如,终止一个名为 caja 的文件管理器:
命令:
killall caja
请注意,强制终止可能导致未保存的数据丢失。
网络诊断 🌐
网络问题是常见的系统故障。ifconfig 命令可以查看网络接口的配置信息,如IP地址。

命令:
ifconfig
要测试网络连通性,可以使用 ping 命令。

命令:
ping youtube.com
ping 会持续向目标发送数据包,直到你按 Ctrl+C 停止。它还会显示往返时间的统计信息。



存储设备管理 💽
在命令行环境下,需要手动挂载外部存储设备(如USB驱动器)。首先,使用 lsblk 列出所有块设备。
命令:
lsblk
假设我们要挂载 /dev/sda2 分区到 /mnt 目录。
命令:
sudo mount /dev/sda2 /mnt
挂载后,可以通过 /mnt 目录访问设备内容。使用完毕后,需要卸载设备。
命令:
sudo umount /dev/sda2
注意,卸载前需确保不在该设备的挂载目录内。
要获取更详细的磁盘信息,可以使用 fdisk 命令。
命令:
sudo fdisk -l
此外,blkid 命令可以显示设备的UUID(通用唯一识别码),这在配置自动挂载时非常有用。
命令:
blkid
系统信息与其他实用命令 ℹ️
uname 命令可以显示系统信息,如内核版本和系统架构。
命令:
uname -a
history 命令能列出你在当前会话中执行过的所有命令。
命令:
history | less
cal 命令可以显示日历。
命令:
cal
对于EXT4文件系统,虽然碎片化问题不常见,但你仍可以使用 e4defrag 检查或整理碎片。
命令:
sudo e4defrag -c /home
最后,系统关机和重启也可以通过命令完成。reboot 命令用于重启系统。
命令:
sudo reboot
shutdown 命令则提供了更多控制,例如定时关机。
命令:
sudo shutdown -h +20
此命令将在20分钟后关闭系统。若要取消已计划的关机,请使用:
命令:
sudo shutdown -c

本节课中我们一起学习了多种Bash系统管理工具,涵盖了资源监控、日志查看、进程管理、网络诊断和存储设备操作等方面。掌握这些工具能让你更深入地理解和控制你的Linux系统。记住,每个命令都有更多选项和用法,请务必查阅其手册页(man 命令名)以获取完整信息。在下一节,我们将学习如何将这些命令组合成脚本,实现自动化任务。
008:Bash脚本编写 🚀

概述
在本节课中,我们将要学习如何编写Bash脚本。脚本是将一系列命令组合在一起,形成一个可以自动执行的计算机程序。Bash不仅允许你串联命令,还拥有自己的编程语言,可以用来完成复杂任务。即使你不擅长编程,也能编写出简单而强大的脚本。
脚本基础结构
上一节我们介绍了Bash的基本命令,本节中我们来看看如何将它们组织成脚本。
任何脚本的第一行必须是shebang(也称为hashbang),它告诉系统这是一个程序,并指定用于执行它的shell。对于Bash脚本,这一行通常是:
#!/bin/bash
shebang之后可以有空行,脚本会忽略它们。你也可以使用#符号添加注释,以说明脚本的功能或提醒自己某些细节。


编写第一个脚本
以下是创建一个简单脚本的步骤。这个脚本会清屏,提示用户输入,然后输出问候语。
- 打开文本编辑器(如nano、vim或任何图形化编辑器)。
- 输入脚本内容:
#!/bin/bash # 一个简单的问候脚本 clear read -p "按 Enter 键开始..." echo -e "请输入你的名字:" read name echo "很高兴认识你,$name"clear:清空终端屏幕。read -p:显示提示信息并等待用户输入。-p选项允许在同一行显示提示。echo -e:输出文本,-e选项允许解释反斜杠转义字符(本例中未使用,但常见)。read name:将用户输入的内容存储到变量name中。echo "很高兴认识你,$name":输出文本,并使用$符号引用变量name的值。
- 保存文件,例如命名为
hello.sh。 - 赋予脚本执行权限。默认情况下,脚本文件没有执行权限。使用
chmod命令添加:chmod +x hello.sh - 运行脚本。如果脚本不在系统PATH中,需要指定路径:
./hello.sh

编写实用脚本

现在,让我们将一些常用的命令组合成一个更有用的脚本。例如,创建一个快速查看系统内存和磁盘使用情况的脚本。
- 创建新脚本文件,例如
resources.sh。 - 输入以下内容:
#!/bin/bash clear echo "内存使用情况:" free -h echo "" echo "磁盘使用情况:" df -h- 这个脚本依次执行了
clear、echo、free -h和df -h命令。
- 这个脚本依次执行了
- 保存文件,赋予执行权限并运行:
chmod +x resources.sh ./resources.sh
通过这种方式,你可以将任何你经常需要手动输入的命令序列封装成脚本,节省时间并减少错误。


真实案例:系统更新脚本
下面我们分析一个更复杂的真实世界脚本,它用于自动更新系统并在完成后计划重启。

#!/bin/bash
# 系统更新脚本
# 记录开始时间到日志文件
echo "更新开始于:" > ~/.update.log
date >> ~/.update.log
echo "正在检查更新..."
sudo apt-get update >> ~/.update.log 2>&1
echo "正在安装更新..."
sudo apt-get dist-upgrade -y >> ~/.update.log 2>&1
echo "正在移除无用包..."
sudo apt-get autoremove -y >> ~/.update.log 2>&1
echo "正在清理缓存..."
sudo apt-get autoclean >> ~/.update.log 2>&1
echo "更新完成!" | tee -a ~/.update.log
echo "系统将在30秒后重启..."
sleep 30
sudo shutdown -r now
脚本逐行解释:
#!/bin/bash:指定Bash shell。echo "更新开始于:" > ~/.update.log:将文本输出到~/.update.log文件,>表示覆盖写入。date >> ~/.update.log:将当前日期时间追加到同一日志文件,>>表示追加写入。sudo apt-get update >> ~/.update.log 2>&1:执行更新软件源列表命令。>> ~/.update.log将标准输出重定向到日志文件。2>&1表示将标准错误输出也重定向到标准输出指向的地方(即日志文件)。sudo apt-get dist-upgrade -y:执行系统升级,-y选项自动对所有提示回答“是”。sudo apt-get autoremove -y:自动移除不再需要的依赖包。sudo apt-get autoclean:清理已下载的旧软件包缓存。echo "更新完成!" | tee -a ~/.update.log:echo输出文本,通过管道|传递给tee命令。tee -a命令既将内容显示在屏幕上,又追加到日志文件中。sleep 30:使脚本暂停(睡眠)30秒。sleep命令在脚本中非常有用,可以确保上一条命令完成,或给用户反应时间。sudo shutdown -r now:立即重启系统。
关键概念:
- 重定向:
>(覆盖)、>>(追加)用于控制命令输出到文件。 - 标准输出与错误:
1代表标准输出,2代表标准错误。2>&1将错误输出合并到标准输出流。 - 管道:
|将一个命令的输出作为另一个命令的输入。 - 命令选项:如
apt-get的-y,tee的-a,它们改变了命令的默认行为。
将脚本设为系统命令

为了让任何用户都能方便地运行你的脚本,可以将其放入系统的命令路径中。
- 了解PATH:系统在特定的目录列表中查找可执行命令,这些目录由
PATH环境变量定义。常见的系统命令目录是/usr/local/bin或/bin。 - 复制脚本:以root权限将你的脚本复制到其中一个目录。例如,将
hello.sh设为系统命令:
(注意:通常省略sudo cp hello.sh /usr/local/bin/hello.sh扩展名,并优先使用/usr/local/bin来存放本地安装的软件,避免污染系统目录)。 - 现在,你可以在任何位置的终端中直接输入
hello来运行该脚本。
警告:操作/bin、/sbin等系统目录时要格外小心,误删或修改系统命令可能导致系统不稳定。


故障排除与学习资源
编写脚本时遇到问题很常见。以下是一些建议:
- 使用搜索引擎:几乎你遇到的任何问题,网上都有丰富的解决方案。尝试搜索“bash script how to [你的问题]”。
- 逐行调试:如果脚本不工作,可以暂时在关键命令前加
echo打印状态,或者先单独测试每条命令。 - 查阅文档:使用
man命令查看命令的官方手册,例如man bash、man read。
此外,你还可以:
- 使用Cron定时任务:让脚本在特定时间自动运行。Cron是一个强大的任务调度程序。
- 创建桌面快捷方式:为脚本创建图形化启动器,方便非终端用户使用。

总结
本节课中我们一起学习了Bash脚本编写的基础知识。我们从最简单的脚本结构开始,逐步编写了交互式脚本和实用工具脚本,并分析了一个自动化系统更新的复杂案例。我们了解了shebang、变量、命令组合、输入输出重定向等核心概念,还学习了如何将脚本安装为系统级命令。脚本是自动化重复任务、提升效率的强大工具。虽然高级编程功能如条件判断和循环等未在本课深入,但你现在掌握的知识已足以创建许多有用的脚本。继续实践和探索,你会发现Bash脚本能极大地简化你的工作流程。
009:Linux技巧 - 如何使用SSH远程登录 🔐
在本节课中,我们将要学习一个非常强大且通用的工具:SSH(Secure Shell)。它允许你通过网络远程登录到另一台计算机,无论这台计算机在你的本地网络还是互联网上。这对于系统管理员和任何需要远程管理计算机的人来说都是必不可少的技能。
概述
SSH是一个安全的网络协议,用于在不安全的网络上提供安全的加密通信。它不仅可以让你远程访问另一台计算机的命令行,还能安全地传输文件,甚至运行图形界面应用程序。本节课将引导你完成SSH的安装、基本使用和一些实用技巧。
安装与配置SSH服务器
上一节我们介绍了SSH的基本概念,本节中我们来看看如何在你的系统上设置SSH。
首先,你需要知道,大多数Linux发行版已经预装了SSH客户端,这意味着你可以用它连接到其他计算机。但如果你想让他人连接到你的计算机,就需要安装并配置SSH服务器。
在Ubuntu系统上,安装SSH服务器非常简单。你可以使用以下命令:
sudo apt install openssh-server
你也可以通过图形界面的软件中心来安装这个软件包。安装过程会自动生成安全密钥并启动SSH服务,通常无需重启计算机。SSH服务默认会在端口22上监听连接。
如果你的网络防火墙或路由器默认阻止了端口22(出于安全考虑),你可能需要配置防火墙允许该端口,或者将SSH服务器配置为使用其他端口。这超出了本教程的范围,但网上有大量相关教程可供参考。
基本SSH登录
一旦SSH服务器安装并运行,你就可以从另一台计算机登录了。以下是基本登录命令的格式:
ssh username@ip_address
例如,如果你的用户名是user,目标计算机的IP地址是192.168.0.13,命令如下:
ssh user@192.168.0.13
如果是首次连接某台主机,系统会提示你确认主机的指纹。输入yes后,再输入对应用户的密码即可登录。
登录成功后,你将进入远程计算机的命令行界面,可以执行任何你有权限执行的命令。
通过SSH安全传输文件
除了远程命令行操作,SSH还能安全地传输文件。这通常使用scp(secure copy)命令来完成。
以下是使用scp命令的基本方法。假设你想将远程计算机(IP:192.168.0.13)上的文件test.txt复制到本地计算机的桌面上:
scp user@192.168.0.13:/path/to/test.txt ~/Desktop/
反之,将本地文件复制到远程计算机:
scp ~/Desktop/test.txt user@192.168.0.13:/home/user/
通过SSH运行图形界面应用程序
上一节我们介绍了如何传输文件,本节中我们来看看SSH更强大的功能:远程运行图形程序。
默认的SSH连接只支持命令行。但通过添加-X参数,你可以启用“X11转发”功能,从而运行需要图形界面的应用程序。
命令格式如下:
ssh -X user@ip_address
登录后,你可以尝试启动一个图形程序,例如文本编辑器:

gedit
或者文件管理器:

nautilus

程序窗口会显示在你的本地屏幕上,但实际运行在远程计算机上。需要注意的是,复杂的图形程序(如大型游戏或视频编辑软件)可能运行缓慢或无法正常工作,但像文本编辑器、简单的系统工具等都能良好运行。

实用网络发现技巧

在使用SSH时,你首先需要知道目标计算机的IP地址。如果你的网络使用DHCP动态分配IP,地址可能会变化。以下是几种查找网络内计算机的方法。
首先,你可以查看已连接过的主机缓存:
arp -a
这个命令会列出你曾连接过的网络设备的IP地址。
其次,你可以使用网络扫描工具nmap来发现当前网络中的所有活跃设备。首先安装它:
sudo apt install nmap
然后扫描你的本地网络(例如192.168.0.0/24):
sudo nmap -sn 192.168.0.0/24
最后,要查看你自己计算机的IP地址,可以使用:
ip addr show
或者旧的命令:
ifconfig
输出信息中会包含类似inet 192.168.0.14的条目,这就是你的IP地址。
为了长期稳定地使用SSH,建议为需要远程访问的计算机在路由器或系统设置中配置静态IP地址。
总结

本节课中我们一起学习了SSH的强大功能。我们从安装SSH服务器开始,学习了如何进行基本的远程登录。接着,我们探索了如何使用scp命令在计算机间安全地复制文件。然后,我们介绍了通过-X参数启用X11转发,从而远程运行图形界面应用程序的技巧。最后,我们了解了几种在本地网络中发现设备IP地址的实用方法。
SSH是Linux和系统管理中的核心工具,掌握它将极大地提升你管理多台计算机的效率和灵活性。

浙公网安备 33010602011771号