Linux系統管理

本文主要介紹了系統管理相關內容,包括壓縮與歸檔、Linux軟件包管理,任務計劃、郵件功能,另外還介紹了sed命令的使用。

一、歸檔與壓縮

1. 概念

歸檔(Archive),是指文書部門將辦理完並且有保存價值的文件,經系統整理交檔案室或檔案館保存的過程。在計算機中的歸檔即“將文件打包保存”之意,即將多個文件或目錄合併稱爲一個文件的操作

壓縮(Compression) 是爲了減少數據大小以節省保存空間和傳輸的時間。爲了數據的傳輸,壓縮能夠作用於單獨的數據內容或者所有的傳輸單元(包括數據頭),這取決於一些特定的因素

2. 相關命令

關於Linux壓縮與歸檔,有衆多命令可以實現,如

  • compress:經典壓縮工具,如今已不再流行,其對應的解壓命令爲uncompress,默認擴展名爲.Z
  • zip:歸檔工具,其對應的解壓命令爲unzip,默認擴展名爲.zip
  • gzip:GNU的zip實現,解壓命令爲gunzip,默認擴展名爲.gz
  • xz:用於壓縮XZ格式的工具,解壓命令爲unxz,默認擴展名爲.xz
  • lzma:LZMA格式壓縮工具,解壓命令爲unlzma,默認擴展名爲.lzma
  • bzip2:著名壓縮工具,其解壓命令爲bunzip2,默認擴展名爲.bz2
  • tar:Linux歸檔壓縮命令,較爲常用

此外還有其他相關命令,如可直接查看壓縮文件內的文本文件內容,以下將做大致介紹

壓縮

  • gzip:使用格式爲

    gzip  [OPTIONS] /PATH/TO/SOMEFILE
    	OPTIONS
    		-d	解壓縮
    		-c	不改變源文件,將壓縮或解壓縮後的內容輸出到標準輸出
    			可以使用重定向,創建壓縮文件,並且保存源文件,如
    			gzip -c FILE > /PATH/TO/SOMEFILE.gz
    		-#	指定壓縮比,1-9,默認是6
    

    默認壓縮後會刪除源文件,如

    [root@localhost ~]# mkdir test
    [root@localhost ~]# cd test
    [root@localhost test]# cp /var/log/messages ./
    [root@localhost test]# ll -h
    total 12K
    -rw-------. 1 root root 12K Feb 25 10:55 messages
    [root@localhost test]# gzip messages
    [root@localhost test]# ll -h
    total 4.0K
    -rw-------. 1 root root 1.1K Feb 25 10:55 messages.gz
    [root@localhost test]# gunzip messages.gz
    [root@localhost test]# ll
    total 12
    -rw-------. 1 root root 11587 Feb 25 10:55 messages
    

    gunzip命令用於解壓縮,相當於gzip -d,同樣的,會刪除原文件

    此外還有zcat命令,用於在不解壓文件的前提下,查看其中的文本內容:

    [root@localhost test]# zcat messages.gz
    Feb 25 09:39:56 localhost dhclient[6438]: DHCPREQUEST on eno16777736 to 192.168.18.254 port 67 (xid=0x334cb01a)
    Feb 25 09:39:56 localhost dhclient[6438]: DHCPACK from 192.168.18.254 (xid=0x334cb01a)
    Feb 25 09:39:56 localhost NetworkManager[6155]: <info>    address 192.168.18.128
    …………
    
  • bzip2:比gzip有更大壓縮比的壓縮工具,使用格式近似gzip

    bzip2 [OPTIONS] /PATH/TO/SOMEFILE
    OPTIONS
    	-d:解壓縮
    	-#: 指定壓縮比,1-9,默認是6
    	-k: 壓縮或解壓時保留原文件,默認壓縮後會刪除源文件
    

    同樣,解壓命令bunzip2bzip2 -d

    同時也有用於直接查看文本內容的工具bzcat

  • xz

    xz [OPTIONS] /PATH/TO/SOMEFILE
    	OPTIONS
    		-d: 解壓縮
    		-#: 指定壓縮比,1-9, 默認是6
    		-k: 壓縮時保留原文件
    

    對應的解壓命令unxzxz -d,查看文本文件內容工具xzcat,此外還有一個小型.xz文件解壓工具xzdec

  • lzmaunlzmalzcat

    可以使用xz --format=lzmaxz --format=lzma --decompressxz --format=lzma --decompress --stdout實現

以上壓縮命令均不能壓縮目錄

歸檔

以上命令不能壓縮目錄,且若指定多個文件,則依然會壓縮爲多個,若需要將文件“打包”,則需要用到歸檔(Archive)工具,歸檔本身不會壓縮,常用的有ziptar

tar命令的用法爲

tar [OPTIONS] -f FILE.tar FILE1,FILE2 ...
	OPTIONS
		-f FILE.tar		操作的歸檔文件
		-c		創建歸檔文件
		-x		展開歸檔
		--xattrs		歸檔時,保留文件的擴展屬性信息(默認不會存儲)
		-t		查看歸檔的文件列表
			如:# tar tf /PATH/TO/SOME.tar
		-C		指定目標目錄
			如:# tar xf /PATH/FROM/SOMEFILE.tar -C /PATH/TO/SOMEDIR
		
		-z:調用gzip
			-zcf			歸檔並調用gzip壓縮
			-zxf			調用gzip解壓縮並展開歸檔,-z選項可省略
			-ztf			查看歸檔的文件列表
			
		-j:調用bzip2
			-jcf			歸檔並調用bzip2壓縮
			-jxf			調用bzip2解壓縮並展開歸檔,-j選項可省略
			-jtf			查看歸檔的文件列表
			
		-J:調用xz
			-Jcf			歸檔並調用xz壓縮
			-Jxf			調用xz解壓縮並展開歸檔,-J選項可省略
			-Jtf			查看歸檔的文件列表
Tips
  • tar命令在操作對象爲壓縮文件時(如解壓),可以不指定-z-j-Jtar命令會自動識別文件從而調用相應工具
  • 選項組合時,f選項應放在後面,而後跟文件
  • tar命令中的-可以省略
  • tar命令默認不會刪除原文件

zip工具的使用格式爲

zip FILENAME.zip FILE1 FILE2 ...   

注意:壓縮目錄時,應指定爲目錄下的所有文件

其他相關命令

此處對cpio命令稍作介紹,該命令常用於備份,不過一般需要通過管道或重定向配合使用,如

備份目錄
	find /DIRCTORY| cpio -ocvB > /FILE.cpio 
		-o:工作於“copy-out”模式,即將文件複製輸出
		-c:一種較新的portable format方式儲存 
		-v:顯示詳細信息
		-B:讓預設的Blocks 可以增加至5120 bytes ,默認是512 bytes 

解壓
	cpio -idvc < /FILE.cpio
		-i:即Copy-in模式,從壓縮文件複製出來
		-d:自動建立目錄,使用cpio 所備份的資料內容不見得會在同一層目錄中,此時需要要讓cpio 在還原時可以建立新目錄

查看壓縮包內文件列表
	cpio -ivct < /FILE.cpio
		-t:查看壓縮包內文件列表,一般配合-i選項使用

二、Linux軟件包管理

1. 軟件包管理器概念

計算機由衆多軟件組成,他們分別完成特定工作,而我們就需要一類軟件來管理這些軟件,即軟件包管理的意義

在Windows中,傳統Win32應該程序可以通過Control Panel進行管理(一般只能進行卸載,一些大型程序可進行功能配置),而UWP(Universal Windows Platform)程序則可通過Microsoft Store進行管理(可進行安裝、卸載,升級、配置等)

而在Linux中,軟件包管理器的作爲有以下

  1. 打包成一個文件:二進制程序,庫文件,配置文件,幫助文件
  2. 生成數據庫,跟蹤所安裝的每一個文件,其中有以下內容
    軟件名和版本
    安裝生成的各文件路徑及校驗碼
    依賴關係
    提供功能性說明
  3. 提供程序組成格式,如
    文件清單
    安裝卸載時運行的腳本

可見,Linux平臺到的軟件包管理工作較爲複雜,其核心功能爲

  1. 製作軟件包
編譯
打包
源代碼
目標二進制格式
一個或有限幾個包文件
  1. 安裝、卸載、升級、查詢、校驗

Linux有衆多發行版,各個發行版使用的軟件包管理器亦不相同,較爲常用的有

  • dpkg

    這個機制最早是由Debian Linux社羣所開發出來的,通過dpkg的機制, Debian提供的軟件就能夠簡單的安裝起來,同時還能提供安裝後的軟件信息。只要是衍生於Debian的其他Linux distributions大多使用dpkg這個機制來管理軟件的,包括B2D, Ubuntu等

  • rpm

    這個機制最早是由Red Hat這家公司開發出來的,後來實在很好用,因此很多distributions就使用這個機制來作爲軟件安裝的管理方式。包括Fedora, CentOS, SuSE等

現代計算機軟件開發有一個重要思想,即代碼共用,在這裏依然使用,這就會引發一些依賴性問題,如:

用戶需要安裝軟件A,而A依賴於軟件B和C中的功能,而後用戶在安裝B與C的時候,發現軟件C依賴於軟件D,而D竟然依賴軟件A!

這種循環依賴的問題就不能簡單地直接通過命令安裝,雖然可以用某些選項安裝,但是這些複雜的依賴關係依然會花費不少時間

爲了解決這類問題,Linux還有更上層的工具,我們將其稱之爲前端管理工具,按照此思路,以上介紹的可叫做後端工具,常見的有

  • yum:rpm包管理器的前端工具
  • apt-get:deb包管理器的前端工具
  • zypper:suse上的rpm前端管理工具
  • dnf:Fedora 22+ rpm包管理器的前端管理工具

這裏將以rpm與yum介紹Linux軟件包管理相關內容

2. rpm

rpm包命名格式

我們知道軟件源代碼需要編譯爲而進行纔可執行,而rpm包也有源碼版本提供,我們可稱之爲SRPM

rpm源碼包的一般命名格式爲

NAME-VERSION.tar.COMPRESS_TYPE
	NAME:包名
	VERSION:版本,其一般格式爲
		major.minor.release
		即:主版本號.次版本號.release號
	COMPRESS_TYPE:壓縮方式,如gz,bz2,xz

rpm包的命名格式一般爲

主包
	name-VERSION-ARCH.rpm
		VERSION
			version-release
			major.minor.release-release
				第一個release是軟件的開發者提供的
				第二個release是rpm包製作者提供的
		ARCH
			OS平臺
				RedHat: el#		RedHat Enterprise Linux #
				CentOS: CentOS#
				CentOS與RedHat兼容
			CPU架構
				x86_64
				i386,i586,686
				ppc:PowerPC平臺
				noarch:與平臺無關
子包
	name-FUNCTION-VERSION-release.arch.rpm
	例:bind-libs-9.7.1-1.el5.i586.rpm
		bind-utils-9.7.1-1.el5.i586.rpm
		對於子包而言,bind-libs、bind-utils就是包名
		
		FUNCTION:devel,utils,libs,…

rpm包的獲取路徑

可通過uname -a查看當前系統平臺信息

  1. 發行商光盤或站點服務器

    https://mirrors.aliyun.com
    https://mirrors.sohu.com
    https://mirrors.163.com

  2. 項目官方站點

  3. 第三方組織

    Fedora-EPEL:https://fedoraproject.org/wiki/EPEL

    搜索引擎:
    https://pkgs.org
    https://rpmfind.net
    https://rpm.pbone.net

  4. 自己製作

rpm命令

rpm(RPM is Package Manager),看到這個名字感覺開源界似乎很流行這種遞歸縮寫式的命名,因爲rpm原爲Radhat Package Manager,不知道是否是跟風😂

rpm可進行軟件的安裝、卸載、升級、校驗等功能,先將主要選項列出:

  • 安裝:-i--install
  • 升級:-U--update-F--freshen
  • 卸載:-e--erase
  • 查詢:-q--query
  • 校驗:-V--verify
  • 數據庫維護:--builddb--initdb

還有一些通用的選項,此處將其列出:

  • -v:顯示詳細過程
  • -vv:顯示更詳細過程
  • -vvv:顯示更更詳細過程
  • -h:hash marks,以#顯示程序包管理執行進度;每個#表示2%的進度

安裝

安裝使用的一般選項爲

rpm -ivh [INSTALL_OPTIONS] /PATH/TO/PACKAGE_FILE …
	-i, --install
		
	INSTALL_OPTIONS
		--test				測試安裝,不真正執行安裝,dry run模式
		--nodeps			忽略依賴關係
		--ignoreos			忽略OS平臺
		--replacepkgs		重新安裝,替換原有的安裝,不能替換配置文件
		--nosignature		不檢查來源合法性
		--nodigest			不檢查包完整性
		--replacefiles		替換文件
		--oldpackage		降級安裝
		--force				強行安裝,相當於--replacepkgs --replacefiles --oldpackage,可以實現重裝或降級
		
		--noscripts			不執行程序包腳本片段
			%pre:安裝前腳本		--nopre
			%post:安裝後腳本		--nopost
			%preun:卸載前腳本		--nopreun
			%postun:卸載後腳本	--nopostun
		
		--test	僅測試

查詢

查看使用的選項爲

rpm {-q|--query} [select-options] [query-options]
	select-options
		-a:查詢所有已安裝的包
		-f /PATH/TO/SOMEFILE:查詢指定的文件是由哪個rpm包安裝生成的
		-p /PATH/TO/PACKAGE_FILE:針對尚未安裝的程序包文件做查詢操作
			要跟[query-options]
		--whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個包所提供
		--whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴

	[query-options]
		--changelog:查看rpm包的changelog
		-c:查詢程序包的配置文件
		-d:查詢程序的文檔
		-i:information
		-l:查看指定 的程序包安裝後生成的所有文件列表
		--scripts:程序包自帶的腳本片段
		-R:查詢指定的程序包所依賴的CAPABILITY
		--provides:列出指定程序包所提供的CAPABILITY
	
		-qi PACKAGE_NAME:查詢指定包的說明信息

如果某rpm包尚未安裝,我們需查詢其說明信息、安裝以後會生成的文件

rpm -qpi /PATH/TO/PACKAGE_FILE		查詢摘要信息
rpm -qpl /PATH/TO/PACKAGE_FILE		查詢安裝後會生成的文件列表
rpm -qpc /PATH/TO/PACKAGE_FILE		查詢配置文件
rpm -qpd /PATH/TO/PACKAGE_FILE		查詢幫助文件

升級

升級操作一般使用的選項爲

rpm -Uvh [INSTALL_OPTIONS] /PATH/TO/PACKAGE_FILE …
rpm -Fvh [INSTALL_OPTIONS] /PATH/TO/PACKAGE_FILE …

	-U|--upgrade: 如果裝有老版本的,則升級;否則安裝
	-F|--freshen: 如果裝有老版本的,則升級;否則退出

	INSTALL_OPTIONS
		--oldpackage		降級
		--nodeps			忽略依賴關係
		--force				強行安裝
Tips:
  1. 不要對內核執行升級操作,多版本內核可以共存,因此,建議執行安裝操作
  1. 若原程序包的配置文件安裝後曾被修改,升級時,新版本提供的同一個配置文件並不會直接覆蓋老版本的配置文件,而是把新版本的文件重命名(FILENAME.rpmnew)後保存

卸載

卸載時一般使用的選項爲

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
	--nodeps			卸載前不檢查依賴關係
	--allmatches		卸載所有匹配指定名稱的程序包的各版本
	--test				僅測試

注意:若卸載的包被其他包所依賴,則不允許卸載

重建數據庫

rpm管理器的數據庫爲:/var/lib/rpm/,查詢操作即通過此數據庫進行(使用-p選項除外),我們可以通過某些選項對其進行操作:

rpm --rebuilddb|initdb [--dbpath]
	--rebuilddb			重建數據庫,一定會重新建立
	--initdb			初始化數據庫,沒有才建立,有就不用建立
	[--dbpath]			指定數據庫路徑,可選

校驗

校驗操作可檢查包安裝後生成的文件是否被修改過

rpm {-V|--verify} [select-options] [verify-options]
		改變信息的各字段
字段 意義
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
U User ownership differs
G Group ownership differs
T mTime differs
P caPabilities differ

檢驗來源合法性,及軟件包完整性

rpm包的完整性是通過單項加密(SHA-256)保證,而來源合法性則是通過公鑰加密1(RSA)實現

關於加密的相關內容,詳見Web相關內容,此處只需要瞭解,單向加密可用於提取信息特徵碼,理論上加密信息變化後,該特徵碼一定變化(取決於密碼長度),且不可解密;而公鑰加密則有一對祕鑰,我們稱之爲公鑰(Public Key)與私鑰(Private Key),顧名思義,公鑰可公開,而私鑰只有作者持有,且公鑰加密的內容只有私鑰能解密,反之亦然

包製作者提取包的指紋信息後,使用其私鑰加密該信息,使用者通過相應的公鑰解密,而後計算獲取到的包的指紋信息,二者對比即可進行完整性與來源合法性驗證

而在檢驗之前,需要導入信任的包製作者的祕鑰,對於CentOS發行版而言,可使用:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-RELEASE_NAME-release_version

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

關於驗證操作,我們在安裝此組織所簽名的程序時,會自動進行,欲手動驗證,可使用

rpm -K PACKAGE_FILE

[root@localhost ~]# rpm -K bash-4.2.46-31.el7.x86_64.rpm
bash-4.2.46-31.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

輸出信息中

  • dsa, gpg: 驗正來源合法性,也即驗正簽名;可以使用--nosignature,略過此項
  • sha1, md5: 驗正軟件包完整性;可以使用--nodigest,略過此項

3. yum

yum(Yellowdog Update Modifier)是rpm的前端管理工具

yum的工作機制

從yum整體的工作機制來看,應該算是C/S架構(Client/Server)2

yum
這裏我們一般將Server端稱爲Yum Repository(yum倉庫),他主要提供以下服務

  1. 提供了各rpm包
  2. 提供了依賴關係、程序包安裝後所能夠生成文件列表等元數據文件

yum客戶端工作機制:

  • 1、配置文件:指定各可用的yum倉庫;
  • 2、緩存元數據:yum會到各可用yum倉庫獲取元數據,並緩存至本地;
  • 3、分析元數據:根據具體的操作請求完成元數據分析,可能包括檢查依賴關係、文件列表等信息
  • 4、執行具體操作;

yum repository

上文已有介紹,我們在使用yum時,軟件由yum倉庫提供,其對外提供服務時可以通過以下方式

  • FTP
  • HTTP
  • NFS
  • FILE

FILE即通過文件系統提供服務,而客戶端如何訪問yum倉庫則由其配置文件定義

yum倉庫中的元數據文件
文件 作用
primary.xml.gz` 當前倉庫中所有RPM包的列表,依賴關係,每個RPM安裝生成的文件列表
filelists.xml.gz` 當前倉庫內所有rpm包的所有文件列表
other.xml.gz` 額外信息,RPM包的修改日誌
repomd.xml` 記錄的是上面三個文件的時間戳和校驗和
comps*.xml` RPM包分組信息

yum配置文件

yum配置文件爲

  • /etc/yum.conf:爲所有倉庫提供公共配置
  • /etc/yum.repos.d/*.repo:爲倉庫的指向提供配置

其配置文件類似於Windows中的INI文件,/etc/yum.conf主要由2段:
[main]:住配置段
[repo]:倉庫配置段

/etc/yum.repos.d/*.repo用於配置倉庫,可有多段:

  • [REPO_NAME]:倉庫名稱
  • [REPO_NAME]:倉庫名稱
  • ……

yum.conf文件內容:

[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release

# 以下爲註釋,此處省略

常用字段3

字段 描述
cachedir Directory where yum should store its cache and db files. The default is `/var/cache/yum’.
keepcache Either ‘1’ or ‘0’. Determines whether or not yum keeps the cache of headers and packages after successful installation. Default is ‘1’ (keep files)
debuglevel Debug message output level. Practical range is 0-10. Default is ‘2’.
logfile Full directory and file name for where yum should write its log file.
tolerant Either ‘1’ or ‘0’. If enabled, yum will go slower, checking for things that shouldn’t be possible making it more tolerant of external errors. Default to `0’ (not tolerant).
distroverpkg The package used by yum to determine the “version” of the distribution, this sets $releasever for use in config. files. This can be any installed package.Default is ‘system-release(releasever)’, ‘redhat-release’. Yum will now look at the version provided by the provide, and if that is non-empty then will use the full V(-R), otherwise it uses the version of the package.
You can see what provides this manually by using: “yum whatprovides ‘system-release(releasever)’ redhat-release” and you can see what $releasever is most easily by using: “yum version”.
exactarchlist List of packages that should never change archs in an update. That means, if a package has a newer version available which is for a different compatible arch, yum will not consider that version an update if the package name is in this list. For example, on x86_64, foo-1.x86_64 won’t be updated to foo-2.i686 if foo is in this list. Kernels in particular fall into this category. Shell globs using wildcards (eg. * and ?) are allowed. Default is an empty list.
obsolees This option only has affect during an update. It enables yum’s obsoletes processing logic. Useful when doing distribution level upgrades. See also the yum upgrade command documentation for more details (yum(8)). Default is ‘true’.
gpgcheck Either ‘1’ or ‘0’. This tells yum whether or not it should perform a GPG signature check on packages. When this is set in the [main] section it sets the default for all repositories. The default is ‘0’.
plugins Either ‘0’ or ‘1’. Global switch to enable or disable yum plugins. Default is ‘0’ (plugins disabled). See the PLUGINS section of the yum(8) man for more information on installing yum plugins.

爲yum定義repo文件

我們一般都將倉庫定義放置於/etc/yum.repos.d/目錄下,並且以.repo爲文件名結尾,其內容格式爲

[Repo_ID]
name=Description
baseurl=			倉庫的訪問路徑,可以同時指定多個
	ftp://
	http://
	nfs://
	file://
enabled={1|0}		是否啓用此倉庫,默認啓用
gpgcheck={1|0}		是否檢查包來源合法性及完整性
gpgkey=				公鑰文件的URL
	若gpgcheck指定爲1,此項必須指定,方法同baseurl,可爲ftp,htpp,nfs,file
enablegroup={1|0}	是否允許使用組進行管理
enablegroups={1|0}	是否允許在次倉庫上基於組執行倉庫管理,默認開啓
failovermethod={roundrobin|priority}		故障轉移方式
	默認爲:roundrobin,爲隨機挑選
	
username=
password=
	用戶名與密碼
	
cost=				定義此倉庫的開銷
	默認爲1000,開銷越小,將越被優先使用

說明

  • 關於baseurl,指定時以協議名開頭,而指定爲file://時表示通過文件系統方位(一般用於本地),此時其後根本地路徑,將展示爲file:///PATH,即三個/,第三個/表示Root Directory,如下爲一個本地倉庫的定義:
    [base1]
    name=CentOS 7 Release 7.1
    baseurl=file:///media/cdrom
    enabled=0
    gpgcheck=1
    gpgkey=file:///media/cdrom/RPM-GPG-KEY-CentOS-7
    
yum的repo配置文件中可用的宏
$releasever
	程序的版本,對yum而言指的是redhat-release版本,只替換爲主版本號
	如RHEL 6.5,則替換爲6
$arch: 系統架構
$basearch: 基礎系統架構
	如i686, i586等的基本架構爲i386
$YUM[0-9]: 在系統中定義的環境變量,可在yum中使用

我們可以通過Python的相關模塊來獲取這些宏信息:

[root@localhost ~]# python
Python 2.7.5 (default, Oct 30 2018, 23:45:53)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import yum,pprint
>>> yb=yum.yum.YumBase()
>>> pprint.pprint(yb.conf.yumvar,width=1)
Loaded plugins: fastestmirror, langpacks
{'arch': 'ia32e',
 'basearch': 'x86_64',
 'contentdir': 'centos',
 'infra': 'stock',
 'releasever': '7',
 'uuid': 'b20d80a4-93ea-4c88-8d97-a4b982570a63'}
>>> exit()
[root@localhost ~]#

yum命令

yum命令的使用格式爲

yum[options] [command] [package ...]
	[options]
		-y: 自動回答爲yes
		--nogpgcheck:不使用gpg check
		-q:靜默模式
		--disablerepo=repoidglob:臨時禁用此處指定的repo
		--enablerepo=repoidglob:臨時啓用此處指定的repo
		--noplugins:禁用所有插件

yum有衆多子命令,以下將做介紹

  • list: 列表,顯示程序包
    all:所有,默認選項
    available:可用的,即倉庫中有但尚未安裝的
    installed:已經安裝的
    updates: 可用的升級

    可使用Glob過濾:yum list [all|available|installed|updates | glob_exp1] [glob_exp2] [...]

  • clean: 清理本地緩存
    可選擇清理那些內容:[packages|headers|metadata|expire-cache|rpmdb|dbcache|plugins|all]
  • repolist: 顯示repo列表及其簡要信息
    all
    enabled: 默認
    disabled
  • deplist
    查看指定包所依賴的capabilitys
  • install: 安裝
    直接指定包,可以本地安裝:yum install PACKAGE_FILE
    需要手動禁止檢查來源及完整性:--nogpgcheck
  • reinstall:重新安裝
    可指定本地包:yum reinstall PACKAGE_NAME
  • 升級
    check-update:檢查可升級的包
    update [package1 package2 …]:升級爲庫中的最新版本
    update_to: 升級爲指定版本
    downgrade:降級
  • remove|erase:卸載
    注意:會卸載掉依賴當前軟件的包
  • 查詢信息
    info:查詢指定包的說明信息
    provides | whatprovides:查看指定的特性(可以是某文件)是由哪個程序包所提供
  • makecache
    構建緩存
  • search string1 [string2] [...]
    搜索,以指定的關鍵字搜索程序包名及summary信息
  • 包組相關
    groupinfo:顯示指定包組信息
    grouplist:顯示所有組
    groupinstall: 安裝指定的包組
    • CentOS7組安裝可能要執行yum groups mark convert
    groupremove:卸載組
  • history:查看yum的事務歷史
    [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
  • 創建yum倉庫:
    createrepo [options] <directory>

三、任務計劃

1. Linux任務計劃

Linux系統的任務計劃大體上分爲兩種:一次性任務和週期性任務

同時,系統也預設了一些任務,如locate數據庫的建立、man手冊的建立等

2. 一次性任務

at

at需要依賴atd服務,在RHEL系列發行版上,該服務默認啓用

at爲交互式命令,執行後,用戶可在at>提示符下進行任務配置,命令使用方式爲

at [OPTION] TIME
	OPTION
		-l		查看作業列表,相當於atq命令
		-f		從指定文件中讀取作業任務,而不是交互式輸入
			at -f /path/to/at_job_file TIME
		-d		刪除一個尚未執行的作業,相當於atrm命令
			# at -d job_num
			# atrm job_num
			
		-c		查看指定作業的具體內容
			可查看at執行任務時的環境配置
		-q		指定隊列
			at作業有隊列:使用單個字母來表示
	
	TIME
		絕對時間:HH:MM, DD.MM.YY  MM/DD/YY
		相對時間:now+#UNIT
			UNIT:minutes,hours,days,weeks
		模糊時間:noon,midnight,teatime(16:00),tomorrow

而在at>提示符中,直接輸入要執行的命令即可,使用Ctrl+D提交

任務計劃的執行結果,將以郵件的形式發送給安排任務計劃的用戶

at的執行權限

/etc/下,可以編輯at.denyat.allow文件,來設定誰可以使用at命令

  • 若兩個文件都存在,只有at.allow文件生效
  • 若兩個文件都不存在,只允許root用戶使用

batch

batch命令可讓用戶無需指定時間,自動選擇系統空閒的時間(load average<0.8)執行任務,其他格式同at

3. 週期性任務

cron

cron依賴的服務爲crond,cron任務分爲兩類,系統cron任務與用戶cron任務

cron任務的設定是通過定義文件來實現的,接下來將對兩種分別介紹

系統cron

系統cron定義在/etc/cron/目錄中,/etc/cron/.*/目錄下有各種週期的計劃任務,管理員可通過編輯/etc/crontab文件來定義系統cron,筆者系統該默認文件如下

[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

上面爲crond在指定任務時使用的環境配置,而下方的註釋信息說明了任務的定義格式,每行定義一個任務,格式爲

分鐘 小時 天 月 周 用戶 任務
cron的環境變量:

cron執行的所有命令都去PATH環境變量指定的路徑下去找,在執行任務的時候,用戶可能沒有登錄,所以沒有環境變量

cron中默認的環境變量:PATH /bin:/sbin/:usr/bin:/usr/sbin

應該使用絕對路徑,或自定義PATH環境變量

若任務計劃是腳本,可以在腳本中設定環境變量:

#!/bin/bash
export PATH=……

用戶cron

用戶cron定義在/var/spool/cron/USERNAME文件中,格式如下:

分鐘 小時 天 月 周 任務

與系統cron相比,此處無需指定用戶,其他定義方式與類似

時間的指定方式

時間的有效取值

分鐘:0-59

小時:0-23

天:1-31

月:1-12

周:0-7,0和7都表示週日

時間通配表示:

*:對應的所有有效取值,如

  • 3 * * * *:每小時的第3分鐘執行
  • 3 * * * 7:每週日的每小時的第3分鐘執行
  • 13 12 6 * 3:每月的6日,同時是週三,12:13分執行

,:離散時間點,如

  • 10,40 * * * *:每小時的第10分和第40分執行
  • 10,40 * * * 2,5:每週二和每週五的每小時第10分和第40分執行

-:連續時間點,如

  • 10 02 * * 1-5:每週一到週五的2:10執行

/#:對應取值範圍每多久一次,如

  • */3 * * * *每3分鐘執行一次
Tips

在使用/#方式指定時間時,若指定的時間點不能被#整除,將沒有意義

day of week與day of month一般不同時使用

執行結果將以郵件的形式發送給管理員,可通過下列方式拒收郵件

  • 通過輸出重定向而拒收郵件:*/3 * * * * cat /etc/fstab &> /dev/null
  • 指定MAILTO爲空,發送mail給空用戶:MAILTO=""

(1) 3 * * * *:每小時執行一次;每小時的第3分鐘;

(2) 3 4 * * 5:每週執行一次;每週5的4點3分;

(3) 5 6 7 * *:每月執行一次;每月的7號的6點5分;

(4) 7 8 9 10 *:每年執行一次;每年的10月9號8點7分;

(5) 9 8 * * 3,7:每週三和週日的8點9分執行;

(6) 0 8,20 * * 3,7:每週三和週日的8點和20d點執行;

(7) 0 9-18 * * 1-5:週一至週五的9點至18點整,每小時執行;

(8) */5 * * * *:每5分鐘執行一次某任務;

cron的使用權限

類似於at,cron也對那些用戶可以使用做了限制,定義在/etc/cron.allow/etc/cron.deny

同樣的,二者只有一個可以生效,/etc/cron.allow優先級較高

crontab命令

該命令用於維護cron任務,用法爲

crontab
	-l			列出當前用戶的所有cron任務列表
	-e			通過EDITOR變量中定義的編輯器打開用戶自己的cron配置文件
		編輯單獨的任務都使用-e選項,無論是刪除、修改還是新建
	-r			刪除/var/spool/cron/USERNAME文件,移除所有任務
	-i			在使用-r選項移除所有任務時提示用戶確認
	-u USERNAME		管理其他用戶的cron任務,只有管理員可執行
		如: # crontab -e -U user1
Tips
如果在crontab的用戶命令中使用%,需要轉義爲\%,在使用單引號後,%也可以不必轉義
5 3 * * * /bin/touch ~/testfile_`date +%Y-%m-%d`.txt 應該寫爲
	5 3 * * * /bin/touch ~/testfile_`date +\%Y-\%m-\%d`.txt
	或放置於單引號中:
	5 3 * * * /bin/touch ~/testfile_`date +'%Y-%m-%d'`.txt
1、每3分鐘執行一個echo “how are you?”
*/3 * * * * /bin/echo “how are you?”
2、每週2、4、6備份/etc/目錄至/backup目錄中,備份的文件名以當etc_開頭並跟上當日的日期作爲文件名
0 0 * * 2,4,6 ([ -d /backup ] || mkdir /backup )&& /bin/tar Jcf /back/etc-`date +'%F'`.tar.xz /etc/* 
3.每天6,9,12,15,18查看一下系統當前掛載的所有文件系統,並將查看的結果追加至/tmp/mounts.txt文件中
0 6-18/3 * * *  /bin/mount >> /tmp/mounts.txt
4.每天每兩小時取當前系統內存空間餘量,將其保存至/stats/memory.txt文件中
20 */2 * * * /bin/grep "^MemFree:" /proc/meminfo >> /stats/memory.txt

anacron

anacron是crontab的補充,用於檢查crontab中某任務在過去的一個週期內是否沒有執行,如果沒有執行,則在開機以後的某時間點讓其執行一次,無論其週期是否到達

/etc/anacrontab文件如下

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1   5   cron.daily      nice run-parts /etc/cron.daily
7   25  cron.weekly     nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly        nice run-parts /etc/cron.monthly

類似於/etc/crontabb,文件中有4個字段:period in days delay in minutes job-identifier command

  • 天數
  • 若指定天數超過而任務沒有執行,則在開機以後的第多少分鐘執行
  • 註釋信息
  • 操作

四、sed

sed是Linux系統上著名的文本處理工具,sed爲Stream EDitor之意,顧名思義,它是一款流編輯器,由貝爾實驗室開發,異常強大,可以說是一個腳本語言,與vimawk併成爲Linux文本處理三劍客(The Three Musketeers)

1. sed工作方式

模式空間

sed工作時從輸入流或文件中逐行讀取文本到一個稱爲模式空間(Pattern Space)的內部緩衝區。每讀一行開始一個循環 。對於模式空間,sed會應用sed Script指定的一個或多個操作

另外還有另一殊緩衝區,即保持空間(Hold Space),可以由幾個sed命令使用,用於在循環之間保持和累積文本

sed_patter_space

sed工作流程

sed工作按照讀取、處理、顯示的流程執行,即4

sed_workflow

  • 讀取(Read):sed從輸入流(文件,管道或標準輸入)讀取一行,並將其存儲在名爲模式緩衝區的內部緩衝區中

  • 執行(Execute):所有Sed命令按順序應用於模式緩衝區。 默認情況下,除非指定行尋址,否則SED命令將應用於所有行(globally)

  • 顯示(Display):將(修改的)內容發送到輸出流。 發送數據後,模式緩衝區將爲空

  • sed對文件的每一行指定上述操作,直至輸入流爲空

說明5

: - 模式空間是一塊活躍的緩衝區,在sed編輯器執行命令時它會保存待檢查的文本
  • 默認情況下,所有的sed命令都是在模式空間中執行,因此輸入文件並不會發生改變
  • 還有另外一個緩衝區叫做保持空間,在處理模式空間中的某些行時,可以用保持空間來臨時保存一些行。在每一個循環結束的時候,sed將會移除模式空間中的內容,但是該緩衝區中的內容在所有的循環過程中是持久存儲的。sed命令無法直接在該緩衝區中執行,因此sed允許數據在保持空間模式空間之間切換
  • 初始情況下,保持空間模式空間這兩個緩衝區都是空的
  • 如果沒有提供輸入文件的話,sed將會從標準輸入接收請求
  • 如果沒有提供地址範圍的話,默認情況下sed將會對所有的行進行操作

2. 基礎用法

sed默認不編輯原文件,僅對模式空間中的數據做處理;處理結束後,將模式空間打印至屏幕

其基本使用格式爲

sed [options] SCRIPT file ...
	若使用變量替換,應使用雙引號,即sed [options] "SCRIPT" file ...
	options
		-n					靜默模式,不再默認顯示模式空間的內容
		-i					直接修改原文件
		-e					指定多個編輯指令
			-e SCRIPT -e SCRIPT ...	 即
				-e 'AddressCommand' -e 'AddressCommand' ...
		-f /PATH/TO/SED_SCRIPT_FILE			讀取腳本文件來處理文本
			sed -f /path/to/sed_scripts	 file
			文件中每行一個指令
		-r	使用擴展正則表達式(默認爲基本正則表達式)

	SCRIPT:由<Address><Command>組成,多個SCRIPT直接可使用分號隔開
		Address:地址定界
			1、 StartLine,EndLine
				1,100		第1行到第100行
				$			最後一行
			2、 /Rpattern/		能被pattern匹配到的所有行
				/^root/		以root開頭的行
			3、/pattern1/,/pattern2/
				第一次被pattern1匹配到的行開始,至第一次被pattern2匹配到的行結束,這中間的所有行
				或LineNumber,/pattern/
			4、 LineNumber
				指定的行
				$			最後一行
			5、 StartLine,+N
				從StartLine開始,向後的N行(共n+1行)
			6、空地址
				即不給定地址定界,對全文進行處理
			7、步進:~
				1~2:所有奇數行
				2~2:所有偶數行

		Command:編輯命令
			d				刪除符合條件的行
			p				顯示符合條件的行
			a \STRING		在指定的行後面追加新行,內容爲STRING
				\n				換行
			i \STRING		在指定的行前面追加新行,內容爲STRING
			c \STRING		把匹配到的行替換爲此處指定的文本STRING
			r FILE			將指定的文件的內容添加至符合條件的行處
			w FILE			將符合條件的行另存至指定的文件中
			=			顯示符合條件的行的行號
			!			條件取反
				一般形式:地址定界!編輯命令
			s				查找並替換,默認只替換每行中第一次被模式匹配到的字符串
				地址定界s/pattern/string/修飾符
					將每一行中能夠被pattern匹配到的字符串替換成string字符串
					注意:string字段中不能使用正則表達式
	
					修飾符
						g		全局替換,替換所有被模式匹配到的字符串
						i		忽略字符大小寫
						w /PATH/TO/SOMEFILE
							將替換成功的結果保存至指定文件中
						p		顯示替換成功的行

seds命令與vim中相同

①刪除/etc/grub.conf文件中行首的空白符;

  • sed -r 's@^[[:spapce:]]+@@g' /etc/grub.conf

②替換/etc/inittab文件中"id:3:initdefault:"一行中的數字爲5;

  • sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab

③刪除/etc/inittab文件中的空白行;

  • sed '/^$/d' /etc/inittab

④刪除/etc/inittab文件中開頭的#號;

  • sed 's@^#@@g' /etc/inittab

⑤刪除某文件中開頭的#號及後面的空白字符,但要求#號後面必須有空白字符;

  • sed -r 's@^#[[:space:]]+@@g' /etc/inittab

⑥刪除文件中以空白字符後面跟#類的行中的開頭的空白字符及#

  • sed -r 's@^[[:space:]]+#@@g' /etc/inittab

⑦取出一個文件路徑的目錄名稱;

  • echo "/etc/rc.d/" | sed -r 's@^(/.*/)[^/]+/?@\1@g'
  • echo "/var/log/messages" | sed 's@[^/]\+/\?$@@'

⑧刪除/etc/init.d/functions文件中的空白行

  • sed '/^$/d' /etc/init.d/functions

⑨刪除/etc/rc.d/rc.rc.sysinit文件中以#開頭且後面跟了至少一個空白字符的行的行首的#和空白符;

  • sed 's@^#[[:space:]]\{1,\}@@' /etc/rc.d/rc.sysinit

⑩取出一個文件路徑的目錄名稱,如/etc/sysconfig/network,其目錄爲/etc/sysconfig,功能類似dirname命令;

  • echo /etc/sysconfig/network | sed 's@[^/]\{1,\}/\?$@@'

2. 高級用法

sed高級編輯命令

h:把模式空間(pattern space)中的內容覆蓋至保持空間(hold space)中
H:把模式空間中的內容追加至保持空間中
g:把保持空間中的內容覆蓋至模式空間中
G:把保持空間中的內容追加至模式空間中
x:把模式空間中的內容與保持空間中的內容互換
n:覆蓋讀取匹配到的行的下一行至模式空間中
N:追加讀取匹配到的行的下一行至模式空間中
d:刪除模式空間中的行
D:刪除多行模式空間中的所有行


sed-n'n;p' FILE:顯示偶數行

  • 說明:對於N或n命令,讀取到下一行後,下次就不再讀取

sed '1!G;h;$!d' FILE:按行逆序顯示文件內容

sed '$!d' FILE:取出最後一行

sed '$!N;$!D' FILE:取出最後兩行

sed '/^$/d;G' FILE:刪除文件中的空行,而後給文件的每一行後加空行

sed 'n;d' FILE:顯示奇數行

sed 'G' FILE:在原有的每行後添加一個空行

五、例

1、每12小時備份並壓縮/etc/目錄至/backup目錄中,保存文件名稱格式爲,“etc-年-月-日-時-分.tar.gz”

編輯/etc/crontab文件,定義任務計劃:

PATH=/sbin:/bin:/usr/sbin:/usr/bin
0 0,12 * * * tar zcf /backup/etc-`date +'%F-%H-%M'`.tar.gz /etc/

說明

  • 使用到的tardate命令均在/usr/bin/目錄下,在cron環境變量中定義之,或使用絕對路徑
  • 命令中用到的%可使用\轉義或將其置於''

2、寫一個腳本實現列出以下菜單給用戶:

cpu) display cpu information
mem) display memory information
disk) display disks information
quit) quit
!/bin/bash

cat << EOF
cpu) display cpu information
mem) display memory information
disk) display disks information
quit) quit
================================
EOF

read -p "Enter your option: " option

while true; do
    case $option in
    cpu)
        lscpu
        break
        ;;
    mem)
        free -m
        break
        ;;
    disk)
        fdisk -l /dev/[hs]d[a-z]
        break
        ;;
    quit)
        echo "quit"
        exit 0
        ;;
    *)
        read -p "Enter your option: " option
        ;;
    esac
done

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

本機的訪問日誌定義格式爲

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog "logs/access_log" combined

統計命令爲

cut -d' ' -f1,9 access.log | grep [[:space:]][45] | sort | cut -d' ' -f1 | uniq -c

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

yum源配置:

[base1]
name=CentOS 7 Release 7.1
baseurl=file:///media/cdrom
enabled=0
gpgcheck=1
gpgkey=file:///media/cdrom/RPM-GPG-KEY-CentOS-7

軟件包安裝

[root@localhost scripts]# yum -y install ftp openssh curl wget tcpdump

  1. 關於加密的相關內容,Web服務將做介紹 ↩︎

  2. 圖片引用自 http://linux.vbird.org/linux_basic/0520rpm_and_srpm.php#intro_solution ↩︎

  3. 表格內容來自yum.conf(5) ↩︎

  4. 圖片來源:https://www.tutorialspoint.com/sed/sed_workflow.htm ↩︎

  5. 參考自 https://www.tutorialspoint.com/sed/sed_workflow.htm ↩︎

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