部署环境:

ios openssh 软件源 openssh源码_配置文件

首先,一个问题,为什么要源码包编译安装 openssh,rpm 包安装不香吗?

# 由于安全问题,或者环境中的漏洞扫描软件扫出你当前网络中某些linux系统中的 openssh 版本过低,存在安全隐患, 需要升级到最新版本

# 然后我们到 http://rpmfind.net/ 网站搜索 openssh,发现最新的版本只有8.9(2022-5-28),但我们的需求是安装 openssh9.0

#我们在上面没有找到对应的最新版本的 rpm 包,但在官网上有相应版本的源码包,此时就需要我们进行源码包编译安装软件 

查看安装的 openssh 版本

ios openssh 软件源 openssh源码_配置文件_02

 官网查看 openssh 最新版本,最新为9.0

ios openssh 软件源 openssh源码_源码包_03

 第一步:下载 openssh 的源码包

ios openssh 软件源 openssh源码_重启_04

 第二步:安装编译所需要的软件(开发工具里包含 gcc 编译器等编译所需的软件)

ios openssh 软件源 openssh源码_配置文件_05

 第三步:解压下载的 openssh 源码包

ios openssh 软件源 openssh源码_重启_06

第四步:进入解压后的目录,解压后的目录大小为 9.7M

ios openssh 软件源 openssh源码_源码包_07

 第五步:阅读 INSTALL 文档,发现需要有 libcrypto 这个库才能安装成功

ios openssh 软件源 openssh源码_源码包_08

第六步:尝试编译安装,第一次 check 失败是因为我们没有安装 libcrypto 这个库

ios openssh 软件源 openssh源码_源码包_09

ios openssh 软件源 openssh源码_重启_10

 由第五步得知 libcrypto 这个库来自 libressl 和 openssl,因此我们查看我们安装的 opnessl

ios openssh 软件源 openssh源码_ios openssh 软件源_11

 安装的包和没有安装的包进行对比,我们需要安装 openssl-devel.x86_64 这个包

ios openssh 软件源 openssh源码_源码包_12

 安装后我们再尝试 checking

ios openssh 软件源 openssh源码_重启_13

 最后,当出现下面这些信息表示 checking 成功

ios openssh 软件源 openssh源码_配置文件_14

 然后执行 make 进行编译,当 checking 成功后,make 大概率会成功

ios openssh 软件源 openssh源码_源码包_15

 make 成功后,进行 make install 编译安装,出现以下结果表示安装成功

ios openssh 软件源 openssh源码_源码包_16

我们先禁用我们之前的 openssh8.0 服务(这条命令执行完就要小心了,因为 openssh 服务有保护机制,所以禁止该服务后这个 ssh 会话不会断开,但如果退出该会话之后就不能再通过 ssh 连接了)

ios openssh 软件源 openssh源码_重启_17

 我们从 check 那一步,可以找到我们的 openssh9.0 的安装路径,查看我们的 openssh9.0 配置文件

ios openssh 软件源 openssh源码_配置文件_18

 从上图可看出 openssh9.0 默认不支持 root 的 ssh 登录,因此我们需要开启 root 的 ssh 登录并重启 openssh9.0 对应的 sshd 服务

ios openssh 软件源 openssh源码_源码包_19

 修改完配置文件后,我们发现一个问题,就是我们 openssh9.0 没有对应 systemd 的 service 文件,所以不能用 systemctl restart sshd 这条命令,用这条命令会重启我们之前的 openssh8.0 服务,并不会重启我们的9.0服务

因此我们要自定义我们的 openssh9.0 的 service 文件,我们可以在8.0的基础上修改

ios openssh 软件源 openssh源码_源码包_20

systemd unit 文件写法

Unit部分

[Unit]:通常是配置文件的第一个 section,用来定义 Unit 的元数据以及配置与其他 Unit 的关系

Description:简短描述

Documentation:文档地址

Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败

Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败

BindsTo:与 Requires 类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行

Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动

After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动

Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行

Condition...:当前 Unit 运行必须满足的条件,否则不会运行

Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败

Install部分

[Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动

WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入 /etc/systemd/system 目录下面以 Target 名 + .wants 后缀构成的子目录中

RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入 /etc/systemd/system 目录下面以 Target 名 + .required 后缀构成的子目录中

Alias:当前 Unit 可用于启动的别名

Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit

Service部分

[Service]:只有 Service 类型的 Unit 才有这个区块

Type:定义启动时的进程行为,它有以下几种值

Type=simple:默认值,执行 ExecStart 指定的命令,启动主进程

Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出

Type=oneshot:一次性进程,systemd 会等当前服务退出,再继续往下执行

Type=dbus:当前服务通过 D-Bus 启动

Type=notify:当前服务启动完毕,会通知 systemd,再继续往下执行

Type=idle:若有其他任务执行完毕,当前服务才会运行

ExecStart:启动当前服务的命令

ExecStartPre:启动当前服务之前执行的命令

ExecStartPost:启动当前服务之后执行的命令

ExecReload:重启当前服务时执行的命令

ExecStop:停止当前服务时执行的命令

ExecStopPost:停止当其服务之后执行的命令

RestartSec:自动重启当前服务间隔的秒数

Restart:定义何种情况 systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog

TimeoutSec:定义 systemd 停止当前服务之前等待的秒数

Environment:指定环境变量

编写 service 文件

ios openssh 软件源 openssh源码_重启_21

 重载 service 文件并设置 openssh9.0 服务启动和下次开机启动

ios openssh 软件源 openssh源码_源码包_22

 到此,源码包升级安装 openssh9.0 已经完成,如果想要回滚也很简单,执行下面命令即可

ios openssh 软件源 openssh源码_配置文件_23