OpenSSH升级9.8p1保姆教程

最近客户要做安全整改,出现了许多SSH的CVE-2024-6387 OpenSSH Server 远程代码执行漏洞,其他同行最近也在做这个漏洞的处理,我查了其他网上的资料,期间还遇到升级后SFTP无法使用的问题,最后总结了一个保姆教程

下载软件

我把安装包下载到了root目录下,也就是/root

cd ~
wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1w.tar.gz
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz

如果是离线环境还要提前准备离线yum包或系统镜像

yum -y install zlib zlib-devel gcc openssl-devel pam-devel make build-essential gcc-c++ libtool openssl openssl-devel unzip net-tools vim telnent tree pstree cmake telnet zip xz

查看现在的SSH版本:ssh -V,结果一般都是这样的:

[root@ceshi0826 ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

安装OpenSSL

卸载原有OpenSSL

yum remove openssl

编译安装OpenSSL

tar -xzvf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w/
./config --prefix=/usr

make && make install
cd ..

查看openssl版本:openssl version

[root@ceshi0826 ~]# openssl version
OpenSSL 1.1.1w  11 Sep 2023

安装OpenSSH

备份配置文件(注意备份文件路径根据实际情况选择,后面会用到)

mkdir -p /bak/ssh
cp -ra /etc/ssh/sshd_config /bak/ssh/
cp -ra /etc/pam.d/sshd /bak/ssh/

卸载原来的openssh

rpm -e --nodeps `rpm -qa | grep openssh`
rpm -qa  openssh

修改配置文件权限

chmod 600 /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ed25519_key

编译安装文件

cd ~
tar -zxvf openssh-9.8p1.tar.gz
cd openssh-9.8p1
./configure --prefix=/usr/local/openssh --exec-prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-zlib --with-selinux --with-tcp-wrappers --with-ssl-dir=/usr/local/ssl --without-hardening
# 如果编译报错可以改成
./configure --prefix=/usr/local/openssh --exec-prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-zlib --with-selinux --with-tcp-wrappers --with-ssl-dir=/usr/local --without-hardening
make && make install

拷贝新生成的sshd

cp contrib/redhat/sshd.init /etc/init.d/sshd
chmod u+x /etc/init.d/sshd

再把配置文件替换成之前备份的文件,直接覆盖

cp -ar /bak/ssh/sshd_config /etc/ssh/
cp -ar /bak/ssh/sshd /etc/pam.d/

修改配置

把安装包的文件夹移动到新的ssh安装目录下,因为之前旧的ssh和sftp已经删掉了,安装包里面包含了新的sftp,安装包移过去以后再修改一下/etc/ssh/sshd_config里sftp的路径,不然以后用不了SFTP

mv /root/openssh-9.8p1 /usr/local/openssh/
vim /etc/ssh/sshd_config
Subsystem       sftp    /usr/local/openssh/openssh-9.8p1/sftp-server

如果配置文件里的允许root远程登录是注释状态,也需要把注释去掉,不然可能出现登录不上的问题

PermitRootLogin yes

添加ssh到开机启动项,重启sshd服务

chkconfig --add sshd
chkconfig sshd on
systemctl restart sshd

看一下现在的版本

[root@ceshi0826 ~]# ssh -V
OpenSSH_9.8p1, OpenSSL 1.1.1w  11 Sep 2023
<think>好的,用户想了解C++中如何进行幂次方运算。首先,我需要回忆C++中的相关函数和方法。 首先想到的是C++标准库中的pow函数,它属于<cmath>头文件。这个函数可以处理浮点数的幂运算,比如pow(2, 3)得到8.0。但要注意,返回类型是double,所以如果需要整数结果,得进行类型转换。例如,int result = (int)pow(2, 3);。不过,用户提供的引用[1]中的代码用的是循环累乘的方法,这可能是因为直接计算整数次幂时,循环更直观且避免浮点误差。比如用户引用[1]里的例子,计算a的b次方,用for循环累乘,结果存储在整型变量c中,这样确保了结果是整数。这点需要向用户说明,特别是当底数和指数都是整数时,循环方法可能更合适。 接下来,用户引用[2]中的代码涉及递归分解幂次方,比如将整数表示为2的幂次方之和。这可能更复杂,但展示了另一种方法,特别是处理特定输出格式的情况。不过用户的问题可能更关注基础的幂运算实现,所以需要分清楚这两种情况。 然后,我需要考虑用户可能的场景。如果是初学C++,可能更倾向于使用标准库函数,但也要提醒注意事项。例如,pow函数在计算大指数时可能会有精度问题,或者当底数为负数时的行为。此外,循环和递归的方法虽然直观,但在处理大指数时效率可能不高,这时候可以提到快速幂算法,但用户提供的引用中没有提到,可能需要简要介绍,但根据用户的问题,可能不需要深入。 另外,用户可能想知道如何实现整数幂运算,特别是当结果为整数时。这时循环累乘或快速幂都是可行的方法。需要比较不同方法的优缺点,比如时间复杂度。例如,循环累乘的时间复杂度是$O(n)$,而快速幂是$O(\log n)$,更适合大指数。 还要注意用户提供的代码中,引用[1]的循环方法有一个问题,就是当指数为0时,循环不会执行,而c初始化为1,正好正确处理了a^0=1的情况。这点可以指出,说明代码的鲁棒性。 总结回答结构:先介绍标准库的pow函数,说明其用法和注意事项;然后介绍循环实现,适用于整数次幂;接着可以提到快速幂算法作为优化;最后,根据引用[2],说明如何处理特定格式的幂次方分解,但可能不是用户主要需求,所以简要提及即可。需要确保示例代码正确,比如pow函数的使用和循环的实现,同时指出类型转换的问题。</think>在C++中实现幂次方运算主要有以下方法: ### 一、使用标准库函数`pow()` 1. **语法格式** ```cpp #include <cmath> double result = pow(base, exponent); ``` 2. **特点说明** - 支持浮点数和整数运算,但返回值为`double`类型 - 计算$3^4$示例: ```cpp int main() { cout << (int)pow(3, 4); // 输出81,需显式类型转换 } ``` - 注意:计算$(-2)^3$时应使用`pow(-2, 3)`,但负数的非整数次幂会得到`nan`[^1] ### 二、循环累乘法 1. **实现原理** 通过for循环累乘实现整数幂运算: ```cpp int power(int a, int b) { int result = 1; // 初始化为1是关键,保证a^0=1 for(int i=0; i<b; ++i) { result *= a; } return result; } ``` 2. **时间复杂度** - 线性复杂度$O(n)$ - 适用于$b<10^6$的情况 ### 三、快速幂算法(优化方案) 1. **算法原理** 利用二进制分解降低时间复杂度到$O(\log n)$: ```cpp int fast_pow(int a, int b) { int res = 1; while(b > 0) { if(b & 1) res *= a; a *= a; b >>= 1; } return res; } ``` 2. **优势对比** | 方法 | 时间复杂度 | 适用场景 | |-----------|--------|--------------| | 标准库pow() | O(1) | 简单计算,可接受浮点误差 | | 循环累乘 | O(n) | 小规模整数幂 | | 快速幂 | O(logn)| 大规模指数计算 | ### 四、特殊格式输出(引用[2]方法) 针对将整数表示为2的幂次方和的特定需求: ```cpp void dfs(int s) { // 递归分解数的二进制表示 // 示例:输入137 输出"2(2(2)+2+2(0))+2(2+2(0))+2(0)" } ``` 此方法适用于特殊格式要求的幂次方表达,但需要配合递归算法实现[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值