Linux 安装更新和管理软件包(或许在施工中)

安装和更新软件包

  • 软件(Software)是您在计算机上运行的任何应用程序。
  • 软件包(Package)是一个包含与软件相关的程序、文件和可执行文件的容器。

系统更新和软件仓库

  • yum (用于 CentOS) / apt-get (用于其他 Linux 发行版)
  • rpm (红帽软件包管理器)

这里我使用yum安装ftp包作为一个例子。昨天的笔记中有在ubuntu中使用apt安装ftp的例子。

VirtualBoxVM_c7cN03nWKq.png

你可以使用rpm -qa来查看所有你已经安装的包。
VirtualBoxVM_vvIFUAYmWy.png

使用管道到wc -l可以统计列数,就是已安装的包的数量。

VirtualBoxVM_RDUKq6er9w.png

RPM vs. YUM

rpmyum 都是用于在基于 Red Hat 的 Linux 系统上管理软件包的工具,但它们在功能和使用方式上有本质的区别。

  • RPM (Red Hat Package Manager)

    • 底层工具: rpm 是一个底层的软件包管理器。它直接处理 .rpm 文件,可以进行安装、查询、卸载、升级和验证等操作。
    • 不自动处理依赖: 这是 rpm 最重要的一个特点。当你使用 rpm 安装一个软件包时,如果这个包依赖于其他未安装的包,rpm 会报错并失败。你需要手动去寻找并安装所有这些依赖包,这个过程可能非常繁琐。
    • 用途: rpm 更适合用于对单个 .rpm 文件进行操作,或者在无法连接到互联网的环境下进行离线安装(前提是你已经准备好了所有的依赖包)。
  • YUM (Yellowdog Updater, Modified)

    • 高层工具: yum 是一个更高层次的软件包管理工具,它构建在 rpm 之上,旨在简化软件包管理过程。
    • 自动解决依赖关系: 这是 yum 最大的优势。当你使用 yum 安装一个软件包时,它会自动检查所有依赖关系,并从配置好的软件仓库(repository)中下载并安装所有需要的依赖包。这极大地简化了软件安装过程。
    • 基于软件仓库: yum 从远程或本地的软件仓库中查找、下载和安装软件包。这些仓库包含了大量的软件包及其元数据(包括依赖信息)。
    • 用途: yum 是日常进行系统更新、软件安装和管理的首选工具,因为它非常方便。

卸载软件包

使用 YUM 卸载

yum remove <package_name>: 这是卸载软件包的首选方法,因为它会自动处理依赖关系。当您卸载一个软件包时,yum 会检查是否有其他软件包依赖于它。如果没有,yum 会将其卸载;如果有,yum 会提示您是否也卸载这些依赖包(如果它们不再被其他任何包需要)。

示例:

1
yum remove ftp

此命令会卸载 ftp 软件包及其不再需要的依赖项。

使用 RPM 卸载

rpm -e <package_name>: 使用 rpm 卸载软件包时,需要非常小心,因为它不会自动处理依赖关系。如果一个软件包被其他已安装的软件包所依赖,rpm -e 命令会失败并报错,除非强制卸载。

示例:

1
rpm -e ftp

如果 ftp 软件包没有被其他包依赖,这个命令会成功。如果存在依赖,您可能会看到类似以下的错误:

1
2
error: Failed dependencies:
ftp is needed by (installed) some_other_package

在这种情况下,需要先卸载依赖 ftpsome_other_package,或者使用 --nodeps 选项强制卸载(不推荐,可能导致系统不稳定)。

强制卸载 (不推荐):

1
rpm -e --nodeps ftp

注意: 强制卸载可能会破坏系统上其他软件包的功能,因为它们可能依赖于正在卸载的软件包。除非非常清楚自己在做什么,否则应尽量避免使用 --nodeps 选项。

系统升级/补丁管理

  • 两种类型的升级:

    • 主版本升级 (Major version) = 例如从 5.x 升级到 6.x 或 7.x
    • 次版本升级 (Minor version) = 例如从 7.3 升级到 7.4
  • yum update vs. yum upgrade

    • upgrade = 删除旧的包
    • update = 保留旧的包
  • 主版本升级 = yum 命令 是不支持的

  • 次版本升级 = yum update 可以升级

1
yum update -y

意思更新目前所有的已安装软件包,并且不要询问我,我会同意安装中的所有询问。

VirtualBoxVM_DbhUcvFWnn.png

如果你所有的软件包都是最新的,那么yum update是不会有更新的。

rpm

有时候你可能会通过curl或者访问某包的官网下载他们的rpm包。

比如你本地有了一个.rpm文件,你就可以使用比较常用的

1
rpm -Uvh packagename.rpm

-U(Update)
如果这个软件已经安装了,它会将其升级到新版本。
如果这个软件尚未安装,它会直接安装它。

-h (hash - 哈希/进度条)
这个选项会在安装过程中显示一个进度条,通常是用井号(#)来表示。这能让你直观地看到安装的进度,非常有用。

-v (verbose - 详细)
这个选项会显示详细的运行信息,比如它正在检查什么、正在执行什么步骤。

上面的这个命令也经常会使用通配符,因为通常这个文件名会很长。

比如3cpio-0.11.0-2.el10_2.x86_64.rpm,就可以使用:

1
rpm -Uvh 3cpio*rpm

rpm -qi可以展示关于已安装的该软件包的信息:

VirtualBoxVM_Chy9bjlMkA.png

rpm -qc可以查看该软件包的配置文件目录:

VirtualBoxVM_tiOHMwFzR1.png

rpm -qf可以查询该目录隶属于哪个包
VirtualBoxVM_jsN38lQab6.png

Linux 归档压缩和传输文件

1. 压缩和解压缩文件

  • tar: 用于创建和提取归档文件。归档文件是将多个文件和目录组合成一个文件,以便于传输或备份。

WindowsTerminal_HrPrb2QEqj.png
在你第一次使用之前,一定要看一下使用方法。

比如我想要把当前目录的所有内容打包成一个tar:
WindowsTerminal_5wvza0vn0D.png

看到这一行tar: ./goscript.tar: archive cannot contain itself; not dumped了吗?意思是:“压缩包不能包含它自己”。
在你运行命令之前goscript.tar 这个文件确实不存在。

关键点在于 tar 命令的 执行顺序

当你运行 tar -cvf goscript.tar . 时,tar 的工作流程是:

  1. 第一步:创建目标文件。 tar 看到 -f goscript.tar,它的第一个动作就是在当前目录(.)下,立即创建一个空的 goscript.tar 文件。它需要这个“壳”来往里面塞东西。
  2. 第二步:扫描源目录。 创造完“壳”之后,tar 才开始扫描你指定的源(.,代表当前目录),看看有哪些东西需要被塞进去。
  3. 第三步:打包并报错。
    • 它找到了 hello1.go,塞进去了。
    • 它找到了 hello2.go,塞进去了。
    • 接着,它找到了 goscript.tar —— 也就是它在第一步刚刚创建的那个文件!
    • tar 就懵了:你要我把我自己(goscript.tar)也塞进我自己(goscript.tar)里面?
    • 于是它就报了 archive cannot contain itself 这个错误。

所以,并不是因为文件“事先存在”,而是因为 tar 命令“先创建了目标文件”,而这个目标文件“恰好”又在它要扫描打包的源目录里。又学到了机制!

之后我们查看一下压缩包里的内容:
WindowsTerminal_UvVdXUmJdO.png

有没有注意到这里多了一个./的目录?

这个 ./ 就是你试图打包的那个目录本身

./ 在 Linux/Unix 系统里是一个特殊的符号,代表“当前目录”。在你的例子里,它就代表 gostudy 这个文件夹。

为什么它会出现在这里?

这和上一步出错的命令 tar -cvf goscript.tar . 直接相关。

tar 命令在执行时,是按顺序来的:

  1. 它首先在当前目录创建了一个空的 goscript.tar
  2. 然后它开始扫描你让它打包的源:. (当前目录)。
  3. tar 存档时,会先把目录本身的信息(元数据)打包进去,然后再打包目录里的文件。

所以,你现在用 tar -tvf (t = test/list) 命令看到的列表,其实是 tar 在报错停止前,已经塞进去的东西:

  • drwxr-xr-x ... ./: 这是 tar 扫描到的第一个条目,也就是 . (gostudy 目录) 自己的信息。
    • 你看它开头的 d,就代表directory (目录)。
    • 你原来的目录里当然“看”不到它,因为它不是一个实体文件,而是对目录本身的引用。
  • -rw-r--r-- ... ./hello1.go: 这是 tar 扫描到的第二个条目,是目录里的文件。
  • -rw-r--r-- ... ./hello2.go: 这是 tar 扫描到的第三个条目,是目录里的另一个文件。

在这之后,tar 才继续扫描,然后发现了 goscript.tar,它意识到不能打包自己,于是报错 archive cannot contain itself 并停止了。

但它已经打包进去的(前面这三行)就被保存下来了,所以你现在才能list (列出) 它们。

这个 ./ 不是你创建的“文件”,而是 tar 命令在打包 . (当前目录) 时,自动放进去的**“目录元数据”**。

如果你当时用的是 tar -cvf goscript.tar *.go,那么你现在tar -tvf 就不会看到那个 ./ 目录了,只会看到两个 .go 文件。

之后我们尝试解包:
WindowsTerminal_Rw0HY27rRr.png

  • gzip: 用于压缩文件,减小文件大小。

WindowsTerminal_W1eJRLsXAq.png

可以看到文件的大小的确被压缩了。聪明的你会不会想把.gz再继续用gzip压缩呢?实际上gzip有一个防呆设计,对于.gz结尾的文件他会提示你已经被压缩过了:

WindowsTerminal_uGw3OBun5x.png

但是实际上如果你修改后缀,改成不是gz结尾,那就可以再继续进行gzip,但是实际上这样做的意义很小,已经压缩过的文件再度压缩大小几乎不会变,甚至可能因为多了一个 gzip 的“外壳”而反而变大一点点。如同你在windows试图多重压缩压缩包一样。如果你没有尝试过的话可以试一试,看看压缩包的大小变化是如何的?

  • gzip -dgunzip: 用于解压缩由gzip压缩的文件。

WindowsTerminal_xpNB0Aegyz.png


2. FTP - 文件传输协议

  • 文件传输协议(FTP)是一种标准的网络协议,用于在客户端和服务器之间传输计算机文件。
  • 协议 = 计算机用于通信的规则集
  • 默认FTP端口 = 21

在远程服务器上安装和配置FTP

  • # yum install vsftpd: 使用yum包管理器安装vsftpd(一个FTP服务器软件)。
  • # vi /etc/vsftpd/vsftpd.conf: 使用vi文本编辑器打开vsftpd的配置文件进行编辑。
    • anonymous_enable=NO: 禁止匿名用户登录FTP服务器。
    • ascii_upload_enable=YES: 允许以ASCII模式上传文件。
    • ascii_download_enable=YES: 允许以ASCII模式下载文件。
    • ftpd_banner=Welcome to UNIXMEN FTP service.: 设置FTP服务器的欢迎横幅。
  • # systemctl start vsftpd: 启动vsftpd服务。
  • # systemctl enable vsftpd: 设置vsftpd服务开机自启。

首先我开始配置服务端,安装vsftpd并且使用vi编辑/etc/vsftpd/vsftpd.conf进行一些基础的配置。
VirtualBoxVM_yuKueavXuW.png

VirtualBoxVM_h0yNSeCoCY.png

VirtualBoxVM_jytvWgspJI.png

随后我启用vsftpd,并且关闭防火墙(目的是为了放行ftp端口):

VirtualBoxVM_X7tQpSJ4A2.png

FTP客户端命令

  • ftp 192.168.1.x: 连接到指定IP地址的FTP服务器。
  • bin: 将文件传输模式设置为二进制模式,适用于传输非文本文件(如图片、程序)。
  • hash: 开启文件传输进度显示,每传输一定数据量就显示一个“#”号。
  • put hello1.go: 将本地文件“hello1.go”上传到FTP服务器。
  • bye: 断开与FTP服务器的连接并退出FTP客户端。

首先我需要先安装ftp。我的第二台机子用的是Ubuntu,所以我用的是apt install ftp:
WindowsTerminal_sEUN5LgNyR.png

之后使用ftp命令,连接服务器端之后(服务器端的地址用ip addr来查看),输入服务端的用户名和密码就可以连接到ftp服务器端了。之后开启二进制模式和传输进度显示,将我的hello1.go文件传送过去。
Code_ZNcZXmCdlt.png

可以看到该文件已经被传输到服务器端的home目录下:

VirtualBoxVM_H76bRQmbAw.png


3. SCP - 安全复制协议

  • 安全复制协议(SCP)有助于安全地将计算机文件从本地主机传输到远程主机。
  • 默认SCP端口 = 22(与SSH相同)

SCP命令

  • scp jack lpt@192.168.1.x:/home/lpt: 将本地文件“jack”安全地复制到远程服务器192.168.1.x上用户lpt的主目录/home/lpt下。

scp实际上使用的是ssh,所以你的发送端必须要有访问接受端的ssh权限。这里就不截图了。


Linux 网络管理

1. 静态 IP vs. DHCP

  • IP 是互联网协议的缩写,分配给您的计算机以便访问网络。私有 IP 用于内网通信,公有 IP 用于互联网/外网通信。
  • 静态 IP: 地址不会改变。
  • 动态 IP: 系统重启后地址会改变。

2. 操作系统网络组件

  • 网络接口
  • MAC 地址
  • 子网掩码
  • 网关
  • DNS (域名系统)

3. NetworkManager 入门

  • NetworkManager 是一项服务和一组工具,旨在简化 Linux 系统上的网络配置管理,是 RHEL 8 上的默认网络管理服务。
  • 它使网络管理更容易。
  • 它为用户提供了简单的连接设置。
  • NetworkManager 通过不同的工具提供管理,例如 GUI、nmtui 和 nmcli。

4. 网络配置方法

  • nmcli: NetworkManager 命令行界面的缩写。当图形环境不可用时,此工具很有用,也可以在脚本中使用以进行网络配置更改。
    VirtualBoxVM_BYqsZF83PH.png
  • nmtui: NetworkManager 文本用户界面的缩写。该工具可以在任何终端窗口中运行,并允许通过菜单选择和输入数据进行更改。
  • nm-connection-editor: 一个完整的图形管理工具,提供对大多数 NetworkManager 配置选项的访问。只能通过桌面或控制台访问。
    VirtualBoxVM_RXVjnuTjYe.png
  • GNOME 设置: GNOME 桌面设置应用程序的网络屏幕允许执行基本的网络管理任务。
    gnome-control-center
    VirtualBoxVM_ReOmgUE50u.png

5. 网络文件和基本命令

文件:

  • /etc/NetworkManager/system-connections/
    VirtualBoxVM_eV442ZqdqZ.png
  • /etc/hosts
    VirtualBoxVM_QcRSakWw8P.png
    跟踪ip->主机名。
  • /etc/hostname
    如果你需要修改你的主机名,你只需要把你的名字写入这里,之后重启NetworkManager。
  • /etc/resolv.conf
    VirtualBoxVM_hAvXNY1pVE.png
    这里是保存你使用的DNS服务器信息的文件。当你需要域名解析的时候,系统就会访问这个文件查询你使用的DNS服务器,从而向该地址发动DNS请求。
  • /etc/nsswitch.conf
    VirtualBoxVM_pQHoDxZ8Z9.png
    这里展示了系统对于这些需求的使用方案,比如networks这里,会先考虑files然后才是dns。注意看上面的注释里面写到,请你不要手动修改这个文件。

命令:

  • ping
    • 解释: 用于测试网络连接性,向目标主机发送 ICMP 回显请求,并等待回显回复。
    • 示例: ping google.comping 8.8.8.8
  • ifconfigip addr
    • 解释: ifconfig (较旧) 和 ip addr (较新,推荐) 用于显示和配置网络接口信息,如 IP 地址、MAC 地址等。
    • 示例: ip addr showifconfig -a
      VirtualBoxVM_5OlYxeDG26.png
  • ifupifdown
    • 解释: 用于激活 (ifup) 或禁用 (ifdown) 网络接口。通常与 /etc/sysconfig/network-scripts 中的配置文件一起使用。
    • 示例: ifup eth0 (激活 eth0 接口)
  • netstat
    • 解释: 显示网络连接、路由表、接口统计等信息。
    • 示例: netstat -tuln (显示所有 TCP 和 UDP 监听端口)
    • netstat -rnv显示网关信息。
      VirtualBoxVM_DT62ideXQV.png
      查看网关信息
  • traceroute
    • 解释: 跟踪数据包从本地主机到目标主机的路径,显示每个跳的延迟。
    • 示例: traceroute google.com
  • tcpdump
    • 解释: 强大的网络抓包工具,用于捕获和分析网络数据包。
    • 示例: tcpdump -i eth0 host 192.168.1.1 (捕获 eth0 接口上与 192.168.1.1 相关的数据包)
  • nslookupdig
    • 解释: 用于查询 DNS (域名系统) 服务器,解析域名到 IP 地址,或反之。dig 功能更强大。
    • 示例: nslookup google.comdig google.com
      VirtualBoxVM_XZPIo2ioIR.png
  • ethtool
    • 解释: 用于查询和控制以太网卡的驱动程序和硬件设置。
    • 示例: ethtool eth0 (显示 eth0 接口的详细信息)
      VirtualBoxVM_Vp04fHDiRI.png

6. 尝试使用 nmcli 配置网络

这里我们就不给示范了,因为这里写的示例ip对于你来说并不是通用的,而且你也不知道这个/24是什么意思,你只需要这个位置是你需要改且能改的ip地址。你了解一下下文在干什么就可以了。

使用 nmcli 配置静态 IP

  • nmcli device: 获取网络接口列表。
  • nmcli connection modify enp0s3 ipv4.addresses 10.253.1.211/24: 修改 enp0s3 连接的 IPv4 地址和子网掩码。
  • nmcli connection modify enp0s3 ipv4.gateway 10.253.1.1: 修改 enp0s3 连接的 IPv4 网关。
  • nmcli connection modify enp0s3 ipv4.method manual: 将 enp0s3 连接的 IPv4 配置方法设置为手动。
  • nmcli connection modify enp0s3 ipv4.dns 8.8.8.8: 修改 enp0s3 连接的 IPv4 DNS 服务器。
  • nmcli connection down enp0s3 && nmcli connection up enp0s3: 重新启动 enp0s3 连接以应用更改。
  • ip address show enp0s3: 显示 enp0s3 接口的 IP 地址信息。

使用 nmcli 添加辅助静态 IP

  • nmcli device status: 查看设备状态。
  • nmcli connection show --active: 显示活动的连接。
  • ifconfig: 显示网络接口信息 (也可以使用 ip addr)。
  • nmcli connection modify enp0s3 +ipv4.addresses 10.0.0.211/24: 为 enp0s3 连接添加一个辅助 IPv4 地址。
  • nmcli connection reload: 重新加载连接配置。
  • systemctl reboot: 重启系统以使更改生效。
  • ip address show: 显示所有接口的 IP 地址信息。

题外话

对于测试网络而言,第六节的所有命令都是常用且有用的。但是如果你没有网络的基础理解起来会很费劲。比如什么是DNS?DHCP是什么?IP/TCP/UDP又都是什么?内网和外网说的又是什么?那个/24变长子网掩码又是什么意思?这些都是属于网络的知识了。作为一个linux管理员,你必须要了解基础的网络知识,而上面说的这一点点都是最基础的最冰山一角的了。或许以后再做一个网络的笔记吧。

Linux 日志监控与时间同步

1. 日志监控 (Log Monitoring)

  • 目的: 系统管理中非常重要的一部分,用于分析系统事件和故障排除。
  • 日志目录: /var/log
  • 常见日志文件/目录:
    • boot: 系统启动日志
    • chronyd: NTP (Network Time Protocol) 服务日志
    • cron: 计划任务日志
    • maillog: 邮件服务日志
    • secure: 安全相关日志 (如认证失败)
    • messages: 核心系统日志
    • httpd: Web 服务器 (Apache) 日志

VirtualBoxVM_jsOwGTYJhf.png

VirtualBoxVM_DA5KNbi58H.png

对于那些root所有权的文件,我们作为一个普通用户是无权的。需要提权之后才能查看。
(当然有一部分并不是不能看,还记得我们的文件权限吗?那些最后对于所有人开放r权限的就可以看。)

切换到root用户后,我们尝试来看一个日志。

VirtualBoxVM_kuvzsNnH8H.png

现在看的这个是boot.log,是启动日志。你的每一次开机新产生的启动日志都会覆盖这个文件。

对于这些日志具体有什么内容,请你自行学习。作为一个合格的管理员,你应该要知道出现什么样的问题需要看哪一个日志。


2. 维护精确时间 (Maintaining Accurate Time)

  • 重要性:
    • 对于跨多个系统的日志文件分析至关重要。
    • 是生产环境中敏感应用程序 (如数据库) 的要求。
  • NTP (Network Time Protocol):
    • 机器与 NTP 服务器同步时间的标准方式。
    • NTP 服务器是专门的机器/计算机,响应客户端的时间同步请求。
  • chronyd:
    • 在较新的 Linux 版本中用于时间同步的 NTP 服务。

2.1. 时间管理相关命令

  • 显示系统时间/日期:
    1
    date
  • 时间/日期和 NTP 设置命令: timedatectl
    • 获取帮助:
      1
      timedatectl --help
    • 查看时区列表:
      1
      timedatectl list-timezones
    • 设置时区:
      1
      timedatectl set-timezone America/New_York
    • 设置时间 (HH:MM:SS):
      1
      timedatectl set-time HH:MM:SS
    • 设置时间与日期 (YYYY-MM-DD HH:MM:SS):
      1
      2
      timedatectl set-time 'YYYY-MM-DD HH:MM:SS'
      # 示例: timedatectl set-time '2021-08-18 20:15:50'
    • 启用 NTP 同步:
      1
      timedatectl set-ntp true

VirtualBoxVM_kzrc58cNQp.png

2.2. chronyd 详情

  • 目的: 时间同步
  • 包名: chronyd
  • 配置文件: /etc/chrony.conf
  • 日志文件: /var/log/chrony
  • 服务管理:
    1
    systemctl start/restart chronyd
  • 程序命令: chronyc

VirtualBoxVM_0fBDrctMqs.png

如果你没有chronyd,请运行yum install chrony.

VirtualBoxVM_mTxlrJbiq0.png

VirtualBoxVM_56qInuPznr.png

使用chronyc进入程序,你可以使用help来查看所支持的命令:

VirtualBoxVM_0nXkuDhQUc.png

这里给了一个使用示范,我使用sources查看正在使用的。

VirtualBoxVM_QwqPhB9EeR.png

最后题外话:

RHEL 7 (Red Hat Enterprise Linux 7) 和 CentOS 7 开始,Red Hat 就已经将默认的 NTP 客户端从 ntpd 换成了 chrony

  • chrony (即 chronyd 服务) 被证实同步速度更快资源占用更低
  • 它对虚拟机(VM)和网络连接不稳定的设备(比如笔记本电脑)支持得更好。

因此,在你现在使用的大多数现代 RHEL/CentOS/Rocky Linux/AlmaLinux 系统上:

  1. ntpd 服务(来自 ntp 软件包)默认不再安装
  2. chronyd 服务(来自 chrony 软件包)是默认安装并启用的

如果你想查看时间同步服务,你应该检查 chrony 的状态:

1
systemctl status chronyd

如果你确实特别需要使用 ntpd,你仍然可以手动安装它(比如 sudo yum install ntp),但在安装前你必须先停止并禁用 chrony,因为它们会占用相同的端口(UDP 123)而产生冲突。

不过,除非有特殊的老旧应用需求,否则强烈推荐使用现代的 chrony

Troubleshoot: 修改sshd端口号后重启服务报错255

VirtualBoxVM_wYe3UkV9yU.png

把端口从 22 改成了 22222。在 RHEL 10 这样的系统上,最常见的原因是 SELinux 策略 阻止了 sshd 绑定到非标准的端口(默认只允许 22)。

journalctl -xeu sshd.service中也能看到bind to port 2222失败是因为Permission denied

请尝试按以下步骤解决问题:

1. 检查 SSH 配置文件语法

首先,我们来确保你的配置文件 /etc/ssh/sshd_config 没有语法错误。运行:

1
sshd -t
  • 如果这条命令没有任何输出,说明语法正确。
  • 如果有错误提示,请根据提示修改 /etc/ssh/sshd_config 文件中的错误。

更新 SELinux 策略

如果语法正确,那么几乎可以肯定是 SELinux 问题。你需要告诉 SELinux 允许 sshd 使用 22222 端口。

a. 使用semanage添加新的端口策略
运行以下命令,将 22222 端口的 SELinux 上下文标记为 ssh_port_t 类型:

1
sudo semanage port -a -t ssh_port_t -p tcp 22222
  • -a 是添加 (add)
  • -t 是类型 (type)
  • -p 是协议 (protocol)

3. 重新启动 sshd 服务

更新 SELinux 策略后,再次尝试启动 sshd

1
sudo systemctl restart sshd

然后马上检查它的状态:

1
sudo systemctl status sshd

如果 Active: 行显示 active (running),那么恭喜你,问题解决了!

VirtualBoxVM_XGvE3P2U58.png


⚠️ 重要提醒:更新防火墙

在你确认 sshd 服务成功运行后,千万别忘了firewalld 防火墙上放行你的新端口 22222,否则你将无法从外部连接到这台机器:

1
2
3
4
5
# 永久添加 22222/tcp 端口到防火墙规则
sudo firewall-cmd --permanent --add-port=22222/tcp

# 重新加载防火墙规则使之生效
sudo firewall-cmd --reload

VirtualBoxVM_wXgQWSylXx.png

Linux 配置和保护 SSH

1. SSH 基础

  • SSH (Secure Shell): 一种安全的网络协议,用于在不安全的网络上安全地操作网络服务。
  • 功能: 提供了一个与 Linux 系统交互的加密命令行界面,接收你的命令并将其传输给内核以管理硬件。
  • 相关组件:
    • 软件包: OpenSSH
    • 服务守护进程: sshd
    • 默认端口: 22

2. 增强 SSH 安全性的配置

尽管 SSH 本身是安全的(通信全程加密),但管理员应采取额外措施来进一步加固 SSH 服务。

2.1. 配置空闲超时

  • 目的: 自动断开长时间处于空闲状态的 SSH 会话,防止未经授权的访问。
  • 操作步骤:
    1. root 用户身份编辑 /etc/ssh/sshd_config 文件。
    2. 添加或修改以下两行:
      1
      2
      3
      4
      # 设置客户端存活探测间隔为600秒(10分钟)
      ClientAliveInterval 600
      # 设置在断开连接前,客户端可以无响应的次数为0
      ClientAliveCountMax 0
    3. 重启 SSH 服务以应用更改:
      1
      # systemctl restart sshd
  • 注解: ClientAliveInterval 设置了服务器向客户端发送“空消息”以检查其是否仍然连接的时间间隔(以秒为单位)。如果客户端在 ClientAliveInterval * ClientAliveCountMax 秒内没有响应,连接将被关闭。

VirtualBoxVM_gL32R7dcAX.png
在进行修改配置文件之前,强烈建议你先使用cp命令进行备份,这样一旦出了问题你还能还原。

之后我们使用vi来编辑这个配置文件,使用g直达文件末尾,之后o另起新行并且开始插入以下内容:

VirtualBoxVM_so4Ria1KdI.png

最后保存并退出,重启服务。

VirtualBoxVM_JWcYOh3Lru.png

2.2. 禁用 root 用户登录

  • 目的: 阻止直接使用 root 账户进行远程登录,这是系统安全的基本最佳实践之一。
  • 操作步骤:
    1. 编辑 /etc/ssh/sshd_config 文件。
    2. PermitRootLogin yes 修改为 no
      1
      PermitRootLogin no
    3. 重启 sshd 服务。
  • 注解: 禁用 root 登录后,管理员应使用普通用户登录,然后使用 susudo 命令提权至 root,这增加了系统的可审计性。

VirtualBoxVM_AYumCBpnou.png

默认是prohibit-password,我们修改成no。
VirtualBoxVM_ICcbKG8eGm.png

保存并退出,别忘了重启服务。

2.3. 禁止空密码登录

  • 目的: 增加安全性,防止配置了空密码的账户通过远程 SSH 登录。
  • 操作步骤:
    1. 编辑 /etc/ssh/sshd_config 文件。
    2. 找到并确保以下行的设置为 no(如果被注释,请取消注释):
      1
      PermitEmptyPasswords no
    3. 重启 sshd 服务。

VirtualBoxVM_Ih5Q55OTF9.png

取消注释,保存并退出。

VirtualBoxVM_CdKSGCG3MJ.png

别忘了重启服务。

2.4. 限制特定用户的 SSH 访问

  • 目的: 作为额外的安全层,只允许授权用户列表中的用户进行 SSH 登录。
  • 操作步骤:
    1. 编辑 /etc/ssh/sshd_config 文件。
    2. 添加 AllowUsers 指令,后面跟上允许登录的用户名列表:
      1
      AllowUsers user1 user2
    3. 重启 sshd 服务。

VirtualBoxVM_qmo30mTynt.png

2.5. 更改默认 SSH 端口

  • 目的: 默认的 22 端口是自动化攻击的常见目标。更改端口可以减少被扫描和攻击的风险。
  • 操作步骤:
    1. 编辑 /etc/ssh/sshd_config 文件。
    2. 找到 #Port 22 这一行,取消注释并修改为新的端口号(例如 2222):
      1
      Port 2222
    3. 重启 sshd 服务。
  • 注解: 更改端口后,连接时需要明确指定新端口,例如 ssh user@hostname -p 2222。同时,需要确保新的端口在防火墙(如 firewalld)和 SELinux 策略中是允许的。

VirtualBoxVM_6BfpjJCZt3.png


3. 使用 SSH 密钥实现无密码认证

  • 目的: 提高安全性和便利性,尤其适用于自动化脚本和频繁登录的场景。
  • 工作原理: 使用公钥/私钥对进行身份验证,而不是传统的密码。
  • 操作步骤:
    1. 在客户端生成密钥对:
      1
      # ssh-keygen
      这会在 ~/.ssh/ 目录下创建 id_rsa (私钥) 和 id_rsa.pub (公钥)。
    2. 将公钥复制到服务器:
      1
      # ssh-copy-id <user>@<server_ip>
      此命令会将客户端的公钥追加到服务器上 ~/.ssh/authorized_keys 文件中。
    3. 无密码登录: 完成以上步骤后,从客户端 SSH 到服务器将不再需要输入密码。
      1
      # ssh <user>@<server_ip>

这里我们就不做示范了。如果你有这个需求的话你是自己一定会实操一次的。我曾经也做过这样的事情,在我之前的一篇ssh文章里。不过那篇文章的图床全部挂掉了,有一些可惜。

这里最后简单介绍一下公私钥是什么:

  • 公钥 (Public Key): 可以公开分享给任何人。它用于加密数据或验证数字签名。
  • 私钥 (Private Key): 必须严格保密,只能由所有者持有。它用于解密公钥加密的数据或创建数字签名。

非对称加密 (Asymmetric Encryption):

  • 原理: 非对称加密使用一对密钥,即公钥和私钥。公钥用于加密数据,私钥用于解密数据;反之,私钥也可以用于签名,公钥用于验证签名。
  • 公钥加密,私钥解密: 当A想向B发送加密信息时,A使用B的公钥加密信息,然后发送给B。B收到信息后,使用自己的私钥解密。由于只有B拥有其私钥,因此只有B能解密该信息,确保了信息的机密性。
  • 私钥签名,公钥验证: 当A想证明信息确实由自己发出时,A使用自己的私钥对信息进行签名。B收到信息和签名后,使用A的公钥验证签名的有效性。如果验证成功,则证明信息确实由A发出,且未被篡改,确保了信息的完整性和不可否认性。
  • 与公私钥的关系: 公钥和私钥是非对称加密技术的核心组成部分。它们成对生成,数学上相关联,但无法从其中一个推导出另一个。这种机制使得在不安全通道上进行安全通信成为可能。

Linux 服务与守护进程控制

1. 服务与守护进程基础

  • 服务 (Service)应用程序 (Application) 在启动后会创建进程。当这些进程在后台持续运行时,它们就变成了 守护进程 (Daemon)
  • 大多数服务都是守护进程。
  • 服务由 systemctl 命令控制。
  • systemctl 是一个 systemd 工具,负责控制 systemd 系统和服务管理器。
  • systemd 是一系列系统管理守护进程、工具和库的集合,它取代了 System V init 守护进程。
  • systemd 是大多数守护进程的父进程。
  • 控制服务的命令是 systemctl

2. systemctl 命令详解与使用场景

  • 检查系统是否安装了 systemd:

    1
    systemctl --version

    VirtualBoxVM_CrBKqMAkpw.png

  • 检查 systemd 是否正在运行:

    1
    ps -ef | grep system

    VirtualBoxVM_RNswmKmk94.png

  • 检查所有正在运行的服务:

    1
    systemctl --all

    列出所有 systemd 单元,包括非活动状态的。
    VirtualBoxVM_VcBiaiBH6u.png

  • 管理服务状态 (status|start|stop|restart):

    1
    systemctl status|start|stop|restart application.service
    • status: 查看服务详细状态和日志。
    • start: 启动已停止的服务。
    • stop: 停止正在运行的服务。
    • restart: 重启服务,常用于配置更新后。

    比如我们尝试一下查看firewalld服务:
    VirtualBoxVM_VBCgftyiKu.png
    你在这里可以看到服务的状态,服务的路径等等信息。

    VirtualBoxVM_BrAi99nD5r.png

    这里我们尝试用systemctl stop杀掉这个服务尝试一下。

    VirtualBoxVM_too14Rx5eu.png

    这里使用ps命令发现这里没有什么信息了。

    VirtualBoxVM_nTRFg6ryiG.png

    再尝试用system start重启这个服务。

    有的时候你可能更改了某些配置,你想重启该服务获取新的状态,你就可以使用systemctl restart来实现。

    停止服务的最好方法就是使用systemctl stop,而不是kill。你可以使用kill之后使用systemctl status来观察和使用systemctl stop的区别在哪里。

  • 重新加载服务的配置:

    1
    systemctl reload application.service

    在不中断服务的情况下应用新的配置。
    重新加载不会影响你的服务,而停止和启动是会影响的。如果你在配置的时候停止一个服务,那服务在停止的时候就会失效。但是如果你更改配置文件并使用reload,他会将配置文件重新加载到systemctl,而无需停止和启动应用程序。

  • 设置服务开机自启 (enable|disable):

    1
    systemctl enable|disable application.service
    • enable: 配置服务在系统启动时自动启动。
    • disable: 阻止服务在系统启动时自动启动。
  • 彻底禁用服务 (mask|unmask):

    1
    systemctl mask|unmask application.service
    • mask: 强制禁用服务,防止其被任何方式启动。
    • unmask: 解除服务的强制禁用状态。

Linux 进程管理与资源监控

1. 基本概念:进程与作业 (Processes and Jobs)

在计算中,我们经常遇到与“进程”和“作业”相关的几个核心概念。下图总结了这些关键术语,它们是理解操作系统如何管理程序执行的基础:

  • 应用程序 (Application) = 服务 (Service): 应用程序可以作为服务在后台运行。
  • 脚本 (Script): 由解释器执行的一系列命令。
  • 进程 (Process): 正在执行的程序的实例。
  • 守护进程 (Daemon): 在后台运行以执行特定任务的特殊进程。
  • 线程 (Threads): 进程内的执行单元。
  • 作业 (Job): 由shell管理的一组进程。

2. 监控和管理进程

当操作系统启动时,许多程序会加载到系统内存中。这些进程或程序需要被管理和监控,因为它们主要消耗三种系统资源:CPU、内存和磁盘空间。

以下是一些常用的管理系统资源的监控命令。


3. 系统资源监控命令

3.1. 磁盘空间 (df, du)

df (disk free)

显示文件系统的磁盘空间使用情况。

VirtualBoxVM_PuiHdwUw0L.png

建议你使用-h选项,获得更方便阅读的结果。

VirtualBoxVM_JJMn5j5Owq.png

此外-T选项也很重要。这个结果向你展示了文件系统的类型(Type)。

  • xfs

    • 这是一种高性能的日志文件系统 (Journaling File System)
    • “日志”意味着它会记录即将对磁盘进行的更改,如果系统意外崩溃(比如断电),它能很快恢复数据一致性,而不需要长时间扫描整个磁盘。
    • xfs 这种类型的文件系统是持久化的,意味着它存储在你的物理硬盘上,关机后数据不会丢失。
    • 在你的例子中,你的根目录 (/)启动目录 (/boot) 都使用了 xfs
  • tmpfs (Temporary File System):

    • 这是一种临时的、基于内存的文件系统
    • 它把所有数据都存储在RAM(内存) 和/或交换空间 (swap) 中。
    • 优点:读写速度极快,因为它操作的是内存。
    • 缺点:它是易失的(Volatile),意味着系统一旦重启,tmpfs 上的所有数据都会丢失
    • 它非常适合存放那些“用完即走”的临时运行时数据。
  • devtmpfs:

    • 这是一种特殊的 tmpfs,专门用于 /dev 目录。
    • 它的任务是由内核在系统启动时动态创建和管理设备文件(比如你的硬盘 /dev/sda、终端 /dev/tty1 等)。

du (disk usage)

估算文件和目录的磁盘使用空间。

VirtualBoxVM_urfc4V40pw.png

这个命令du -k / | sort -nr | more是从根目录 (/) 开始计算所有目录的磁盘占用空间(以KB为单位),然后将结果按空间大小从大到小排序,最后把这个排好序的列表用分页器(more)显示出来,方便查看。

提示: 上面的这些 cannot access 的提示都是正常现象。它们只是告诉你在 du 扫描整个系统的过程中,有几个瞬时的 /proc 文件消失了,并且有几个属于其他用户的 FUSE 挂载点拒绝了你的访问。你可以忽略这些。

同样du命令也有-h选项。

VirtualBoxVM_n4U5YRi4Rr.png

你可以通过这个命令查看什么文件占据了很大的空间,从而对其进行管理。

3.2. 系统负载与内存 (uptime, top, free)

uptime

显示系统已经运行了多长时间,当前登录的用户数,以及系统在过去1、5、15分钟内的平均负载。

VirtualBoxVM_8z0XOpWpGp.png

top

实时显示系统中各个进程的资源占用状况,类似于 Windows 的任务管理器。

VirtualBoxVM_XFtEG4kLOO.png

top 命令输出的主要字段解释:

  • PID: 进程ID。
  • USER: 进程的所有者。
  • PR: 进程优先级。
  • NI: 进程的 nice 值。
  • VIRT: 进程使用的虚拟内存量。
  • RES: 进程使用的常驻内存量。
  • SHR: 进程使用的共享内存量。
  • S: 进程状态。
  • %CPU: 自上次更新以来进程所使用的 CPU 时间百分比。
  • %MEM: 进程所使用的物理内存百分比。
  • TIME+: 任务所使用的总 CPU 时间,单位为 1/100 秒。
  • COMMAND: 命令名称或命令行。

free

显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区。

VirtualBoxVM_n7VTVrh1MK.png

如果你想以MB为单位,只需要加上-m选项。

3.3. 网络与文件 (lsof, tcpdump, netstat)

lsof (list open files)

列出当前系统打开的文件。有些时候,当你停止了某个进程,它所正在查找的文件仍然处于被打开的状态。

tcpdump

一个强大的网络抓包工具,用于捕获和分析网络流量。

我们来简单使用一下,首先我们使用ifconfig(这是个很老的命令了,不过很多人包括我习惯于用这个,新的ubuntu等都没有预装这个老命令的包了),或者ip addr show,来检查IP地址和网卡:

VirtualBoxVM_5UGWpbaLKa.png

比如我想查看流经这个enp0s3接口的所有流量信息:

VirtualBoxVM_YuMXrt0hkl.png

netstat

显示网络连接、路由表、接口统计等网络相关信息。

注意: netstat 是一个比较旧的命令,现在你可以使用 ip -r 来获取类似的信息。

VirtualBoxVM_KX2fyJL5Sp.png


4. 进程管理 (ps, kill)

ps (process status)

显示当前系统的进程状态。

VirtualBoxVM_I0npEJEO2f.png

kill

用于向进程发送信号,通常用于终止进程。

VirtualBoxVM_YP0phAJZmi.png

VirtualBoxVM_slbVS7BkWH.png

可以看到这个top进程被杀掉了。你可以使用-9选项来强制终止进程。


5. 高级监控工具 (vmstat, iostat, iftop)

vmstat (virtual memory statistics)

报告关于虚拟内存、进程、CPU活动、I/O等的统计信息。

iostat (input/output statistics)

报告CPU统计信息和输入/输出设备的统计信息。

VirtualBoxVM_vXgm3MwZGE.png

iftop (interface top)

实时监控网络接口的流量。

在 RHEL 10 上安装 iftop

第一步:启用 codeready-builder (CRB) 仓库

EPEL 里的软件包经常需要这个仓库里的依赖。

1
sudo subscription-manager repos --enable codeready-builder-for-rhel-10-$(arch)-rpms

第二步:手动安装 EPEL 10 的 ‘release’ 包

这会告诉 dnf 工具 EPEL 仓库的地址。

1
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm

VirtualBoxVM_YzAWVhqN57.png

在安装过程中,它可能会提示导入 EPEL 的 GPG 密钥,请输入 y 并按回车键接受。

第三步:安装 iftop

现在 dnf 已经知道 EPEL 仓库了,您可以直接安装 iftop

1
sudo dnf install iftop

VirtualBoxVM_E69t7ksoQc.png

安装完成后,你就可以使用 iftop 命令了。

VirtualBoxVM_FaDKDSrmZv.png

Linux 文件权限与所有权

文件权限

在 UNIX 和 Linux 系统中,文件和目录的访问权限是系统安全的基础。

权限类型

每个文件和目录都有三种基本权限:

  • r (Read - 读取):
    • 对于文件:可以查看文件内容。
    • 对于目录:可以列出目录中的文件和子目录。
  • w (Write - 写入):
    • 对于文件:可以修改文件内容。
    • 对于目录:可以在目录中创建、删除或重命名文件。
  • x (Execute - 执行):
    • 对于文件:可以将文件作为程序执行。
    • 对于目录:可以进入该目录(例如,使用 cd 命令)。

权限级别

这三种权限分别应用于三个不同的级别:

  • u (User - 用户): 文件的所有者。
  • g (Group - 组): 拥有该文件的用户组。
  • o (Others - 其他): 系统上的所有其他用户。

查看权限

使用 ls -l 命令可以查看文件和目录的详细信息,包括其权限。

VirtualBoxVM_HwRsK09O7B.png

权限字符串(例如 -rwxr-xr--)的第一位表示文件类型(- 表示普通文件,d 表示目录)。接下来的九位分为三组,分别代表所有者、所属组和其他用户的权限。

示例分析 (-rw-r--r--):

  • 所有者 (rw-): 可以读取和写入,但不能执行。
  • 所属组 (r--): 只能读取。
  • 其他用户 (r--): 只能读取。

修改权限 (chmod)

chmod 命令用于修改文件或目录的权限。

使用方法:

可以使用符号模式(u, g, o, a (all) 和 +, -, =)来添加、删除或设置权限。

VirtualBoxVM_6rP9k0Ad3h.png

示例:

  • 为所属组添加写入权限:
    1
    chmod g+w error.log

VirtualBoxVM_UY52ik3ttn.png

VirtualBoxVM_JwZyceXRcl.png


文件所有权

所有权概念

  • 用户 (User): 文件或目录的创建者,即所有者。
  • 组 (Group): 一个用户组,可以共享文件访问权限。

修改所有权

chown 命令

chown 命令用于更改文件或目录的所有者和/或所属组。

使用方法:

1
chown [选项] 新所有者[:新组] 文件或目录

示例:

  • file.txt 的所有者更改为 user1:
    1
    chown user1 file.txt
  • 同时更改所有者和所属组:
    1
    chown user1:group1 file.txt

chgrp 命令

chgrp 命令仅用于更改文件或目录的所属组。

使用方法:

1
chgrp [选项] 新组 文件或目录

示例:

  • file.txt 的所属组更改为 group1:
    1
    chgrp group1 file.txt

递归更改 (-R)

-R 选项可以递归地更改目录及其所有内容的所 有权。

示例:

  • 递归地将 /data 目录的所有权赋予 user1:
    1
    chown -R user1 /data

Linux 用户管理和权限

引言

在管理Linux系统时,尤其是在需要批量创建和管理用户账户的场景下,手动为每个用户进行繁琐的参数配置显然效率低下。为了简化这一过程并确保安全策略的一致性,Linux提供了强大的配置文件和命令来帮助我们集中管理用户策略和权限。本文将重点介绍如何通过/etc/login.defs文件、chage命令以及susudo命令,高效地进行用户安全设置和权限管理。

一、 设置用户默认策略:/etc/login.defs 文件

当我们创建新用户时,系统会根据/etc/login.defs文件中的预设值来为用户配置初始属性。这个文件定义了用户账户的全局默认策略,例如密码的有效期、长度要求等。

VirtualBoxVM_SzIhON8hUd.png

login.defs 文件中的重要参数

  • PASS_MAX_DAYS 99999: 密码最长有效期(天)。
  • PASS_MIN_DAYS 0: 密码最短有效期(天)。
  • PASS_MIN_LEN 5: 密码最小长度。
  • PASS_WARN_AGE 7: 密码过期前多少天开始警告用户。

除此之外,该文件还包含了用户ID(UID)和组ID(GID)的范围等信息。了解并根据安全需求配置此文件,是实现标准化用户管理的第一步。

VirtualBoxVM_SKsdGHyAQB.png

二、 精细化用户密码策略:chage 命令

chage命令允许我们针对单个用户,精细化地修改其密码的有效期信息,覆盖/etc/login.defs中的全局设置。

chage 命令详解

语法示例:
chage [-m mindays] [-M maxdays] [-d lastday] [-I inactive] [-E expiredate] [-W warndays] user

常用参数说明:

  • -d, --lastday LAST_DAY: 密码上次更改的日期(自1970-01-01以来的天数)。
  • -m, --mindays MIN_DAYS: 密码更改之间的最短天数。
  • -M, --maxdays MAX_DAYS: 密码的最长有效期(天)。
  • -W, --warndays WARN_DAYS: 密码过期前警告用户的天数。
  • -I, --inactive INACTIVE: 密码过期后账户被禁用的天数。
  • -E, --expiredate EXPIRE_DATE: 账户被禁用的绝对日期。

操作示例:
我们可以使用chage命令查看和修改特定用户的密码策略。

VirtualBoxVM_BAOKfnlfgB.png

三、 权限切换与提升:susudo

在日常管理中,我们经常需要在不同用户间切换,或者以更高的权限执行特定命令。

1. 切换用户:su 命令

su - <username>命令可以让我们切换到指定的用户,并加载该用户的环境变量(-的作用)。

  • root用户切换到任何其他用户,不需要输入密码。
  • 从普通用户切换到root或其他用户,需要输入目标用户的密码。

注意:在使用su切换到新用户前,如果该用户没有密码,root用户需要先使用passwd <username>为其设置密码。

VirtualBoxVM_fcp2asq46q.png

2. 提升命令权限:sudo 命令

sudo命令允许普通用户以超级用户(root)的权限执行特定的、经过授权的命令,而无需知道root用户的密码。这是一种更安全、更可控的权限管理方式。

VirtualBoxVM_CpJYblRhZB.png

配置 sudo 权限

要让一个用户能够使用sudo,必须在/etc/sudoers文件中进行配置。强烈建议使用visudo命令来编辑此文件,因为它会在保存时检查语法错误,防止配置错误导致系统无法使用sudo

我们切换到root用户,执行visudo

VirtualBoxVM_jqgS8JZFnb.png

有两种常见的方式为用户授予sudo权限:

方法一:直接在sudoers文件中添加用户

在文件中添加如下格式的行:
username ALL=(ALL) ALL

VirtualBoxVM_6HFNqO3JKO.png

方法二:将用户添加到wheel组(推荐)

在很多Linux发行版中,/etc/sudoers文件默认配置允许wheel组的成员执行所有命令。

VirtualBoxVM_Xwx2TsqYAU.png

因此,我们只需将用户添加为wheel组的附加组即可,这是一种更简洁、更易于管理的方式。

1
usermod -aG wheel lpt

VirtualBoxVM_nUP7Xr6rZH.png

完成配置后,该用户就可以成功使用sudo执行命令了。

VirtualBoxVM_gIQxh4kcmj.png

总结

本文介绍了Linux中与用户账户策略和权限管理相关的几个核心工具。通过配置/etc/login.defs实现全局用户策略,使用chage命令对单个用户进行密码时效的精细化调整,以及利用susudo进行灵活的权限切换和提升。掌握这些工具,将使你的Linux系统管理工作更加高效和安全。

0%