MAGESH MARUTHAMUTHU 发布的文章

单用户模式,也被称为维护模式,超级用户可以在此模式下恢复/修复系统问题。

通常情况下,这类问题在多用户环境中修复不了。系统可以启动但功能不能正常运行或者你登录不了系统。

在基于 Red Hat(RHEL)7/8 的系统中,使用 runlevel1.targetrescue.target 来实现。

在此模式下,系统会挂载所有的本地文件系统,但不开启网络接口。

系统仅启动特定的几个服务和修复系统必要的尽可能少的功能。

当你想运行文件系统一致性检查来修复损坏的文件系统,或忘记 root 密码后重置密码,或要修复系统上的一个挂载点问题时,这个方法会很有用。

你可以用下面三种方法以单用户模式启动 CentOS/RHEL 7/8 系统。

  • 方法 1:通过向内核添加 rd.break 参数来以单用户模式启动 CentOS/RHEL 7/8 系统
  • 方法 2:通过用 init=/bin/bashinit=/bin/sh 替换内核中的 rhgb quiet 语句来以单用户模式启动 CentOS/RHEL 7/8 系统
  • 方法 3:通过用 rw init=/sysroot/bin/sh 参数替换内核中的 ro 语句以单用户模式启动 CentOS/RHEL 7/8 系统

方法 1

通过向内核添加 rd.break 参数来以单用户模式启动 CentOS/RHEL 7/8 系统。

重启你的系统,在 GRUB2 启动界面,按下 e 键来编辑选中的内核。你需要选中第一行,第一个是最新的内核,然而如果你想用旧的内核启动系统你也可以选择其他的行。

根据你的 RHEL/CentOS 版本,找到 linux16linux 语句,按下键盘上的 End 键,跳到行末,像下面截图中展示的那样添加关键词 rd.break,按下 Ctrl+xF10 来进入单用户模式。

如果你的系统是 RHEL/CentOS 7,你需要找 linux16,如果你的系统是 RHEL/CentOS 8,那么你需要找 linux

这个修改会让你的 root 文件系统以 “只读(ro)” 模式挂载。你可以用下面的命令来验证下。下面的输出也明确地告诉你当前是在 “ 紧急模式 Emergency Mode ”。

# mount | grep root

为了修改 sysroot 文件系统,你需要用读写模式(rw)重新挂载它。

# mount -o remount,rw /sysroot

运行下面的命令修改环境,这就是大家熟知的 “监禁目录” 或 “chroot 监狱”。

# chroot /sysroot

现在,单用户模式已经完全准备好了。当你修复了你的问题要退出单用户模式时,执行下面的步骤。

CentOS/RHEL 7/8 默认使用 SELinux,因此创建下面的隐藏文件,这个文件会在下一次启动时重新标记所有文件。

# touch /.autorelabel

最后,用下面的命令重启系统。你也可以输入两次 exit 命令来重启你的系统。

# reboot -f

方法 2

通过用 init=/bin/bashinit=/bin/sh 替换内核中的 rhgb quiet 语句来以单用户模式启动 CentOS/RHEL 7/8 系统。

重启你的系统,在 GRUB2 启动界面,按下 e 键来编辑选中的内核。

找到语句 rhgb quiet,用 init=/bin/bashinit=/bin/sh 替换它,然后按下 Ctrl+xF10 来进入单用户模式。

init=/bin/bash 的截图。

init=/bin/sh 的截图。

默认情况下,上面的操作会以只读(ro)模式挂载你的 / 分区,因此你需要以读写(rw)模式重新挂载 / 文件系统,这样才能修改它。

# mount -o remount,rw /

现在你可以执行你的任务了。当结束时,执行下面的命令来开启重启时的 SELinux 重新标记。

# touch /.autorelabel

最后,重启系统。

# exec /sbin/init 6

方法 3

通过用 rw init=/sysroot/bin/sh 参数替换内核中的 ro 单词,以单用户模式启动 CentOS/RHEL 7/8 系统。

为了中断自动启动的过程,重启你的系统并在 GRUB2 启动界面按下任意键。

现在会展示你系统上所有可用的内核,选择最新的内核,按下 e 键来编辑选中的内核参数。

找到以 linuxlinux16 开头的语句,用 rw init=/sysroot/bin/sh 替换 ro。替换完后按下 Ctrl+xF10 来进入单用户模式。

运行下面的命令把环境切换为 “chroot 监狱”。

# chroot /sysroot

如果需要,做出必要的修改。修改完后,执行下面的命令来开启重启时的 SELinux 重新标记。

# touch /.autorelabel

最后,重启系统。

# reboot -f

via: https://www.2daygeek.com/boot-centos-7-8-rhel-7-8-single-user-mode/

作者:Magesh Maruthamuthu 选题:lujun9972 译者:lxbwolf 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

软件包管理器在 Linux 系统中扮演着重要的角色。它允许你安装、更新、查看、搜索和删除软件包,以满足你的需求。

每个发行版都有自己的一套包管理器,依据你的 Linux 发行版来分别使用它们。

RPM 是最古老的传统软件包管理器之一,它是为基于 Red Hat 的系统设计的,如 Red Hat Enterprise Linux(RHEL)、CentOS、Fedora 和 openSUSE(它基于 suse Enterprise Linux)等系统。但在依赖解析和包更新(全系统更新/升级)方面,RPM 包管理器有一个突出的限制。

如果你想知道 YUM 和 DNF 包管理器的区别请参考该文章。

这意味着 yum 可以自动下载并安装所有需要的依赖项,但 rpm 会告诉你安装一个依赖项列表,然后你必须手动安装。

当你想用 rpm 命令 安装一组包时,这实际上是不可能的,而且很费时间。

这时,YUM 包管理器 就派上了用场,解决了这两个问题。

什么是 RPM?

RPM 指的是 RPM Package Manager(原名 Red Hat Package Manager),是一个功能强大的命令行包管理工具,是为 Red Hat 操作系统开发的。

它现在被用作许多 Linux 发行版的核心组件,如 Centos、Fedora、Oracle Linux、openSUSE 和 Mageia 等。

RPM 软件包管理器允许你在基于 RPM 的 Linux 系统上安装、升级、删除、查询和验证软件包。

RPM 文件的扩展名为 .rpm。RPM 包由一个存档文件组成,其中包含了一个特定包的库和依赖关系,这些库和依赖关系与系统上安装的其他包不冲突。

在 Linux 上有很多前端工具可以用来安装 RPM 包,与 RPM 工具相比,这些工具可以使安装过程更加高效,尤其是在处理依赖关系方面。

如果你想了解更多关于 Linux 发行版的前端包管理器的信息,请到下面的链接。

如果你想了解 Linux 的 GUI 包管理器,请到下面的链接。

什么是 YUM?

Yum 是一个 Linux 操作系统上的自由开源的命令行包管理程序,它使用 RPM 包管理器。Yum 是一个 RPM 的前端工具,可以自动解决软件包的依赖关系。它可以从发行版官方仓库和其他第三方仓库中安装 RPM 软件包。

Yum 允许你在系统中安装、更新、搜索和删除软件包。如果你想让你的系统保持更新,你可以通过 yum-cron 启用自动更新。

此外,如果你需要的话,它还允许你在 yum update 中排除一个或多个软件包。

Yum 是默认安装的,你不需要安装它。

编号RPMYUM
1红帽在 1997 年引入了 RPMYellowdog UPdater(YUP)开发于 1999-2001 年,YUM 于 2003 年取代了原来的 YUP 工具
2RPM 代表 RPM Package manager(原名 Red Hat package manager)YUM 代表 Yellowdog Updater Modified
3RPM 文件的命名规则如下,httpd-2.4.6-92.el7.x86_64.rpmhttpd - 实际的包名;2.4.6 - 包发布版本号;92 - 包发布子版本号;el7 - Red Hat 版本;x86_64 - 硬件架构;rpm - 文件扩展名后台使用 rpm 数据库
4不解析依赖关系,你必须手动安装依赖可以自动解析依赖关系并同时安装它们(任何包都会和它的依赖关系一起安装)
5允许你同时安装多个版本的软件包不允许,并显示该软件包已经安装
6当使用 RPM 命令安装一个软件包时,你必须提供 .rpm 软件包的确切位置你可以安装仓库中的任何软件包,而你只需要知道软件包的名称就可以了
7RPM 不依赖于 YUM它是一个前端工具,在后台使用 RPM 包管理器来管理包
8RPM 在安装包的管理方面比较难YUM 是最简单的管理 RPM 包的方法
9RPM 不能让你将整个系统升级到最新的版本YUM 可以让你将系统升级到最新的版本(例如 7.0 到 7.x 的小版本升级)
10RPM 不能让你自动更新/升级安装在系统上的软件包YUM 可以让你自动更新/升级系统上的更新
11不使用在线仓库来执行任何操作完全依赖在线仓库来完成所有的工作
12RPM 是一种包格式,它也是一个底层的包管理器,只做基本的事情这是一个上层的包管理器前端,它可以完成你所需要的一切工作

via: https://www.2daygeek.com/comparison-difference-between-yum-vs-rpm/

作者:Magesh Maruthamuthu 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

默认情况下,在设置服务器时你会配置主网络接口。这是每个人所做的构建工作的一部分。有时出于各种原因,你可能需要配置额外的网络接口。

这可以是通过网络 绑定 bonding / 协作 teaming 来提供高可用性,也可以是用于应用需求或备份的单独接口。

为此,你需要知道计算机有多少接口以及它们的速度来配置它们。

有许多命令可检查可用的网络接口,但是我们仅使用 ip 命令。以后,我们会另外写一篇文章来全部介绍这些工具。

在本教程中,我们将向你显示可用网络网卡(NIC)信息,例如接口名称、关联的 IP 地址、MAC 地址和接口速度。

什么是 ip 命令

ip 命令 类似于 ifconfig, 用于分配静态 IP 地址、路由和默认网关等。

# ip a

1: lo: mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether fa:16:3e:a0:7d:5a brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.101/24 brd 192.168.1.101 scope global eth0
    inet6 fe80::f816:3eff:fea0:7d5a/64 scope link
       valid_lft forever preferred_lft forever

什么是 ethtool 命令

ethtool 用于查询或控制网络驱动或硬件设置。

# ethtool eth0

1)如何在 Linux 上使用 ip 命令检查可用的网络接口

在不带任何参数的情况下运行 ip 命令时,它会提供大量信息,但是,如果仅需要可用的网络接口,请使用以下定制的 ip 命令。

# ip a |awk '/state UP/{print $2}'

eth0:
eth1:

2)如何在 Linux 上使用 ip 命令检查网络接口的 IP 地址

如果只想查看 IP 地址分配给了哪个接口,请使用以下定制的 ip 命令。

# ip -o a show | cut -d ' ' -f 2,7
或
ip a |grep -i inet | awk '{print $7, $2}'

lo 127.0.0.1/8
192.168.1.101/24
192.168.1.102/24

3)如何在 Linux 上使用 ip 命令检查网卡的 MAC 地址

如果只想查看网络接口名称和相应的 MAC 地址,请使用以下格式。

检查特定的网络接口的 MAC 地址:

# ip link show dev eth0 |awk '/link/{print $2}'
00:00:00:55:43:5c

检查所有网络接口的 MAC 地址,创建该脚本:

# vi /opt/scripts/mac-addresses.sh

#!/bin/sh
ip a |awk '/state UP/{print $2}' | sed 's/://' | while read output;
do
  echo $output:
  ethtool -P $output
done

运行该脚本获取多个网络接口的 MAC 地址:

# sh /opt/scripts/mac-addresses.sh

eth0:
Permanent address: 00:00:00:55:43:5c
eth1:
Permanent address: 00:00:00:55:43:5d

4)如何在 Linux 上使用 ethtool 命令检查网络接口速度

如果要在 Linux 上检查网络接口速度,请使用 ethtool 命令。

检查特定网络接口的速度:

# ethtool eth0 |grep "Speed:"

Speed: 10000Mb/s

检查所有网络接口速度,创建该脚本:

# vi /opt/scripts/port-speed.sh

#!/bin/sh
ip a |awk '/state UP/{print $2}' | sed 's/://' | while read output;
do
  echo $output:
  ethtool $output |grep "Speed:"
done

运行该脚本获取多个网络接口速度:

# sh /opt/scripts/port-speed.sh

eth0:
Speed: 10000Mb/s
eth1:
Speed: 10000Mb/s

5)验证网卡信息的 Shell 脚本

通过此 shell 脚本你可以收集上述所有信息,例如网络接口名称、网络接口的 IP 地址,网络接口的 MAC 地址以及网络接口的速度。创建该脚本:

# vi /opt/scripts/nic-info.sh

#!/bin/sh
hostname
echo "-------------"
for iname in $(ip a |awk '/state UP/{print $2}')
do
  echo "$iname"
  ip a | grep -A2 $iname | awk '/inet/{print $2}'
  ip a | grep -A2 $iname | awk '/link/{print $2}'
  ethtool $iname |grep "Speed:"
done

运行该脚本检查网卡信息:

# sh /opt/scripts/nic-info.sh

vps.2daygeek.com
----------------
eth0:
192.168.1.101/24
00:00:00:55:43:5c
Speed: 10000Mb/s
eth1:
192.168.1.102/24
00:00:00:55:43:5d
Speed: 10000Mb/s

via: https://www.2daygeek.com/linux-unix-check-network-interfaces-names-nic-speed-ip-mac-address/

作者:Magesh Maruthamuthu 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

由于 Yum 中许多长期存在的问题仍未得到解决,因此 Yum 包管理器已被 DNF 包管理器取代。这些问题包括性能差、内存占用过多、依赖解析速度变慢等。

DNF 使用 libsolv 进行依赖解析,由 SUSE 开发和维护,旨在提高性能。

Yum 主要是用 Python 编写的,它有自己的应对依赖解析的方法。它的 API 没有完整的文档,它的扩展系统只允许 Python 插件。

Yum 是 RPM 的前端工具,它管理依赖关系和资源库,然后使用 RPM 来安装、下载和删除包。

为什么他们要建立一个新的工具,而不是修复现有的问题呢?

Ales Kozamblak 解释说,这个修复在技术上是不可行的,而且 Yum 团队还没有准备好立即接受修改。

另外,最大的挑战是,Yum 有 56000 行代码,但 DNF 只有 29000 行代码。

所以除了分叉,没有办法解决。

不过 Yum 的运行情况还算可以。

编号DNF(Dandified YUM)YUM(Yellowdog Updater, Modified)
1DNF 使用 libsolv 来解析依赖关系,由 SUSE 开发和维护YUM 使用公开的 API 来解析依赖关系
2API 有完整的文档API 没有完整的文档
3由 C、C++、Python 编写的只用 Python 编写
4DNF 目前在 Fedora、RHEL 8、CentOS 8、OEL 8 和 Mageia 6/7 中使用YUM 目前在 RHEL 6/7、CentOS 6/7、OEL 6/7 中使用
5DNF 支持各种扩展Yum 只支持基于 Python 的扩展
6API 有良好的文档,因此很容易创建新的功能因为 API 没有正确的文档化,所以创建新功能非常困难
7DNF 在同步存储库的元数据时,使用的内存较少在同步存储库的元数据时,YUM 使用了过多的内存
8DNF 使用满足性算法来解决依赖关系解析(它是用字典的方法来存储和检索包和依赖信息)由于使用公开 API 的原因,Yum 依赖性解析变得迟钝
9从内存使用量和版本库元数据的依赖性解析来看,性能都不错总的来说,在很多因素的影响下,表现不佳
10DNF 更新:在 DNF 更新过程中,如果包中包含不相关的依赖,则不会更新YUM 将在没有验证的情况下更新软件包
11如果启用的存储库没有响应,DNF 将跳过它,并继续使用可用的存储库处理事务如果有存储库不可用,YUM 会立即停止
12dnf updatednf upgrade 是等价的在 Yum 中则不同
13安装包的依赖关系不更新Yum 为这种行为提供了一个选项
14清理删除的包:当删除一个包时,DNF 会自动删除任何没有被用户明确安装的依赖包Yum 不会这样做
15存储库缓存更新计划:默认情况下,系统启动后 10 分钟后,DNF 每小时会对配置的存储库检查一次更新。这个动作由系统定时器单元 dnf-makecache.timer 控制Yum 也会这样做
16内核包不受 DNF 保护。不像 Yum,你可以删除所有的内核包,包括运行中的内核包Yum 不允许你删除运行中的内核
17libsolv:用于解包和读取资源库。hawkey: 为 libsolv 提供简化的 C 和 Python API 库。librepo: 提供 C 和 Python(类似 libcURL)API 的库,用于下载 Linux 存储库元数据和软件包。libcomps: 是 yum.comps 库的替代品。它是用纯 C 语言编写的库,有 Python 2 和 Python 3 的绑定。Yum 不使用单独的库来执行这些功能
18DNF 包含 29000 行代码Yum 包含 56000 行代码
19DNF 由 Ales Kozumplik 开发YUM 由 Zdenek Pavlas、Jan Silhan 和团队成员开发

via: https://www.2daygeek.com/comparison-difference-between-dnf-vs-yum/

作者:Magesh Maruthamuthu 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果你在 Linux 上启用了密码策略。密码必须在到期前进行更改,并且登录到系统时会收到通知。

如果你很少使用自己的帐户,那么可能由于密码过期而被锁定。在许多情况下,这可能会在无需密码登录的服务帐户中发生,因为没人会注意到它。

这将导致停止服务器上配置的 cronjob/crontab

如果如此,该如何缓解这种情况。

你可以写一个 shell 脚本来获得有关它的通知,我们前一段时间为此写了一篇文章。

它将给出天数,但是本文旨在在终端中给你实际日期。

这可以使用 chage 命令来实现。

什么是 chage 命令?

chage 代表 更改时效 change age 。它更改用户密码到期信息。

chage 命令可以修改两次密码更改之间的天数,以及最后一次更改密码的日期。

系统使用此信息来确定用户何时应更改密码。

它还允许用户执行其他功能,例如设置帐户到期日期、在到期后将密码设置为无效、显示帐户时效信息、设置密码更改之前的最小和最大天数以及设置到期警告天数。

1)如何在 Linux 上检查特定用户的密码到期日期

如果要检查 Linux 上特定用户的密码到期日期,请使用以下命令。

# chage -l daygeek

Last password change                                    : Feb 13, 2020
Password expires                                        : May 13, 2020
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 7
Maximum number of days between password change          : 90
Number of days of warning before password expires       : 7

2)如何在 Linux 上检查所有用户的密码到期日期

你可以直接对单个用户使用 chage 命令,不过可能你对多个用户使用时可能无效。

为此,你需要编写一个小的 shell 脚本。下面的 shell 脚本可以列出添加到系统中的所有用户,包括系统用户。

# for user in $(cat /etc/passwd |cut -d: -f1); do echo $user; chage -l $user | grep "Password expires"; done | paste -d " "  - - | sed 's/Password expires//g'

你将得到类似以下的输出,但是用户名可能不同。

root                : never
bin                 : never
daemon              : never
adm                 : never
lp                  : never
sync                : never
shutdown            : never
u1               : Nov 12, 2018
u2               : Jun 17, 2019
u3               : Jun 17, 2019
u4               : Jun 17, 2019
u5               : Jun 17, 2019

3)如何检查 Linux 上除系统用户外的所有用户的密码有效期

下面的 shell 脚本将显示有到期日期的用户列表。

# for user in $(cat /etc/passwd |cut -d: -f1); do echo $user; chage -l $user | grep "Password expires"; done | paste -d " "  - - | sed 's/Password expires//g' | grep -v "never"

你将得到类似以下的输出,但是用户名可能不同。

u1               : Nov 12, 2018
u2               : Jun 17, 2019
u3               : Jun 17, 2019
u4               : Jun 17, 2019
u5               : Jun 17, 2019

via: https://www.2daygeek.com/linux-check-user-password-expiration-date/

作者:Magesh Maruthamuthu 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果你是一名系统管理员或者开发者,当你在终端工作时有时会需要编辑一个文件。在 Linux 系统中有几种文件编辑器,你可以根据需求选择合适的文件编辑器。在这里,我想推荐 Vim 编辑器。

为什么推荐 Vim 编辑器

相对于创建新文件,你更多是修改已经存在的文件。在这种情况下,Vim 快捷键可以有效地满足你的需求。

下列文章可以帮助你了解对文件和目录的操作。

什么是 Vim

Vim 是被 Linux 管理员和开发者广泛使用的最流行和功能强大的编辑器之一。它可以通过高度的自定义配置来提高文本编辑效率。它是在众多 Unix 默认安装的 Vi 编辑器的升级版。

Vim 通常被称为“程序员的编辑器”,但并不限于此,它也可用于编辑任何类型的文件。它具有许多功能,例如:多次撤销、多窗口和缓冲区、语法高亮、命令行编辑、文件名补全、可视选择等等。你可以使用 :help 命令来获取在线帮助。

理解 Vim 的模式

Vim 有两种模式,详细介绍如下:

命令模式: 当启动 Vim 编辑器后,默认处在命令模式下。你可以在文件中移动并且修改内容,剪切、复制和粘贴文件的一部分,同时发出命令执行更多操作(按 ESC 键进入命令模式)

插入模式: 插入模式用于在给定的文档位置插入文本(按 i 键进入插入模式)

我如何知道我正使用哪种 Vim 模式呢?

如果你正在使用插入模式,你会在编辑器的底部看到 INSERT。如果编辑器底部没有显示任何内容,或者在编辑器底部显示了文件名,则处于 “命令模式”。

命令模式下的光标移动

Vim 快捷键允许你使用不同的方式来移动光标:

  • G – 跳转到文件最后一行
  • gg – 跳转到文件首行
  • $ – 跳转到行末尾
  • 0(数字 0) – 跳转到行开头
  • w – 跳转到下一个单词的开始(单词的分隔符可以是空格或其他符号)
  • W – 跳转到下一个单词的开始(单词的分隔符只能是空格)
  • b – 跳转到下一个单词的末尾(单词的分隔符可以是空格或其他符号)
  • B – 跳转到下一个单词的末尾(单词的分隔符只能是空格)
  • PgDn 键 – 向下移动一页
  • PgUp 键 – 向上移动一页
  • Ctrl+d – 向下移动半页
  • Ctrl+u – 向上移动半页

插入模式:插入文字

下面的 Vim 快捷键允许你根据需要在光标的不同位置插入内容。

  • i – 在光标之前插入
  • a – 在光标之后插入
  • I – 在光标所在行的开头插入。当光标位于行中间时,这个键很有用
  • A – 在光标所在行的末尾插入。
  • o – 在光标所在行的下面插入新行
  • O – 在光标所在行的上面插入新行
  • ea – 在单词的末尾插入

拷贝、粘贴和删除一行

  • yy – 复制一行
  • p / P – 将内容粘贴到光标之后 / 之前
  • dd – 删除一行
  • dw – 删除一个单词

在 Vim 中搜索和替换匹配的模式

  • /模式 – 向后搜索给定的模式
  • ?模式 – 向前搜索给定的模式
  • n – 向后重复搜索之前给定的模式
  • N – 向前重复搜索之前给定的模式
  • :%s/旧模式/新模式/g – 将文件中所有的旧模式替换为新模式
  • :s/旧模式/新模式/g – 将当前行中所有的旧模式替换为新模式
  • :%s/旧模式/新模式/gc – 逐个询问是否文件中的旧模式替换为新模式

如何在 Vim 编辑器中跳转到特定行

你可以根据需求以两种方式达到该目的,如果你不知道行号,建议采用第一种方法。

通过打开文件并运行下面的命令来显示行号

:set number

当你设置好显示行号后,按 :n 跳转到相应的行号。例如,如果你想跳转到第 15 行,请输入:

:15

如果你已经知道行号,请使用以下方法在打开文件时直接跳转到相应行。例如,如果在打开文件时直接跳转到 20 行,请输入下面的命令:

$ vim +20 [文件名]

撤销操作/恢复上一次操作/重复上一次操作

  • u – 撤销更改
  • Ctrl+r – 恢复更改
  • . – 重复上一条命令

保存和退出 Vim

  • :w – 保存更改但不退出 vim
  • :wq – 写并退出
  • :q! – 强制退出

via: https://www.2daygeek.com/basic-vim-commands-cheat-sheet-quick-start-guide/

作者:Magesh Maruthamuthu 选题:lujun9972 译者:萌新阿岩 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出