概述
在Linux下進行腳本開發,以及系統維護大多少不了rpm命令的身影。常見的yum命令更是基於rpm命令之上的,接下來就讓我簡單介紹一下rpm命令,並用rpm命令簡單開發一個刷取訪問量的腳本程序。
rpm命令
rpm命令是RPM軟件包的管理工具,rpm原本是Red Hat Linux發行版專門用來管理Linux各項套件的程序,由於它遵循GPL規則且功能強大方便,因而廣受歡迎並逐漸受到其他發行版的採用。
語法:rpm 【參數】 【包名】
參數 | 功能 |
---|---|
-a | 查詢所有套件 |
-c | 只列出組態配置文件,本參數需配合"-l"參數使用 |
-d | 只列出文本文件,本參數需配合"-l"參數使用 |
-e【套件檔】 | 刪除指定的套件 |
-f【文件】+ | 查詢擁有指定文件的套件 |
-h | 套件安裝時列出標記 |
-i | 顯示套件的相關信息 |
-i【套件檔】 | 安裝指定的套件檔 |
-l | 顯示套件的文件列表 |
-p【套件檔】+ | 查詢指定的RPM套件檔 |
-q | 使用詢問模式,當遇到任何問題時,rpm指令會先詢問用戶 |
-R | 顯示套件的關聯性信息 |
-s | 顯示文件狀態,本參數需配合"-l"參數使用 |
-U【套件檔】 | 升級指定的套件檔 |
-v | 顯示指令執行過程 |
-vv | 詳細顯示指令執行過程,便於排錯 |
示例:
首先找到目標rpm包,然後利用 -i 命令安裝該目標軟件
[root@localhost x86_64]# ls
myhello-1.0-0.el7.x86_64.rpm
[root@localhost x86_64]# rpm -i myhello-1.0-0.el7.x86_64.rpm
通過 -ql 組合命令產看軟件安裝情況,最後用 -e 命令卸載
[root@localhost x86_64]# rpm -ql myhello
/usr/bin/myhello
[root@localhost x86_64]# rpm -e myhello
[root@localhost x86_64]# rpm -ql myhello
package myhello is not installed
[root@localhost x86_64]#
圖示:
rpm包製作流程
寫目標腳本
將腳本代碼書寫如下:
1 #!/usr/bin/python3
2 import requests
3 import time
4 url = ['https://blog.csdn.net/qq_42452450/article/details/104617518','https://blog.csdn.net/qq_42452450/article/details /104719646'] #訪問鏈接可以多個
5 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3 683.103 Safari/537.36'}
6 num = 0 #定義刷取次數
7 countUrl = len(url) #獲取鏈接數量
8 while num < 100:
9 try:
10 for i in range(countUrl): #按照鏈接數量訪問
11 response = requests.get(url[i], headers=headers)
12 if response.status_code == 200:
13 num = num + 1
14 print('成功訪問 ' + str(num), '次')
15 time.sleep(60) #由於網站cookie針對同一限制需要隔一段時間(60s)
16 except Exception:
17 print('訪問失敗請稍後!')
18 time.sleep(60)
腳本書寫完畢可以利用 pyinstall -F命令編譯運行,也可以利用chmod u+x增加執行權限運行(編譯運行可執行文件爲爲二進制文件且代碼不可見,增加權限執行爲普通可執行文件且代碼可見)
注:如果運行出現requests模塊未安裝問題請點擊下列鏈接查看https://blog.csdn.net/qq_42452450/article/details/104781623
rpm製作前的準備工作
軟件準備
請利用下列命令安裝下列軟件:
命令 | 軟件功能 |
---|---|
pip3 install pyinstaller | 編譯python程序 |
yum install rpmdevtools | 創建rpm製作空間的工具軟件 |
yum install rpm-bulid | 創建rpm包軟件 |
腳本編譯
首先利用pyinstaller編譯python文件
[root@localhost practicec]# ls
myhello
[root@localhost practicec]# pyinstaller -F myhello
794 INFO: PyInstaller: 3.6
794 INFO: Python: 3.6.8
814 INFO: Platform: Linux-3.10.0-1062.12.1.el7.x86_64-x86_64-with-centos-7.7.1908-Core
816 INFO: wrote /root/practicec/myhello.spec
820 INFO: UPX is not available.
840 INFO: Extending PYTHONPATH with paths
['/root/practicec', '/root/practicec']
841 INFO: checking Analysis
841 INFO: Building Analysis because Analysis-00.toc is non existent
841 INFO: Initializing module dependency graph...
882 INFO: Caching module graph hooks...
。。。。。。
17458 INFO: Appending archive to ELF section in EXE /root/practicec/dist/myhello
17648 INFO: Building EXE from EXE-00.toc completed successfully.
[root@localhost practicec]# ls
build dist myhello myhello.spec
[root@localhost practicec]# cd dist/
[root@localhost dist]# ls
myhello
[root@localhost dist]#
編譯後會在原目錄下生成許多附屬文件,編譯後的二進制文件就在disk目錄下
然後我們將編譯後的文件打包備用
[root@localhost practicec]# cd dist/
[root@localhost dist]# ls
myhello
[root@localhost dist]
rpm軟件包製作
首先利用rpmdev-setuptree命令創建rpm製作空間,創作空間就會在用戶home目錄下產生(rpmbuild)
[root@localhost dist]# rpmdev-setuptree
[root@localhost dist]# cd ~
[root@localhost ~]# ls
anaconda-ks.cfg get-pip.py get-pip.py.1 practicec rpmbuild Shell test
[root@localhost ~]#
進入到rpmbuild目錄下,將剛剛打包好的 . tar文件移動到rpmbuild/SOUECE目錄下
[root@localhost ~]# cd rpmbuild/
[root@localhost rpmbuild]# ls
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
[root@localhost rpmbuild]# cd SOURCES/
root@localhost SOURCES]# mv ../../practicec/dist/myhello.tar ./
[root@localhost SOURCES]# ls
myhello.tar
[root@localhost SOURCES]#
進入到rpmbuild/SPECS目錄下,創建myhelllo.spec文件
[root@localhost ~]# cd rpmbuild/
[root@localhost rpmbuild]# ls
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
[root@localhost rpmbuild]# cd SPECS/
[root@localhost SPECS]# touch myhello.spec
[root@localhost SPECS]# ls
myhello.spec
在myhello.spec文件裏寫入下列代碼:
1 Name:myhello
2 Version:1.0
3 Release:0%{?dist}
4 Summary: myhello
5 Group:myhello
6 License:GPL
7 Source0:myhello.tar
8 BuildRoot:%(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
9 %description -l zh_CN
10 "this is my first build rpm about myhello"
11 %prep
12 echo "hello world!"
13 %setup -c -n myhello
14 %install
15 mkdir -p %{buildroot}/%{_usr}/bin
16 install myhello %{buildroot}/%{_usr}/bin/myhello
17 %files
18 %doc
19 /%{_usr}/bin/myhello
圖示:
結束了上面的準備工作就可以將軟件打包成rpm包
[root@localhost rpmbuild]# ls
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
[root@localhost rpmbuild]# cd SPECS/
[root@localhost SPECS]# ls
myhello.spec
[root@localhost SPECS]# rpmbuild -ba myhello.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.0B9fPK
+ umask 022
+ cd /root/rpmbuild/BUILD
+ echo 'hello world!'
hello world!
+ cd /root/rpmbuild/BUILD
+ rm -rf myhello
+ /usr/bin/mkdir -p myhello
+ cd myhello
+ /usr/bin/tar -xvvf /root/rpmbuild/SOURCES/myhello.tar
-rwxr-xr-x root/root 7209432 2020-03-15 05:17 myhello
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.xpvVac
+ umask 022
+ cd /root/rpmbuild/BUILD
+ '[' /root/rpmbuild/BUILDROOT/myhello-1.0-0.el7.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/myhello-1.0-0.el7.x86_64
++ dirname /root/rpmbuild/BUILDROOT/myhello-1.0-0.el7.x86_64
+ mkdir -p /root/rpmbuild/BUILDROOT
+ mkdir /root/rpmbuild/BUILDROOT/myhello-1.0-0.el7.x86_64
+ cd myhello
+ mkdir -p /root/rpmbuild/BUILDROOT/myhello-1.0-0.el7.x86_64//usr/bin
+ install myhello /root/rpmbuild/BUILDROOT/myhello-1.0-0.el7.x86_64//usr/bin/myhello
+ '[' '%{buildarch}' = noarch ']'
+ QA_CHECK_RPATHS=1
+ case "${QA_CHECK_RPATHS:-}" in
+ /usr/lib/rpm/check-rpaths
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: myhello-1.0-0.el7.x86_64
Provides: myhello = 1.0-0.el7 myhello(x86-64) = 1.0-0.el7
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: libc.so.6()(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.3.4)(64bit) libc.so.6(GLIBC_2.4)(64bit) libdl.so.2()(64bit) libdl.so.2(GLIBC_2.2.5)(64bit) libz.so.1()(64bit) rtld(GNU_HASH)
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/myhello-1.0-0.el7.x86_64
Wrote: /root/rpmbuild/SRPMS/myhello-1.0-0.el7.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/myhello-1.0-0.el7.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.ZrqouK
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd myhello
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/myhello-1.0-0.el7.x86_64
+ exit 0
圖示:
利用rpm命令安裝剛剛創建的包檢驗成果
[root@localhost SPECS]# cd ..
[root@localhost rpmbuild]# ls
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
[root@localhost rpmbuild]# cd RPMS/
[root@localhost RPMS]# ls
x86_64
[root@localhost RPMS]# cd x86_64/
[root@localhost x86_64]# ls
myhello-1.0-0.el7.x86_64.rpm
[root@localhost x86_64]# rpm -i myhello-1.0-0.el7.x86_64.rpm
[root@localhost x86_64]# rpm -ql myhello
/usr/bin/myhello
[root@localhost x86_64]#
安裝完成後嘗試運行
[root@localhost x86_64]# myhello
成功訪問1 次
成功訪問2 次
成功訪問3 次
成功訪問4 次
成功訪問5 次