第二個禮拜總結

shell編程:過程試。解釋執行
編程語言的基本結構:
各種命令的組合
數據儲存:變量。數組
表達式:a+b
語句:if

shell腳本基礎:
包含一些命令或聲明,並符合一定格式的文本文件
格式要求:首行shebang機制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
shell腳本的用途有:
自動化常用命令
執行系統管理和故障排除
創建簡單的應用程序
處理文本或文件

腳本規範:
腳本代碼開頭約定
1.第一行一般爲調用使用的語言
2.程序名,避免更改文件名爲無法找到正確文件
3.版本號
4.更改後的時間
5作者相關信息
6該程序的作用,及注意事項
7.最後是各版本的更新簡要說明

腳本調試:
1.檢測腳本中的語法錯誤
bash -n /path/to/some_scrip
2。調試執行
bash -x /path/to/some_script

變量
shell中變量命名法則
1.不能使用程序中的保留字;例如 if for
2。只能使用數字 字母 及下劃線,且不能以數字開頭
3.見名知意
4.統一命名規則:駝峯命名法

shell中命名建議規則:
1。變量大寫
2.局部變量小寫
3。函數名小寫
4.用英文名字,並體現出實際作用

bash中變量的種類:
根據變量的生效範圍等標準劃分下面變量類型
局部變量 :生效範圍爲當前shell進程:對當前shell之外的其他shell進程,包括當前shell的子shell進程均無效
環境變量:生效範圍爲當前shell進程的子進程
本地變量:生效範圍爲當前shell進程中某代碼片斷,通常指函數。
位置變量:$1,$2,...來表示,用於讓腳本腳本代碼中調用通過命令行傳遞給它的參數
特殊變量:$? 查看命令執行結果 echo$?結果爲0執行成功。非0 (1-255)之間爲失敗,
$0,命令本身
$: 傳遞給腳本的所有參數,全部參數爲一個字符串br/>$@:傳遞給ijaoben的所有參數,每個參數爲獨立字符串
,,$#:傳遞給腳本的參數的個數
,,$$:傳遞給腳本的參數的個數
注意:$@ $
只在被雙引號包起來的時候纔會有差異

局部變量
變量賦值:name=‘value’
可以使用引用value
(1) 可以是直接字串:name=“root"
(2) 變量引用:name="$USER"
(3) 命令引用:name=COMMAND
name=$(COMMAND)
變量引用:${name} 或者 $name
" " 弱引用,其中的變量引用會被替換爲變量值
' ' 強引用,其中的變量引用不會被替換爲變量值,而保持原字符串
顯示已定義的所有變量:set
刪除變量:unset name

退出狀態碼
bash自定義退出狀態碼
exit [n]:自定義退出狀態碼
注意:腳本中一旦遇到exit命令,腳本會立即終止;終止退出狀態取決於exit命令後面的數字
注意:如果未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決於腳本中執行的最後一條命令的狀態碼

算術運算
bash中的算術運算:help let
+, -, *, /, %取模(取餘), **(乘方),乘法符號有些場景中需要轉義
實現算術運算:
(1) let var=算術表達式
(2) var=$[算術表達式]
(3) var=$((算術表達式))
(4) var=$(expr arg1 arg2 arg3 ...)
(5) declare –i var = 數值
(6) echo ‘算術表達式’ | bc
bash有內建的隨機數生成器變量:$RANDOM(0-32767)
示例:生成 0 - 49 之間隨機數
echo $[$RANDOM%50]

邏輯運算
true, false
1, 0

1 與 1 = 1
1 與 0 = 0
0 與 1 = 0
0 與 0 = 0

1 或 1 = 1
1 或 0 = 1
0 或 1 = 1
0 或 0 = 0

邏輯運算
非:!
! 1 = 0 ! true
! 0 = 1 ! false
短路運算
短路與
第一個爲0,結果必定爲0
第一個爲1,第二個必須要參與運算
短路或
第一個爲1,結果必定爲1
第一個爲0,第二個必須要參與運算
異或:^
異或的兩個值,相同爲假,不同

bash的數值測試
-v VAR
變量VAR是否設置
數值測試:
-gt 是否大於
-ge 是否大於等於
-eq 是否等於
-ne 是否不等於
-lt 是否小於
-le 是否小於等於

bash的字符串測試
字符串測試:
= 是否等於

ascii碼是否大於ascii碼
< 是否小於
!= 是否不等於
=~ 左側字符串是否能夠被右側的PATTERN所匹配
注意: 此表達式一般用於[[ ]]中;擴展的正則表達式
-z "STRING“ 字符串是否爲空,空爲真,不空爲假
-n "STRING“ 字符串是否不空,不空爲真,空爲假
注意:用於字符串比較時的用到的操作數都應該使用引號

Bash的文件測試
存在性測試
-a FILE:同-e
-e FILE: 文件存在性測試,存在爲真,否則爲假
存在性及類別測試
-b FILE:是否存在且爲塊設備文件
-c FILE:是否存在且爲字符設備文件
-d FILE:是否存在且爲目錄文件
-f FILE:是否存在且爲普通文件
-h FILE 或 -L FILE:存在且爲符號鏈接文件
-p FILE:是否存在且爲命名管道文件
-S FILE:是否存在且爲套接字文件

Bash的文件權限測試
文件權限測試:
-r FILE:是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執行
文件特殊權限測試:
-u FILE:是否存在且擁有suid權限
-g FILE:是否存在且擁有sgid權限
-k FILE:是否存在且擁有sticky權限

Bash的文件屬性測試
文件大小測試:
-s FILE: 是否存在且非空
文件是否打開:
-t fd: fd 文件描述符是否在某終端已經打開
-N FILE:文件自從上一次被讀取之後是否被修改過
-O FILE:當前有效用戶是否爲文件屬主
-G FILE:當前有效用戶是否爲文件屬組

Bash的組合測試條件
第一種方式:
EXPRESSION1 -a EXPRESSION2 並且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
必須使用測試命令進行,[[ ]] 不支持
第二種方式:
COMMAND1 && COMMAND2 並且,短路與,代表條件性的AND THEN
COMMAND1 || COMMAND2 或者,短路或,代表條件性的OR ELSE
! COMMAND 非
如:[ -f “$FILE” ] && [[ “$FILE”=~ .*.sh$ ]]

短路與和短路或
[ $RANDOM%6 –eq 0 ] && rm –rf /* || echo “click”

使用read命令來接受輸入
使用read來把輸入值分配給一個或多個shell變量
-p 指定要顯示的提示
-s 靜默輸入,一般用於密碼
-n N 指定輸入的字符長度N
-d ‘字符’ 輸入結束符
-t N TIMEOUT爲N秒
read 從標準輸入中讀取值,給每個單詞分配一個變量
所有剩餘單詞都被分配給最後一個變量
read -p “Enter a filename: “ FILE

條件選擇if語句
選擇執行:
注意:if語句可嵌套
單分支
if 判斷條件;then
條件爲真的分支代碼
fi
雙分支
if 判斷條件; then
條件爲真的分支代碼
else
條件爲假的分支代碼
fi

if 語句
多分支
if 判斷條件1; then
條件1爲真的分支代碼
elif 判斷條件2; then
條件2爲真的分支代碼
elif 判斷條件3; then
條件3爲真的分支代碼
else
以上條件都爲假的分支代碼
fi
逐條件進行判斷,第一次遇爲“真”條件時,執行其分支,而後結束整個if語句

條件判斷:case語句
case 變量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
)
默認分支
;;
esac
case支持glob風格的通配符:
: 任意長度任意字符
?: 任意單個字符
[]:指定範圍內的任意單個字符
a|b: a或b

bash如何展開命令行
把命令行分成單個命令詞
展開別名
展開大括號的聲明({})
展開波浪符聲明(~)
命令替換$() 和 ``)
再次把命令行分成命令詞
展開文件通配(*、?、[abc]等等)
準備I/0重導向(<、>)
運行命令

防止擴展
反斜線(\)會使隨後的字符按原意解釋
echo Your cost: \$5.00
Your cost: $5.00
加引號來防止擴展
•單引號(’’)防止所有擴展
•雙引號(”“)也可防止擴展,但是以下情況例外:
$(美元符號) 變量擴展
(反引號) 命令替換
\(反斜線) 禁止單個字符擴展
!(歎號) 歷史命令替換

bash的配置文件
按生效範圍劃分,存在兩類:
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
個人配置:
~/.bash_profile
~/.bashrc

shell登錄兩種方式
交互式登錄:
(1)直接通過終端輸入賬號密碼登錄
(2)使用“su - UserName” 切換的用戶
執行順序:/etc/profile --> /e

tc/profile.d/.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登錄:
(1)su UserName
(2)圖形界面下打開的終端
(3)執行腳本
(4)任何其它的bash實例
執行順序: /etc/profile.d/
.sh --> /etc/bashrc -->~/.bashrc

Bashrc類
bashrc類:爲非交互式和交互式登錄的shell提供配置
全局:/etc/bashrc
個人:~/.bashrc
功用:
(1) 定義命令別名和函數
(2) 定義本地變量

set 命令
$- 變量
h:hashall,打開這個選項後,Shell 會將命令所在的路徑hash下來,避免每次都要查詢。通過set +h將h選項關閉
i:interactive-comments,包含這個選項說明當前的 shell 是一個交互式的 shell。所謂的交互式shell,在腳本中,i選項是關閉的。
m:monitor,打開監控模式,就可以通過Job control來控制進程的停止、繼續,後臺或者前臺執行等。
B:braceexpand,大括號擴展
H:history,H選項打開,可以展開歷史列表中的命令,可以通過!感嘆號來完成,例如“!!”返回上最近的一個歷史命令,“!n”返回第 n 個歷史命令
set 命令
-u 在擴展一個沒有設置的變量時,顯示錯誤信息,等同set –o nounset
-e 如果一個命令返回一個非0退出狀態值(失敗)就退出,等同set –o errexit

locate
查詢系統上預建的文件索引數據庫
/var/lib/mlocate/mlocate.db
依賴於事先構建的索引
索引的構建是在系統較爲空閒時自動進行(週期性任務),管理員手動更新數據庫(updatedb)
索引構建過程需要遍歷整個根文件系統,極消耗資源
工作特點:
•查找速度快
•模糊查找
•非實時查找
•搜索的是文件的全路徑,不僅僅是文件名
•可能只搜索用戶具備讀取和執行權限的目錄

locate命令
locate KEYWORD
有用的選項
-i 不區分大小寫的搜索
-n N 只列舉前N個匹配項目
-r 使用基本正則表達式
示例
搜索名稱或路徑中帶有“conf”的文件
locate conf
使用Regex來搜索以“.conf”結尾的文件
locate -r ‘.conf$’

find
實時查找工具,通過遍歷指定路徑完成文件查找
工作特點:
• 查找速度略慢
• 精確查找
• 實時查找
• 可能只搜索用戶具備讀取和執行權限的目錄

find
語法:
find [OPTION]... [查找路徑] [查找條件] [處理動作]
查找路徑:指定具體目標路徑;默認爲當前目錄
查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認爲找出指定路徑下的所有文件
處理動作:對符合條件的文件做操作,默認輸出至屏幕

查找條件
指搜索層級
-maxdepth level 最大搜索目錄深度,指定目錄下的文件爲第1級
-mindepth level 最小搜索目錄深度
先處理目錄內的文件,再處理指定目錄
-depth
根據文件名和inode查找:
-name "文件名稱":支持使用glob
*, ?, [], [^]
-iname "文件名稱":不區分字母大小寫
-inum n 按inode號查找
-samefile name 相同inode號的文件
-links n 鏈接數爲n的文件
-regex “PATTERN”:以PATTERN匹配整個文件路徑,而非文件名稱

查找條件
根據屬主、屬組查找:
-user USERNAME:查找屬主爲指定用戶(UID)的文件
-group GRPNAME: 查找屬組爲指定組(GID)的文件
-uid UserID:查找屬主爲指定的UID號的文件
-gid GroupID:查找屬組爲指定的GID號的文件
-nouser:查找沒有屬主的文件
-nogroup:查找沒有屬組的文件

查找條件
根據文件類型查找
-type TYPE
•f: 普通文件
•d: 目錄文件
•l: 符號鏈接文件
•s:套接字文件
•b: 塊設備文件
•c: 字符設備文件
•p: 管道文件
空文件或目錄
-empty
示例:find /app -type d -empty

查找條件
zu合條件:
與:-a
或:-o
非:-not !
德·摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)

find 示例
find -name snow.png
find -iname snow.png
find / -name “.txt”
find /var –name “
log*”
find -user joe -group joe
find -user joe -not -group joe
find -user joe -o -user jane
find -not ( -user joe -o -user jane )
find / -user joe -o -uid 500

find示例
找出/tmp目錄下,屬主不是root,且文件名不以f開頭的文件
find /tmp ( -not -user root -a -not -name 'f' ) -ls
find /tmp -not ( -user root -o -name 'f
' ) –ls
排除目錄
示例:
查找/etc/下,除/etc/sane.d目錄的其它所有.conf後綴的文件
find /etc -path ‘/etc/sane.d’ -a –prune -o -name “.conf”
查找/etc/下,除/etc/sane.d和/etc/fonts兩個目錄的所有.conf後綴的文件
find /etc ( -path "/etc/sane.d" -o -path "/etc/fonts" ) -a -prune -o -name "
.conf"

查找條件
根據文件大小來查找:
-size [+|-]#UNIT
常用單位:k, M, G,c(byte)
#UNIT: (#-1, #]
如:6k 表示(5k,6k]
-#UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)

查找條件
根據時間戳:
以“天”爲單位
-atime [+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分鐘”爲單位
-amin
-mmin
-cmin

查找條件
根據權限查找:
-perm [/|-]MODE
MODE: 精確權限匹配
/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關係,+ 從centos7開始淘汰
-MODE:每一類對象都必須同時擁有指定權限,與關係
0 表示不關注
•find -perm 755 會匹配權限模式恰好是755的文件
•只要當任意人有寫權限時,find -perm +222就會匹配
•只有當每個人都有寫權限時,find -perm -222纔會匹配
•只有當其它人(other)有寫權限時,find -perm -002纔會匹配

處理動作
-print:默認的處理動作,顯示至屏幕
-ls:類似於對查找到的文件執行“ls -l”命令
-delete:刪除查找到的文件
-fls file:查找到的所有文件的長格式信息保存至指定文件中
-ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令,對於每個文件執行命令之前,都會交互式要求用戶確認
-exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令
{}: 用於引用查找到的文件名稱自身
find傳遞查找到的文件至後面指定的命令時,查找到所有符合條件的文件一次性傳遞給後面的命令

參數替換xargs
由於很多命令不支持管道|來傳遞參數,xargs用於產生某個命令的參數,xargs 可以讀入 stdin 的數據,並且以空格符或回車符將 stdin 的數據分隔成爲參數
許多命令不能接受過多參數,命令執行可能會失敗,xargs可以解決
注意:文件名或者是其他意義的名詞內含有空格符的情況
find和xargs的組合:find | xargs COMMAND
示例:
ls | xargs rm 刪除當前目錄下的大量文件
find /sbin/ -perm +700 | ls -l 這個命令是錯誤的
find /bin/ -perm /7000 | xargs ls -Sl 查找有特殊權限的文件
find /bin/ -perm -7000 | xargs ls -Sl 此命令和上面有何區別?
find -type f -name “*.txt” -print0 | xargs -0 rm 以字符nul分隔

find示例
備份配置文件,添加.orig這個擴展名
find -name “.conf” -exec cp {} {}.orig \;
提示刪除存在時間超過3天以上的joe的臨時文件
find /tmp -ctime +3 -user joe -ok rm {} \;
在主目錄中尋找可被其它用戶寫入的文件
find ~ -perm -002 -exec chmod o-w {} \;
查找/data下的權限爲644,後綴爲sh的普通文件,增加執行權限
find /data –type f -perm 644 -name “
.sh” –exec chmod 755 {} \;
查看/home的目錄
find /home –type d -ls

compress/uncompress
compress [-dfvcVr] [-b maxbits] [file ...]
-d 解壓縮,相當於uncompress
-c 結果輸出至標準輸出,不刪除原文件
-v 顯示詳情
uncompress file.Z 解壓縮
zcat file.Z 不顯式解壓縮的前提下查看文本文件內容
示例:zcat file.Z >file

gzip/gunzip
gzip [OPTION]... FILE ...
-d 解壓縮,相當於gunzip
-c 結果輸出至標準輸出,保留原文件不改變
-# 指定壓縮比,#取值爲1-9,值越大壓縮比越大
gunzip file.gz 解壓縮
zcat file.gz 不顯式解壓縮的前提下查看文本文件內容
示例:
gzip -c messages >messages.gz
gzip -c -d messages.gz > messages
zcat messages.gz > messages
cat messages | gzip > m.gz

bzip2/bunzip2/bzcat
bzip2 [OPTION]... FILE ...
-k keep, 保留原文件
-d 解壓縮
-# 1-9,壓縮比,默認爲9
bunzip2 file.bz2 解壓縮
bzcat file.bz2 不顯式解壓縮的前提下查看文本文件內容

gzip

-d 解壓縮,相當於gunzip
-c 結果輸出至標準輸出,保留源文件不改變
-# 指定壓縮比,#取值爲1-9,值越大壓縮越大
gunzip file.gz 解壓縮
zcat file.gz 不顯示解壓縮的前提下查看文本內容
示例
gzip -c messages >messages.gz
gzip -c -d messages.gz >messages
zcat messages.gz > messages
cat messages | gzip > m.gz

bzip2
-k keep,保留原文件
-d 解壓縮
-# 1-9 , 壓縮比,默認爲9
bunzip2 file.bz2 解壓縮
bzcat file.bz2 不顯示解壓縮的前提下查看文本文件內容

xz
-k keep, 保留原文件
-d 解壓縮
-# 壓縮比 取值1-9 默認爲6
unxz file.xz 解壓縮
xzcat file.xz 不顯示解壓縮的前提下查看文本文件內容

zip / unzip
打包壓縮
zip -r /backup/sysconfig /etc/sysconfig/
解包解壓縮
unzip sysconfig.zip
cat/var/log/messages | zip messages -
unzip -p message > message

tar 工具

tar (Tapa ARchive,磁帶歸檔的縮寫)

1創建歸檔,保留權限
tar -cpvf /PATH/FILE.tar FILE...
2 追加文件至歸檔:注:不支持對壓縮文件追加
tar -r -f /PATH/LIFE.tar FILE.....
3 查看歸檔文件中的文件列表
tar -t -f /PATH/FILE .tar
4 展開歸檔

tar -x -f /PATH/FILE.tar
tar -x -f /PATH/FILE.tar -C /PATH/

5 結合壓縮工具實現: 歸檔並壓縮
-j:bzip2, -z: gzip, -J:xz

tar工具
-exclude 排除文件
tar zcvf /root/a3.tgz --exclude=/app/host1 --exclude=/app/host2 /app
-T 選項指定輸入文件 -X 選項指定包含要排除的文件列表
tar zcvf mybackup.tgz -T /root/includefilelist -X /root/excludefilelist
split:分割一個文件爲多個文件
分割大的 tar 文件爲多份小文件
split -b Size –d tar-file-name prefix-name
split -b 1M –d mybackup.tgz mybackup-parts
split -b 1M mybackup.tgz mybackup-parts
合併:
cat mybackup-parts* > mybackup.tar.gz
cpio
功能:複製文件從或到歸檔
cpio命令是通過重定向的方式將文件進行打包備份,還原恢復的工具,它可以解壓以“.cpio”或者“.tar”結尾的文件
cpio [選項] > 文件名或者設備名
cpio [選項] < 文件名或者設備名
選項
-o 將文件拷貝打包成文件或者將文件輸出到設備上
-O filename 輸出到指定的歸檔文件名
-A 向已存在的歸檔文件中追加文件
-i 解包,將打包文件解壓或將設備上的備份還原到系統
-I filename 對指定的歸檔文件名解壓
-t 預覽,查看文件內容或者輸出到設備上的文件內容
-F filename 使用指定的文件名替代標準輸入或輸出
-d 解包生成目錄,在cpio還原時,自動的建立目錄
-v 顯示打包過程中的文件名稱

示例
將etc目錄備份:
find ./etc -print |cpio -ov >bak.cpio
將/data內容追加bak.cpio
find /data | cpio -oA -F bak.cpio
內容預覽
cpio –tv < etc.cpio
解包文件
cpio –idv < etc.cpio

sed工具
用法:
sed [option]... 'script' inputfile...
常用選項:
-n 不輸出模式空間內容到屏幕,即不自動打印
-e 多點編輯
-f /PATH/SCRIPT_FILE 從指定文件中讀取編輯腳本
-r 支持使用擴展正則表達式
-i.bak 備份文件並原處編輯
script:
'地址命令'

sed工具
地址定界:
(1) 不給地址:對全文進行處理
(2) 單地址:
#:指定的行,$:最後一行
/pattern/:被此處模式所能夠匹配到的每一行
(3) 地址範圍:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步進
1~2 奇數行
2~2 偶數行

sed工具
編輯命令:
d 刪除模式空間匹配的行,並立即啓用下一輪循環
p 打印當前模式空間內容,追加到默認輸出之後
a []text 在指定行後面追加文本,支持使用\n實現多行追加
i []text 在行前面插入文本
c []text 替換行爲單行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 讀取指定文件的文本至模式空間中匹配到的行後
= 爲模式空間中的行打印行號
! 模式空間中匹配行取反處理

sed工具
s/// 查找替換,支持使用其它分隔符,s@@@,s###
替換標記:
g 行內全局替換
p 顯示替換成功的行
w /PATH/FILE 將替換成功的行保存至文

sed示例
sed ‘2p’ /etc/passwd
sed -n ‘2p’ /etc/passwd
sed -n ‘1,4p’ /etc/passwd
sed -n ‘/root/p’ /etc/passwd
sed -n ‘2,/root/p’ /etc/passwd 從2行開始
sed -n ‘/^$/=’ file 顯示空行行號
sed -n -e ‘/^$/p’ -e ‘/^$/=’ file
Sed‘/root/a\superman’ /etc/passwd行後
sed ‘/root/i\superman’ /etc/passwd 行前
sed ‘/root/c\superman’ /etc/passwd 代替行

sed示例
sed ‘/^$/d’ file
sed ‘1,10d’ file
nl /etc/passwd | sed ‘2,5d’
nl /etc/passwd | sed ‘2a tea’
sed 's/test/mytest/g' example
sed –n ‘s/root/&superman/p’ /etc/passwd 單詞後
sed –n ‘s/root/superman&/p’ /etc/passwd 單詞前
sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets
sed –i.bak ‘s/dog/cat/g’ pets

高級編輯命令
P: 打印模式空間開端至\n內容,並追加到默認輸出之前
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N:讀取匹配到的行的下一行追加至模式空間
d: 刪除模式空間中的行
D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本,並不會讀取新的輸入行,而使用合成的模式空間重新啓動循環。如果模式空間不包含換行符,則會像發出d命令那樣啓動正常的新循環

包命名和工具
包:分類和拆包
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 開發子包
Application-utils-VERSION-ARHC.rpm 其它子包
Application-libs-VERSION-ARHC.rpm 其它子包
包之間:可能存在依賴關係,甚至循環依賴
解決依賴包管理工具:
yum:rpm包管理器的前端工具
apt:deb包管理器前端工具
zypper:suse上的rpm前端管理工具
dnf:Fedora 18+ rpm包管理器前端管理工具

庫文件
查看二進制程序所依賴的庫文件
ldd /PATH/TO/BINARY_FILE
管理及查看本機裝載的庫文件
ldconfig 加載配置文件中指定的庫文件
/sbin/ldconfig –p 顯示本機已經緩存的所有可用庫文件名及文件路徑映射關係
配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
緩存文件:/etc/ld.so.cache

程序包的來源
管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum, dnf
獲取程序包的途徑:
(1) 系統發版的光盤或官方的服務器
CentOS鏡像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2) 項目官方站點

程序包的來源
(3) 第三方組織:
Fedora-EPEL:
Extra Packages for Enterprise Linux
Rpmforge:RHEL推薦,包很全
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
(4) 自己製作
注意:第三方包建議要檢查其合法性
來源合法性,程序包的完整性

rpm包管理
CentOS系統上使用rpm命令管理程序包:
安裝、卸載、升級、查詢、校驗、數據庫維護
安裝:
rpm {-i|--install} [install-options] PACKAGE_FILE…
-v: verbose
-vv:
-h: 以#顯示程序包管理執行進度
rpm -ivh PACKAGE_FILE ...

rpm包安裝
[install-options]
--test: 測試安裝,但不真正執行安裝,即dry run模式
--nodeps:忽略依賴關係
--replacepkgs | replacefiles
--nosignature: 不檢查來源合法性
--nodigest:不檢查包完整性
--noscripts:不執行程序包腳本
%pre: 安裝前腳本 --nopre
%post: 安裝後腳本 --nopost
%preun: 卸載前腳本 --nopreun
%postun: 卸載後腳本 --nopostun

rpm包升級
升級:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
rpm {-F|--freshen} [install-options] PACKAGE_FILE...
upgrade:安裝有舊版程序包,則“升級”
如果不存在舊版程序包,則“安裝”
freshen:安裝有舊版程序包,則“升級”
如果不存在舊版程序包,則不執行升級操作
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
--oldpackage:降級
--force: 強制安裝

rpm包升級
升級:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
rpm {-F|--freshen} [install-options] PACKAGE_FILE...
upgrade:安裝有舊版程序包,則“升級”
如果不存在舊版程序包,則“安裝”
freshen:安裝有舊版程序包,則“升級”
如果不存在舊版程序包,則不執行升級操作
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
--oldpackage:降級
--force: 強制安裝

包查詢
rpm {-q|--query} [select-options] [query-options]
[select-options]
-a:所有包
-f:查看指定的文件由哪個程序包安裝生成
-p rpmfile:針對尚未安裝的程序包文件做查詢操作
--whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個包所提供
--whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴
rpm2cpio 包文件|cpio –itv 預覽包內文件
rpm2cpio 包文件|cpio –id “*.conf” 釋放包內文件

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

包查詢
常用查詢用法:
-qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ...
-qa
包卸載:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
當包卸載時,對應的配置文件不會刪除, 以FILENAME.rpmsave形式保留

包校驗
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

包校驗
包來源的合法性驗證及完整性驗證
完整性驗證:SHA256
來源合法性驗證:RSA
公鑰加密
對稱加密:加密、解密使用同一密鑰
非對稱加密:密鑰是成對兒的
public key: 公鑰,公開所有人
secret key: 私鑰, 不能公開
導入所需要公鑰
rpm -K|checksig rpmfile 檢查包的完整性和簽名
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7發行版光盤提供:RPM-GPG-KEY-CentOS-7
rpm -qa “gpg-pubkey*”

rpm數據庫
數據庫重建:
/var/lib/rpm
rpm {--initdb|--rebuilddb}
initdb: 初始化
如果事先不存在數據庫,則新建之
否則,不執行任何操作
rebuilddb:重建已安裝的包頭的數據庫索引目錄

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