📑 目录

复习和预习

昨天课堂内容

  1. 配置秘钥登录
  2. Openssh 服务加固
  3. 日志(rsyslog+journal)
  4. CentOS 系统配置

课前思考

  1. 概述配置windows通过秘钥登录Linux服务器过程 - 生成密钥对 - 放入到对方家目录文件 - 验证
  2. Openssh 服务加固从哪几方面着手? - root 用户使用秘钥登录 - 禁用密码认证 - 设置允许指定用户/禁用指定用户 - 设置允许指定用户组/禁用指定用户组 - 修改端口号 - 启用 SELinux
  3. sshd 服务重启失败,如何通过日志排故? - 查看服务状态 systemctl status sshd - 在状态日志中查找对应信息 - 查看 tail -f /var/log/messages,新开窗口执行 systemctl restart sshd

今天课堂内容

  1. 时间设置
  2. 网络管理
  3. 系统间复制文档
  4. 周期性计划作业

Linux 服务器之间秘钥登录

环境准备

准备两台服务器server1和server2

10.1.8.11 server1.laoma.cloud server1
10.1.8.12 server2.laoma.cloud server2

配置 server1

# 设置主机名
[root@server1 ~ 09:23:07]# hostnamectl set-hostname server1.laoma.cloud

# 修改 IP 地址
[root@server1 ~ 09:23:07]# cd /etc/sysconfig/network-scripts/
[root@server1 network-scripts 09:24:52]# vim ifcfg-ens33 
# 修改IP地址为 10.1.8.11
IPADDR=10.1.8.11

# 重新加载配置文件
[root@server1 network-scripts 09:24:52]# nmcli connection reload
# 激活配置
[root@server1 network-scripts 09:24:52]# nmcli connection up ens33 

# 配置名称解析
[root@server1 ~ 09:42:48]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

# 最后追加解析记录
10.1.8.11 server1.laoma.cloud server1
10.1.8.12 server2.laoma.cloud server2

[root@server1 ~ 09:53:40]# ping -c 1 server2
PING server2.laoma.cloud (10.1.8.12) 56(84) bytes of data.
64 bytes from server2.laoma.cloud (10.1.8.12): icmp_seq=1 ttl=64 time=0.695 ms

--- server2.laoma.cloud ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.695/0.695/0.695/0.000 ms

配置 server2

# 设置主机名
[root@server2 ~ 09:23:07]# hostnamectl set-hostname server2.laoma.cloud

# 修改 IP 地址
[root@server2 ~ 09:23:07]# cd /etc/sysconfig/network-scripts/
[root@server2 network-scripts 09:24:52]# vim ifcfg-ens33 
# 修改IP地址为 10.1.8.12
IPADDR=10.1.8.12

# 重新加载配置文件
[root@server2 network-scripts 09:24:52]# nmcli connection reload
# 激活配置
[root@server2 network-scripts 09:24:52]# nmcli connection up ens33

# 配置名称解析
[root@server2 ~ 09:42:48]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

# 最后追加解析记录
10.1.8.11 server1.laoma.cloud server1
10.1.8.12 server2.laoma.cloud server2

验证

452d94d84460f309ac519eaf08c6e2ce

配置过程

配置server1秘钥登录server2

# 1. 生成密钥对
[root@server1 ~ 10:02:52]# ssh-keygen
Generating public/private rsa key pair.
# 私钥保存位置
Enter file in which to save the key (/root/.ssh/id_rsa): 
# 私钥密码为空
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:EWHD23ebuaOEMAQOP6kgXl2IEErL5YqiszrAPlRjX5o root@server1.laoma.cloud
The key's randomart image is:
+---[RSA 2048]----+
| +o.o oo=.       |
|+ +..=.+.o       |
|oo.o .= oo       |
|o.o= . +... . .  |
|+oo + + S  . . + |
|+o   E   o .  +  |
|*         . .  . |
|.=         .  o  |
|+..         .. . |
+----[SHA256]-----+

[root@server1 ~ 10:04:35]# ls .ssh/id_rsa*
id_rsa      id_rsa.pub 

# 删除之前生成的文件
[root@server1 ~ 10:04:35]# rm -fr .ssh/id_rsa*

# 也可以使用以下命令,非交互方式生成
[root@server1 ~ 10:05:47]# ssh-keygen -N '' -f .ssh/id_rsa
# -f 私钥存储位置
# -N 指定秘钥为空

# 2. 推送到目标服务器
[root@server1 ~ 10:06:40]# ssh-copy-id laoma@server2
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/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
laoma@server2's password: `123`

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'laoma@server2'"
and check to make sure that only the key(s) you wanted were added.

# 3. 验证
[root@server1 ~ 10:08:12]# ssh laoma@server2 id
uid=1000(laoma) gid=1000(laoma) groups=1000(laoma),10(wheel)
[root@server1 ~ 10:07:46]# ssh laoma@server2 hostname
server2.laoma.cloud

时间管理

常见管理命令

date 命令

[root@centos7 ~ 10:28:25]# date
Tue Apr  7 10:28:27 CST 2026
[root@centos7 ~ 10:28:27]# echo $LANG
en_US.UTF-8

# 设置时间显示格式
[root@centos7 ~ 10:28:44]# LANG=zh_CN.UTF-8 
[root@centos7 ~ 10:29:03]# date
2026年 04月 07日 星期二 10:29:04 CST

# 设置时间
[root@centos7 ~ 10:29:04]# date -s 'Tue Apr  6 10:28:27 CST 2026'
2026年 04月 06日 星期一 10:28:27 CST

tzselect 命令

查看时区对应代码。

[root@centos7 ~ 10:28:40]# tzselect 
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
 1) Africa
 2) Americas
 3) Antarctica
 4) Arctic Ocean
 5) Asia
 6) Atlantic Ocean
 7) Australia
 8) Europe
 9) Indian Ocean
10) Pacific Ocean
11) none - I want to specify the time zone using the Posix TZ format.
# 选择 5) Asia
#? 5
Please select a country.
 1) Afghanistan       18) Israel            35) Palestine
 2) Armenia       19) Japan         36) Philippines
 3) Azerbaijan        20) Jordan            37) Qatar
 4) Bahrain       21) Kazakhstan        38) Russia
 5) Bangladesh        22) Korea (North)     39) Saudi Arabia
 6) Bhutan        23) Korea (South)     40) Singapore
 7) Brunei        24) Kuwait            41) Sri Lanka
 8) Cambodia          25) Kyrgyzstan        42) Syria
 9) China         26) Laos          43) Taiwan
10) Cyprus        27) Lebanon           44) Tajikistan
11) East Timor        28) Macau         45) Thailand
12) Georgia       29) Malaysia          46) Turkmenistan
13) Hong Kong         30) Mongolia          47) United Arab Emirates
14) India         31) Myanmar (Burma)       48) Uzbekistan
15) Indonesia         32) Nepal         49) Vietnam
16) Iran          33) Oman          50) Yemen
17) Iraq          34) Pakistan
# 选择 9) China
#? 9
Please select one of the following time zone regions.
1) Beijing Time
2) Xinjiang Time
# 选择 2) Xinjiang Time
#? 2

The following information has been given:

    China
    Xinjiang Time

Therefore TZ='Asia/Urumqi' will be used.
Local time is now:  Mon Apr  6 08:30:40 +06 2026.
Universal Time is now:  Mon Apr  6 02:30:40 UTC 2026.
Is the above information OK?
1) Yes
2) No
# 选择 1) Yes
#? 1

You can make this change permanent for yourself by appending the line
    TZ='Asia/Urumqi'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /bin/tzselect command in shell scripts:
Asia/Urumqi
# 结果显示对应的时区代码是 Asia/Urumqi

通过变量设置时区

# 设置时区为东6区
[root@centos7 ~ 10:30:57]# TZ='Asia/Urumqi'; export TZ
[root@centos7 ~ 08:32:37]# date
2026年 04月 06日 星期一 08:32:39 +06

# 设置时区为东8区
[root@centos7 ~ 08:32:39]# TZ='Asia/Shanghai'; export TZ
[root@centos7 ~ 10:33:37]# date
2026年 04月 06日 星期一 10:33:40 CST

自动对时

chrony 软件。

# 安装软件
[root@centos7 ~ 10:45:20]# yum install -y chrony

# 设置与哪个服务器对时
[root@centos7 ~ 10:45:30]# vim /etc/chrony.conf
# 将原先server开头的行注释掉,并新增一行
# 设置与aliyun对时
server ntp.aliyun.com iburst

# 启动服务
[root@centos7 ~ 10:47:57]# systemctl start chronyd
# 验证时间准确性
[root@centos7 ~ 10:48:05]# date
2026年 04月 07日 星期二 10:49:53 CST

# 查看与哪个服务器对时
[root@centos7 ~ 10:49:53]# chronyc sources -v
210 Number of sources = 1

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 203.107.6.88                  2   6    17    12    +21ms[  +22ms] +/-   41ms
# 带* 开头的是对时的服务器

网络管理

网络查看

# 查看IP地址
[root@centos7 ~ 11:07:11]# ip -br addr
lo               UNKNOWN        127.0.0.1/8 ::1/128 
ens33            UP             10.1.8.10/24 fe80::20c:29ff:feae:bf1d/64
# -br brief 简洁

# 查看特定网卡IP地址
[root@centos7 ~ 11:07:17]# ip -br addr show ens33
ens33            UP             10.1.8.10/24 fe80::20c:29ff:feae:bf1d/64

# 查看MAC地址
[root@centos7 ~ 11:08:13]# ip -br link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> 
ens33            UP             00:0c:29:ae:bf:1d <BROADCAST,MULTICAST,UP,LOWER_UP> 
[root@centos7 ~ 11:08:18]# ip -br link show ens33
ens33            UP             00:0c:29:ae:bf:1d <BROADCAST,MULTICAST,UP,LOWER_UP>

# 查看网关
[root@centos7 ~ 11:08:23]# ip route
default via 10.1.8.2 dev ens33 proto static metric 100 
10.1.8.0/24 dev ens33 proto kernel scope link src 10.1.8.10 metric 100
# default 开头的条目是网关

# 查看 DNS
[root@centos7 ~ 11:09:22]# cat /etc/resolv.conf 
# Generated by NetworkManager
search laoma.cloud
nameserver 223.5.5.5
nameserver 223.6.6.6

网络配置

通过配置文件修改

[root@centos7 ~ 11:10:21]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=1f9d8e96-40c7-438b-adf1-67c6b3119ce9
DEVICE=ens33
ONBOOT=yes
IPADDR=10.1.8.10
PREFIX=24
GATEWAY=10.1.8.2
DNS1=223.5.5.5
DNS2=223.6.6.6
IPV6_PRIVACY=no

# 修改完成后需要重新加载和激活配置文件
[root@centos7 ~ 11:12:35]# nmcli connection reload 
[root@centos7 ~ 11:12:38]# nmcli connection up ens33 

通过命令修改

明白两个概念:

device和connection之间关系是,device可以有多个connection,同一时刻只能激活一个connection。

例如在2401教室,激活2401配置;在2402教室,激活2402配置;使用的是同一个网卡 以太网2

管理设备

# 查看网络设备清单
[root@centos7 ~ 11:12:41]# nmcli device 
DEVICE  TYPE      STATE   CONNECTION 
ens33   ethernet  已连接  ens33      
lo      loopback  未托管  --

# 断开连接,相当于拔掉网线
[root@centos7 ~ 11:17:18]# nmcli device disconnect ens33

# 接上连接,相当于接上网线
[root@centos7 ~ 11:17:53]# nmcli device connect ens33

# 查看网卡详细配置
[root@centos7 ~ 11:18:32]# nmcli device show ens33 
GENERAL.DEVICE:                         ens33
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         00:0C:29:AE:BF:1D
GENERAL.MTU:                            1500
GENERAL.STATE:                          100(已连接)
GENERAL.CONNECTION:                     ens33
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/4
WIRED-PROPERTIES.CARRIER:               开
IP4.ADDRESS[1]:                         10.1.8.10/24
IP4.GATEWAY:                            10.1.8.2
IP4.ROUTE[1]:                           dst = 10.1.8.0/24, nh = 0.0.0.0, mt = 100
IP4.ROUTE[2]:                           dst = 0.0.0.0/0, nh = 10.1.8.2, mt = 100
IP4.DNS[1]:                             223.5.5.5
IP4.DNS[2]:                             223.6.6.6
IP6.ADDRESS[1]:                         fe80::20c:29ff:feae:bf1d/64
IP6.GATEWAY:                            --
IP6.ROUTE[1]:                           dst = ff00::/8, nh = ::, mt = 256, table=255
IP6.ROUTE[2]:                           dst = fe80::/64, nh = ::, mt = 256

管理连接

实践:

  1. 静态配置IP
  2. 动态配置IP

给CentOS 系统添加一块网卡。

image-20260407133623513

[root@centos7 ~ 13:36:49]# nmcli device 
DEVICE  TYPE      STATE   CONNECTION         
ens33   ethernet  已连接  ens33              
ens36   ethernet  已连接  Wired connection 1 
lo      loopback  未托管  --
# 多了一个 ens36 网卡
添加一个动态获取的配置
[root@centos7 ~ 13:40:23]# nmcli connection add type ethernet ifname ens36 con-name dongtai ipv4.method auto
# 参数说明:
# type ethernet:连接类型是以太网
# ifname ens36:给网卡ens36配置链接
# con-name dongtai:连接名称是dongtai
# ipv4.method auto:获取地址方法是auto

# 激活连接
[root@centos7 ~ 13:41:49]# nmcli connection up dongtai 
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/8)

# 验证网卡配置信息:自动获取了IP、网关和DNS
[root@centos7 ~ 13:42:00]# nmcli device show ens36
GENERAL.DEVICE:                         ens36
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         00:0C:29:AE:BF:27
GENERAL.MTU:                            1500
GENERAL.STATE:                          100(已连接)
GENERAL.CONNECTION:                     dongtai
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/8
WIRED-PROPERTIES.CARRIER:               开
IP4.ADDRESS[1]:                         10.1.1.130/24
IP4.GATEWAY:                            --
IP4.ROUTE[1]:                           dst = 10.1.1.0/24, nh = 0.0.0.0, mt = 102
IP4.DNS[1]:                             10.1.1.1
IP4.DOMAIN[1]:                          localdomain
IP6.ADDRESS[1]:                         fe80::47ee:a597:6e46:c673/64
IP6.GATEWAY:                            --
IP6.ROUTE[1]:                           dst = fe80::/64, nh = ::, mt = 102
IP6.ROUTE[2]:                           dst = ff00::/8, nh = ::, mt = 256, table=255

# 查看连接清单:多了一个dongtai,而且是激活状态(关联了网卡ens36)。
[root@centos7 ~ 13:42:17]# nmcli connection 
NAME                UUID                                  TYPE      DEVICE 
ens33               1f9d8e96-40c7-438b-adf1-67c6b3119ce9  ethernet  ens33  
dongtai             5258feee-ea13-44b0-95aa-821e38add45b  ethernet  ens36  
Wired connection 1  55598965-f922-3b5b-afba-a29a47488723  ethernet  --
添加一个静态配置
[root@centos7 ~ 13:53:05]# nmcli connection add type ethernet ifname ens36 con-name jingtai ipv4.method manual ipv4.addresses 10.1.1.10/24 
连接 "jingtai" (604950ce-a611-49fc-9d96-5b7c3ba91d92) 已成功添加。

[root@centos7 ~ 13:56:06]# nmcli connection up jingtai 
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/9)

# 网卡配置中只有IP地址,没有网关和DNS,因为没有配置。
[root@centos7 ~ 13:56:18]# nmcli device show ens36
GENERAL.DEVICE:                         ens36
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         00:0C:29:AE:BF:27
GENERAL.MTU:                            1500
GENERAL.STATE:                          100(已连接)
GENERAL.CONNECTION:                     jingtai
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/9
WIRED-PROPERTIES.CARRIER:               开
IP4.ADDRESS[1]:                         10.1.1.10/24
IP4.GATEWAY:                            --
IP4.ROUTE[1]:                           dst = 10.1.1.0/24, nh = 0.0.0.0, mt = 102
IP6.ADDRESS[1]:                         fe80::23ef:cdb3:9c88:2362/64
IP6.GATEWAY:                            --
IP6.ROUTE[1]:                           dst = fe80::/64, nh = ::, mt = 102
IP6.ROUTE[2]:                           dst = ff00::/8, nh = ::, mt = 256, table=255

[root@centos7 ~ 13:56:15]# nmcli connection 
NAME                UUID                                  TYPE      DEVICE 
ens33               1f9d8e96-40c7-438b-adf1-67c6b3119ce9  ethernet  ens33  
jingtai             604950ce-a611-49fc-9d96-5b7c3ba91d92  ethernet  ens36  
dongtai             5258feee-ea13-44b0-95aa-821e38add45b  ethernet  --     
Wired connection 1  55598965-f922-3b5b-afba-a29a47488723  ethernet  -- 

书写命令的时候,多使用tab键补全功能。

修改连接配置
[root@centos7 ~ 14:05:39]# nmcli connection modify jingtai ipv4.addresses 10.1.1.100/24
[root@centos7 ~ 14:06:08]# nmcli connection up jingtai 
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/10)
[root@centos7 ~ 14:06:13]# ip -br a show ens36
ens36            UP             10.1.1.100/24 fe80::23ef:cdb3:9c88:2362/64 
删除连接
# 删除自带连接
[root@centos7 ~ 14:06:19]# nmcli connection delete Wired\ connection\ 1 
成功删除连接 "Wired connection 1" (55598965-f922-3b5b-afba-a29a47488723)。

[root@centos7 ~ 14:07:28]# nmcli connection 
NAME     UUID                                  TYPE      DEVICE 
ens33    1f9d8e96-40c7-438b-adf1-67c6b3119ce9  ethernet  ens33  
jingtai  604950ce-a611-49fc-9d96-5b7c3ba91d92  ethernet  ens36  
dongtai  5258feee-ea13-44b0-95aa-821e38add45b  ethernet  --   

# 删除dongtai和jingtai连接
[root@centos7 ~ 14:07:32]# nmcli connection delete dongtai 
成功删除连接 "dongtai" (5258feee-ea13-44b0-95aa-821e38add45b)。
[root@centos7 ~ 14:07:41]# nmcli connection delete jingtai
成功删除连接 "jingtai" (604950ce-a611-49fc-9d96-5b7c3ba91d92)。

[root@centos7 ~ 14:07:45]# nmcli c
NAME   UUID                                  TYPE      DEVICE 
ens33  1f9d8e96-40c7-438b-adf1-67c6b3119ce9  ethernet  ens33  
修改dns
# 服务器可以具备多个DNS,通常是两个
[root@centos7 ~ 14:09:38]# nmcli connection modify ens33 ipv4.dns 223.5.5.5 +ipv4.dns 223.6.6.6

[root@centos7 ~ 14:10:17]# nmcli connection up ens33 
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/12)

[root@centos7 ~ 14:10:19]# cat /etc/resolv.conf 
# Generated by NetworkManager
search laoma.cloud
nameserver 223.5.5.5
nameserver 223.6.6.6

使用半图形化工具

自行研究使用方法。

image-20260407143601638

系统间复制文档

windows与Linux

使用 ftp 相关工具

提示:前提条件是Linux服务器开启了sshd 服务。

image-20260407143938315

使用 lrzsz

提示:前提条件是Linux服务器安装了lrzsz工具。

适合传送小文件,因为速度慢。

image-20260407144225424

image-20260407144146431

Linux与Linux

scp(secure copy)

全量复制:每次传输都是完整的传输,不支持比对传输。

# 系统主机名存储位置
[root@server1 ~ 10:08:25]# cat /etc/hostname 
server1.laoma.cloud

# 将文件传输到server2的/root目录
# server2要能够解析成ip
[root@server1 ~ 14:45:53]# scp /etc/hostname server2:/root
root@server2's password: 
hostname                                                  100%   20     5.1KB/s   00:00    
# 验证文件内容
[root@server1 ~ 14:46:07]# ssh server2 cat /root/hostname
root@server2's password: 
server1.laoma.cloud

# 如果之前配置过秘钥登录,则不需要输入密码就可以同步

# 复制目录,需要-r选项
[root@server1 ~ 14:49:27]# scp -r /etc/yum server2:/tmp
contentdir                                                100%    7     3.8KB/s   00:00    
infra                                                     100%    6     3.0KB/s   00:00    
fastestmirror.conf                                        100%  279   168.2KB/s   00:00    
langpacks.conf                                            100%  385    23.5KB/s   00:00    
systemd.conf                                              100%    8     1.7KB/s   00:00    
version-groups.conf                                       100%  444   125.8KB/s   00:00

也可以拉取文件

[root@server1 ~ 14:49:44]# scp server2:/etc/hostname /tmp
hostname                                                  100%   20    10.9KB/s   00:00    
[root@server1 ~ 14:50:36]# cat /tmp/hostname
server2.laoma.cloud

rsync

全量和增量同步:每次传输的时候,比对目标位置是否有相同的文件。如果有相同的文件,则不重复传输。

# 准备文件
[root@server1 ~ 15:00:17]# mkdir Pictures
[root@server1 ~ 15:03:30]# touch Pictures/snap-{1..6}.jpg

# 同步目录
[root@server1 ~ 15:03:44]# rsync -av Pictures server2:/root
sending incremental file list
Pictures/
Pictures/snap-1.jpg
Pictures/snap-2.jpg
Pictures/snap-3.jpg
Pictures/snap-4.jpg
Pictures/snap-5.jpg
Pictures/snap-6.jpg
# 选项 -a 归档模式,等价于 -r -l -p -t -g -o -D,保留目录结构、软链接、权限、时间戳等
# 选项 -v 显示详细过程

sent 408 bytes  received 134 bytes  361.33 bytes/sec
total size is 0  speedup is 0.00

# 第二次同步:没有变化,所以不用同步
[root@server1 ~ 15:04:19]# rsync -av Pictures server2:/root
sending incremental file list

sent 167 bytes  received 17 bytes  122.67 bytes/sec
total size is 0  speedup is 0.00

# 更新文件时间戳
[root@server1 ~ 15:05:09]# touch Pictures/snap-3.jpg 

# 只同步变化的文件
[root@server1 ~ 15:05:59]# rsync -av Pictures server2:/root
sending incremental file list
Pictures/snap-3.jpg

sent 218 bytes  received 36 bytes  508.00 bytes/sec
total size is 0  speedup is 0.00

# 同步内容发生变化的文件
[root@server1 ~ 15:06:27]# echo hello world >> Pictures/snap-6.jpg 
[root@server1 ~ 15:06:48]# rsync -av Pictures server2:/root
sending incremental file list
Pictures/snap-6.jpg

sent 238 bytes  received 36 bytes  548.00 bytes/sec
total size is 12  speedup is 0.04

rsync也支持拉取文件。

[root@server1 ~ 15:06:51]# rsync -av server2:/root/Pictures /tmp
receiving incremental file list
Pictures/
Pictures/snap-1.jpg
Pictures/snap-2.jpg
Pictures/snap-3.jpg
Pictures/snap-4.jpg
Pictures/snap-5.jpg
Pictures/snap-6.jpg

sent 142 bytes  received 436 bytes  1,156.00 bytes/sec
total size is 12  speedup is 0.02

[root@server1 ~ 15:09:20]# ls /tmp/Pictures/
snap-1.jpg  snap-2.jpg  snap-3.jpg  snap-4.jpg  snap-5.jpg  snap-6.jpg

周期性计划作业

定个闹钟:每天 7:00 起床。

计算机也要定时要完成自己的事情:

  1. 每天巡检系统资源使用情况。
  2. 每小时检查一次异常日志
  3. 每天夜里 0:00 备份数据

crond 服务,提供定制任务功能,定期触发执行相应命令。

实践

每分钟同步一次上一章节创建的Pictures目录到server2.

前提条件:

  1. server1可以秘钥登录server2
  2. server1上要准备好相应的目录

配置秘钥登录

[root@server1 ~ 15:17:51]# ssh-keygen 
[root@server1 ~ 15:17:51]# ssh-copy-id root@server2
[root@server1 ~ 15:17:51]# ssh server2 hostname

步骤1:确保 crond服务启动

[root@server1 ~ 15:17:51]# systemctl is-active crond
active

步骤2:设置定时任务

# 查看当前定时任务
[root@server1 ~ 15:36:05]# crontab -l
no crontab for root

# 设置vim作为默认编辑器
[root@server1 ~ 15:37:12]# export EDITOR=vim

# 编辑定时任务
[root@server1 ~ 15:36:25]# crontab -e
# 弹出vim编辑文件
*  *  *  *  * rsync -av Pictures server2:/root
# 提前配置好秘钥登录

[root@server1 ~ 15:40:43]# crontab -l
*  *  *  *  * rsync -av Pictures server2:/root

# 创建一个文件
[root@server1 ~ 15:40:47]# touch Pictures/snap-7.jpg

# 验证-1: 查看执行日志
[root@server1 ~ 15:41:37]# tail -f /var/log/cron 
Apr  7 15:40:43 centos7 crontab[11739]: (root) END EDIT (root)
Apr  7 15:40:47 centos7 crontab[11741]: (root) LIST (root)
Apr  7 15:41:01 centos7 CROND[11743]: (root) CMD (rsync -av Pictures server2:/root)
Apr  7 15:42:01 centos7 CROND[11773]: (root) CMD (rsync -av Pictures server2:/root)

# 验证-2:目标服务器查看
[root@server1 ~ 15:43:01]# ssh server2 ls Pictures/snap-7.jpg
snap-7.jpg

# 验证-3:查看邮件
[root@server1 ~ 15:59:10]# yum install -y mailx
[root@server1 ~ 15:59:10]# mail
......
 N  6 (Cron Daemon)         Tue Apr  7 15:46  28/964   "Cron <root@server1> rsync -av Pic"
 N  7 (Cron Daemon)         Tue Apr  7 15:47  28/964   "Cron <root@server1> rsync -av Pic"
 N  8 (Cron Daemon)         Tue Apr  7 15:48  28/964   "Cron <root@server1> rsync -av Pic"
 N  9 (Cron Daemon)         Tue Apr  7 15:49  28/964   "Cron <root@server1> rsync -av Pic"
>  10 (Cron Daemon)         Tue Apr  7 15:50  28/964   "Cron <root@server1> rsync -av Pic"
 N 11 (Cron Daemon)         Tue Apr  7 15:51  28/964   "Cron <root@server1> rsync -av Pic"
 N 12 (Cron Daemon)         Tue Apr  7 15:52  28/964   "Cron <root@server1> rsync -av Pic"
# 查看第9封邮件
& 9
......
Date: Tue,  7 Apr 2026 15:49:01 +0800 (CST)
Status: R

sending incremental file list

sent 204 bytes  received 17 bytes  442.00 bytes/sec
total size is 12  speedup is 0.05
# 按q 退出
& q

默认情况:命令的执行结果的标准输出内容以邮件方式通知相应的执行用户。

关闭邮件通知:

  1. 将命令的输出结果重定向到文件中,示例中使用/var/log/rsync.log。
*  *  *  *  * rsync -av Pictures server2:/root >> /var/log/rsync.log
  1. 关闭邮件服务器(不建议)
[root@server1 ~ 16:53:21]# systemctl stop postfix.service 

删除计划任务

[root@server1 ~ 16:55:00]# crontab -r
[root@server1 ~ 16:55:02]# crontab -l
no crontab for root

配置模版

[root@server1 ~ 15:38:05]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

其他示例

每年2月2日上午9点执行年度备份脚本:

0 9 2 2 * /usr/local/bin/yearly_backup

7月每周五9:00-16:00,每5分钟发送包含「Chime」的邮件给任务所有者:

*/5 9-16 * Jul 5 echo "Chime"

每个工作日(周一至周五)23:58执行每日报告脚本:

58 23 * * 1-5 /usr/local/bin/daily_report

每个工作日9:00发送邮件给老板(% 表示换行,后续内容为邮件正文):

0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi boss, just checking in.