《Introduction to Linux》——Linux Fundation (10~14/18章)
第十章 文件操作
1. 文件系统
在Linux(以及所有类似UNIX的操作系统)中,通常说“一切都是文件”,或者至少如此。这意味着无论是处理普通数据文件和文档,还是处理声卡和打印机之类的设备,您都可以通过相同的输入/输出(I / O)操作与它们进行交互。这简化了打开“文件”并执行正常的操作,例如读取文件并在文件上写入。
在许多系统(包括Linux)上,文件系统的结构像一棵树。该树通常被描绘为倒置的,并且从最常被称为根目录的根目录 开始,该根目录标志着分层文件系统的开始, 有时也称为主干,或简单地由 /表示。根(root)目录 / 和 root用户的目录是不一样的(英文语义)。分层文件系统在路径(目录名称)中还包含其他元素,这些元素之间用正斜杠(/)分隔,如/ usr / bin / emacs中所示,其中最后一个元素是实际文件名。
Linux支持由Linux开发人员明确创建的多种本机文件系统类型,例如:
- ext3
- ext4
- squashfs
- btrfs.
它还提供了在其他外部操作系统上使用的文件系统的实现,例如来自以下操作系统的文件系统:
- Windows ( ntfs , vfat )
- SGI(xfs)
- IBM(jfs)
- MacOS(hfs,hfs +)
还支持许多较旧的旧文件系统,例如FAT 。
通常,一台机器上会使用多个文件系统类型,这基于诸如文件大小,文件被修改的频率,文件所位于的硬件类型以及所需的访问速度等因素的考虑。常用的最高级文件系统类型是日记记录类型:ext4,xfs,btrfs和jfs。这些具有许多最新功能和高性能,并且很难被意外损坏。
如前所述,Linux系统上的每个文件系统都占用一个硬盘分区。分区有助于根据所包含数据的种类和用途来组织磁盘的内容。例如,运行系统所需的重要程序通常保存在一个单独的分区(称为root或/)上,而不是包含该系统的常规用户(/ home)拥有的文件的分区。此外,在Linux的正常运行过程中创建和销毁的临时文件可能位于专用分区上。通过类型和可变性进行这种隔离的一个优势是,当特定分区上的所有可用空间都用完时,系统仍可以正常运行。
图中显示了名为gparted的工具内容,该工具显示了具有三个操作系统的系统上的分区布局:Windows 10,RHEL 7和Ubuntu 18.04。
在开始使用文件系统之前,需要在安装点将其安装到文件系统树中。这只是要附加(挂载)文件系统的目录(可以为空,也可以不为空)。有时,如果目录不存在,则可能需要创建该目录。
警告:如果在非空目录上挂载文件系统,该目录的先前内容将被掩盖,并且在卸载该文件系统之前不可访问。因此,安装点通常是空目录。
该 mount 指令用于安装文件系统(可以是本地计算机或,我们将讨论在网络上)的文件系统树中的某处。基本参数是设备节点和安装点。例如,
sudo mount /dev/sda5 /home
将与/ dev / sda5设备节点关联的磁盘分区中包含的文件系统附加到/ home 挂载点的文件系统树中。除了设备节点以外,还有其他方法可以指定分区,例如使用磁盘标签或UUID。
要卸载该分区,命令为:
sudo umount /home
注意命令是 umount,不是unmount!除非以其他方式配置了系统,否则只有root用户(以root用户登录或使用sudo登录)有权运行这些命令。如果希望它在每次系统启动时自动可用,则需要相应地编辑/ etc / fstab(名称是文件系统表的缩写)。查看该文件将为您显示所有预配置文件系统的配置。man fstab将显示如何使用此文件以及如何配置它。
键入 不带任何参数的mount将显示当前所有已挂载的文件系统。命令df -Th(无磁盘)将显示有关已挂载文件系统的信息,包括文件系统类型,以及有关当前使用和可用空间的使用情况统计信息。
通常有必要在物理系统之间共享数据,这些物理系统可以位于Internet可以到达的相同位置或任何位置。网络(有时也称为分布式)文件系统可以将所有数据都放在一台计算机上,也可以分散在一个以上的网络节点上。可以在各台机器上本地使用各种不同的文件系统。网络文件系统可以看作是各种类型的低级文件系统的组合。
许多系统管理员将远程用户的主目录安装在服务器上,以使他们可以跨多个客户端系统访问相同的文件和配置文件。这使用户可以登录到不同的计算机,但仍然可以访问相同的文件和资源。最常见的此类文件系统简称为NFS(网络文件系统)。它具有很长的历史,最早由Sun Microsystems开发。另一个常见的实现是CIFS(也称为SAMBA),它起源于Microsoft。我们将把注意力集中在对NFS的关注上。
现在,我们将详细介绍如何在服务器上使用NFS。
在服务器计算机上,NFS使用守护程序(Linux中的内置网络和服务进程),并在命令行中通过键入以下命令来启动其他系统服务器:
sudo systemctl start nfs
文本文件/ etc / exports包含主机愿意通过NFS与其他系统共享的目录和权限。该文件中的一个非常简单的条目可能如下所示:
/projects * .example.com(rw)
此项允许使用具有读写(rw)权限的NFS挂载目录/projects,并与example.com域中的其他主机共享。正如我们将在下一章中详细介绍的那样,Linux中的每个文件都具有三种可能的权限:读取(r),写入(w)和执行(x)。
修改/ etc / exports文件后,可以使用exportfs -av命令通知Linux有关允许使用NFS远程挂载的目录的信息。您也可以使用sudo systemctl restart nfs,但这比较慢,因为它会暂停NFS一段时间,然后再重新启动。要确保 每次引导系统时都启动NFS 服务,请键入 sudo systemctl enable nfs.
在客户机上,如果希望在系统引导时自动安装远程文件系统,则可以修改/ etc / fstab文件来完成此操作。例如,客户端的/ etc / fstab文件中的条目可能如下所示:
servername:/projects /mnt/nfs/projects nfs defaults 0 0
您还可以通过直接使用mount命令来挂载远程文件系统而无需重新引导或一次性挂载:
sudo mount servername:/projects /mnt/nfs/projects
请记住,如果未修改/ etc / fstab ,则下次系统重新启动时将不会出现此远程安装。此外,如果NFS服务器在引导时不处于活动状态,则可能要在fstab中使用nofail选项。
2. 文件系统架构
在本节中,您将学习识别和区分Linux中最重要的目录。我们从普通用户的主目录空间开始。
每个用户都有一个主目录,通常位于/home下。现代Linux系统上的/root(“ slash-root”)目录仅是root用户(或超级用户或系统管理员帐户)的主目录。在多用户系统上,/home目录基础结构通常作为单独的文件系统安装在其自己的分区上,甚至通过NFS远程导出(共享)在网络上。有时,您可以根据用户的部门或职能对其进行分组。然后,您可以在/home目录下为每个组创建子目录。例如,学校可能使用以下内容来组织/home:
/ home / faculty /
/ home / staff /
/ home / students /
在/bin中目录包含可执行二进制码,用于启动系统或在单用户模式必需的命令,并且通过所有系统用户所需的必要的命令,如cat, cp, ls, mv, ps和 rm。
同样,/ sbin 目录用于与系统管理相关的基本二进制文件,例如 fsck 和 shutdown。
对于系统启动或以单用户模式运行不是必需的命令(理论上),这些命令位于/ usr / bin 和/ usr / sbin 目录中。之前这样做是为了使 / usr 可以作为一个单独的文件系统挂载,可以在系统启动的后期甚至通过网络挂载。但是,如今大多数人发现这种区别已经过时了。实际上,已经发现许多发行版无法通过这种分离启动,因为这种方式已经很长时间没有使用或测试了。因此,在一些最新的Linux发行版中, / usr / bin 和 / bin 实际上就象征性的链接在一起,/ usr / sbin和/ sbin也是如此。
某些文件系统,像一个安装在 / proc中,被称为伪文件系统,因为他们没有永久存在磁盘上的任意位置。
的/ proc文件系统包含允许观看不断变化的内核数据虚拟文件(仅在存储器中存在的文件)。该文件系统包含模仿内核结构和配置信息的文件和目录。它不包含实际 文件,但包含运行时系统信息,例如系统内存,已安装的设备,硬件配置等。/proc中的一些重要文件包括:
/proc/cpuinfo
/proc/interrupts
/proc/meminfo
/proc/mounts
/proc/partitions
/proc/version
/proc 也具有子目录,包括:
/proc/<Process-ID-#>
/proc/sys
第一个示例显示在系统上运行的每个进程都有一个目录,其中包含有关该目录的重要信息。第二个示例显示了一个虚拟目录,其中包含有关整个系统的很多信息,尤其是其硬件和配置。/ proc文件系统非常有用,因为它报告的信息仅根据需要收集,而无需存储在磁盘上。
所述的/ dev目录包含的设备节点,大多数硬件和软件设备中使用的,除了网络设备中的类型伪的文件。该目录是:
- 未挂载时在磁盘分区上为空
- 包含由udev系统创建的条目,该系统在Linux上创建和管理设备节点,并找到设备时动态创建它们。/dev目录包含以下项目:
- / dev / sda1 (第一个硬盘上的第一个分区)
- / dev / lp1(第二台打印机)
- / dev / random (随机数的来源)
/var目录包含有望在规模和内容的系统改变运行文件(VAR代表变量),如以下目录中的条目:
- 系统日志文件:/ var / log
- 软件包和数据库文件:/ var / lib
- 打印队列:/ var / spool
- 临时文件:/ var / tmp。
/var目录可以放在其自己的文件系统上,以便可以容纳文件的增长,并且文件大小不会严重影响系统。也可以在/ var下找到诸如/ var / ftp(FTP服务)和/ var / www(HTTP Web服务)之 类的网络服务目录。
/etc目录是系统配置文件的主目录。尽管有一些可执行脚本,但它不包含二进制程序。例如,/ etc / resolv.conf 告诉系统要在网络上到达哪里以获取主机名到IP地址的映射(DNS)。在/ etc目录中可以找到诸如passwd, shadow 和 group 用于管理用户帐户的文件。尽管某些发行版本在/ etc下拥有自己的广泛基础结构 (例如,Red Hat和SUSE使用/ etc / sysconfig),但是随着systemd的出现,当今发行版本之间的统一性更高。
请注意, / etc 用于系统范围的配置文件,只有超级用户才能在此处修改文件。特定于用户的配置文件始终位于其主目录下。
/boot目录包含启动系统所需的一些基本文件。对于系统上安装的每个备用内核,都有四个文件:
-
vmlinuz
引导所需的压缩Linux内核。 -
initramfs
引导所需的初始ram文件系统,有时称为initrd,而不是initramfs。 -
config
内核配置文件,仅用于调试和簿记。 -
System.map
内核符号表,仅用于调试。
这些文件中的每个文件都在其名称后附加了一个内核版本。
还可以在/ boot目录下找到Grand Unified Bootloader(GRUB)文件,例如/boot/grub/grub.conf或/boot/grub2/grub2.cfg。
上图显示了/ boot 目录的示例列表,该目录取自具有多个已安装内核的RHEL 7系统,包括发行版提供的和自定义编译的内核。名称会有所不同,并且在不同的发行版上,情况可能会有所不同。
/ lib在 / bin和 / sbin中包含基本程序的库(应用程序共享的通用代码,它们是运行它们所需的)。这些库文件名以 ld或 lib开头。 例如,/ lib/libncurses.so.5.9。
其中大多数是所谓的动态加载库(也称为共享库或共享对象(SO))。在某些Linux发行版中,存在一个/ lib64 目录,其中包含64位库,而/ lib 包含32位版本。
在最近的Linux发行版中,可以找到:
即就像/ bin 和/ sbin一样,目录指向/ usr下的目录。
内核模块(可以在不重新启动系统的情况下加载和卸载)(内核代码,通常是设备驱动程序)位于/ lib / modules / <kernel-version-number>中。
人们经常使用可移动媒体,例如USB驱动器,CD和DVD。为了使资料可以通过常规文件系统访问,必须将其安装在方便的位置。大多数Linux系统均已配置,因此当系统发现已插入某些内容时,会自动装入所有可移动介质。
之前,这是在/ media 目录 下完成的 ,但是现代Linux发行版将这些安装点放在/ run 目录下。例如,带有标签“myusbdrive”的用户名“student”的USB笔驱动将安装在 / run / media / student / myusbdrive上。
/mnt 因为UNIX初期临时挂载文件系统目录中已被使用。这些文件可以是可移动介质上的文件,但更常见的是带有NFS的网络文件系统,这些文件系统通常不会挂载。或者这些可以是临时分区,也可以是所谓的伪装成分区的文件的回送文件系统。
在根目录下还有一些其他目录:
/usr目录树从理论上讲包含非必需的程序和脚本(从某种意义上说,它们在最初启动系统时不需要使用),并且至少具有以下子目录:
3. 比较文件和文件类型
现在您已经了解了文件系统及其结构,现在让我们学习如何管理文件和目录。
diff 用于比较文件和目录。这个经常使用的实用程序具有许多有用的选项(请参阅: man diff),包括:
若要比较两个文件,请在命令提示符下键入diff [options] <filename1> <filename2>。diff用于文本文件;对于二进制文件,可以使用 cmp。
在本节中,您将学习用于比较文件以及如何将补丁应用于文件的其他方法。
您可以使用diff3一次比较三个文件,该文件使用一个文件作为其他两个文件的参考基础。例如,假设您和同事都对同时工作的同一文件进行了修改。diff3 可以基于您都使用的通用文件来显示差异。diff3的语法 如下:
diff3 MY-FILE COMMON-FILE YOUR-FILE
该图显示了diff3的用法 。
使用补丁分发了对源代码和配置文件的许多修改,毫无疑问,补丁程序会应用这些 补丁。修补程序文件包含将文件的较旧版本更新为新版本所需的增量(更改)。修补程序文件实际上是通过使用正确的选项运行diff产生的,如下所示:
diff -Nur originalfile newfile > patchfile
仅分发补丁程序比分发整个文件更为简洁高效。例如,如果在包含1000行的文件中仅需要更改一行,则补丁文件将只有几行长。
要应用补丁,您可以执行以下两种方法之一:
patch -p1 < patchfile
patch originalfile patchfile
第一种用法更为常见,因为它经常用于将更改应用于整个目录树,而不仅仅是第二个示例中的一个文件。要了解-p1选项以及其他许多选项的用法 ,请参见patch的手册页。
在Linux中,文件扩展名通常不会像在其他操作系统中那样进行分类。不能假定名为file.txt的文件是文本文件,而不是可执行程序。在Linux中,文件名通常比系统本身对系统用户更有意义。实际上,大多数应用程序直接检查文件的内容以查看文件的类型,而不是依赖扩展名。这与Windows处理文件名的方式非常不同,在Windows中,文件名以.exe结尾的文件表示可执行的二进制文件。可以通过使用文件实用程序来确定文件的真实性质。对于作为参数指定的文件名,它将检查内容和某些特征,以确定文件是纯文本文件,共享库,可执行程序,脚本还是其他文件。
4. 数据备份和数据压缩
您可以通过多种方法来备份数据甚至整个系统。这样做的基本方法包括使用cp进行简单复制以及使用更可靠的rsync。两者都可以用于同步整个目录树。但是,rsync效率更高,因为它检查要复制的文件是否已经存在。如果文件存在并且大小或修改时间没有变化,则rsync将避免不必要的复制并节省时间。此外,由于rsync仅复制实际上已更改的文件部分,因此它可以非常快。
cp只能与本地计算机上的目标之间来回复制文件(除非要与使用NFS挂载的文件系统进行复制),但是 rsync也可以用于将文件从一台计算机复制到另一台计算机上。位置以 target:path形式指定,其中 target可以为 someone @ host形式。该someone @ 部分是可选的,如果远程用户是来自本地用户的不同使用。
当将一个目录树递归复制到另一个目录树时, rsync非常有效,因为只有差异会通过网络传输。通常使用 -r选项递归遍历目录树,将目标目录树与源目录树同步,从而复制列出的源目录下的所有文件和目录。
rsync 是一个非常强大的实用程序。例如,备份项目目录的一种非常有用的方法可能是使用以下命令:
rsync -r project-X archive-machine:archives/project-X
请注意,rsync 可能具有很大的破坏性!意外的滥用会由于无意间将更改复制到不需要的地方而对数据和程序造成很大的伤害。注意指定正确的选项和路径。强烈建议您先测试您的rsync 使用命令 -dry-run 选项,以确保它提供了你想要的结果。
要在命令提示符下使用 rsync ,请键入rsync sourcefile destinationfile,其中一个文件可以位于本地计算机上,也可以位于网络计算机上;sourcefile的内容 将被复制到destinationfile。
选项的良好组合如下所示:
rsync --progress -avrxH --delete sourcedir destdir
通常会压缩文件数据以节省磁盘空间并减少通过网络传输文件所需的时间。
Linux使用多种方法来执行此压缩,包括:
这些技术的压缩效率(节省多少空间)以及压缩所需的时间有所不同。通常,更有效的技术需要更长的时间。减压时间在不同方法之间变化不大。另外,tar 工具通常用于对档案中的文件进行分组,然后立即压缩整个档案。
gzip 是最常用的Linux压缩实用程序。它压缩得非常好并且非常快。下表提供了一些用法示例:
bzip2的语法与gzip相似,但是它使用不同的压缩算法,并且产生的文件要小得多,但花费的时间却更长。因此,它更有可能用于压缩较大的文件。常见用法的示例也类似于 gzip:
xz 是Linux中使用的最节省空间的压缩实用程序,现在用于存储Linux内核的存档。再次,它以较低的压缩速度换来更高的压缩比。压缩文件以.xz扩展名存储。 一些用法示例:
在Linux中,该zip 程序通常不用于压缩文件,但通常需要使用zip程序来检查和解压缩来自其他操作系统的档案。仅当从Windows用户获得压缩文件时,才在Linux中使用它。这是一个旧程序。
从历史上看,tar 代表“磁带存档”,用于将文件存档到磁带。它允许您从通常称为tarball的存档文件中创建或提取文件。同时,您可以选择在创建归档文件时进行压缩,并在提取其内容时进行解压缩。以下是一些使用tar的示例:
您可以将归档和压缩阶段分开,如下所示:
tar cvf mydir.tar mydir ; gzip mydir.tar
gunzip mydir.tar.gz ; tar xvf mydir.tar
但这速度较慢,且创建不需要的中间.tar文件来浪费空间。
为了演示gzip, bzip2和 xz的相对效率 ,以下屏幕截图显示了使用这三种方法压缩纯文本文件目录树(来自内核源的 include 目录)的结果。
这表明,随着压缩系数的增加,CPU时间也会增加(例如,生成较小的存档会花费更长的时间)。
dd 程序是使原始磁盘空间复制非常有用的。例如,要备份主引导记录(MBR)(磁盘上的第一个512字节扇区,其中包含描述该磁盘上的分区的表),可以键入:
dd if = / dev / sda of = sda.mbr bs = 512 count = 1
警告!
输入:
dd if = / dev / sda of = / dev / sdb
要将一个磁盘的副本复制到另一个磁盘上,将删除第二个磁盘上先前存在的所有内容。
在第二个磁盘设备上创建了第一个磁盘设备的精确副本。
不要尝试上面写的这个命令,因为它会擦除硬盘!
dd的名称确切地 是一个经常被争论的项目。数据定义一词是最流行的理论,它起源于IBM早期的 历史。通常,人们开玩笑说这意味着磁盘破坏者和其他变体,例如删除数据!
时不时地存档(或备份)文件是必不可少的良好卫生习惯。您可能会键入命令,从而无意间破坏了所需的文件,而不是要进行更改。此外,虽然您的硬件被认为相当可靠,但所有设备最终都会以某种方式发生故障(即使这只是意外的电源故障)。通常,这发生在最坏的时间。定期备份文件是一种很好的习惯。
当然,通过网络备份到外部系统或备份到外部存储(例如外部驱动器或USB记忆棒)上非常重要。在这里,我们将在同一系统上创建一个备份存档,这非常有用,但是如果驱动器发生灾难性故障,计算机被盗或小行星或火被摧毁,将无济于事。
第十一章 文本编辑器
1. 基础文本编辑器
在某些时候,您将需要手动编辑文本文件。您可能正在离线编写电子邮件,编写用于bash或其他命令解释器的脚本,更改系统或应用程序配置文件,或者为诸如C或Java的编程语言开发源代码。Linux管理员通常使用图形实用程序来创建和修改系统配置文件,从而避开了文本编辑器。但是,与直接使用文本编辑器相比,这可能更费力,并且功能上也受到限制。请注意,文字处理应用程序(包括那些属于Office套件的文字处理应用程序)并不是真正的基本文本编辑器,因为它们会添加许多额外的(通常是不可见的)格式设置信息,这些信息可能会使系统管理配置文件无法按预期使用。因此,在Linux中使用文本编辑器确实至关重要。到目前为止,您肯定已经意识到Linux充满了选择。
对于文本编辑器,有很多选择,从非常简单到非常复杂,包括:
- nano
- gedit
- vi
- emacs.
在本节中,我们将学习相对简单易学的nano和gedit编辑器。在开始之前,让我们看一些不需要编辑器的情况。
有时,您可能想创建一个简短的文件,而又不想打扰全文编辑器。此外,从脚本内使用时,即使创建更长的文件,这样做也很有用。当您在介绍bash脚本的后续章节中开始时,您无疑会发现自己在使用这种方法!如果要在不使用编辑器的情况下创建文件,则有两种标准方法可以从命令行创建一个文件并用内容填充它。
第一种是 重复使用echo:
echo line one > myfile
echo line two >> myfile
echo line three >> myfile
请注意,虽然单个大于号(>)会将命令的输出发送到文件,但其中两个(>>)会将新的输出附加到现有文件。
第二种方法是 结合使用cat和重定向:
cat << EOF > myfile
> line one
> line two
> line three
> EOF
两种技术都会在文件中包含以下几行:
line one
line two
line three
并且在脚本使用时非常有用。
有一些很明显的文本编辑器。他们不需要特殊的经验就可以学习,并且即使不是很健壮,他们实际上也很有能力。一种特别易于使用的工具是基于文本终端的编辑器nano。只需 通过提供文件名作为参数来调用nano 。您需要的所有帮助都显示在屏幕底部,您应该可以继续进行而不会出现任何问题。作为图形编辑器,gedit是GNOME桌面系统的一部分(kwrite与KDE相关联)。gedit和kwrite编辑器非常易于使用并且功能强大。它们也是非常可配置的。它们看起来很像Windows中的记事本。KDE也支持其他变量,例如kate。
nano易于使用,并且几乎不需要学习。要打开nano文件,请输入nano <filename>并按Enter。如果文件不存在,将创建它。
gedit(发音为“ g-edit”)是一种易于使用的图形编辑器,只能在图形桌面环境中运行。它在外观上与Windows中的记事本文本编辑器非常相似,但实际上功能更强大且可配置性更强,并且具有大量可用的插件来进一步扩展其功能。要在gedit中打开新文件,请在桌面菜单系统中找到该程序,或者从命令行键入gedit <filename>。如果文件不存在,将创建它。
使用gedit非常简单,不需要太多培训。它的界面由相当熟悉的元素组成。
2. 高级文本编辑器vi和emacs
在类似UNIX的系统上工作的经验丰富的开发人员和管理员几乎总是使用两个古老的编辑选项之一:vi和emacs。两者在所有发行版中都存在或容易获得,并且与其他操作系统上可用的版本完全兼容。
vi和emacs都具有基本的纯文本形式,可以在非图形环境中运行。它们还具有一个或多个具有扩展功能的图形界面形式。对于经验不足的用户,这些可能会更友好。尽管vi 和emacs对于新用户而言具有非常陡峭的学习曲线,但是当人们学会了如何使用它们时,它们将非常高效。
您需要意识到,经验丰富的用户之间关于那个编辑器比较好的战斗,这可能是非常激烈的,通常被称为一场神圣的战争。
通常,系统上安装的实际程序是vim,代表Vi IMproved,并且别名为vi。这个名字的发音是“ vee-eye”。即使您不想使用vi,也最好对它有所了解:它是几乎所有Linux发行版中都安装的标准工具。确实,有时系统上没有其他可用的编辑器。GNOME通过称为gvim的非常图形化的界面扩展了vi,而KDE提供了kvim。首先,这两种方法可能更容易使用。
使用vi时,所有命令均通过键盘输入。除非要在使用编辑器的一种图形版本时这样做,否则无需一直动手以使用鼠标或触摸板之类的指针设备。
vi 提供了三种模式,如下表所述。至关重要的是,不要忘记自己所处的模式。在不同的模式下,许多按键和命令的行为都大不相同。
下表描述了在vi中用于启动,退出,读取和写入文件的最重要命令。所有这些命令需要回车结尾。
下表描述了在vi中更改光标位置时使用的最重要的击键。行模式命令(那些以下冒号:)这些命令需要回车结尾。
下表描述了在vi中搜索文本时使用的最重要的命令。
表描述了在vi中更改,添加和删除文本时使用的最重要的命令。
键入: sh command 打开一个外部命令shell。退出shell程序后,将恢复vi 编辑会话。
键入 :! 从vi内部执行命令。该命令遵循感叹号。此技术最适合非交互式命令,例如:!wc%。键入此 命令将在文件上运行wc(字数统计)命令;字符%表示当前正在编辑的文件。
emacs编辑器是vi的流行竞争对手。与vi不同,它不适用于模式。emacs是高度可定制的,并包含大量功能。它最初是为在控制台上使用而设计的,但很快又适应了GUI的需求。emacs除了简单的文本编辑之外,还具有许多其他功能。例如,它可以用于电子邮件,调试等。
emacs并非像vi那样具有不同的命令和插入模式,而是使用CTRL 和Meta 键(Alt 或 Esc)来执行特殊命令。
emacs教程是开始学习基本emacs命令的好地方。只需在emacs中输入CTRL-h (以获得帮助),然后输入字母 t,即可 在教程中随时使用它。 具体的可以自行查找资料。
第十二章 用户环境
1. 账户,用户和用户组
如您所知,Linux是一个多用户操作系统,这意味着多个用户可以同时登录。
- 要标识当前用户,请键入whoami
- 要列出当前登录的用户,请输入 who
给who的选择将更加详细的信息。 -a
在Linux中,命令shell程序(通常为bash)使用一个或多个启动文件来配置用户环境。在/etc目录下的所有用户定义的全局设置,同时在用户的主目录初始化文件可以覆盖全局设置。
启动文件可以在每个命令外壳中执行用户想要执行的任何操作,例如:
- 自定义提示
- 定义命令行快捷方式和别名
- 设置默认文本编辑器
- 设置查找可执行程序的路径
标准规定是,当您首次登录Linux时,将读取并评估/ etc / profile,然后按照列出的顺序搜索以下文件(如果存在):
- 〜/ .bash_profile
- 〜/ .bash_login
- 〜/ .profile
〜/.表示用户的主目录。Linux登录shell将评估首先遇到的启动文件,而忽略其余启动文件。这意味着,如果找到〜/ .bash_profile,它将忽略〜/ .bash_login和〜/ .profile。不同的发行版可能使用不同的启动文件。
但是,每次创建新的shell程序或终端窗口等时,都不会执行完整的系统登录;仅读取和评估名为 〜/ .bashrc文件的文件。尽管未与登录外壳一起读取和评估此文件,但是大多数发行版和用户都从三个用户拥有的启动文件之一中包含〜/ .bashrc 文件。
最常见的是,用户仅在〜/ .bashrc操作,因为每次启动新命令行shell或从终端窗口启动另一个程序时都会调用〜/ .bashrc,而仅当用户首次登录时才读取和执行其他文件。系统。
最近的发行版有时甚至没有.bash_profile或 .bash_login(Ubuntu),有些甚至只是包含.bashrc而已 。
您可以创建自定义命令或通过创建别名来修改现有命令的行为。通常,这些别名放置在〜/ .bashrc文件中,因此您创建的任何命令Shell都可以使用它们。unalias 删除别名。
键入不带参数的alias 将列出当前定义的别名。
请注意,等号两边不应有任何空格,并且如果别名定义包含任何空格,则需要在单引号或双引号中放置别名。
所有Linux用户都被分配了唯一的用户ID(uid),它只是一个整数;普通用户的uid开头为1000或更大。
Linux使用组来组织用户。组是具有某些共享权限的帐户的集合。通过/ etc / group 文件管理组成员资格的控制,该 文件显示了组及其成员的列表。默认情况下,每个用户都属于默认或主要组。用户登录时,将为其主要组设置组成员身份,并且所有成员都享有相同级别的访问和特权。可以在组级别上修改各种文件和目录的权限。
用户还具有一个或多个组ID(gid),包括与用户ID相同的 默认ID。这些数字通过文件/ etc / passwd和/ etc / group与名称相关联。组用于建立一组具有共同兴趣的用户,以实现访问权限,特权和安全性考虑。文件(和设备)的访问权限是根据用户及其所属的组授予的。
例如, / etc / passwd 可能包含george:x:1002:1002:George Metesky:/ home / george:/ bin / bash和 / etc / group可能包含 george:x:1002
发行版具有直观的图形界面,可用于创建和删除用户和组以及操纵组成员身份。但是,从命令行或在Shell脚本中执行此操作通常很有用。只有root用户可以添加和删除用户和组。
使用useradd 完成添加新用户,而使用userdel完成删除现有用户。以最简单的形式,将为新用户bjmoose开设一个帐户 :
sudo useradd bjmoose
请注意,对于openSUSE,useradd 不在普通用户的PATH中,因此命令应为:
sudo / usr / sbin / useradd bjmoose
默认情况下,它将主目录设置为/ home / bjmoose,并用一些基本文件(从/ etc / skel复制)填充它,并在/ etc / passwd中添加一行,例如:
bjmoose:x:1002:1002 :: / home / bjmoose:/ bin / bash
并将默认shell设置为/ bin / bash。删除用户帐户就像输入userdel bjmoose 一样容易。但是,这将使/ home / bjmoose 目录保持不变。如果这是暂时的停用,这可能很有用。要在删除帐户的同时删除主目录,需要对userdel使用-r选项。
输入不带参数的id 可提供有关当前用户的信息,如下所示:
$ id
uid = 1002(bjmoose)gid = 1002(bjmoose)组= 106(fuse),1002(bjmoose)
如果给定另一个用户的名称作为参数,则id将报告有关该另一个用户的信息。
添加新组是通过groupadd完成的 :
sudo / usr / sbin / groupadd anewgroup
可以通过以下方式删除该组:
$ sudo / usr / sbin / groupdel anewgroup
使用usermod将用户添加到现有组中 。例如,您首先要查看用户已经属于哪些组:
groups rjsquirrel
bjmoose: rjsquirrel
然后添加新组:
sudo / usr / sbin / usermod -a -G anewgroup rjsquirrel
groups rjsquirrel
rjsquirrel: rjsquirrel anewgroup
这些实用程序根据需要更新 / etc / group。确保对附加使用 -a 选项,以免删除已经存在的组。groupmod可用于更改组属性,例如使用-g选项更改组ID(gid)或使用-n选项更改其名称。
从组中删除用户比较棘手。 usermod 的-G选项必须提供组的完整列表。因此,如果您这样做:
sudo / usr / sbin / usermod -G rjsquirrel rjsquirrel
groups rjsquirrel
rjsquirrel:rjsquirrel
仅 保留rjsquirrel 组。
root 帐户非常强大,并且具有对系统的完全访问权限。其他操作系统通常将此称为管理员帐户。在Linux中,通常称为超级用户帐户。在授予用户完全根访问权限之前,您必须非常谨慎。如果有的话,这很少是合理的。外部攻击通常包括用于提升到root帐户的技巧。
但是,您可以使用sudo功能为用户帐户分配更多的受限特权:
- 只是暂时的
- 仅用于特定的命令子集。
分配提升的特权时,可以使用命令 su (切换用户或替换用户)启动以其他用户身份运行的新Shell(必须输入要成为该用户的密码)。通常,该其他用户是root用户,新的Shell允许使用提升的特权,直到退出为止。使用su提升权限几乎总是一种不好的做法(对安全性和稳定性都有危险)。导致的错误可能包括从系统中删除重要文件和安全漏洞。
使用sudo授予特权的危险性较小,因此是首选。默认情况下, 必须基于每个用户启用sudo 。但是,默认情况下,某些发行版(例如Ubuntu)会为至少一个主要用户启用它,或将其作为安装选项。
在第18章:本地安全原则中,我们将详细描述和比较su 和 sudo 。
su,然后提示输入root密码。
要仅以root特权执行一个命令,请键入sudo <command>。命令完成后,您将恢复为普通的非特权用户。
sudo配置文件存储在/ etc / sudoers文件和/etc/sudoers.d/目录中。默认情况下,sudoers.d目录为空。
2. 环境变量
环境变量是具有特定值的数量,命令shell(例如bash或其他实用程序和应用程序)可以使用这些特定值。一些环境变量由系统提供预设值(通常可以覆盖),而其他一些环境变量则由用户直接设置,可以在命令行或在启动脚本和其他脚本中进行设置。
环境变量实际上只是一个字符串,其中包含一个或多个应用程序使用的信息。有许多种方法可以查看当前设置的环境变量的值。一个可以键入 set, env或 export。根据系统状态的不同, set可能比其他两种方法打印出更多的行。
默认情况下,在脚本中创建的变量仅可用于当前shell程序。子进程(子shell程序)将无法访问已设置或修改的值。允许子进程查看值需要使用export 命令。
您还可以将环境变量设置为一次性输入到命令中,如下所示:
SDIRS = s_0 * KROOT = / lib / modules / $(uname -r)/ build make modules_install
它将SDIRS和KROOT环境变量的值提供给命令 make modules_install。
HOME是一个环境变量,代表用户的主目录(或登录名)。 不带参数的 cd会将当前工作目录更改为 HOME的值。请注意,代字号(〜)通常用作 $ HOME的缩写 。因此, cd $ HOME和 cd〜是完全等效的语句。
PATH是目录(路径)的有序列表,当发出命令以查找要运行的适当程序或脚本时,将对其进行扫描。路径中的每个目录由冒号分隔(:)。空(空)目录名(或 ./)表示任何给定时间的当前目录。
- :path1:path2
- path1::path2
在该实例中:PATH1:PATH2,有第一个冒号之前空目录(:)。类似地,对于path1 :: path2在path1 和path2之间存在一个空目录。
要将私有bin 目录添加到路径前缀:
export PATH = $ HOME / bin:$ PATH
echo $ PATH
/ home / student / bin:/ usr / local / bin:/ usr / bin:/ bin / usr
环境变量SHELL 指向用户的默认命令shell程序(该程序正在处理您在命令窗口中键入的内容,通常是bash),并包含shell程序的完整路径名:
echo $SHELL
/ bin / bash
提示语句(PS)用于自定义终端窗口中的提示字符串,以显示所需的信息。
PS1是主要的提示变量,它控制命令行提示的外观。PS1中可以包含以下特殊字符 :
\ u - 用户名
\ h - 主机名
\ w - 当前工作目录
\!- 此命令的历史编号
\ d - 日期
使用它们时,它们必须用单引号引起来,如下例所示:
echo $ PS1
export PS1 ='\ u @ \ h:\ w '
[email protected]:〜$ # new prompt
student@ example.com:〜$
要还原更改,请执行以下操作:
[email protected]:〜$ export PS1 ='$'
更好的做法是先保存旧的提示,然后还原,如:
OLD_PS1 = $ PS1
更改提示,最后将其更改为:
PS1 = $ OLD_PS1
3. 回顾历史命令
bash在历史记录缓冲区中跟踪先前输入的命令和语句。您只需使用向上和向下光标键即可调用以前使用的命令。要查看以前执行的命令列表,您只需在命令行输入history 即可。
显示命令列表,最新命令显示在列表的最后。此信息存储在 〜/ .bash_history中。如果打开了多个终端,则在会话终止之前不会保存在每个会话中键入的命令。
几个关联的环境变量可用于获取有关 history 文件的信息。
- HISTFILE
历史记录文件的位置。
-
HISTFILESIZE
历史记录文件中的最大行数(默认为500)。 -
HISTSIZE
历史记录文件中的最大命令数。 -
HISTCONTROL
命令的存储方式。 -
HISTIGNORE
可以取消保存哪些命令行。
有关这些环境变量的用法的完整说明,请参见man bash。
如果要撤回历史记录列表中的命令,但又不想重复按箭头键,则可以按CTRL-R进行反向智能搜索。当您开始键入内容时,搜索将以与您输入的字母匹配的第一个命令以相反的顺序返回。通过键入更多连续的字母,可以使匹配变得越来越具体。以下是如何使用CTRL-R命令搜索命令历史记录的示例:$ ^ R(这全部发生在1行上)(反向i搜索)是:sleep 1000(在“ s';匹配的“ sleep”)$ sleep 1000(按Enter执行搜索的命令)$
下表描述了用于执行先前使用的命令的语法:
这里有更多示例:
history
- echo $SHELL
- echo $HOME
- echo $PS1
- ls -a
- ls -l /etc/ passwd
- sleep 1000
- history
$ !1 (执行上面的命令#1)
echo $SHELL
/bin/bash
$ !sl (执行最近一条以“ sl”开头的命令)
sleep 1000
您可以使用键盘快捷键快速执行不同的任务。下表列出了其中一些键盘快捷键及其用法。请注意,“热键”的大小写无关紧要,例如,执行CTRL-a与执行CTRL-A相同。
4. 文件权限
在Linux和其他基于UNIX的操作系统中,每个文件都与作为所有者的用户相关联。每个文件还与一个组(所有用户的一个子集)相关联,该组对该文件感兴趣并具有某些权利或权限:读取,写入和执行。
以下实用程序涉及用户和组的所有权和权限设置:
文件具有三种权限:读取(r),写入(w),执行(x)。这些通常用 rwx表示。这些权限影响三组所有者:用户/所有者(u),组(g)和其他(o)。
因此,您具有以下三个权限组,分为三个权限:
rwx:rwx:rwx
u:g:o
有多种使用chmod的方法。例如,要授予所有者和其他人执行权限并删除组的写权限:
ls -l somefile
-rw-rw-r-- 1 student student 1601 Mar 9 15:04 somefile
chmod uo+x,g-w somefile
ls -l somefile
-rwxr--r-x 1 student student 1601 Mar 9 15:04 somefile
其中 u 代表用户(所有者), o代表其他, g代表组。
这种语法可能很难键入和记住,因此经常使用一种简写形式,使您可以一步设置所有权限。这是通过简单的算法完成的,并且一位数字足以为每个实体指定所有三个权限位。该数字是以下各项的总和:
- 4如果需要读取权限
- 2如果需要写许可
- 如果需要执行许可,则为1。
因此,7表示读/写/执行,6表示读/写,5表示读/执行。
将其应用于chmod命令时,必须为每个自由度提供三位数,例如:
chmod 755 somefile
ls -l somefile
-rwxr-xr-x 1 student student 1601 Mar 9 15:04 somefile
让我们来看一个使用chown更改文件所有权的示例 , 如右侧的屏幕截图所示。首先,我们使用touch创建两个空文件 。注意,它需要sudo才能将file2的所有者更改 为root。第二个 chown命令同时更改所有者和组!
最后,只有超级用户才能删除文件。
现在,让我们看一个使用chgrp更改组所有权的示例:
第十三章 文本操作
1. cat命令和echo命令