当前位置: 首页 > 编程日记 > 正文

centos8编译openssl-1.0.2u、openssl-1.1.1k

目录

一、给openssl-1.0.2u打包rpm

二、编译安装openssl-1.1.1k

三、给openssl-1.1.1k打包rpm(不推荐!)


近日openssl爆出拒绝服务、证书绕过漏洞,CVE编号CVE-2021-3449、CVE-2021-3450。

解决方法:
CentOS7默认openssl版本1.0.2,不受影响。
CentOS8默认openssl版本1.1.1,受影响,需要到OpenSSL1.1.1k及以上版本。

记录centos8编译打包openssl-1.0.2u、openssl-1.1.1k的过程。

一、给openssl-1.0.2u打包rpm

从官网https://www.openssl.org/source/old/1.0.2/下载openssl-1.0.2u.tar.gz,并做sha256校验。

cd rpmbuild/SOURCES/
wget https://www.openssl.org/source/old/1.0.2/openssl-1.0.2u.tar.gz
sha256sum ./openssl-1.0.2u.tar.gz
ecd0c6ffb493dd06707d38b14bb4d8c2288bb7033735606569d8f90f89669d16  ./openssl-1.0.2u.tar.gz

解压缩,把spec文件copy到SPEC目录下。

tar xvzf openssl-1.0.2u.tar.gz
cp openssl-1.0.2u/openssl.spec ../SPECS/openssl-1.0.2u.spec

编译打包openssl-1.0.2u并排错。报错Can't locate find.pl in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5,解决方案是安装依赖perl-Perl4-CoreLibs.noarch

rpmbuild -ba openssl-1.0.2u.specCan't locate find.pl in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5) at util/perlpath.pl line 7.
error: Bad exit status from /var/tmp/rpm-tmp.IaQ3r6 (%build)RPM build errors:bogus date in %changelog: Sun Jun  6 2005 Richard Levitte <richard@levitte.org>bogus date in %changelog: Tue Sep 10 1999 Damien Miller <damien@ibs.com.au>Bad exit status from /var/tmp/rpm-tmp.IaQ3r6 (%build)yum install perl-Perl4-CoreLibs.noarch

编译打包openssl-1.0.2u成功。

rpmbuild -ba --clean openssl-1.0.2u.spec
……
Wrote: /home/cnpe/rpmbuild/SRPMS/openssl-1.0.2u-1.src.rpm
Wrote: /home/cnpe/rpmbuild/RPMS/x86_64/openssl-1.0.2u-1.x86_64.rpm
Wrote: /home/cnpe/rpmbuild/RPMS/x86_64/openssl-devel-1.0.2u-1.x86_64.rpm
Wrote: /home/cnpe/rpmbuild/RPMS/x86_64/openssl-doc-1.0.2u-1.x86_64.rpm

二、编译安装openssl-1.1.1k

从官网https://www.openssl.org/source/下载openssl-1.1.1k.tar.gz,并做sha256校验,再解压缩。

wget https://www.openssl.org/source/openssl-1.1.1k.tar.gzsha256sum ./openssl-1.1.1k.tar.gz
892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5  ./openssl-1.1.1k.tar.gztar xvzf openssl-1.1.1k.tar.gz

编译安装
config生成Makefile
make编译,make test的结果一定要PASS
make install安装,或者其他选项只安装你需要的内容
如果在这些过程中提示有依赖项就安装,不OK就解决,再make clean后重新来过。

cd openssl-1.1.1k
./config
make
make test
make install

这样编译安装以后,openssl的版本升级到了1.1.1k,但是库文件仍使用原来1.1.1g版本的,不会影响使用。

openssl version
OpenSSL 1.1.1k  25 Mar 2021 (Library: OpenSSL 1.1.1g FIPS  21 Apr 2020)

三、给openssl-1.1.1k打包rpm(不推荐!动态库不兼容!)

这个包安装上以后,会导致严重的故障。

[root@test18 x86_64]# rpm --version
rpm: symbol lookup error: /lib64/librpmio.so.8: undefined symbol: EVP_md2, version OPENSSL_1_1_0[root@test18 x86_64]# yum remove openssl
Traceback (most recent call last):
......
ImportError: /lib64/libk5crypto.so.3: undefined symbol: EVP_KDF_ctrl, version OPENSSL_1_1_1b
......[root@test18 ~]# ldd /lib64/librpmio.so.8 | grep cryptolibcrypto.so.1.1 => /lib64/libcrypto.so.1.1 (0x00007f299ed70000)
[root@test18 ~]# ldd /lib64/libk5crypto.so.3 | grep cryptolibcrypto.so.1.1 => /lib64/libcrypto.so.1.1 (0x00007fea0bf97000)

原因是这种方式会替换库文件,不能替换这个库文件详细的原因在这个地方有https://github.com/openssl/openssl/issues/11471,请自行查看。

[root@test18 ~]# ll /lib64/libcrypto.so.1.1
lrwxrwxrwx. 1 root root 19 Dec 18 06:45 /lib64/libcrypto.so.1.1 -> libcrypto.so.1.1.1g
[root@test18 ~]# nm -gD /lib64/libcrypto.so.1.1 | grep EVP_KDF
0000000000170530 T EVP_KDF_ctrl
0000000000170620 T EVP_KDF_ctrl_str
0000000000170370 T EVP_KDF_CTX_free
00000000001703b0 T EVP_KDF_CTX_new_id
00000000001706e0 T EVP_KDF_derive
00000000001704d0 T EVP_KDF_reset
00000000001706b0 T EVP_KDF_size
0000000000170500 T EVP_KDF_vctrl[root@test18 x86_64]# ll /lib64/libcrypto.so.1.1
lrwxrwxrwx. 1 root root 19 Apr  5 12:58 /lib64/libcrypto.so.1.1 -> libcrypto.so.1.1.1k
[root@test18 x86_64]# nm -gD /lib64/libcrypto.so.1.1 | grep EVP_KDF
Nothing!!!

这里只是记录编译打包的过程,不推荐使用!

从官网https://www.openssl.org/source/下载openssl-1.1.1k.tar.gz,并做sha256校验。解压缩,发现这个版本没有现成的spec文件。经查证在http://rpmfind.net/可以找到openssl-1.1.1g-12.el8.src.rpm这个包,这个包里面有1.1.1g版本的spec文件,可以找来使用。
该rpm文件cpio提取归档文件不会生成目录,因此建立一个目录存放,再下载。

mkdir openssl-1.1.1g-src
cd openssl-1.1.1g-src/
wget http://vault.centos.org/8.3.2011/BaseOS/Source/SPackages/openssl-1.1.1g-12.el8_3.src.rpm
rpm2cpio openssl-1.1.1g-12.el8_3.src.rpm | cpio -duim

提取的文件很多,把其中的openssl.spec拷贝到rpmbuild/SPECS目录下,并编辑openssl-1.1.1k.spec,修改源代码文件、版本、删除不需要的内容,最终形成openssl-1.1.1k.spec文件,内容如下。

# For the curious:
# 0.9.5a soversion = 0
# 0.9.6  soversion = 1
# 0.9.6a soversion = 2
# 0.9.6c soversion = 3
# 0.9.7a soversion = 4
# 0.9.7ef soversion = 5
# 0.9.8ab soversion = 6
# 0.9.8g soversion = 7
# 0.9.8jk + EAP-FAST soversion = 8
# 1.0.0 soversion = 10
# 1.1.0 soversion = 1.1 (same as upstream although presence of some symbols
#                        depends on build configuration options)
%define soversion 1.1
%define debug_package %{nil}Summary: Utilities from the general purpose cryptography library with TLS implementation
Name: openssl
Version: 1.1.1k
Release: 1%{?dist}
Epoch: 1
License: OpenSSL and ASL 2.0
URL: http://www.openssl.org/
BuildRequires: gcc
BuildRequires: coreutils, perl-interpreter, sed, zlib-devel, /usr/bin/cmp
BuildRequires: lksctp-tools-devel
BuildRequires: /usr/bin/rename
BuildRequires: /usr/bin/pod2man
BuildRequires: /usr/sbin/sysctl
BuildRequires: perl(Test::Harness), perl(Test::More), perl(Math::BigInt)
BuildRequires: perl(Module::Load::Conditional), perl(File::Temp)
BuildRequires: perl(Time::HiRes)
BuildRequires: perl(FindBin), perl(lib), perl(File::Compare), perl(File::Copy)
Requires: coreutils
Requires: %{name}-libs%{?_isa} = %{epoch}:%{version}-%{release}
Source0:openssl-%{version}.tar.gz%description
The OpenSSL toolkit provides support for secure communications between
machines. OpenSSL includes a certificate management tool and shared
libraries which provide various cryptographic algorithms and
protocols.%package libs
Summary: A general purpose cryptography library with TLS implementation
Requires: ca-certificates >= 2008-5
Requires: crypto-policies >= 20180730
Recommends: openssl-pkcs11%{?_isa}
# Needed obsoletes due to the base/lib subpackage split
Obsoletes: openssl < 1:1.0.1-0.3.beta3
Obsoletes: openssl-fips < 1:1.0.1e-28
Provides: openssl-fips = %{epoch}:%{version}-%{release}%description libs
OpenSSL is a toolkit for supporting cryptography. The openssl-libs
package contains the libraries that are used by various applications which
support cryptographic algorithms and protocols.%package devel
Summary: Files for development of applications which will use OpenSSL
Requires: %{name}-libs%{?_isa} = %{epoch}:%{version}-%{release}
Requires: krb5-devel%{?_isa}, zlib-devel%{?_isa}
Requires: pkgconfig%description devel
OpenSSL is a toolkit for supporting cryptography. The openssl-devel
package contains include files needed to develop applications which
support various cryptographic algorithms and protocols.%package static
Summary:  Libraries for static linking of applications which will use OpenSSL
Requires: %{name}-devel%{?_isa} = %{epoch}:%{version}-%{release}%description static
OpenSSL is a toolkit for supporting cryptography. The openssl-static
package contains static libraries needed for static linking of
applications which support various cryptographic algorithms and
protocols.%package perl
Summary: Perl scripts provided with OpenSSL
Requires: perl-interpreter
Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release}%description perl
OpenSSL is a toolkit for supporting cryptography. The openssl-perl
package provides Perl scripts for converting certificates and keys
from other formats to the formats used by the OpenSSL toolkit.%prep
%setup -q -n %{name}-%{version}%build
#./config \
#	--prefix=/usr/bin \
#	--openssldir=/etc/pki/tls \
#	--libdir=/usr/lib64 \#./config \
#	--prefix=%{_bindir} \
#	--openssldir=%{_sysconfdir}/pki/tls \
#	--libdir=%{_prefix}/lib64 \./config \--prefix=%{_prefix} \--openssldir=%{_sysconfdir}/pki/tls \make all# Clean up the .pc files
#for i in libcrypto.pc libssl.pc openssl.pc ; do
#  sed -i '/^Libs.private:/{s/-L[^ ]* //;s/-Wl[^ ]* //}' $i
#done%check
# Verify that what was compiled actually works.
make test%install
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
# Install OpenSSL.
install -d $RPM_BUILD_ROOT{%{_bindir},%{_includedir},%{_libdir},%{_mandir},%{_libdir}/openssl,%{_pkgdocdir}}
make DESTDIR=$RPM_BUILD_ROOT install
make DESTDIR=$RPM_BUILD_ROOT uninstall_html_docs
rename so.%{soversion} so.%{version} $RPM_BUILD_ROOT%{_libdir}/*.so.%{soversion}
for lib in $RPM_BUILD_ROOT%{_libdir}/*.so.%{version} ; dochmod 755 ${lib}ln -s -f `basename ${lib}` $RPM_BUILD_ROOT%{_libdir}/`basename ${lib} .%{version}`ln -s -f `basename ${lib}` $RPM_BUILD_ROOT%{_libdir}/`basename ${lib} .%{version}`.%{soversion}
done# Install a makefile for generating keys and self-signed certs, and a script
# for generating them on the fly.
#mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/pki/tls/certs
#install -m644 %{SOURCE2} $RPM_BUILD_ROOT%{_pkgdocdir}/Makefile.certificate
#install -m755 %{SOURCE6} $RPM_BUILD_ROOT%{_bindir}/make-dummy-cert
#install -m755 %{SOURCE7} $RPM_BUILD_ROOT%{_bindir}/renew-dummy-cert# Move runable perl scripts to bindir
mv $RPM_BUILD_ROOT%{_sysconfdir}/pki/tls/misc/*.pl $RPM_BUILD_ROOT%{_bindir}
mv $RPM_BUILD_ROOT%{_sysconfdir}/pki/tls/misc/tsget $RPM_BUILD_ROOT%{_bindir}# Rename man pages so that they don't conflict with other system man pages.
pushd $RPM_BUILD_ROOT%{_mandir}
ln -s -f config.5 man5/openssl.cnf.5
for manpage in man*/* ; doif [ -L ${manpage} ]; thenTARGET=`ls -l ${manpage} | awk '{ print $NF }'`ln -snf ${TARGET}ssl ${manpage}sslrm -f ${manpage}elsemv ${manpage} ${manpage}sslfi
done
for conflict in passwd rand ; dorename ${conflict} ssl${conflict} man*/${conflict}*
# Fix dangling symlinksmanpage=man1/openssl-${conflict}.*if [ -L ${manpage} ] ; thenln -snf ssl${conflict}.1ssl ${manpage}fi
done
popdmkdir -m755 $RPM_BUILD_ROOT%{_sysconfdir}/pki/CA
mkdir -m700 $RPM_BUILD_ROOT%{_sysconfdir}/pki/CA/private
mkdir -m755 $RPM_BUILD_ROOT%{_sysconfdir}/pki/CA/certs
mkdir -m755 $RPM_BUILD_ROOT%{_sysconfdir}/pki/CA/crl
mkdir -m755 $RPM_BUILD_ROOT%{_sysconfdir}/pki/CA/newcerts# Ensure the config file timestamps are identical across builds to avoid
# mulitlib conflicts and unnecessary renames on upgrade
#touch -r %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/pki/tls/openssl.cnf
#touch -r %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/pki/tls/ct_log_list.cnfrm -f $RPM_BUILD_ROOT%{_sysconfdir}/pki/tls/openssl.cnf.dist
rm -f $RPM_BUILD_ROOT%{_sysconfdir}/pki/tls/ct_log_list.cnf.dist# Determine which arch opensslconf.h is going to try to #include.
basearch=%{_arch}
%ifarch %{ix86}
basearch=i386
%endif
%ifarch sparcv9
basearch=sparc
%endif
%ifarch sparc64
basearch=sparc64
%endif%ifarch %{multilib_arches}
# Do an opensslconf.h switcheroo to avoid file conflicts on systems where you
# can have both a 32- and 64-bit version of the library, and they each need
# their own correct-but-different versions of opensslconf.h to be usable.
install -m644 %{SOURCE10} \$RPM_BUILD_ROOT/%{_prefix}/include/openssl/opensslconf-${basearch}.h
cat $RPM_BUILD_ROOT/%{_prefix}/include/openssl/opensslconf.h >> \$RPM_BUILD_ROOT/%{_prefix}/include/openssl/opensslconf-${basearch}.h
install -m644 %{SOURCE9} \$RPM_BUILD_ROOT/%{_prefix}/include/openssl/opensslconf.h
%endif
LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export LD_LIBRARY_PATH%files
%{!?_licensedir:%global license %%doc}
%license LICENSE
%doc FAQ NEWS README README.FIPS
%{_bindir}/openssl
%{_mandir}/man1*/*
%{_mandir}/man5*/*
%{_mandir}/man7*/*
%exclude %{_mandir}/man1*/*.pl*
%exclude %{_mandir}/man1*/c_rehash*
%exclude %{_mandir}/man1*/tsget*
%exclude %{_mandir}/man1*/openssl-tsget*%files libs
%{!?_licensedir:%global license %%doc}
%license LICENSE
%dir %{_sysconfdir}/pki/tls
%dir %{_sysconfdir}/pki/tls/certs
%dir %{_sysconfdir}/pki/tls/misc
%dir %{_sysconfdir}/pki/tls/private
%config(noreplace) %{_sysconfdir}/pki/tls/openssl.cnf
%config(noreplace) %{_sysconfdir}/pki/tls/ct_log_list.cnf
%attr(0755,root,root) %{_libdir}/libcrypto.so.%{version}
%attr(0755,root,root) %{_libdir}/libcrypto.so.%{soversion}
%attr(0755,root,root) %{_libdir}/libssl.so.%{version}
%attr(0755,root,root) %{_libdir}/libssl.so.%{soversion}
%attr(0755,root,root) %{_libdir}/engines-%{soversion}%files devel
%doc CHANGES doc/dir-locals.example.el doc/openssl-c-indent.el
%{_prefix}/include/openssl
%{_libdir}/*.so
%{_mandir}/man3*/*
%{_libdir}/pkgconfig/*.pc%files static
%{_libdir}/*.a%files perl
%{_bindir}/c_rehash
%{_bindir}/*.pl
%{_bindir}/tsget
%{_mandir}/man1*/*.pl*
%{_mandir}/man1*/c_rehash*
%{_mandir}/man1*/tsget*
%{_mandir}/man1*/openssl-tsget*
%dir %{_sysconfdir}/pki/CA
%dir %{_sysconfdir}/pki/CA/private
%dir %{_sysconfdir}/pki/CA/certs
%dir %{_sysconfdir}/pki/CA/crl
%dir %{_sysconfdir}/pki/CA/newcerts%post libs -p /sbin/ldconfig%postun libs -p /sbin/ldconfig%changelog

然后rpmbuild -ba --clean openssl-1.1.1k.spec,得到openssl-1.1.1k的rpm包。

rpmbuild -ba --clean openssl-1.1.1k.spec
......
Wrote: /home/cnpe/rpmbuild/SRPMS/openssl-1.1.1k-1.el8.src.rpm
Wrote: /home/cnpe/rpmbuild/RPMS/x86_64/openssl-1.1.1k-1.el8.x86_64.rpm
Wrote: /home/cnpe/rpmbuild/RPMS/x86_64/openssl-libs-1.1.1k-1.el8.x86_64.rpm
Wrote: /home/cnpe/rpmbuild/RPMS/x86_64/openssl-devel-1.1.1k-1.el8.x86_64.rpm
Wrote: /home/cnpe/rpmbuild/RPMS/x86_64/openssl-static-1.1.1k-1.el8.x86_64.rpm
Wrote: /home/cnpe/rpmbuild/RPMS/x86_64/openssl-perl-1.1.1k-1.el8.x86_64.rpm
......

相关文章:

jquery 1.7.2源码解析(二)构造jquery对象

构造jquery对象 jQuery对象是一个类数组对象。 一&#xff09;构造函数jQuery() 构造函数的7种用法: 1.jQuery(selector [, context ]) 传入字符串参数&#xff1a;检查该字符串是选择器表达式还是HTML代码。如果是选择器表达式&#xff0c;则遍历文档查找匹配的DOM元素&#x…

Map接口及其常用方法

Map集合基于键(key)和值(value)的映射&#xff0c;每个键只能映射一个值&#xff0c;也就是说key不可以重复&#xff08;当然喽&#xff0c;重复的话就按最后一个为准&#xff09;。键和值都可以是任何引用数据类型的值&#xff1b;且一对键值的存放是无序的。 Map常用的实现类…

C++计时函数

推荐使用chrono计时函数 #include<iostream> #include<vector> #include<algorithm> #include<chrono> using namespace std; class mycom { public:bool operator()(pair<int,int> p1,pair<int,int> p2){return p1.first < p2.first;…

最长递增子序列的两种解法

以LeetCode-300为例&#xff1a; O(n^2)解法&#xff1a; dp数组表示以i结尾的最长递增子序列的长度 class Solution { public:int lengthOfLIS(vector<int>& nums) {const int size nums.size();if (size 0) { return 0; } vector<int> dp(size, 1);int res…

【救援过程】升级openssl导致libcrypto.so.1.1动态库不可用

目录 一、故障重现 二、救援过程 一、故障重现 近日为了解决CVE-2021-3449: 拒绝服务漏洞、CVE-2021-3450: 证书校验漏洞&#xff0c;自己编译了openssl-1.1.1k。 亲测发现&#xff1a;只升级openssl的版本&#xff0c;动态库版本没有升级&#xff0c;系统可用。 升级openss…

C++类class

一、定义 构造函数&#xff1a;在定义一个类对象时会自动调用&#xff0c;可用于实现一些功能&#xff0c;比如new一个内存。 构造函数&#xff0c;没有返回值也不写void函数名称与类名相同构造函数可以有参数&#xff0c;因此可以发生重载程序在调用对象时候会自动调用构造&…

pandas学习之Series结构

#!/usr/bin/env python # -*- coding:utf-8 -*- """ 系列&#xff08;值的集合&#xff09; DataFrame数据包&#xff08;系列对象的集合&#xff09; panel&#xff08;数据文件对象的集合) 一个系列对象可以保存许多数据类型&#xff0c;包括 浮点数表示浮点数…

Java中的Map集合遍历总结(详尽版)

因为Map集合中的键值对排列无序&#xff0c;所以不能用传统的for循环来遍历&#xff0c;只能使用加强循环(for-each)和迭代器进行遍历。 让我们通过例子来了解Map集合的遍历&#xff1a; package gather; import java.util.HashMap; import java.util.Iterator; import java.…

Ansible01-Ansible基础和部署

目录 一、Ansible简介 二、安装部署Ansible 2.1、在控制节点安装ansible 2.2、对Linux和Unix受管节点要求 2.3、基于 Microsoft Windows 的受管主机 2.4、受管网络设备 三、Ansible配置文件 3.1、ansible.cfg配置文件推荐做法 3.2、ansible.cfg配置文件内容 四、Ansi…

C++/C文件读取

1、C文件操作 ofstream&#xff1a;写操作ifstream&#xff1a; 读操作fstream &#xff1a; 读写操作 打开方式解释ios::in为读文件而打开文件ios::out为写文件而打开文件ios::ate初始位置&#xff1a;文件尾ios::app追加方式写文件ios::trunc如果文件存在先删除&#xff0c…

HashSet中的add()方法( 二 )(详尽版)

本篇接着上一篇&#xff1a;&#xff08;详尽版&#xff09;HashSet中的add()方法( 一 )&#xff08;详尽版&#xff09; 有些东西上一篇说过了&#xff0c;这里就不再赘述了&#xff0c;具体说一下再次添加与第一次添加的区别&#xff1a; import java.util.HashSet;public …

20155321 实验四 Android程序设计

20155321 实验四 Android程序设计 安装Android studio成功 任务一&#xff1a;Android Stuidio的安装测试&#xff1a; 参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十四章&#xff1a; 安装 Android Stuidio完成Hello World, 要求修改res目录…

Ansible02-实施playbook

一、编写和运行playbook 1.1、编写playbook play 是针对清单中选定的主机运行的一组有序任务。playbook 是一个文本文件&#xff0c;其中包含由一个或多个按特定顺序运行的 play 组成的列表。 playbook 是以 YAML 格式编写的文本文件&#xff0c;通常使用扩展名 .yml 保存。…

linux下解压缩文件中文乱码问题的解决

在windows上压缩的文件&#xff0c;是以系统默认编码中文来压缩文件。由于zip文件中没有声明其编码&#xff0c;所以linux上的unzip一般以默认编码解压&#xff0c;中文文件名会出现乱码。 虽然2005年就有人把这报告为bug, 但是info-zip的官方网站没有把自动识别编码列入计划&a…

ROS知识点总结

1、ROS功能包的目录下不能有中文 2、 WorkSpace --- 自定义的工作空间|--- build:编译空间&#xff0c;用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。|--- devel:开发空间&#xff0c;用于存放编译后生成的目标文件&#xff0c;包括头文件、动态&静态链接库…

Effective Java:对于全部对象都通用的方法

前言&#xff1a; 读这本书第1条规则的时候就感觉到这是一本非常好的书。可以把我们的Java功底提升一个档次&#xff0c;我还是比較推荐的。这里我主要就关于覆盖equals、hashCode和toString方法来做一个笔记总结。希望可以与君共勉。 概述&#xff1a; 这一章主要是说明一些对…

HashSet中的add()方法( 一 )(详尽版)

让我们用例子来理解add()方法的底层代码吧&#xff0c;Let’s go&#xff1a; import java.util.HashSet;public class Test {public static void main(String[] args) {HashSet<String> names new HashSet<String>();names.add("Jim");//向HashMap集合…

Ansible03-管理变量、加密、事实

目录 一、管理变量 1.1、变量的基本用法 1.2、使用已注册变量捕获命令输出 二、管理加密 2.1、ansible-vault常用场景 三、管理事实 3.1、事实基本用法 3.2、创建自定义事实 3.3、魔法变量hostvars、group_names、groups、inventory_hostname 一、管理变量 1.1、变量…

HashSet中的add()方法( 零 )(详尽版)

我们知道在使用HashSet集合时&#xff0c;也就是在用HashMap集合&#xff0c;这是因为HashSet的底层是HashMap&#xff0c; public HashSet() {map new HashMap<>(); }在详述HashSet中的add()方法之前&#xff0c;我们要知道HashMap中的hash&#xff0c;因为在add()的底…

layui上传图片接口

mvc中 前台调用接口 url&#xff1a;"../upload/uploadfiles/" 然后开始接口 代码&#xff1a; string a ""; try { HttpFileCollection file context.Request.Files;//获取选中的文件 for (int i 0; i < file.Count; i) { string cFileName Path.G…

shell与 .sh文件与 .bash文件

一、shell和bash shell是LInux系统下的解释器&#xff0c;类似于windows下的cmd。shell对用户输入到窗口中的命令行进行解释&#xff0c;输入到内核。 bash同样是Linux系统下的解释器&#xff0c;是bash的改进版。 二、.sh文件与.bash文件 .sh文件和.bash文件都是脚本文件&a…

php session存入redis

一、 安装phpredis扩展php连接redis需要安装phpredis扩展。下载地址&#xff1a;https://github.com/phpredis/phpredis/releases&#xff0c;选用相应版本。笔者用的是php5.6.29&#xff0c;下载了phpredis-3.0.0安装出了问题&#xff0c;于是换成phpredis-2.2.8&#xff0c;正…

Ansible04-任务控制

目录 一、循环 二、条件 三、handlers 四、失败的处理 一、循环 使用 loop 关键字对一组项目迭代任务&#xff0c;循环变量 item 保存每个迭代过程中使用的值。 [studentworkstation ansible]$ vim loop.yml --- - name: Test loophosts: devgather_facts: novars:num:- …

HashSet中的add()方法( 三 )(详尽版)

上接HashSet中的add()方法( 二 )&#xff08;详尽版&#xff09; &#xff0c;前两篇说的是泛型为String类的add()方法的具体执行过程&#xff0c;此后三篇说说泛型为自定义类的add()方法的具体执行过程&#xff1a; 首先让我们来自定义一个学生类&#xff1a; public class …

mono修改配置

当前mono安装目录为:/home/mono&#xff0c;安装成功后修改配置需进入这个路径&#xff1a; cd /home/mono 1.修改TcpBinaryFrameManager.cs文件 cd /home/mono/mono-2.10.8 vim mcs/class/System.ServiceModel/System.ServiceModel.Channels.NetTcp/TcpBinaryFrameManager.cs …

[Java in NetBeans] Lesson 01. Java Programming Basics

这个课程的参考视频在youtube。 主要学到的知识点有&#xff1a; Create new project, choose Java Application.one .jar file/ package(.jar name with the same as package), one package can contains mutiple .java files.Comment mutiple lines by using "/* */&quo…

ubuntu中常用指令

常用指令 清空命令行 CtrlL Conda 创建虚拟环境 conda create -n 虚拟环境名称 python3.7.10 查看虚拟环境列表 conda info --envs 激活虚拟环境 conda activate 虚拟环境名 退出虚拟环境 conda deactivate 虚拟环境名称 安装功能包 conda install 功能包名称 卸载功能包 con…

Ansible05-部署文件

目录 一、部署文件的常用模块 二、使用jinja2文件部署自定义文件 一、部署文件的常用模块 部署文件常用模块有 file 创建、删除文件或目录&#xff0c;修改selinux上下文。copy 复制文件到受控节点上&#xff0c;也可以直接在受控结点上创建文件。fetch 从受控结点获取文件…

HashSet中的add()方法( 四 )(详尽版)

上接 HashSet中的add()方法( 三 )&#xff08;详尽版&#xff09; &#xff0c;我们重写一下Student类中的hashCode()方法来看看是否还能不能添加重复的学号了&#xff0c; 在学生类中重写hashCode()方法&#xff1a; public class Student {private String id;public Studen…

Laravel框架中的event事件操作

有时候当我们单纯的看 Laravel 手册的时候会有一些疑惑&#xff0c;比如说系统服务下的授权和事件&#xff0c;这些功能服务的应用场景是什么&#xff0c;其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情&#xff0c;但是当我们在工作中多加思考会发现有时候这些服务…