1. 程式人生 > >馬哥linux作業--第六週

馬哥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:檢視指定包的描述資訊,可用的opionlist命令。
    • 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實現統計訪問日誌檔案中狀態碼大於等於400IP數量並排序

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

Q7:使用自制的yum源安裝ftpopensshwgettcpdump等軟體包。

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