部署环境:
首先,一个问题,为什么要源码包编译安装 openssh,rpm 包安装不香吗?
# 由于安全问题,或者环境中的漏洞扫描软件扫出你当前网络中某些linux系统中的 openssh 版本过低,存在安全隐患, 需要升级到最新版本
# 然后我们到 http://rpmfind.net/ 网站搜索 openssh,发现最新的版本只有8.9(2022-5-28),但我们的需求是安装 openssh9.0
#我们在上面没有找到对应的最新版本的 rpm 包,但在官网上有相应版本的源码包,此时就需要我们进行源码包编译安装软件
查看安装的 openssh 版本
官网查看 openssh 最新版本,最新为9.0
第一步:下载 openssh 的源码包
第二步:安装编译所需要的软件(开发工具里包含 gcc 编译器等编译所需的软件)
第三步:解压下载的 openssh 源码包
第四步:进入解压后的目录,解压后的目录大小为 9.7M
第五步:阅读 INSTALL 文档,发现需要有 libcrypto 这个库才能安装成功
第六步:尝试编译安装,第一次 check 失败是因为我们没有安装 libcrypto 这个库
由第五步得知 libcrypto 这个库来自 libressl 和 openssl,因此我们查看我们安装的 opnessl
安装的包和没有安装的包进行对比,我们需要安装 openssl-devel.x86_64 这个包
安装后我们再尝试 checking
最后,当出现下面这些信息表示 checking 成功
然后执行 make 进行编译,当 checking 成功后,make 大概率会成功
make 成功后,进行 make install 编译安装,出现以下结果表示安装成功
我们先禁用我们之前的 openssh8.0 服务(这条命令执行完就要小心了,因为 openssh 服务有保护机制,所以禁止该服务后这个 ssh 会话不会断开,但如果退出该会话之后就不能再通过 ssh 连接了)
我们从 check 那一步,可以找到我们的 openssh9.0 的安装路径,查看我们的 openssh9.0 配置文件
从上图可看出 openssh9.0 默认不支持 root 的 ssh 登录,因此我们需要开启 root 的 ssh 登录并重启 openssh9.0 对应的 sshd 服务
修改完配置文件后,我们发现一个问题,就是我们 openssh9.0 没有对应 systemd 的 service 文件,所以不能用 systemctl restart sshd 这条命令,用这条命令会重启我们之前的 openssh8.0 服务,并不会重启我们的9.0服务
因此我们要自定义我们的 openssh9.0 的 service 文件,我们可以在8.0的基础上修改
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 文件
重载 service 文件并设置 openssh9.0 服务启动和下次开机启动
到此,源码包升级安装 openssh9.0 已经完成,如果想要回滚也很简单,执行下面命令即可