第9章 使用 SSH 服务管理远程主机
章节简述
本章讲解了如何使用 nmtui 命令配置网络参数,以及如何通过 nmcli 命令查看网络信息并管理网络会话服务,使读者能够在不同工作场景中快速切换网络运行参数;还讲解了如何手工绑定 round-robin(轮询)模式双网卡,实现网络的负载均衡。
本章深入介绍 SSH 协议与 sshd 服务程序的理论知识、Linux 系统的远程管理方法,以及在系统中配置服务程序的方法,并通过实验演示了使用基于密码与密钥验证的 sshd 服务程序进行远程访问,以及使用 Tmux 服务程序实现 Linux 系统的不间断远程管理会话等技术。本章还详细讲解了日志系统的理论知识,并使用 journalctl 命令基于各种条件进行日志信息的检索,以快速定位工作中的故障点。
当读者掌握了本章的内容后,也就完全具备了对 Linux 系统进行配置管理的知识。后续章节中将陆续引入大量实用服务的配置内容,读者将会使用本章学习的知识进行配置。这不仅能让读者对生产环境中使用的大多数热门服务程序有广泛且深入的认识,还能掌握相应的配置方法。
9.1 配置网卡服务
为了更好从零掌握 Linux 系统中网络的配置方法,我们会依次以基本配置网卡参数、创建网络会话和绑定两块网卡来进行实操,逐步提高代码量和难度,彻底学懂网络服务。
9.1.1 配置网卡参数
截至目前,大家已经能够利用当前所学的知识来管理 Linux 系统了。当然,大家的水平完全可以更进一步,当有朝一日登顶技术巅峰时,一定会感谢现在努力学习的自己。
我们接下来将学习如何在 Linux 系统上配置服务。但是在此之前,必须先保证主机之间能够顺畅地通信。如果网络不通,即便服务部署得再正确,用户也无法顺利访问。所以,配置网络并确保网络的连通性是学习部署 Linux 服务之前最后一个重要的知识点。
4.1.3 节讲解了如何使用 Vim 文本编辑器来配置网卡参数。其实,在 RHEL 10 系统中至少有 5 种配置网络的方法,刘遄老师尽量在本书中为大家逐一演示。这里教给大家的是使用nmtui 命令来配置网络,其具体的配置步骤如图 9-1 至图 9-8 所示。当遇到不容易理解的内容时,会额外进行解释说明。
图9-1 执行nmtui命令运行网络配置工具
图9-2 选中配置网卡按钮并按下回车键
图9-3 选中要配置的网卡名称,然后按下编辑按钮
现在,在服务器主机的网络配置信息中填写 IP 地址 192.168.10.10/24。24 表示子网掩码中的前 24 位为网络号,后 8 位是主机号(与写成 255.255.255.0 的效果一样)。网关、DNS 等信息暂可不必填写,等用到时再补充。
图9-4 把网卡IPv4的配置方式改成手动模式
图9-5 按下显示详细信息按钮
Tips :
再多提一句,咱们这本《Linux 就该这么学(第 3 版)》不仅学习门槛低、简单易懂, 而且还有一个潜在的优势—书中所有的服务器主机 IP 地址均为 192.168.10.10,而客户端主机均为 192.168.10.20 及 192.168.10.30。这样的好处就是,在后面部署Linux 服务的时候,不用每次都要考虑 IP 地址变化的问题,从而可以心无旁骛地关注配 置细节。
图9-6 填写IP地址和子网掩码
图9-7 单击OK按钮保存配置
图9-8 单击Back按钮结束配置工作
至此,在 Linux 系统中配置网络的步骤就结束了。只要是 nmtui 命令配置过的网卡信息, 都会被自动写入到网卡配置文件中,不放心的话可以确认一下:
root@linuxprobe:~# cat /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
uuid=f75b55fd-2891-3f5d-ba2c-adadbcd7505c
type=ethernet
autoconnect-priority=-999
interface-name=ens160
timestamp=1741809963
[ethernet]
[ipv4]
address1=192.168.10.10/24
method=manual
[ipv6]
addr-gen-mode=eui64
method=auto
要想让服务程序获取最新的配置文件,需要手动重启相应的服务,之后就能看到网络畅通了:
root@linuxprobe:~# nmcli connection reload
root@linuxprobe:~# nmcli connection up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
root@linuxprobe:~# ping -c 4 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.110 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.196 ms
64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.086 ms
64 bytes from 192.168.10.10: icmp_seq=4 ttl=64 time=0.064 ms
--- 192.168.10.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3069ms
rtt min/avg/max/mdev = 0.064/0.114/0.196/0.050 ms
9.1.2 创建网络会话
RHEL 和 CentOS 系统默认使用 NetworkManager 来提供网络服务,这是一种动态管理网络配置的守护进程,可以让网络设备保持连接状态。可以使用nmcli 命令来管理 NetworkManager 服务程序。nmcli 是一款基于命令行的网络配置工具,功能丰富,参数众多,能够轻松地查看网络信息或网络状态:
root@linuxprobe:~# nmcli connection show
NAME UUID TYPE DEVICE
ens160 f75b55fd-2891-3f5d-ba2c-adadbcd7505c ethernet ens160
lo 1b2c44f7-af47-4291-9997-d8de6cf5fa3f loopback lo
root@linuxprobe:~# nmcli connection show ens160
connection.id: ens160
connection.uuid: f75b55fd-2891-3f5d-ba2c-adadbcd7505c
connection.stable-id: --
connection.type: 802-3-ethernet
connection.interface-name: ens160
connection.autoconnect: yes
………………省略部分输出信息………………
另外,RHEL 10 系统支持网络会话功能,允许用户在多个配置文件中快速切换(非常类似于firewalld 防火墙服务中的区域技术)。如果我们在公司网络中使用笔记本电脑时需要手动指定网络的 IP 地址,而回到家中则使用 DHCP 自动分配 IP 地址,这就需要频繁地修改IP 地址,但是使用了网络会话功能后一切就简单多了—只需在不同的使用环境中激活相应的网络会话,就可以实现网络配置信息的自动切换了。
使用 nmcli 命令并按照 connection add con-name type ifname 的格式来创建网络会话。假设将公司网络中的网络会话称为 company,将家庭网络中的网络会话称为house,现在依次创建各自的网络会话。
使用 con-name 参数指定公司使用的网络会话名称 company,然后依次用 ifname 参数指定本机的网卡名称(千万要以实际环境为准,不要照抄书上的 ens160 ),用 autoconnect no 参数将网络会话设置为默认不被自动激活,以及用 ip4 及 gw4 参数手动指定网络的 IP 地址。
root@linuxprobe:~# nmcli connection add con-name company ifname ens160 autoconnect no type ethernet ip4 192.168.10.88/24 gw4 192.168.10.1
Connection 'company' (2040b650-edf6-4709-a1a3-4956ee0ffc2e) successfully added.
使用 con-name 参数指定家庭使用的网络会话名称 house。因为要从外部 DHCP 服务器自动获得 IP 地址,所以这里不需要进行手动指定。
root@linuxprobe:~# nmcli connection add con-name house type ethernet ifname ens160
Connection 'house' (52b64b23-fb88-4248-af74-6b67f1237d60) successfully added.
在成功创建网络会话后,使用 nmcli 命令查看创建的所有网络会话。
root@linuxprobe:~# nmcli connection show
NAME UUID TYPE DEVICE
ens160 f75b55fd-2891-3f5d-ba2c-adadbcd7505c ethernet ens160
lo 1b2c44f7-af47-4291-9997-d8de6cf5fa3f loopback lo
company 2040b650-edf6-4709-a1a3-4956ee0ffc2e ethernet --
house 52b64b23-fb88-4248-af74-6b67f1237d60 ethernet --
使用 nmcli 命令配置过的网络会话是永久生效的,这样当我们上班后,顺手启动 company 网络会话,网卡信息就自动配置好了:
root@linuxprobe:~# nmcli connection up company
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
root@linuxprobe:~# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.88 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::2936:b131:9ed3:3120 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:e5:e7:33 txqueuelen 1000 (Ethernet)
RX packets 57244 bytes 4969903 (4.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 88 bytes 9242 (9.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
………………省略部分输出信息………………
如果大家使用的是虚拟机,请把虚拟机系统的网卡(网络适配器)切换成桥接模式,如图 9-9 所示。然后重启虚拟机系统即可。
图9-9 设置虚拟机网卡的模式
这样操作过后就能使用家庭中的路由器设备了。启动 house 家庭会话,看一下效果:
root@linuxprobe:~# nmcli connection up house
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
root@linuxprobe:~# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.31.191 netmask 255.255.255.0 broadcast 192.168.31.255
inet6 fe80::a689:6ecd:767e:7571 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:e5:e7:33 txqueuelen 1000 (Ethernet)
RX packets 57592 bytes 5001809 (4.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 142 bytes 15284 (14.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
………………省略部分输出信息………………
如果启用 company 会话成功,但启用 house 会话失败且不能获取到动态地址,则证明你的配置是正确的,问题出在了外部网络环境。有 3 种常见的情况:首先,你家中的设备没有连接路由器,而是通过拨号网络或共享 Wi-Fi 的方式上网;其次,还在上学或上班的读者在浏览网页前必须通过学校或公司的验证页面才能访问互联网;最后,检查物理机的防火墙设置,可暂时关闭后再重试。
后续不需要网络会话时,直接用 delete 命令就能删除,特别简单:
root@linuxprobe:~# nmcli connection delete house
Connection 'house' (52b64b23-fb88-4248-af74-6b67f1237d60) successfully deleted.
root@linuxprobe:~# nmcli connection delete company
Connection 'company' (2040b650-edf6-4709-a1a3-4956ee0ffc2e) successfully deleted.
9.1.3 绑定两块网卡
一般来讲,生产环境必须提供 7×24 小时的网络传输服务。网卡绑定技术不仅能够提高网络传输速度,更重要的是,还可以确保在其中一块网卡出现故障时,依然能正常提供网络服务。假设我们对两块网卡实施了绑定技术,这样在正常工作中它们会共同传输数据,使得网络传输的速度变得更快;而且即使有一块网卡突然出现了故障,另外一块网卡也会立即自动顶替上去,保证数据传输不会中断。
下面看一下如何绑定网卡。
在虚拟机系统中再添加一块网卡设备,请确保两块网卡都处在同一种网络连接模式中, 如图 9-10 和图 9-11 所示。处于相同模式的网卡设备才能进行网卡绑定,否则这两块网卡无法互相传送数据。
图9-10 在虚拟机中再添加一块网卡设备
图9-11 确保两块网卡处在同一个网络连接中(即网卡模式相同)
前面是使用 nmtui 命令来配置网络信息,这次我们使用 nmcli 命令来配置网卡设备的绑定参数。这样可以确保大家同时学到两个命令,而不用依赖于某个特定的命令了。网卡绑定的理论知识类似于前面学习的 RAID 磁盘组,我们需要对参与绑定的网卡设备逐个进行“初始设置”。需要注意的是,在图 9-12 中,左侧的 ens160 及 ens192 这些原本独立的网卡设备此时需要被配置成为一块“从属”网卡,服务于右侧的 bond0“主”网卡,不应该再有自己的IP 地址等信息。在进行了初始设置之后,它们就可以支持网卡绑定。
图9-12 网卡绑定信息示意图
实验前先确认网卡名称,若不是 ens160 和 ens192,大家可自行替换,以实际为准。
root@linuxprobe:~# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.10 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::20c:29ff:fee5:e733 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:e5:e7:33 txqueuelen 1000 (Ethernet)
RX packets 1319 bytes 113553 (110.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 56 bytes 5770 (5.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens192: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500
ether 00:0c:29:e5:e7:3d txqueuelen 1000 (Ethernet)
RX packets 76 bytes 6960 (6.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 50 bytes 5014 (4.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
………………省略部分输出信息………………
1.创建出一个 bond 网卡
使用nmcli 命令配置网络信息有一定的难度,所以咱们放到第 9 章才开始讲解。首先使用如下命令创建一个 bond 网卡。其中,命令与参数的意思是创建一个类型为bond(绑定)、名称为 bond0、网卡名为bond0 的绑定设备,绑定模式为 balance-rr:
root@linuxprobe:~# nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=balance-rr"
Connection 'bond0' (3fb9d014-677f-4b83-8579-d1f959905632) successfully added.
这里使用的是 balance-rr 网卡绑定模式,其中 rr 是 round-robin(轮询)的缩写。round-robin 的特点是会根据设备顺序依次传输数据包,提供负载均衡的效果,让带宽的性能得到一定提升;而且一旦某个网卡发生故障,会马上切换到另外一台网卡设备上,保证网络传输不被中断。active-backup 是另外一种比较常用的网卡绑定模式,它的特点是平时只有一块网卡正常工作,另一块网卡随时待命,一旦工作中的网卡发生损坏,待命的网卡会自动顶替上去。可见,这种网卡绑定模式的冗余能力比较强,因此也称为主备模式。
比如,有一台用于提供 NFS 或者 Samba 服务的文件服务器,它所能提供的最大网络传输速率为 100Mbit/s,但是访问该服务器的用户数量特别多,因此它的访问压力很大。在生产环境中,网络的可靠性是极为重要的,而且网络的传输速率也必须得以保证。针对这样的情况, 比较好的选择就是使用 balance-rr 网卡绑定模式了。因为 balance-rr 模式能够让两块网卡同时工作,当其中一块网卡出现故障后能自动备援,且无须交换机设备支援,从而提供了可靠的网络传输保障。
2.向 bond0 添加从属网卡
刚才创建成功的 bond0 设备当前仅仅是个名称,里面并没有真正能为用户传输数据的网卡设备,接下来使用下面的命令把 ens160 和 ens192 网卡添加进来。其中,con-name 参数后面接的是从属网卡的名称(可以随时设置);ifname 参数后面接的是两块网卡的名称。大家一定要以真实的网卡名称为准,不要直接复制这里的名字。
root@linuxprobe:~# nmcli connection add type ethernet slave-type bond con-name bond0-port1 ifname ens160 master bond0
Connection 'bond0-port1' (2976973b-34fe-4fe2-9135-91e6be5123c7) successfully added.
root@linuxprobe:~# nmcli connection add type ethernet slave-type bond con-name bond0-port2 ifname ens192 master bond0
Connection 'bond0-port2' (45036f7d-c042-49f3-8fa1-65a2671e92c9) successfully added.
3.配置bond0设备的网卡信息
配置网络参数的方法有很多,为了让这个实验的配置过程更加具有一致性,下面还是用nmcli 命令依次配置网络的 IP 地址及子网掩码、网关、DNS、搜索域和手动配置等参数。如果同学们不习惯这个命令,也可以直接编辑网卡配置文件,或使用 nmtui 命令完成下面的操作:
root@linuxprobe:~# nmcli connection modify bond0 ipv4.addresses 192.168.10.10/24
root@linuxprobe:~# nmcli connection modify bond0 ipv4.gateway 192.168.10.1
root@linuxprobe:~# nmcli connection modify bond0 ipv4.dns 192.168.10.1
root@linuxprobe:~# nmcli connection modify bond0 ipv4.dns-search linuxprobe.com
root@linuxprobe:~# nmcli connection modify bond0 ipv4.method manual
4.启动它!
接下来就是激动人心的时刻了,启动它吧!再顺便看一下设备的详细列表:
root@linuxprobe:~# nmcli connection up bond0
Connection successfully activated (controller waiting for ports) (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)
root@linuxprobe:~# nmcli device status
DEVICE TYPE STATE CONNECTION
ens160 ethernet connected ens160
ens192 ethernet connected bond0-port2
bond0 bond connecting (getting IP configuration) bond0
lo loopback connected (externally) lo
当用户接下来访问主机 IP 地址 192.168.10.10 时,主机实际上是由两块网卡在共同提供服务。可以在本地主机执行 ping 192.168.10.10 命令检查网络的连通性。为了检验网卡绑定技术的自动备援功能,突然在虚拟机硬件配置中随机移除一块网卡设备,如图 9-13 所示。
图9-13 随机移除掉任意一块网卡
可以非常清晰地看到网卡切换的过程(一般只丢失一个数据包),另外一块网卡会继续为用户提供服务。
root@linuxprobe:~# ping 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.057 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.068 ms
64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.039 ms
ping: sendmsg: Network is unreachable
64 bytes from 192.168.10.10: icmp_seq=5 ttl=64 time=0.270 ms
64 bytes from 192.168.10.10: icmp_seq=6 ttl=64 time=0.092 ms
64 bytes from 192.168.10.10: icmp_seq=7 ttl=64 time=0.082 ms
64 bytes from 192.168.10.10: icmp_seq=8 ttl=64 time=0.089 ms
^C
--- 192.168.10.10 ping statistics ---
8 packets transmitted, 7 received, 12% packet loss, time 7006ms
rtt min/avg/max/mdev = 0.042/0.073/0.109/0.023 ms
9.2 远程控制服务
作为 Linux 系统中最常用的远程控制服务程序之一,SSH 在日常运维中不可或缺。本节将通过基本参数配置、安全密钥验证配置和远程传输命令实操这 3 个实验,帮助同学们深入理解SSH 协议,熟练掌握 sshd 服务程序的操作,为今后在生产环境中的工作奠定坚实基础。
9.2.1 配置sshd服务
SSH(Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理Linux 系统的首选方式。在此之前,一般使用 Telnet 进行远程登录,但是因为它以明文的形式在网络中传输账户密码和数据信息,因此很不安全—很容易受到黑客发起的中间人攻击, 轻则篡改传输的数据信息,重则直接抓取服务器的账户密码。
想要使用 SSH 协议来远程管理 Linux 系统,则需要配置部署 sshd 服务程序。sshd 是基于SSH 协议开发的一款远程管理服务程序,不仅使用起来方便快捷,而且能够提供两种安全验证的方法:
基于密码的验证—用账户和密码来验证登录;
基于密钥的验证—需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器, 并与服务器中的公钥进行比较;该方式相较来说更安全。
前文曾多次强调“Linux 系统中的一切都是文件”,因此在 Linux 系统中修改服务程序的运行参数,实际上就是修改程序配置文件的过程。sshd 服务的配置信息保存在/etc/ssh/ sshd_config 文件中。运维人员一般会把保存着最主要配置信息的文件称为主配置文件,而配置文件中有许多以井号(#)开头的注释行,要想让这些配置参数生效,需要在修改参数后再去掉前面的井号。sshd 服务主配置文件中包含的参数以及作用如表 9-1 所示。
表 9-1 sshd 服务主配置文件中包含的参数以及作用
参数 | 作用 |
---|---|
Port 22 | 默认的 sshd 服务端口 |
ListenAddress 0.0.0.0 | 设定 sshd 服务器监听的 IP 地址 |
Protocol 2 | SSH 协议的版本号 |
HostKey /etc/ssh/ssh_host_key | SSH 协议版本为 1 时,DES 私钥存放的位置 |
HostKey /etc/ssh/ssh_host_rsa_key | SSH 协议版本为 2 时,RSA 私钥存放的位置 |
HostKey /etc/ssh/ssh_host_dsa_key | SSH 协议版本为 2 时,DSA 私钥存放的位置 |
PermitRootLogin yes | 设定是否允许 root 管理员直接登录 |
StrictModes yes | 当远程用户的私钥改变时直接拒绝连接 |
MaxAuthTries 6 | 最大密码尝试次数 |
MaxSessions 10 | 最大终端数 |
PasswordAuthentication yes | 是否允许密码验证 |
PermitEmptyPasswords no | 是否允许空密码登录(很不安全) |
接下来的实验会使用两台虚拟机,一台充当服务器,另外一台充当客户端,其 IP 地址及作用如表 9-2 所示。
表 9-2 sshd 服务实验机器的信息
主机地址 | 主机名 | 操作系统 | 作用 |
---|---|---|---|
192.168.10.10 | Server | Linux | 充当服务器 |
192.168.10.20 | Client | Linux | 充当客户端 |
在RHEL 10 系统中,默认安装并启用了 sshd 服务程序。接下来在客户端使用 ssh 命令远程连接服务器,其格式为“ssh [参数] 用户名@主机IP 地址”,要退出登录则执行 exit命令。第一次访问时需要输入 yes 来确认对方主机的指纹信息:
root@Client:~# ssh 192.168.10.10
The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established.
ED25519 key fingerprint is SHA256:0R7Kuk/yCTlJ+E4G9y9iX/A/hAklHkALm5ZUgnJ01cc.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.10.10' (ED25519) to the list of known hosts.
root@192.168.10.10's password: 此处输入服务器管理员密码
Last login: Thu Mar 13 06:56:57 2025
………………省略部分输出信息………………
root@Server:~# exit
logout
Connection to 192.168.10.10 closed.
如果一直让 root 管理员用户能够以密码方式远程登录服务器,多少让人不太放心。建议设置成仅允许密钥方式验证,这样可以大大降低被黑客暴力破解密码的概率。方法也很简单, 首先使用 Vim 文本编辑器打开服务器上的 sshd 服务主配置文件,然后把第 40 行#PermitRootLogin prohibit-password 参数前的井号(#)去掉就可以了。
要想直接彻底禁止 root 管理员远程登录服务器怎么办呢?即不论使用何种验证方式都拒绝他。那么,将第 40 行的参数值改成 no 就可以了:
root@Server:~## vim /etc/ssh/sshd_config
………………省略部分输出信息………………
39 #LoginGraceTime 2m
40 PermitRootLogin no
41 #StrictModes yes
42 #MaxAuthTries 6
43 #MaxSessions 10
………………省略部分输出信息………………
然后将安装 RHEL 10 系统时允许以 root 管理员身份登录服务器的配置参数注释掉:
root@Server:~# vim /etc/ssh/sshd_config.d/01-permitrootlogin.conf
# This file has been generated by the Anaconda Installer.
# Allow root to log in using ssh. Remove this file to opt-out.
# PermitRootLogin yes
需要再次提醒的是,一般的服务程序并不会在配置文件修改之后立即获得最新的参数。如果想让新配置文件生效,则需要手动重启相应的服务程序。最好也将这个服务程序加入开机启动项中,这样系统在下一次启动时,该服务程序便会自动运行,继续为用户提供服务。
root@Server:~# systemctl restart sshd
root@Server:~# systemctl enable sshd
这样一来,当 root 管理员再尝试访问 sshd 服务程序时,系统会提示“不可访问”的错误信息。虽然 sshd 服务程序的参数相对比较简单,但这就是在 Linux 系统中配置服务程序的正确方法。大家要做的是举一反三、活学活用,这样即便以后遇到了陌生的服务,也一样能搞定了。
root@Client:~# ssh 192.168.10.10
root@192.168.10.10's password: 此处输入服务器管理员密码
Permission denied, please try again.
为了避免后续实验中不能用root 管理员账户登录,请大家动手把上面的参数修改回来:
root@Server:~# vim /etc/ssh/sshd_config
………………省略部分输出信息………………
39 #LoginGraceTime 2m
40 PermitRootLogin yes
41 #StrictModes yes
42 #MaxAuthTries 6
43 #MaxSessions 10
………………省略部分输出信息………………
root@Server:~# systemctl restart sshd
如果想使用 Windows 系统进行访问也没问题。首先确保网络是能够通信的,随后从Xshell、PuTTY、SecureCRT、SSH Secure Shell Client 等工具中选择一个喜欢的登录工具,远程连接一下试试看,效果如图 9-14 至图 9-16 所示。
图9-14 远程登录输入账号名称
图9-15 远程登录输入账号密码
图9-16 远程登录成功界面
9.2.2 安全密钥验证
加密是对信息进行编码,将明文转换为密文的技术,它通过一定的算法(密钥)将原本能被直接阅读的明文信息转换成密文形式。密钥即是密文的钥匙,有私钥和公钥之分。在传输数据时,如果担心被他人监听或截获,就可以在传输前先使用公钥对数据加密处理,然后再进行传送。这样,只有掌握私钥的用户才能解密这段数据,除此之外的其他人即便截获了数据,一般也很难将其破译为明文信息。
一言以蔽之,在生产环境中使用密码进行验证终归存在着被暴力破解或嗅探截获的风险。如果正确配置了密钥验证方式,那么 sshd 服务程序将更加安全。下面进行具体的配置,步骤如下。
第 1 步:在客户端中生成“密钥对”,记住是客户端。
root@Client:~# ssh-keygen
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519): 按回车键或设置密钥的存储路径
Enter passphrase (empty for no passphrase): 直接按回车键或设置密钥的密码
Enter same passphrase again: 再次按回车键或设置密钥的密码
Your identification has been saved in /root/.ssh/id_ed25519
Your public key has been saved in /root/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:5EbLRQAHIY4+1uPwWsJAytg5YK1dYbAZyCvBAHhwWkc root@Client
The key's randomart image is:
+--[ED25519 256]--+
|X.++Eo++o.. |
|oBo+=... . |
|o=o+.. o . |
|B=oo. = o |
|=oO.o S |
| + * . . |
| o + |
| + |
| . |
+----[SHA256]-----+
第 2 步:把客户端中生成的公钥文件传送至远程服务器。
root@Client:~# ssh-copy-id 192.168.10.10
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.10.10's password: 此处输入服务器管理员密码
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.10.10'"
and check to make sure that only the key(s) you wanted were added.
第 3 步:对服务器进行设置,将第 65 行的参数值改成 no,使其只允许密钥验证,拒绝传统的密码验证方式。记得在修改配置文件后保存并重启 sshd 服务程序。
我们不需要也不推荐使用刚刚的 PermitRootLogin prohibit-password 参数,原因主要有两个:其一,该参数只对 root 管理员身份有效,无法限制其他用户使用密码登录服务器;其二,Linux 系统会在接收用户输入的密码值后直接丢弃,虽然效果是一样的(即不能登录服务器),但是用户无法判断是被拒绝了,还是密码输错了,容易产生误会。
root@Server:~# vim /etc/ssh/sshd_config
………………省略部分输出信息………………
64 # To disable tunneled clear text passwords, change to no here!
65 PasswordAuthentication no
66 #PermitEmptyPasswords no
………………省略部分输出信息………………
root@Server:~# systemctl restart sshd
第 4 步:客户端尝试登录到服务器,此时无须输入密码也可成功登录,特别方便。
root@Client:~# ssh 192.168.10.10
………………省略部分输出信息………………
Last login: Fri Mar 21 23:11:10 2025 from 192.168.10.1
root@Server:~#
但是,如果用户没有密钥信息,即便有密码也会被拒绝,系统甚至不会给用户输入密码的机会,如图 9-17 所示。
图9-17 无密钥访问远程服务器被拒
9.2.3 远程传输命令
不知道读者有没有考虑一个问题:既然 SSH 协议可以让用户远程控制服务器、传输命令信息,那么是不是也能传输文件呢?
scp(secure copy)是一个基于 SSH 协议在网络之间进行安全传输的命令,其格式为“scp [参数] 本地文件 远程账户@远程IP 地址:远程目录”。
与第 2 章讲解的 cp 命令不同,cp 命令只能在本地磁盘中进行文件复制,而 scp 不仅能够通过网络传送数据,而且所有的数据都将进行加密处理。例如,如果想把一些文件通过网络从一台主机传递到另外一台主机,这两台主机又恰巧都是 Linux 系统,这时使用 scp 命令就可以轻松完成文件的传递了。scp 命令中可用的参数以及作用如表 9-3 所示。
表 9-3 scp 命令中可用的参数以及作用
参数 | 作用 |
---|---|
-v | 显示详细的连接进度 |
-P | 指定远程主机的 sshd 端口号 |
-r | 用于传送文件夹 |
-6 | 使用 IPv6 协议 |
在使用 scp 命令把文件从本地复制到远程主机时,首先需要以绝对路径的形式写清本地文件的存放位置。如果要传送整个文件夹内的所有数据,还需要额外添加参数-r 进行递归操作。然后写上要传送到的远程主机的 IP 地址,远程主机便会要求进行身份验证了。当前用户名称为 root,而密码则为远程主机的密码。如果想使用指定用户的身份进行验证,可使用“用户名@主机地址”的参数格式。最后需要在远程主机的 IP 地址后面添加冒号,并在后面写上要传送到远程主机的哪个文件夹中。只要参数正确并且成功验证了用户身份,即可开始传送工作。由于 scp 命令是基于 SSH 协议进行文件传送的,而 9.2.2 节又设置好了密钥验证,因此当前在传输文件时,并不需要账户和密码。
root@Client:~# echo "Welcome to LinuxProbe.Com" > readme.txt
root@Client:~# scp /root/readme.txt 192.168.10.10:/home
readme.txt 100% 26 20.1KB/s 00:00
此外,还可以使用 scp 命令把远程主机上的文件下载到本地主机,其命令格式为“scp [参数] 远程用户@远程 IP 地址:远程文件 本地目录”。这样就无须先登录远程主机再进行文件传送了,也就省去了很多周折。例如,把远程主机的系统版本信息文件下载过来。
root@Client:~# scp 192.168.10.10:/etc/redhat-release /root
redhat-release 100% 54 22.7KB/s 00:00
root@Client:~# cat redhat-release
Red Hat Enterprise Linux release 10.0
9.3 不间断会话服务
大家在学习 sshd 服务时,不知有没有注意到这样一个事情:当与远程主机的会话被关闭时,在远程主机上运行的命令也随之中断。
如果正在使用命令来打包文件,或者正在使用脚本安装某个服务程序,中途是绝对不能关闭在本地打开的终端窗口或断开网络连接的,甚至连网速的波动都有可能导致任务中断。一旦中断,只能重新进行远程连接并重新开始任务。有些时候,我们正在执行文件打包操作, 同时又想用脚本来安装某个服务程序,这时会因为打包操作的输出信息占满用户的屏幕界面, 而只能再打开一个执行远程会话的终端窗口。时间久了,难免会忘记这些打开的终端窗口是做什么用的。
Terminal Multiplexer(终端复用器,简称为 Tmux)是一款能够实现多窗口远程控制的开源服务程序。简单来说,它是为了解决网络异常中断或同时控制多个远程终端窗口而 设计的程序。用户还可以使用 Tmux 服务程序同时在多个远程会话中自由切换,并实现如下功能。
会话恢复:即便网络中断,也可让会话随时恢复,确保用户不会失去对远程会话的控制。
多窗口:每个会话都是独立运行的,拥有各自独立的输入输出终端窗口,终端窗口状态可被保留,下次重新连接后可恢复窗口状态和内容。
会话共享:当多个用户同时登录远程服务器时,可以使用会话共享功能来共享用户之间的输入输出信息。
在RHEL 10 系统中,默认没有安装 Tmux 服务程序,因此需要配置软件仓库来安装它。配置软件仓库的步骤请见 8.3.2 节,BaseOS 和 AppStream 都要配置,这里直接开始安装Tmux。
root@linuxprobe:~# dnf install tmux
Updating Subscription Management repositories.
BaseOS 2.7 MB/s | 2.7 kB 00:00
AppStream 2.7 MB/s | 2.8 kB 00:00
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
tmux x86_64 3.3a-10.20230918gitb202a2f.el10 BaseOS 518 k
Transaction Summary
================================================================================
Install 1 Package
Total size: 518 k
Installed size: 1.2 M
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : tmux-3.3a-10.20230918gitb202a2f.el10.x86_64 1/1
Running scriptlet: tmux-3.3a-10.20230918gitb202a2f.el10.x86_64 1/1
Installed products updated.
Installed:
tmux-3.3a-10.20230918gitb202a2f.el10.x86_64
Complete!
Tips :
简洁起见,刘遄老师将对后面章节中出现的软件安装信息进行过滤—把重复性高及无意义的非必要信息省略。
9.3.1 管理远程会话
Tmux 服务能做的事情非常多,例如创建不间断会话、恢复离线工作、将界面切分为不同的窗格、共享会话等。下面直接敲击 tmux 命令进入会话窗口中,如图 9-18 所示。
图9-18 Tmux服务程序会话界面
不难发现,会话窗口的底部出现了一条绿色的状态栏,里面分别显示的是会话编号、名称、主机名及系统时间。
退出会话窗口的命令是 exit,敲击后即可返回到正常的终端界面,如图 9-19 所示。
图9-19 从会话窗口退回到终端界面
会话窗口的编号从 0 开始自动排序(即 0、1、2、3、……),会话窗口数量少的时候还没关系,数量多的时候区分起来就很麻烦了。接下来创建一个指定名称为 backup 的会话窗口。请各位读者留心观察,当在命令行中敲下下面这条命令的一瞬间,屏幕会快速闪动一下, 这时就已经进入 Tmux 会话中了,在里面执行的任何操作都会被后台记录下来。
root@linuxprobe:~# tmux new -s backup
假设我们突然要去忙其他事情,但会话窗口中执行的进程还不能被中断,此时便可以 用 detach 参数将会话隐藏到后台。虽然看起来与刚才没有不同,但实际上当前的会话还在工作中:
root@linuxprobe:~# tmux detach
[detached (from session backup)]
如果觉得每次输入 detach 参数都很麻烦,则直接如图 9-20 所示关闭中断窗口(这与进行远程连接时突然断网具有相同的效果),Tmux 服务程序会自动帮我们进行保存。
图9-20 强行关闭会话窗口
这样操作之后,服务和进程都会一直在后台默默运行,不会因为窗口被关闭而造成数据丢失。不放心的话可以查看一下后台有哪些会话:
root@linuxprobe:~# tmux ls
backup: 1 windows (created Sat Mar 22 18:34:42 2025)
在传统的远程控制中,如果突然关闭会话窗口,一定会导致正在运行的命令突然终止, 但是在 Tmux 的不间断会话服务中则不会这样。我们只需查看一下刚刚关闭的离线会话名称, 然后尝试恢复回来,这个会话就能继续工作了。回到 backup 会话中的方法很简单,直接在tmux 命令后面加 attach 和会话编号或会话名称就可以。关闭会话窗口之前正在进行的一切工作状态都会被原原本本地呈现出来,丝毫不受影响:
root@linuxprobe:~# tmux attach -t backup
如果不再需要使用这个 Tmux 会话了,也不用先在 tmux 命令后面添加 attach,再执行 exit 命令退出,而是直接使用 kill 命令杀死这个会话即可:
root@linuxprobe:~# tmux attach -t backup
[exited]
root@linuxprobe:~# tmux ls
no server running on /tmp/tmux-0/default
在日常的生产环境中,其实并不是必须先创建会话,然后再开始工作。可以直接使用 tmux 命令执行要运行的命令,这样命令中的一切操作都会被记录下来,当命令执行结束后,后台会话也会自动结束。
root@linuxprobe:~# tmux new "vim memo.txt"
9.3.2 管理多窗格
在实际工作中,一个Shell 终端窗口总是不够用,这怎么办呢?Tmux 服务有个多窗格功能,能够把一个终端界面按照上下或左右进行切割,从而使得能同时做多件事情,而且之间互不打扰,特别方便。
先创建一个会话。使用 tmux split-window 命令可以创建上下切割的多窗格终端界面, 如图 9-21 所示。使用 tmux split-window -h 命令可以创建左右切割的多窗格终端界面,如图 9-22 所示。
图9-21 上下切割多窗格
图9-22 上下切割多窗格
创建多窗格终端界面后,同时做几件事情都不会乱了。如果觉得两个窗格还不够,那就再执行几次上面的命令吧,退出时执行 exit 命令即可。
呀!一不小心创建得太多了,当前正在使用的窗格变得特别小,看不到输入内容了,怎么办呢?不要着急!可以同时按下“Ctrl+B+方向键”调整窗格的尺寸。例如,现在使用的窗格有些小,想向右扩大一些,则同时如下“Ctrl+B+右箭头键”就行了。
如果需要切换到其他窗格进行工作,但又不能关闭当前的窗格,则可使用如表 9-4 所示的命令进行切换。
表 9-4 Tmux 不间断会话多窗格的切换命令
命令 | 作用 |
---|---|
tmux select-pane -U | 切换至上方的窗格 |
tmux select-pane -D | 切换至下方的窗格 |
tmux select-pane -L | 切换至左方的窗格 |
tmux select-pane -R | 切换至右方的窗格 |
假如想调整窗格的位置,把上面与下面的窗格位置互换,则可以用如表 9-5 所示的命令进行互换。
表 9-5 Tmux 不间断会话多窗格的互换命令
命令 | 作用 |
---|---|
tmux swap-pane -U | 将当前窗格与上方的窗格互换 |
tmux swap-pane -D | 将当前窗格与下方的窗格互换 |
如图9-23所示,原本执行过uptime命令的窗格在下方,只需要在该窗格中执行“tmux swap-pane -U”命令即可与上方窗格互换位置,效果如图9-24所示。
图9-23 切换窗格位置前
图9-24 切换窗格位置后
在工作中,通过输入命令来切换窗格难免有些麻烦,实际上 Tmux 服务为用户提供了一系列快捷键来执行窗格的切换。方法是先同时按下 Ctrl+B 组合键,然后松手后再迅速按下其他后续按键,而不是必须一起按下,手小的同学也被照顾到啦。用于操作会话窗格的常见快捷键如表 9-6 所示。
表 9-6 操作 Tmux 会话窗格的常见快捷键
快捷键 | 作用 |
---|---|
% | 划分为左右两个窗格 |
" | 划分为上下两个窗格 |
; | 切换至上一个窗格 |
o | 切换至下一个窗格 |
{ | 将当前窗格与上一个窗格位置互换 |
} | 将当前窗格与下一个窗格位置互换 |
x | 关闭窗格 |
! | 将当前窗格拆分成独立窗口 |
q | 显示窗格编号 |
请大家一定要注意,在通过快捷键来操作会话窗格时,一定是先按下 Ctrl+B 组合键后, 再敲击其他按键,否则操作不生效。假设现在有如图 9-25 所示的两个窗格,我们想将这两个窗口的位置互换,操作方法是先同时按下 Ctrl+B 组合键,然后松手,再按下“}”键,即可实现,最终效果如图 9-26 所示。
图9-25 窗格互换前
图9-26 窗格互换后
在学会了 Tmux 服务的这些操作之后,日常管理就不成问题了。这里提及的命令和快捷键不建议死记硬背,工作时把书放在案头,随用随查即可。
9.3.3 会话共享功能
Tmux 服务不仅能够确保用户在极端情况下也不丢失对系统的远程控制,保证了生产环境中远程工作的不间断性,而且它还具有会话共享、分屏切割窗格、会话锁定等实用的功能。其中,会话共享是一件很酷的事情,当多个用户同时控制服务器的时候,它可以把服务器屏幕内容共享出来。也就是说,每个用户都能看到相同的内容,还能一起同时操作。会话共享功能的技术拓扑如图 9-27 所示。
图9-27 会话共享功能技术拓扑
要实现会话共享功能,首先使用 ssh 服务将客户端A 远程连接到服务器,随后使用 Tmux服务创建一个新的会话窗口,名称为 share:
root@ClientA:~# ssh 192.168.10.10
The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established.
ED25519 key fingerprint is SHA256:0R7Kuk/yCTlJ+E4G9y9iX/A/hAklHkALm5ZUgnJ01cc.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.10.10' (ED25519) to the list of known hosts.
root@192.168.10.10's password: 此处输入服务器管理员密码
………………省略部分输出信息………………
Last login: Thu Mar 13 06:56:57 2025
root@ClientA:~# tmux new -s share
然后,使用 ssh 服务将客户端 B 也远程连接到服务器,并执行获取远程会话的命令。接下来,两台客户端就能看到相同的内容了。
root@ClientB:~# ssh 192.168.10.10
The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established.
ED25519 key fingerprint is SHA256:0R7Kuk/yCTlJ+E4G9y9iX/A/hAklHkALm5ZUgnJ01cc.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.10.10' (ED25519) to the list of known hosts.
root@192.168.10.10's password: 此处输入服务器管理员密码
………………省略部分输出信息………………
Last login: Thu Mar 13 06:56:57 2025
root@ClientB:~# tmux attach-session -t share
操作完成后,两台客户端的所有终端信息将实现实时同步,共享同一个会话窗口,使用极为方便。为了直观展示会话共享功能的强大,读者可尝试从两台不同的客户端同时远程连接这台服务器。我们也在同一台计算机上创建出两个窗格(见图 9-28)来模拟该场景,借此清晰观察数据同步的过程。
图9-28 终端界面进行会话同步
9.4 检索日志信息
Linux 系统拥有十分强大且灵活的日志系统,用于保存几乎所有的操作记录和服务运行状态,并且按照“报错”“警告”“提示”和“其他”等标注进行了分类。运维管理员可以根据所需的信息进行检索,快速找出想要的信息,因此对于了解系统运行状态有着不错的帮助作用。
在RHEL 10 系统中,默认的日志服务程序是 rsyslog。可以将 rsyslog 理解成之前的syslogd 服务的增强版本,它更加注重日志的安全性和性能指标。为了便于日后的检索,不同的日志信息会被写入不同的文件中。在 Linux 系统中,常见的日志文件的保存路径以及作用如表 9-7 所示。
表 9-7 常见的日志文件的保存路径以及作用
日志文件的保存路径 | 作用 |
---|---|
/var/log/boot.log | 保存系统开机自检事件及引导过程等信息 |
/var/log/lastlog | 保存用户登录成功时间、终端名称及 IP 地址等信息 |
/var/log/btmp | 保存登录失败的时间、终端名称及 IP 地址等信息 |
/var/log/messages | 保存系统及各个服务的运行和报错信息 |
/var/log/secure | 保存系统安全相关的信息 |
/var/log/wtmp | 保存系统启动与关机等相关信息 |
在日常工作中,/var/log/message 这个综合性的文件用得最多。在处理 Linux 系统中出现的各种故障时,一般是最先发现故障的症状,而要找到故障的原因一定离不开日志 信息的帮忙。
从理论上讲,日志文件分为下面 3 种类型。
系统日志:主要记录系统的运行情况和内核信息。
用户日志:主要记录用户的访问信息,包含用户名、终端名称、登入及退出时间、来源 IP 地址和执行过的操作等。
程序日志:稍微大一些的服务一般都会保存一份与其同名的日志文件,里面记录着服务运行过程中各种事件的信息;每个服务程序都有自己独立的日志文件,且格式相差较大。
只有快速地定位故障点,才能对症下药,及时解决各种系统问题。
上面提到,每个稍微大一些的服务都有自己独立的日志文件,为了让用户在检索信息时不至于特别麻烦,journalctl 命令应运而生。journalctl 命令用于检索和管理系统日志信息,英文全称为 journal control,语法格式为“journalctl 参数”。它可以根据事件、类型、服务名称等信息进行信息检索,从而大大提高了日常排错的效率。journalctl 命令中的常见参数以及作用如表 9-8 所示。大家可以先混个脸熟,然后再开始实验。
表 9-8 journalctl 命令中的常见参数以及作用
参数 | 作用 |
---|---|
-k | 内核日志 |
-b | 启动日志 |
-u | 指定服务 |
-n | 指定条数 |
-p | 指定类型 |
-f | 实时刷新(追踪日志) |
--since | 指定时间 |
--disk-usage | 占用空间 |
现在准备动手操练起来!首先查看系统中最后 5 条日志信息:
root@linuxprobe:~# journalctl -n 5
Mar 22 19:56:09 linuxprobe.com systemd[1]: Starting sshd.service - OpenSSH serv>
Mar 22 19:56:09 linuxprobe.com (sshd)[3650]: sshd.service: Referenced but unset>
Mar 22 19:56:09 linuxprobe.com sshd[3650]: Server listening on 0.0.0.0 port 22.
Mar 22 19:56:09 linuxprobe.com sshd[3650]: Server listening on :: port 22.
Mar 22 19:56:09 linuxprobe.com systemd[1]: Started sshd.service - OpenSSH serve>
lines 1-5/5 (END)
还可以使用-f 参数实时刷新日志的最新内容(这与第 2 章介绍的 tail –f /var/log/ message 命令的效果相同):
root@linuxprobe:~# journalctl -f
Mar 22 19:56:09 linuxprobe.com systemd[1]: sshd-keygen@ecdsa.service - OpenSSH ecdsa Server Key Generation was skipped because no trigger condition checks were met.
Mar 22 19:56:09 linuxprobe.com systemd[1]: sshd-keygen@ed25519.service - OpenSSH ed25519 Server Key Generation was skipped because no trigger condition checks were met.
Mar 22 19:56:09 linuxprobe.com systemd[1]: sshd-keygen@rsa.service - OpenSSH rsa Server Key Generation was skipped because no trigger condition checks were met.
Mar 22 19:56:09 linuxprobe.com systemd[1]: Reached target sshd-keygen.target.
………………省略部分输出信息………………
在rsyslog 服务程序中,日志根据重要程度分为 9 个等级,从高到低如表 9-9 所示。这样的好处是,我们可以直击最重要的信息,而不用担心会被海啸般的输出内容所淹没。大家先将表留存,以备日后工作中进行查阅。
表 9-9 日志信息等级分类
日志等级 | 说明 |
---|---|
emerg | 系统出现严重故障,比如内核崩溃 |
alert | 应立即修复的故障,比如数据库损坏 |
crit | 危险性较高的故障,比如磁盘损坏导致程序运行失败 |
err | 危险性一般的故障,比如某个服务启动或运行失败 |
warning | 警告信息,比如某个服务参数或功能出错 |
notice | 不严重的一般故障,比如只是需要抽空处理的情况 |
info | 通用性消息,用于提示一些有用的信息 |
debug | 调试程序所产生的信息 |
none | 没有优先级,不做日志记录 |
如果只想看系统中较高级别的报错信息,则在 journalctl 命令中用-p 参数进行指定:
root@linuxprobe:~# journalctl -p crit
Mar 13 04:05:59 linuxprobe.com kernel: Warning: Unmaintained driver is detected>
Mar 13 04:05:59 linuxprobe.com kernel: Warning: Unmaintained driver is detected>
Mar 13 04:05:59 linuxprobe.com kernel: Warning: Unmaintained driver is detected>
………………省略部分输出信息………………
我们不仅能够根据日志等级进行检索,还可以用--since 参数按照今日(today)、近 N 小时(hour)、指定时间范围的格式进行检索,找出最近的日志数据。来看下面几个例子。
仅查询今日的日志信息:
root@linuxprobe:~# journalctl --since today
Mar 22 19:47:34 linuxprobe.com systemd[1]: Starting fstrim.service - Discard un>
Mar 22 19:47:34 linuxprobe.com systemd[1]: Starting fwupd-refresh.service - Ref>
Mar 22 19:47:34 linuxprobe.com systemd[1]: Starting plocate-updatedb.service - >
Mar 22 19:47:34 linuxprobe.com systemd[1]: Starting raid-check.service - RAID s>
Mar 22 19:47:34 linuxprobe.com systemd[1]: Starting logrotate.service - Rotate >
………………省略部分输出信息………………
仅查询最近 1 小时的日志信息:
root@linuxprobe:~# journalctl --since "-1 hour"
Mar 22 19:47:34 linuxprobe.com systemd[1]: Starting fstrim.service - Discard un>
Mar 22 19:47:34 linuxprobe.com systemd[1]: Starting fwupd-refresh.service - Ref>
Mar 22 19:47:34 linuxprobe.com systemd[1]: Starting plocate-updatedb.service - >
Mar 22 19:47:34 linuxprobe.com systemd[1]: Starting raid-check.service - RAID s>
Mar 22 19:47:34 linuxprobe.com systemd[1]: Starting logrotate.service - Rotate >
Mar 22 19:47:34 linuxprobe.com systemd[1]: raid-check.service: Deactivated succ>
………………省略部分输出信息………………
仅查询 18 点整到 20 点整的日志信息:
root@linuxprobe:~# journalctl --since "18:00" --until "20:00"
Mar 22 19:47:34 linuxprobe.com systemd[1]: Starting fstrim.service - Discard un>
Mar 22 19:47:34 linuxprobe.com systemd[1]: Starting fwupd-refresh.service - Ref>
Mar 22 19:47:34 linuxprobe.com systemd[1]: Starting plocate-updatedb.service - >
Mar 22 19:47:34 linuxprobe.com systemd[1]: Starting raid-check.service - RAID s>
Mar 22 19:47:34 linuxprobe.com systemd[1]: Starting logrotate.service - Rotate >
………………省略部分输出信息………………
仅查询从 2025 年 3 月 1 日至 2025 年 6 月 1 日的日志信息:
root@linuxprobe:~# journalctl --since "2025-03-01" --until "2025-06-1"
Mar 13 04:05:58 linuxprobe.com kernel: Linux version 6.11.0-0.rc5.23.el10.x86_6>
Mar 13 04:05:58 linuxprobe.com kernel: Command line: BOOT_IMAGE=(hd0,gpt2)/vmli>
Mar 13 04:05:58 linuxprobe.com kernel: BIOS-provided physical RAM map:
Mar 13 04:05:58 linuxprobe.com kernel: BIOS-e820: [mem 0x0000000000000000-0x000>
Mar 13 04:05:58 linuxprobe.com kernel: BIOS-e820: [mem 0x0000000000001000-0x000>
Mar 13 04:05:58 linuxprobe.com kernel: BIOS-e820: [mem 0x0000000000002000-0x000>
………………省略部分输出信息………………
下面再来看个不一样的:查询指定服务的日志信息。在默认情况下,所有的日志信息都是混在一起的。如果想查看某项具体服务的日志信息,可以使用_SYSTEMD_UNIT 参数进行查询,服务名称的后面要有.service,这是标准服务名称的写法。
root@linuxprobe:~# journalctl -u sshd
Mar 13 04:06:03 linuxprobe.com systemd[1]: Starting sshd.service - OpenSSH serv>
Mar 13 04:06:03 linuxprobe.com (sshd)[1346]: sshd.service: Referenced but unset>
Mar 13 04:06:03 linuxprobe.com sshd[1346]: Server listening on 0.0.0.0 port 22.
Mar 13 04:06:03 linuxprobe.com sshd[1346]: Server listening on :: port 22.
Mar 13 04:06:03 linuxprobe.com systemd[1]: Started sshd.service - OpenSSH serve>
………………省略部分输出信息………………
恭喜你!又学习完了一章。按照本书内容结构的划分,从第 10 章开始将介绍各种服务的配置方法。随着配置实验的成功,相信大家的学习乐趣也会翻倍提升。一定要坚持下 去哦!
复习题
-
在 Linux 系统中有多种方法可以配置网络参数,请列举几种。
答:配置网络参数可以使用 nmtui 命令、nmcli 命令、nm-connection-editor 命令或者直接编辑网卡配置文件来实现对网络参数的修改。
-
在 RHEL 10 系统中使用网络会话技术的目的是什么?
答:使用 nmcli 命令来管理网络会话的目的是快速切换网络参数,以便适应不同的工作场景。
-
请简述网卡绑定技术 balance-rr 模式的特点。
答:平时两块网卡均工作,且自动备援,无须交换机设备提供辅助支持。
-
在 Linux 系统中,当通过修改其配置文件中的参数来配置服务程序时,若想要让新配置的参数生效,还需要执行什么操作?
答:需要重新启动相关的服务程序,或让服务程序重新加载配置文件,或重启系统。
-
sshd 服务的密码验证与密钥验证方式,哪个更安全?
答:一般情况下,密钥验证方式更安全。若用户有更高的安全需求,还可以再对密钥文件进行加密,从而实现双重加密。
-
系统均为 Linux 的两台服务器想要相互传输文件,在 FTP、HTTP、SSH 这 3 种方式中, 哪种最简单?
答:SSH 是一对一传输的首选,scp 命令 YYDS(永远的神)!
-
想要把本地文件/root/out.txt 传送到地址为 192.168.10.20 的远程主机的/home 目录下,且本地主机与远程主机均为 Linux 系统,最简便的传送方式是什么?
答:执行命令 scp /root/out.txt root@192.168.10.20:/home,在密码验证通过后即可开始传送文件。
-
Tmux 服务程序能够让用户不间断远程控制的会话,即便网络发生中断也不丢失对远程主机的会话控制。那么,当想要恢复一个名为 linux 的会话窗口时,应该怎么做呢?
答:执行命令tmux attach -t linux 即可恢复这个会话窗口。
-
如果只想看最高等级(emerg)的日志信息,该执行什么命令?
答:执行 journalctl -p emerg 命令。
-
如何在不用 journalctl 命令的情况下查看系统的历史登录信息?
答:Linux 系统中一切皆文件,系统历史登录信息保存在/var/log/lastlog 文件中, 可使用 cat 命令查看。