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過程修改軟件內容這一問題。


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