馬哥linux作業--第六週
Q1:每12
小時備份並壓縮/etc/
目錄到/back
目錄中,儲存檔名格式為,etc-年-月-日-時-分.tar.gz
* */12 * * * tar czf /back/etc-`date +"%F-%H-%M"`.tar.gz /etc
Q2:rpm包管理功能總結以及例項應用演示。
RPM
,原名Red-hat Package Manager
,成為行業標準後改名為RPM Package Manager
。RPM
包的命名格式為:{package}-{version}-{release}.{arch}.rpm
。
比較大的包可以分成主包和多個子包,主包包含主要功能,子包包含擴充套件功能。主包命名格式:{masterpackage}-{version}-{release}.{arch}.rpm
,子包命名格式:{masterpackage}-{subpackage}-{version}-{release}.{arch}.rpm
。
- 安裝和升級相關選項:
- -i PACKAGEFILE:安裝指定的包,例:
rpm -i httpd-2.4.6-67.el7.centos.x86_64.rpm
。- -U PACKAGEFILE:安裝/升級指定包,例:
rpm -U ftp-0.17-51.1.el6.x86_64.rpm
。- -F PACKAGEFILE:升級指定包,前提是已經安裝了老版本,否則不做任何操作,例:
rpm -F ftp-0.17-51.1.el6.x86_64.rpm
。- --reinstall PACKAGEFILE:重新安裝指定包(centos7)。
- --force:強制安裝,等同於
--replacepkgs, --replacefiles, --oldpackage
,可以實現重灌或降級。- -h:用
#
符號顯示進度,一共50
個,每個表示2%
。- --nodeps:不檢查依賴關係。
- --nodigest:不檢驗校驗和。
- --nosignature:不檢驗簽名。
- --oldpackage:降級安裝。
- --prefix:指定安裝路徑。
- --replacefiles:覆蓋其他已安裝包的檔案。
- --replacepkgs:替換原有安裝。
- --test:不安裝,只是測試潛在的衝突。
- 解除安裝相關選項:
- -e PACKAGENAME:解除安裝指定包,例
rpm -e httpd
- --allmatches:解除安裝指定包的所有已安裝的版本,預設情況下,如果檢測到有多個版本,會報錯。
- --nodeps:不檢查依賴關係。
- --test:不解除安裝,只測試。
- 查詢相關選項:查詢的用法
rpm {-q|--query} [select-options] [query-options]
- select-options:
- -q PACKAGENAME:查詢指定的包是否已經安裝,如果已安裝,顯示其完整包名。
- -a:列出所有已經安裝的包。
- -f FILE:查詢指定檔案屬於哪個包。
- -g GROUP:查詢指定包組中的包。
- -p PACKAGEFILE:查詢指定的包檔案相關資訊,而不是已經安裝的包名。
- --whatprovides CAPABILITY:查詢提供指定CAPABILITY(功能)的包。
- --whatrequires CAPABILITY:查詢依賴指定CAPABILITY的包。
- query-options:
- --changelog:顯示指定包的修改日誌。
- -c:顯示配置檔案。
- --conflicts:顯示跟指定包的CAPABILITY衝突的包。
- -d:顯示文件檔案。
- -i:顯示指定包的資訊,包括名稱,版本,描述。
- -L:顯示授權檔案。
- -l:列出指定包安裝生成的所有檔案。
- --provides:列出指定包提供的CAPABILITES。
- -R/--requires:列出指定包依賴的所有CAPALITIES。
- --scripts:列出包在安裝和解除安裝過程中使用的指令碼。
- -s:列出指定包生成的所有檔案的狀態,狀態可能為
正常
、未安裝
,被替換
。- 完整性檢驗相關選項:檢驗的用法
rpm {-V|--verify} [select-options] [verify-options]
- -V PACKAGENAME:
- 驗證的結果一共9位(centos5是8位,少最後一位),表示9個屬性被修改:
- S:檔案大小(Size)。
- M:檔案許可權(Mode)。
- 5:MD5校驗碼。
- D:裝置的主/次裝置號不匹配(Device)。
- L:路徑不匹配:(readLink)。
- U:屬主不匹配(User)。
- G:屬組不匹配(Gser)。
- T:最近修改時間不匹配(mTime)。
- P:CAPABILITY發生變化(caPbilities)。
- 後面會有一個欄位指明檔案型別:
- c:配置檔案。
- d:文件檔案。
- g:幽靈檔案(檔案不屬於此包)。
- l:授權檔案。
- r:readme檔案。
- 例:剛安裝完
openssh
,執行rpm -V openssh
沒有任何輸出,修改檔案/usr/share/doc/openssh-4.3p2/INSTALL
(openssh安裝生成的檔案),隨便修改一點內容,再執行rpm -V openssh
,顯示S.5....T d /usr/share/doc/openssh-4.3p2/INSTALL
,表示檔案大小
、MD5校驗碼
,最近修改時間
三項發生變化。- 合法性校驗選項:用法
rpm -K options PACKAGEFILE
- -K PACKAGEFILE:驗證指定包檔案的合法性。
- dsa和gpg演算法用來校驗來源合法性,即簽名校驗。
- sha1和md5演算法用來校驗包的完整性。
- --import PUBKEY:匯入驗證用的公鑰。匯入的金鑰檔案位於
/etc/pki/rpm-gpg/
目錄下,命名格式為:RPM-GPG-KEY-{name}-{release}
。- 資料庫管理,rpm資料位於
/var/lib/rpm
。
- --initdb:初始化資料庫,如果已經資料庫,不做任何操作。
- --rebuilddb:重建資料庫。
Q3:yum
的配置和使用總結以及yum
私有倉庫的建立。
- 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:檢視組資訊。
- yum選項:
- -y:對所有互動回答為yes。
- -c:指定yum配置檔案位置。
- -q:靜默模式。
- -v:顯示除錯資訊。
- --disablerepo:臨時禁用repo。
- --enablerepo:臨時啟用repo。
- --nogpgcheck:不檢查來源合法性。
- 建立yum倉庫:
createrepo [options] DIRECTORY
- -u URL:指定
baseurl
,訪問倉庫的url。- --basedir:指向rpm檔案目錄的路徑,預設是當前目錄
- -x:排除的檔案,可用glob指定。
- 倉庫元資料:在倉庫的
repodate
目錄中
- primary.xml.gz:指明瞭倉庫中所有rpm包,依賴關係,每個包安裝後會生成的檔案。
- filelists.xml.gz:當前倉庫中所有rpm包的所有檔案列表。
- other.xml.gz:額外資訊,比如修改日誌。
- repomd.xml:上述三個檔案的時間戳和檢驗和。
- comps*.xml:分組資訊。
- 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,越小說明效能越好。
Q4:寫一個指令碼實現以下選單給使用者:
(1) disk:show disk info 資訊
(2) mem:show memory info 資訊
(3) cpu:show cpu info 資訊
(*) quit#! /usr/bin/env bash function 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
Q5:sed
用法總結並結合例項演示。
- 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
中的字元。- 選項:
- -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'
Q6:用bash
實現統計訪問日誌檔案中狀態碼大於等於400
的IP
數量並排序
sed -n -r '/\<40[0-9]\>/p' /var/log/httpd/access_log|cut -d" " -f1 |sort|uniq -c
Q7:使用自制的yum
源安裝ftp
、openssh
、wget
、tcpdump
等軟體包。
1、root
目錄下,新建目錄myrepo/Packages
。
2、 從光碟中複製相應的rpm包到Pacakges
目錄。
3、 執行命令createrepo -u /root/myrepo/Packages /root/myrepo
4、 編輯檔案/etc/yum.repos.d/myrepo.repo
,新增如下內容:
[myrepo]
name=my custom repo
baseurl=file:///root/myrepo
enabled=1
gpgcheck=0
5、yum install XXX
。