rhel6编译ssh的src.rpm包并修改spec参数

  安全扫描要求屏蔽ssh版本信息,也就是说在你ssh -V的时候,不能够显示ssh的版本信息,我之后在网上查找了一些资料,都说需要使用tar包安装ssh,并在解压之后修改sshd.c文件,将version部分进行修

改,我这个项目中有700多台设备,所以需要使用rpm包,之后通过脚本来进行升级ssh的操作。

  那如何将tar包变成rpm包呢,使用rpmbuild工具是可以将tar包编译成rpm包的,但我没这么做,我从rhn上下载了ssh的src.rpm包,我觉得这个更可靠,毕竟是redhat发布的,并且这个ssh包的版本也符合安

全整改的要求。

  我之后下载了openssh-5.3p1-114.el6_7.src.rpm,之后步骤如下:


step1:rpm -ivh 安装src.rpm

rpm -ivh openssh-5.3p1-114.el6_7.src.rpm


step2:安装rpmbuild的环境

yum install compat-gcc* gcc* rpm-build rpm-devel rpm-libs 其他包忘了,可以在网上找相应的文章


step3:第一步之后会在/root下生成一个rpmbuild目录,自动创建几个目录,你也不用手动创建其他的目录,因为你在编译的过程中rpmbuild会自动创建齐全如下6个目录:

BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS


BUILD和BUILDROOT是编译过程中需要的目录,其中BUILDROOT是中间过程目录

RPMS是编译完成后生成的rpm包的存放地址

SOURCES是编译过程在自动解压后,存放解压文件的目录

SPECS目录很重要,是你制作或修改spec文件的存放目录

SRPMS是存放.src.rpm文件的目录

关于这些目录和rpmbuild的工作原理,这里就不详细说了,具体可以参考网上其他文章


step4:修改spec文件===这步是重点,本文会详细描述。在修改过程中遇到了几个问题,一并记录如下。

############################################

【spec中各主要部分说明如下】

%pre和%setup和%patch    -bp  解压tar包,并应用补丁

%setup通常是从/usr/src/asianux/SOURCES里的包解压到/usr/src/asianux/BUILD/%{name}-%{version}中。

%build            -bc  build。等于tar包的make===在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make的工作

%configure     执行源代码的configure配置在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行

%instal            -bi  make install===在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make install的操作

                       -bb 是构建一个binary包;===执行了所有过程

                       -ba 是构建一个binary包和一个source包===执行了所有过程

%files 定义那些文件或目录会放入rpm中

%defattr (-,root,root) 指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755

bp=tar+copy

bc=configure+make

bi=make install

%file是将所有的文件、包都做成rpm形式

bb=bp+bc+bi

ba=bp+bc+bi+bb

############################################


我最初的设想是这样的:

    先执行-bp,将源码解压到BUILD目录

    之后修改sshd.c

    之后修改spec文件,注释掉%pre、%setup、%patch部分

    之后执行-bb,因为-bb包括了-bp/-bc/-bi等步骤,所以之前注释掉%pre,%setup,%patch部分后就会使用修改后的sshd.c文件来执行%build步骤、%configure步骤和%instal、%file步骤了


后来发现rpmbuild -bb或-ba都不行,因为bb=bp+bc+bi,ba更狠,还加上了bb,这个过程会将你之前解压出来的修改后的sshd.c给覆盖掉======【这也是这篇文章要解决的核心问题】


后来我又想,有没有什么参数,可以跳过-bb和-ba过程中的bp、bc步骤呢,也就是这样:

    首先我用-bp解压,并将解压后的各种文件拷贝到相关目录(自动的进行),例如spec文件拷贝到SPEC目录,其他文件拷贝到BUILD目录或者SOURCE===执行rpm -ivh ssh.src.rpm即可

    之后修改sshd.c文件

    之后修改iaspec文件

    之后用某个特殊的参数执行rpmbuild -bb或-ba,让-bb或-ba跳过解压和configure、make步骤,后来发现,根本不好使。


是有2个参数,--nobuild和--short-circuit,命令如下:rpmbuild -bb spec --nobuild;或者rpmbuild --short-circuit -bi spec,但结果不行

之后我又查看了一下rpmbuild文档,上边说rpmbuild的过程支持使用脚本,这是个大好消息!!!这样就可以在spec文件中调用脚本了,问题解决了。如下:

########################

%prep段

这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。%prep和下面的%build,%install段一样,除了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令

,命令可以有很多行,如我们常写的tar解包命令。

########################

我在%configure 行的前边添加了如下两行:

sed -i s#'snprintf(buf, sizeof buf, "SSH-%d.%d-%.100s%s", major, minor,'#'snprintf(buf, sizeof buf, "goodbye");'#g sshd.c

sed -i '/(options.show_patchlevel == 1) ? SSH_VENDOR_PATCHLEVEL : SSH_VERSION, newline);/ d' sshd.c

之后会执行step5


step5:rpmbuild -ba openssh.spec


step6:之后到RPMS目录,就可以yum localinstall openssh-5.3p1-114.el6.x86_64.rpm

注意:会编译出很多包,如下,可以都一起安装,也可以只安装ssh


[root@scd1 x86_64]# ls

openssh-5.3p1-114.el6.x86_64.rpm            openssh-ldap-5.3p1-114.el6.x86_64.rpm

openssh-askpass-5.3p1-114.el6.x86_64.rpm    openssh-server-5.3p1-114.el6.x86_64.rpm

openssh-clients-5.3p1-114.el6.x86_64.rpm    pam_ssh_agent_auth-0.9.3-114.el6.x86_64.rpm

openssh-debuginfo-5.3p1-114.el6.x86_64.rpm


安装更新完毕,我又在另一个节点上"ssh -V 更新ssh的节点ip"   试了一下,发现还是有版本信息,可见,网上的这种方法不行,不能屏蔽ssh版本信息,但确实解决了rpmbuild过程修改软件内容这一问题。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章