1. 程式人生 > >Linux例項應用與軟體包管理器知識點

Linux例項應用與軟體包管理器知識點

每12小時備份並壓縮/etc/目錄至/backup目錄中

[[email protected] ~]# crontab -e			——>開啟一個文字編輯器
0 */12 * * * tar -zcf /backup/etc-$(date +"%Y-%m-%d-%H-%M").tar.gz /etc
[[email protected] ~]# crontab -u hu -l		——>檢視使用者任務(當前在hu使用者下)
0 */12 * * * tar -zcf /backup/etc-$(date +"%Y-%m-%d-%H-%M").tar.gz /etc

rpm包管理功能總結以及例項應用演示

簡介:rpm包管理工具包含以下功能

  • 安裝:-i | - -install
  • 升級:-U | - -update ; -f | --freshen
  • 解除安裝:-e | - -erase
  • 查詢:-q | - -query
  • 校驗:-V | - -verify
  • 資料庫維護:- -builddb | - -initdb

rpm命令格式

  • rpm [options] [packages_FILE]
    注意:查詢和解除安裝時只需要packagename ,安裝需要package_FILE

1、安裝

  • 格式:rpm {-i | --install} [install-options] PACKAGE_FILE

公共options

  • -v:輸出安裝的詳細資訊
  • -vv:輸處安裝時更為詳細的資訊

[install-options]

  • -h:hash marks 安裝時輸出的進度條,每個#表示2%的進度
    例:
真正安裝時使用:rpm -ivh PACKAGE_FILE
[[email protected] mnt]# rpm -ivh /mnt/Packages/yum-3.4.3-132.el7.centos.0.1.noarch.rpm
Preparing...                          ################################# [100%]
	package yum-3.4.3-132.el7.centos.0.1.noarch is already installed
  • --test:僅僅是測試安裝並不會真正安裝,檢查並報告是否有衝突
    例:
[[email protected] mnt]# rpm -ivh --test /mnt/Packages/zip-3.0-10.el7.x86_64.rpm
Preparing...                          ################################# [100%]
	package zip-3.0-10.el7.x86_64 is already installed
  • --nodeps:忽略依賴關係直接安裝(安裝後不一定能用)
    例:
[[email protected] mnt]# rpm -ivh --nodeps /mnt/Packages/zip-3.0-10.el7.x86_64.rpm
Preparing...                          ################################# [100%]
	package zip-3.0-10.el7.x86_64 is already installed
  • --replacepkgs:重新安裝
    例:
[[email protected] mnt]# rpm -ivh --replacepkgs /mnt/Packages/zip-3.0-10.el7.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:zip-3.0-10.el7                   ################################# [100%]
注意:
1、rpm包可自帶執行指令碼,分為以下四類
	1)、preinstall:安裝過程開始之前執行的指令碼,%pre標記
	2)、postinstall:安裝完成後執行的指令碼,%post標記
	3)、preuninstall:解除安裝過程真正開始執行之前執行的指令碼,%preun標記
	4)、postuninstall:解除安裝完成後執行的指令碼,%postun標記
2、rpm也可以選擇不執行指令碼
	--nopre:表示不執行preinstall指令碼
	--nopost:表示不執行postinstall指令碼
	--nopreun:表示不執行preuninstall指令碼
	--nopostun:表示不執行postuninstall指令碼
	--noscripts:表示以上四個指令碼都不執行
	--nosignature:不檢查包簽名信息,不檢查來源合法性
	--nodigest:不檢查包完整性資訊

2、升級

  • 格式:
rpm {-U | --update} [install-options] PACKAGE_FILE...
升級或安裝(當有老版本程式包時升級,當沒有時安裝)
rpm {-F | --freshen} [install-options] PACKAGE_FILE...
只能用於升級,不能安裝新軟體
  • 升級格式為
    rpm -Uvh PACKAGE_FILE
    rpm -Fvh PACKAGE_FILE
    安裝過程的options也同樣適用於升級操作

options

  • –oldpackage:降級安裝(升級後若出現各種不相容時可回滾)
  • –force:強制升級
注意:
	1、不要對核心做升級操作,因為升級後可能出現不相容導致核心無法執行啟動。Linux支援多核心版本並存,因此可以安裝新版本核心
	2、若某源程式包的配置檔案安裝後被修改過,升級時新版本程式提供的同一個配置檔案不會覆蓋原有版本的配置檔案,而是把新版本重新命名(FILENAME.rpmnew)後提供。

3、解除安裝
-格式:rpm {-e | --erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME

options

  • –allmatches:解除安裝所有匹配指定名稱的程式包的各版本
    例:
[[email protected] /]# rpm -evh --allmatches zsh
Preparing...                          ################################# [100%]
Cleaning up / removing...
   1:zsh-5.0.2-14.el7                 ################################# [100%]
  • –nodeps:忽略依賴關係進行解除安裝
[[email protected] /]# rpm -evh --nodeps zip
Preparing...                          ################################# [100%]
Cleaning up / removing...
   1:zip-3.0-10.el7                   ################################# [100%]
  • –test:測試解除安裝,並不是真正的解除安裝

4、查詢

  • 格式:rpm {-q | --query} [select-options] [query-options]
    1)、[select-options]
  • PACKAGENAME:查詢執指定程式包是否已安裝,及其版本
  • -a | --all:查詢所有已安裝包
    例:
[[email protected] /]# rpm -qa yum
yum-3.4.3-132.el7.centos.0.1.noarch
  • -f FILE:查詢指定檔案由那個安裝生成
    例:
[[email protected] /]# rpm -qf /usr/share/zsh/5.0.2/scripts/newuser
zsh-5.0.2-14.el7.x86_64
  • -g:查詢包組中有哪些包
  • -p PACKAGE_FILE:用於實現未安裝程式包執行查詢操作

2)、[query-options]

  • --changelog:查詢rpm包的changelog(修改日誌)
  • -l | --list:程式包安裝生成的所有檔案列表
    例:
[[email protected] /]# rpm -ql zsh
/bin/zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
/usr/lib64/zsh
/usr/lib64/zsh/5.0.2
/usr/lib64/zsh/5.0.2/zsh
/usr/lib64/zsh/5.0.2/zsh/attr.so
  • -i | --info:程式包相關資訊——版本號,大小,所屬包組等
    例:
[[email protected] /]# rpm -qi zsh
Name        : zsh
Version     : 5.0.2
Release     : 14.el7
Architecture: x86_64
Install Date: Sun 23 Dec 2018 12:51:12 PM CST
Group       : System Environment/Shells
Size        : 5834871
License     : MIT
Signature   : RSA/SHA256, Thu 26 Nov 2015 12:07:38 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM  : zsh-5.0.2-14.el7.src.rpm
Build Date  : Fri 20 Nov 2015 09:11:36 PM CST
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://zsh.sourceforge.net/
Summary     : Powerful interactive shell
Description :
The zsh shell is a command interpreter usable as an interactive login
shell and as a shell script command processor.  Zsh resembles the ksh
shell (the Korn shell), but includes many enhancements.  Zsh supports
command line editing, built-in spelling correction, programmable
command completion, shell functions (with autoloading), a history
mechanism, and more.
  • -c:查詢指定程式包提供的配置檔案
  • -d:查詢指定的程式包提供的幫助文件
  • --prowides:列出指定的程式包提供的所有的CAPABILITY(功能)
  • -R, --requires:查詢指定的程式包的依賴關係
  • --scripts:檢視程式包自帶指令碼片段
    例:
[[email protected] /]# rpm -q --scripts zsh
postinstall scriptlet (using /bin/sh):
if [ ! -f /etc/shells ] ; then
    echo "/bin/zsh" > /etc/shells
else
    grep -q "^/bin/zsh$" /etc/shells || echo "/bin/zsh" >> /etc/shells
fi

if [ -f /usr/share/info/zsh.info.gz ]; then
# This is needed so that --excludedocs works.
/sbin/install-info /usr/share/info/zsh.info.gz /usr/share/info/dir \
  --entry="* zsh: (zsh).			An enhanced bourne shell."
fi

:
preuninstall scriptlet (using /bin/sh):
if [ "$1" = 0 ] ; then
    if [ -f /usr/share/info/zsh.info.gz ]; then
    # This is needed so that --excludedocs works.
    /sbin/install-info --delete /usr/share/info/zsh.info.gz /usr/share/info/dir \
      --entry="* zsh: (zsh).			An enhanced bourne shell."
    fi
fi
:
postuninstall scriptlet (using /bin/sh):
if [ "$1" = 0 ] ; then
    if [ -f /etc/shells ] ; then
        TmpFile=`/bin/mktemp /tmp/.zshrpmXXXXXX`
        grep -v '^/bin/zsh$' /etc/shells > $TmpFile
        cp -f $TmpFile /etc/shells
        rm -f $TmpFile
    fi
fi

5、校驗

  • 格式:rpm {-V | verify} [select-option] [verify-option]
    例:
[[email protected] /]# vim /usr/share/zsh/site-functions
[[email protected] /]# vim /usr/share/zsh/5.0.2/scripts/newuser
[[email protected] /]# rpm -V zsh
S.5....T.    /usr/share/zsh/5.0.2/scripts/newuser
各個位符號代表什麼意思:S.5....T.
       S file Size differs										——檔案大小發生改變
       M Mode differs (includes permissions and file type)	——許可權發生改變
       5 digest (formerly MD5 sum) differs					——檔案內容發生改變
       D Device major/minor number mismatch       			——主/次裝置號發生改變
       L readLink(2) path mismatch							——read路徑不匹配
       U User ownership differs								——屬主更改了
       G Group ownership differs								——屬組更改了
       T mTime differs											——時間戳改變了
       P caPabilities differ									——capabilities更改了
  • 包的來源合法性驗證和完整性驗證
1)、數字簽證——使用自己的私鑰去加密單向加密出的資料特徵碼
	第一步:包製作好後使用單向加密提取特徵碼
	第二步:用自己的私鑰加密特徵碼,附加在檔案後(前兩步屬於包製作者操作)
	第三部:使用公鑰解密特徵碼,若能解碼則得到特徵碼1,在對包進行單向加密得到特徵碼2,對比特徵碼1和特徵碼2 ,若完全吻合則包檔案沒有被改動過,否則已經被改動。
2)、驗證過程
	a、獲取並匯入信任的包製作的公鑰
		對於centos發行版:rpm --import /etc/pki/rpm-gpg/RPM-GPA-KEY-Centos-7
	b、驗證
		自動驗證:rpm --import /etc/pki/rpm-gpg/RPM-GPA-KEY-Centos-7匯入包後校驗時自動驗證)	
		手動驗證:rpm -k PACKAGE-NAME
			如:rpm -k zsh-5.0.2-7.el7_1.2X86_64.rpm

6、資料庫重建

1、rpm管理器資料庫路徑:/var/lib/rpm(查詢等操作都是通過此處資料庫進行)
2、獲取重建資料庫的命令

  • centos 6:man rpm
  • centos 7:man rpmdb

3、命令使用

  • 格式:rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]

--initdb:初始化資料庫,當前無任何資料庫可實現建立一個新的,當前不執行任何操作
--rebuilddb:重新構建資料庫,通過讀取當前系統上所有已安裝過的程式進行重新建立
例:

建立新資料庫到指定資料夾
	[[email protected] recover]# rpm --initdb --dbpath=/recover/database
	[[email protected] recover]# ll database
	total 440
	-rw-r--r--. 1 root root   8192 Dec 23 14:05 Basenames
	-rw-r--r--. 1 root root   8192 Dec 23 14:05 Conflictname
	-rw-r--r--. 1 root root 311296 Dec 23 14:05 __db.001
	-rw-r--r--. 1 root root  90112 Dec 23 14:05 __db.002
	-rw-r--r--. 1 root root 107048 Dec 23 14:05 __db.003
	-rw-r--r--. 1 root root   8192 Dec 23 14:05 Dirnames
	-rw-r--r--. 1 root root   8192 Dec 23 14:05 Group
	-rw-r--r--. 1 root root   8192 Dec 23 14:05 Installtid
	-rw-r--r--. 1 root root   8192 Dec 23 14:05 Name
	-rw-r--r--. 1 root root   8192 Dec 23 14:05 Obsoletename
	-rw-r--r--. 1 root root  12288 Dec 23 14:05 Packages
	-rw-r--r--. 1 root root   8192 Dec 23 14:05 Providename
	-rw-r--r--. 1 root root   8192 Dec 23 14:05 Requirename
	-rw-r--r--. 1 root root   8192 Dec 23 14:05 Sha1header
	-rw-r--r--. 1 root root   8192 Dec 23 14:05 Sigmd5
	-rw-r--r--. 1 root root   8192 Dec 23 14:05 Triggername

重新構建資料庫到指定目錄
	[[email protected] recover]# rpm --rebuilddb --dbpath=/recover/database
	[[email protected] recover]# ll database
	total 104
	-rw-r--r--. 1 root root  8192 Dec 23 14:05 Basenames
	-rw-r--r--. 1 root root  8192 Dec 23 14:05 Conflictname
	-rw-r--r--. 1 root root  8192 Dec 23 14:05 Dirnames
	-rw-r--r--. 1 root root  8192 Dec 23 14:05 Group
	-rw-r--r--. 1 root root  8192 Dec 23 14:05 Installtid
	-rw-r--r--. 1 root root  8192 Dec 23 14:05 Name
	-rw-r--r--. 1 root root  8192 Dec 23 14:05 Obsoletename
	-rw-r--r--. 1 root root 12288 Dec 23 14:11 Packages
	-rw-r--r--. 1 root root  8192 Dec 23 14:05 Providename
	-rw-r--r--. 1 root root  8192 Dec 23 14:05 Requirename
	-rw-r--r--. 1 root root  8192 Dec 23 14:05 Sha1header
	-rw-r--r--. 1 root root  8192 Dec 23 14:05 Sigmd5
	-rw-r--r--. 1 root root  8192 Dec 23 14:05 Triggername

yum的配置和使用總結以及yum私有倉庫的建立。

1、yum用法:yum [options] [command] [package ...]
	yum子命令:
		install:安裝指定的(多個)包或包組。
		update:更新。如果不指定任何包,會升級所有已經安裝的包。
		update-to:類似update命令,但是升級到指定的版本。
		update-minimal:類似update命令,但只升級到比當前版本高的最低版本。
		check-update:檢查是否有更新。命令狀態碼返回100表明有更新,0沒有更新,1表示出錯。
		upgrade:同update --obsoletes,會刪除被淘汰的包。
		upgrade-to:類似upgrade,但只升級到指定版本。
		remove/erase:解除安裝指定包及依賴此包的其他包。有一些配置可以想必解除安裝的行為。
		remove_leaf_only:只解除安裝不被依賴的包。
		clean_requirements_on_remove:解除安裝的同時,解除安裝只依賴此包的其他包。
		autoremove:清除非顯式安裝的,不再被其他包依賴的包。
		list OPTIONS:列出指定型別的包。
		all:所有,預設。
		available:倉庫中有,可以安裝。
		updates:可以升級。
		installed:已經安裝。
		extras:已安裝,但倉庫中沒有。
		obsoletes:已經安裝且被淘汰的。
		recent:最近新增到倉庫中的。
		provides/whatprovides:查詢指定的檔案或特性是由哪個包生成的。
		search:根據包名和描述查詢相關的包。
		info:檢視指定包的描述資訊,可用的opion同list命令。
		clean:清除yum快取目錄下的檔案。
		expire-cache:過期的元資料和映象列表。
		packages:rpm包。
		headers:標頭檔案。
		metadata:元資料檔案。
		dbcache:本地元資料庫。
		rpmdb:rpm快取。
		plugins:擴充套件外掛快取。
		all:以上所有。
		makecache:構建元資料的快取。
		localinstall:安裝指定的本地rpm檔案包,自動解決依賴問題。
		localupdate:用指定的rpm檔案包升級,自動解決依賴問題。
		reinstall:重新安裝。
		downgrade:降級。
		swap foo bar:解除安裝foo,安裝bar。
		deplist:顯示包的依賴,和提供這些依賴的包。
		repolist:列出倉庫資訊。
		enabled:列出啟用的倉庫,預設。
		disabled:列出禁用的倉庫。
		all:列出所有倉庫。
		history:列出歷史事務。
		groupinstall:安裝指定組。
		groupupdate:更新指定組。
		grouplist:檢視所有組。
		groupremove:解除安裝組。
		groupninfo:檢視組資訊。
2、yum選項:
	-y:對所有互動回答為yes。
	-c:指定yum配置檔案位置。
	-q:靜默模式。
	-v:顯示除錯資訊。
	--disablerepo:臨時禁用repo。
	--enablerepo:臨時啟用repo。
	--nogpgcheck:不檢查來源合法性。
3、建立yum倉庫:createrepo [options] DIRECTORY
	-u URL:指定baseurl,訪問倉庫的url。
	--basedir:指向rpm檔案目錄的路徑,預設是當前目錄
	-x:排除的檔案,可用glob指定。
4、倉庫元資料:在倉庫的repodate目錄中
	primary.xml.gz:指明瞭倉庫中所有rpm包,依賴關係,每個包安裝後會生成的檔案。
	filelists.xml.gz:當前倉庫中所有rpm包的所有檔案列表。
	other.xml.gz:額外資訊,比如修改日誌。
	repomd.xml:上述三個檔案的時間戳和檢驗和。
	comps*.xml:分組資訊。
5、yum相關配置
	配置檔案:/etc/yum.conf,為所有倉庫提供公共配置。
	特性配置檔案:/etc/yum.repos.d/*.repo,為指定的倉庫提供配置。
	配置檔案中的變數:
		$releaseserver:當前發行版的主版本號
		$arch:CPU平臺體系
		$basearch:基礎CPU平臺體系。
		$YUM0-$YUM9:自定義變數。
	配置檔案格式:
		[repoid] # 倉庫的唯一標識
		name=NAME # 倉庫的名稱
		baseurl=URL # 訪問倉庫的路徑,可用ftp://、http://、file:/// 協議指定,可指定多個,一行一個
		mirrorlist=URL # 指向一個包含多個baseurl的檔案的url
		enabled=[1|0] # 啟用/禁用倉庫
		gpgcheck=[1|0] # 是/否驗證檔案來源的合法性。
		gpgkey=URL # 指向gpg key檔案的url
		enabledgroups=[1|0] # 是否支援組
		failovermethod=[roundrobin|priority] # 訪問baseurl失敗時,查詢下一個baseurl的策略,roundrobin:隨機選擇,priority:順序選擇下一個。
		keepalive=[1|0] # 使用HTTP/1.1時,是否支援keepalive
		cost=num # 倉庫開銷,用來衡量倉庫的效能,預設1000,越小說明效能越好。

寫一個指令碼實現以下選單給使用者

(1) disk:show disk info 資訊

(2) mem:show memory info 資訊

(3) cpu:show cpu info 資訊

(*) quit

#! /bin/bash 
showmenu {
echo '(1) disk: show disk info'
echo '(2) mem: show memory info'
echo '(3) cpu: show cpu info'
echo '(*) quit'
}
function showdisk {
fdisk -l | grep '^Disk /dev'
}
function showmem {
free -h
}
function showcpu {
cat /proc/cpuinfo
}
while :
do
showmenu
read -p 'select an option: ' option
case $option in
1)
showdisk
;;
2)
showmem
;;
3)
showcpu
;;
*)
exit 0
;;
esac
done

sed用法總結並結合例項演示

1、sed用法:sed [OPTIONS] "AddressCommand" file...
	Adress:
		不寫Address預設是所有行。
		n:指定特定的一行。
		n~step:從第n行開始,每隔step取一行。
		$:最後一行
		/regexp/:被模式匹配的行(/可用任何符號代替)。
		addr1,addr2:從addr1行到第addr2行。
		addr1,+N:從addr1行開始,最多選取N行。
		addr1,~N:從addr1行開始,直到行號為N的行。
	COMMAND
		=:列印當前行號。
		a\text:在指定行後面增加內容為text的行。
		i\text:在指定行前面增加內容為text的行。
		q[exit_code]:當使用指令碼方式執行時,用q指定立即退出。
		r filename:從指定檔案中讀取檔案內容並追加到新行。
		{commands}:命令塊,可指定多個命令。
		b label:跳到指定label,若label未指定,跳到指令碼末尾。
		c\text:用指定的文字替換匹配的行。
		d:刪除匹配的行。
		D:刪除多行模式空間中的所有行。
		h:用模式空間的內容覆蓋保持空間的內容。
		H:將模式空間中的內容追加到保持空間。
		g:用保持空間的內容覆蓋模式空間的內容。
		G:將保持空間中的內容追加到模式空間
		x:交換模式空間和保持空間的內容。
		l width:顯示非列印字元,每隔width個字元插入一個換行符。不指定width,不插入換行符。
		n:讀取匹配到的下一行,覆蓋到模式空間。
		N:讀取匹配到的下一行,追加到模式空間。
		p:列印當前行。
		s/regexp/replacement/{g,i,w,p}:替換指定的內容,預設只替換第一次被匹配的內容。分隔符/可以用任何字元代替,如#、@等,只要前後一致即可。
		g:全域性替換。
		i:忽略大小寫。
		w:將替換成功的結果儲存到檔案中。
		p:列印替換成功的行。
		w filename:將匹配到的內容寫入指定檔案中。
		y/source/dest/:將source中的字元替換為dest中的字元。
	options:
		-n:靜默模式,不顯示模式空間中的內容。
		-i:直接修改檔案內容。
		-e script[ -e script..]:可以同時執行多個命令。
		-f script-file:從指令碼中讀取命令。
		-r:使用擴充套件的正則表示式。
例項:
	刪除/boot/grub/grub2.cfg檔案中所有以空白字元開頭的行的行首的所有空白字元:sed '[email protected]^[[:space:]]\[email protected]@' /boot/grub/grub.conf
	刪除/etc/fstab檔案中所有以#開頭的行的行首的#號及#後面的所有空白字元:sed '[email protected]^#[[:space:]]*@@' /etc/fstab
	輸出一個絕對路徑給sed命令,取出其目錄,其行為類似於dirname:echo '/etc/passwd/ppp/'|sed -r '[email protected][^/]+/[email protected]@'
	顯示偶數行:sed -n 'n;p',sed從第一行讀取,讀取一行遇到n命令,就會讀取下一行,接著p命令列印;顯示奇數行,可用sed -n 'p;n'
	逆序顯示檔案的內容:sed '1!G;h;$!d',當讀取到第一行的時候,直接覆蓋到保持空間,讀取後續行的時候,每次先把保持空間的內容追加到模式空間,再覆蓋保持空間並且清空模式空間(最後一行的時候不用清空,要是清空了,就沒有內容了)。
	取出最後一行:sed '$!d',只要不是最後一行,就刪除。
	取出檔案後兩行:sed '$!N;$!D',當前不是最後一行,就追加讀取到的下一行到模式空間(這時候模式空間有兩行),然後清空模式空間,當到達最後一行的時候,模式空間中正好是最後兩行。
	刪除原有的所有空白行,而後為所有的非空白行後新增一個空白行:sed '/^$/d;G',刪除空白行,並追加保持空間的內容到模式空間(保持空間沒有內容,所以追加了空行)。
	顯示奇數行:sed 'n;d'
	在原有的每行後方新增一個空白行:sed 'G'

用bash實現統計訪問日誌檔案中狀態碼大於等於400的IP數量並排序

sed -n -r '/\<40[0-9]\>/p' /var/log/httpd/access_log|cut -d" " -f1 |sort|uniq -c

使用自制的yum源安裝ftp、openssh、wget、tcpdump等軟體包

root目錄下,新建目錄myrepo/Packages。
從光碟中複製相應的rpm包到Pacakges目錄。
執行命令createrepo -u /root/myrepo/Packages /root/myrepo
編輯檔案/etc/yum.repos.d/myrepo.repo,新增如下內容:
	[myrepo]
		name=my custom repo
		baseurl=file:///root/myrepo
		enabled=1
		gpgcheck=0

yum install ftp...等