第一部分 网络服务
第一章 Linux的例行性工作
单一一次的任务计划(单一一次的定时任务)
at程序包是否安装
[root@localhost ~]# rpm -q at at-3.1.23-11.el9.x86_64 [root@localhost ~]# rpm -qa | grep -w at at-spi2-core-2.40.3-1.el9.x86_64 at-spi2-atk-2.38.0-4.el9.x86_64 at-3.1.23-11.el9.x86_64软件程序是否运行
[root@localhost ~]# ps -aux | grep -w atd root 1195 0.0 0.2 12472 4992 ? Ss 18:13 0:00 /usr/sbin/atd -f root 2442 0.0 0.1 221812 2688 pts/0 S+ 18:57 0:00 grep --color=auto -w atd [root@localhost ~]# systemctl status atd ● atd.service - Deferred execution scheduler Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; preset: enabled) Active: active (running) since Wed 2026-10-21 18:13:02 CST; 44min ago Docs: man:atd(8) Main PID: 1195 (atd) Tasks: 1 (limit: 10707) Memory: 896.0K CPU: 13ms CGroup: /system.slice/atd.service └─1195 /usr/sbin/atd -f [root@localhost ~]# systemctl is-active atd active [root@localhost ~]# yum install at -y #没安装通过该命令安装单一一次的定时任务at命令
-m:当任务完成后,即使没有标准输出,也会给用户发送邮件 --了解
-l:列出系统上所有用户的at任务,等价于atq
-d:删除或取消一个任务
-v:任务项以前显示时间,列出at任务
-c:可以列出任务之后的命令内容
-f:从文件中读取
时间格式
| 参数 | 说明 |
| HH:MM | 在今天HH小时的MM分钟执行,若时间点错过,将在明天执行 |
| HH:MM YYYY-MM-DD | 规定在某年某月的某一天的特殊时刻执行该工作 |
| now +2 minutes | 从现在开始的minutes、hours、days、weeks执行 |
| 4pm | 12am 00:00 |
命令用法示例:
[root@node1 ~]# at 12:12 warning: commands will be executed using /bin/sh at> touch file111 #执行任务 at> <EOT> #ctrl-D job 1 at Thu Oct 22 12:12:00 2026 #查看 [root@node1 ~]# at -l 1 Thu Oct 22 12:12:00 2026 a root [root@node1 ~]# atq 1 Thu Oct 22 12:12:00 2026 a root #删除 [root@node1 ~]# at -d 1 #通过任务文件匹配任务 [root@node1 ~]# at -f at.txt 12:12 warning: commands will be executed using /bin/sh job 3 at Thu Oct 22 12:12:00 2026[root@localhost ~]# wall haha wall: /dev/seat0: 没有那个文件或目录 来自 root@localhost.localdomain (pts/0) (Wed Oct 21 19:22:52 2026) 的广播 haha [root@localhost ~]# at now +2 minutes warning: commands will be executed using /bin/sh at> wall 外面太吵了 at> <EOT><EOT> job 7 at Wed Oct 21 19:25:00 2026 [root@localhost ~]#配置文件:程序运行参数文件,程序按照约定格式读取从而决定怎么软件如何运行。
/etc/at.allow(白名单)
/etc/at.deny(黑名单)
定义的任务文件存放位置
/var/spool/at
周期任务crontab
crontabs程序是否存在
[root@node1 at]# dnf list installed | grep crontabs crontabs.noarch 1.11-27.20190603git.el9_0 @anacondacrond程序运行状态
[root@node1 at]# ps -aux | grep crond root 1142 0.0 0.2 223976 3676 ? Ss 18:48 0:00 /usr/sbin/crond -n root 3101 0.0 0.1 221812 2588 pts/0 S+ 19:58 0:00 grep --color=auto crond [root@node1 at]# systemctl status crond ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; preset: enabled) Active: active (running) since Wed 2026-10-21 18:48:26 CST; 1h 10min ago Main PID: 1142 (crond) Tasks: 2 (limit: 10289) Memory: 1.5M (peak: 4.2M) CPU: 38ms CGroup: /system.slice/crond.service ├─1142 /usr/sbin/crond -n └─2748 /usr/sbin/anacron -s Oct 21 19:01:01 node1 run-parts[2738]: (/etc/cron.hourly) starting 0anacron Oct 21 19:01:01 node1 anacron[2748]: Anacron started on 2026-10-21 Oct 21 19:01:01 node1 anacron[2748]: Will run job `cron.daily' in 42 min. Oct 21 19:01:01 node1 anacron[2748]: Will run job `cron.weekly' in 62 min. Oct 21 19:01:01 node1 anacron[2748]: Will run job `cron.monthly' in 82 min. Oct 21 19:01:01 node1 anacron[2748]: Jobs will be executed sequentially Oct 21 19:01:01 node1 run-parts[2750]: (/etc/cron.hourly) finished 0anacron Oct 21 19:01:01 node1 CROND[2734]: (root) CMDEND (run-parts /etc/cron.hourly) Oct 21 19:43:01 node1 anacron[2748]: Job `cron.daily' started Oct 21 19:43:01 node1 anacron[2748]: Job `cron.daily' terminated [root@node1 at]# systemctl is-active crond activecrontab周性任务管理命令用法
| 参数 | 解释 | 示例 |
|---|---|---|
| -l | list 查看定时任务 | crontab -l |
| -e | edit 编辑定时任务,建议手动编辑 | crontab -e |
| -i | 删除定时任务,提示用户确认删除,避免出错 | crontab -i |
| -r | 删除定时任务,移除/var/spool/cron/username文件 | crontab -r |
| -u user | 指定用户执行任务,root 可以管理普通用户计划任务 | crontab -u redhat -l |
| 代表意义 | 分钟 | 小时 | 日期 | 月份 | 星期 | 命令 |
|---|---|---|---|---|---|---|
| 数字范围 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7(0和7表示周日) | 执行的动作 |
| 特使字符 | 含义 |
|---|---|
| * | 任意时刻 |
| - | 表示时间范围1-5 |
| ,(逗号) | 分割时段 月 1,3 |
| */数字 | 指定时间间隔的频率,如:每3分钟执行一次 |
crontab命令用法示例 ---用户级别定义(单用户)
[root@node1 at]# crontab -e no crontab for root - using an empty one crontab: installing new crontab [root@node1 at]# crontab -l # 分 时 日 月 周 任务 * * * * * touch /crontab1 [root@node1 at]# ll /crontab1 -rw-r--r--. 1 root root 0 Oct 21 20:06 /crontab1 [root@node1 at]# #清空周期性任务 [root@node1 at]# crontab -r [root@node1 at]# crontab -l #周期性任务文件位置 [root@node1 at]# ll /var/spool/cron/ total 4 -rw-------. 1 root root 25 Oct 21 20:09 root [root@node1 at]# vim /var/spool/cron/root/etc/crontab 定义周期性任务(系统级别可以是系统中任意用户定义周期性任务)
课堂练习:
定时发送邮件
企业应用场景:判断当前系统内存是否不足,如果内存使用率超过80%需要给运维管理员以邮箱方式发送警告提示
通过linux通过邮箱客户端s-nail 登录邮箱账户,能够给其他邮箱用户发送邮件
1.安装s-nail软件
[root@node1 at]# mkdir /sr0 [root@node1 at]# mount /dev/sr0 /sr0 mount: /sr0: WARNING: source write-protected, mounted read-only. 2.[root@node1 ~]# cat /etc/yum.repos.d/base.repo [AppStream] name=AppStream baseurl=file:///sr0/AppStream gpgcheck=0 [BaseOS] name=BaseOS baseurl=file:///sr0/BaseOS gpgcheck=0 3.[root@node1 ~]#dnf install s-nail -y2.在该软件软件登录邮箱账户
[root@node1 ~]# tail -6 /etc/s-nail.rc ################################################## set from=lxx1xxxxxx@163.com set smtp=smtp.163.com set smtp-auth-user=lxx1xxxxx8@163.com set smtp-auth-password=VRxxxxx set smtp-auth=login3.发送邮件
[root@node1 ~]# echo "邮件内容" | mail -s "邮件主题" lxx1065372838@163.com周期性触发定时发送邮件
[root@node1 ~]# crontab -e crontab: installing new crontab [root@node1 ~]# crontab -l 26 * * * * echo "尽快处理问题" | mail -s "内存严重不足" lxx1065372838@163.com第二章 Chrony服务器
1.服务(网络):由一方按照约定方式给用户或者主机程序提供对应功能、数据、计算能力。
服务响应方式:被动方式
OSI
应用层:数据传输的标准协议 ntp ssh http/https nfs/ftp
表示层:数据格式转换 编码
会话层:通信会话
传输层 端口:TCP 可靠传输 效率低
UDP 不可靠 高
网络层:ip 源ip 目标ip 发送 主机地址标记
数据链路层:MAC
物理接口:ens160
TCP/IP
应用层 应用层协议 +数据 chrony(ntp) http/https dns ssh chrony(ntp) nfs
传输层 端口:TCP 可靠传输 效率低
网络层 ip sip dip
物理接口 ens160
配置文件:
守护进程(daemon):不依赖终端窗口进程在主机后台运行,正常系统运行中不手动结束进程是实时运行的。
Chrony时间服务
时间管理命令:
hwclock
-s 硬件时间到系统时间
-w 系统时间到硬件时间
date 月日时分年点秒
-s 设置时间
+%F%T
timedatectl set-timezone 时区
软件程序 chrony/ntp
netstat 查看报文监听结果
-t TCP
-u UDP
ss 查看报文监听结果
软件程序 chrony
NTP (network time protocal ) 网络时间协议
守护进程(daemon):程序运行后再主机后运行,且该程序进程不依赖终端设备,不会因终端退出结束进程,只有系统重启进程才会受影响
NTP:应用层协议 网络时间协议,提供时间的查看的校验
端口:区分不同程序进行数据交互 ntp协议的端口是123/udp
配置文件介绍/etc/chrony.conf
客户端 pool 2.rhel.pool.ntp.org iburst # 池 时间服务器的主机名 初始化爆发 pool 3.rhel.pool.ntp.org iburst #上层服务器存储池 间服务器的主机名 服务端主机 # local stratum 10 #标记时间服务器主机的层级 1-16 # allow 192.168.0.0/16 #允许哪些客户端主机可以发起请求连接实验一:自定义时间服务能够给客户端主机进行时间校时
环境准备 S/C
server (linux) --- 192.168.211.131
client (linux) --- 192.168.211.132
1.server主机
1.判断chrony软件程序是否安装 2.判断软件是否启动 3.自定义软件功能(ntp时间服务器) vim /etc/chrony.conf #pool 2.rhel.pool.ntp.org iburst #当前主机的时间就是标准时间,不再通过上层服务器进行校时 allow 172.25.250.0/24 #哪些客户端主机发起校时请求 local stratum 10 #1-16 指定自定义时间服务区的层级 4.加载新的配置 systemctl restart chronyd 5.关闭防火墙,selinux systemctl stop firewalld #立即停止防火墙 systemctl disable firewalld #取消防火墙的开机自启 systemctl status firewalld #查看防火墙服务状态 setenforce 0 #临时把selinux设置为permissive(宽容模式) getenforce #查看selinux状态 Permissive 关闭 | enforce 开启 vim /etc/selinux/config SELINIUX=Permissive #永久关闭2.client
1.判断chrony软件程序是否安装 2.判断软件是否启动 3.自定义软件功能(ntp时间客户端) vim /etc/chrony.conf pool 192.168.211.131 iburst 4.辨别时间校时是否成功 date 月日时分年月点秒 5.发起时间同步请求 systemctl restart chronyd 6.判断 [root@client-146 ~]# date Fri Dec 12 10:10:38 AM CST 2025 [root@client-146 ~]# date Fri Dec 12 10:10:39 AM CST 2025 [root@client-146 ~]# date Sat Oct 24 11:46:23 AM CST 2026 [root@localhost ~]# chronyc sources -v # -v参数表示显示内容是否有解释 .-- Source mode '^' = server, '=' = peer, '#' = local clock. / .- Source state '*' = current best, '+' = combined, '-' = not combined, | / 'x' = may be in error, '~' = too variable, '?' = unusable. || .- 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 177 8 +18ms[ +19ms] +/- 48ms ^*:server 类型,当前最优同步源 Stratum 3:三层时间服务器 Poll 6:每64秒同步一次 Reach 377:最近8次全部连通 377八进制表示8次连通,八进制377 = 二进制 11111111,8位全1 LastRx 12:12秒前刚收到回复 offest -423us:本机比NTP服务器慢423微秒实验二:主机通过外网时间服务器进行校时
1.更改配置同步外网时间服务器 ntp.aliyun.com vim /etc/chrony.conf pool ntp.aliyun.com iburst 2.发起校时请求 systemctl restart chronyd 3.查看同步的服务器 [root@localhost ~]# chronyc sources -v # -v参数表示显示内容是否有解释 [root@client-146 ~]# chronyc sources MS Name/IP address Stratum Poll Reach ========================================================================== ^* 203.107.6.88 3 6 17 35ms [root@client-146 ~]# ping ntp.aliyun.com PING ntp.aliyun.com(203.107.6.88) 56(84) byte 64 bytes from 203.107.6.88 (203.107.6.88): icms问题分析
1.客户端主机和服务端主机网络互通 ping 2.包能不能正常请求 pool SERVERNAME iburst 3.服务端是否可以成功响应 allow 主机/主机网段 4.服务程序不能成功启动错误分析方式 [root@server-142 ~]# journalctl -xeu chronyd.service # 早期启动的日志结果也会记录 时间不能同步的另外两个细节: 两台主时区不一致 时间偏差过大第三章 SSH远程登陆服务
1.概念
2.telnet:能够通过当前主机远程连接对端主机通过命令行接口进行控制管理
23 / tcp 数据明文传输
搭建telnet远程连接服务支持终端主机设备,能够通过telnet进行远程连接
server (linux) --- telnet-server --- 192.168.211.131
client(windows) --- xshell --- 192.168.211.1
server端 1.部署telnet服务 dnf install telnet-server -y 2.启动服务监听23/tcp端口等待客户端主机的请求连接 systemctl start telnet.socket client xshell 发起telnet连接 [C:\~]$ telnet 192.168.211.131 Connecting to 192.168.211.131:23... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. Kernel 5.14.0-570.12.1.el9_6.x86_64 on an x86_64 localhost login: root Password: Last login: Sat Oct 24 16:07:50 from ::ffff:192.168.211.1 [root@nodel -]# dnf install wireshark -y 通过主机图形化终端启动wireshark程序 [root@nodel ~]# wireshark 16:10:23.189 Main Info Warning: Ignoring XDG_SESSION_TYPE=Wayland on Gnome. Use QT_OPALPLATFORM=wayland to run on Wayland anyway.3.ssh secure shell:能够通过当前主机远程连接对端主机通过命令行接口进行控制管理
22 / tcp 数据加密传输
实验二:部署ssh远程
openssh-clients-8.7p1-45.el9.x86_64 客户端程序名-----ssh
openssh-server-8.7p1-45.el9.x86_64 服务程序名
查看ssh程序网络监听信息 [root@localhost ~]# ss -tunlp | grep ssh tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1154,fd=3)) tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1154,fd=4)) [root@localhost ~]# netstat -tunlp | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1154/sshd: /usr/sbi tcp6 0 0 :::22 :::* LISTEN 1154/sshd: /usr/sbi 查看指定端口监听的程序 [root@localhost ~]# lsof -i:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1154 root 3u IPv4 19184 0t0 TCP *:ssh (LISTEN) sshd 1154 root 4u IPv6 19186 0t0 TCP *:ssh (LISTEN)安全加固管理
vim /etc/ssh/sshd_config Port 2222 AllowUsers 用户名1 用户名2 vim /etc/ssh/sshd_config.d/01-permitrootlogin.conf PermitRootLogin no 秘钥验证配置文件初始化:重装软件程序
编辑配置文件时:记得对配置文件进行备份
主配置
/etc/ssh/sshd_conf
/etc/ssh/ssh_conf --- 客户端的配置文件
子配置文件
/etc/ssh/sshd_config.d/*.conf
自配置文件名的数值越小级别越高优先读取
SSH建立远程连接的原理
1.tcp三次握手
2.版本协商
3.对称算法的协商阶段(数据加密算法的协商)
4.身份验证
身份伪装
数据泄露
加密算法:
对称加密算法:加密 解密用的是同一把秘钥 A秘钥---123? --- 加密&*&......&......>---B 秘钥
秘钥不允许发送
数据双向传输
数据传输的效率较高
非对称加密算法:加密解密用的是不同秘钥 私钥 --- 数据解密 公钥 --- 数据加密
私钥:留到制作端主机不允许公开发送
公钥:公开发送所有用户都能够获取
数据仅支持单向传输(身份验证)
A私钥 B公钥
公钥
密钥交换算法:Diffie-Hellman(DH)密钥交换算法 ----非对称算法
服务端验证客户端身份通过秘钥验证
服务验证客户端主机身份
1.客户端提前将自己的公钥(如~/.ssh/id_rsa.pub)上传到服务器的~/.ssh/authorized_keys 文件中;
2.验证时,服务器生成一个随机字符串,用服务端公钥加密后发送给客户端;
3.客户端用自己的私钥解密,得到随机字符串,再用会话密钥加密后返回给服务器;
4.服务器解密并对比原始随机字符串,一致则验证通过。
宿舍远程实现秘钥验证(免密登录)
预处理:2台机子都恢复快照
第一步:定位客户端,制作公私钥对
客户端:192.168.48.128
服务端:192.168.48.130
[root@nodel ~]# ssh-keygen -t rsa #一路回车第二步:定位客户端,将公钥上传到服务器端
[root@nodel ~]# ssh-copy-id root@192.168.48.130 # 输入服务端的账户及IP地址 The authenticity of host '192.168.48.130 (192.168.48.130)' can't be established. ED25519 key fingerprint is SHA256:K7nvJFkfIh+p9YytEGR44wLbTfpB0Y52oVou0UdG6nc. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes # 输Ayes /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.48.130's password: #输入服务端root账户的的密码 Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.48.130'" and check to make sure that only the key(s) you wanted were added. #注意:客户端将公钥上传到服务器端后,服务器端的/root/.ssh/authorized_keys文件会存储客户端的公钥数据第三步:客户端测试
[root@nodel ~]# ssh root@192.168.48.130 Activate the web console with: systemctl enable --now cockpit.socket Register this system with Red Hat Insights: insights-client --register Create an account or view all your systems at https://red.ht/insights-dashboard Last login: Wed Mar 22 11:31:31 2023 [root@server ~]#