Linux基础常用命令
ps -ef用于查看全格式的全部進程,其中“ps”是在Linux中是查看進程的命令,“-e?”參數代表顯示所有進程,“-f”參數代表全格式。
禁用防火墻
systemctl disable firewalld centos7以后版本
chkconfig iptables off centos6以前版本?
禁用selinux
vim /etc/selinux/config
SELINUX=disabled? ? ? ?
>表示這個文件如果不存在則創建該文件,如果該文件存在則清空該文件。 ? ??
Centos7上修改網卡名稱由原來ens33改成eth0
sed -ri '/^[[:space:]]+linux16/s#.*#& net.ifnames=0#' /boot/grub2/grub.cfg
? ?1.目錄操作
(1)絕對路徑與相對路徑
絕對路徑:路徑的寫法一定由根目錄”/”寫起,比如:/usr/local/lib
相對路徑:路徑的寫法不是由根目錄”/”寫起,比如:local/lib。這時,這個目錄相當于是將當前目錄作為“根目錄”,如果當前目錄變化了,那么這個相對路徑就要需要修改。
(2)打印當前目錄:pwd
root 用戶
一個特殊的管理帳戶
也被稱為超級用戶
root已接近完整的系統控制
對系統損害幾乎有無限的能力
除非必要,不要登錄為 root
root用戶id為零
普通( 非特權 )用戶
CentOS7的r普通用戶id從1000開始起步
CentOS6普通用戶id從500開始起步
權限有限
造成損害的能力比較有限
判斷一個用戶是否是管理員用戶,如果該用戶id為0就是root用戶,如果該用戶id為非零就是普通用戶。
管理員用戶已#開頭,普通用戶以$開頭。
?
命令格式:pwd
返回當前目錄的絕對路徑
?
(3)切換目錄:cd
(4)創建目錄:mkdir
命令格式:mkdir 新目錄(既可以是絕對路徑,也可以是相對路徑)
?-p參數
mkdir -p 新目錄
-p的作用是,不使用-p參數時,如果要創建的目錄所在的上層目錄不存在時,就會報錯;而使用了-p參數后,就會直接一次性連上層目錄都創建了。如下:創建tmp3中的tmp4,其中tmp3之前是不存在的。未使用-p時,提示了tmp3不存在;使用-p時,不提示錯了,tmp3、tmp4都會一次性創建。
(5)查看目錄內容:ls
命令格式:ls?目錄
直接使用ls命令,查看當前目錄下的內容
使用ls命令+路徑,查看指定目錄下的內容。
? ?常用參數搭配:
???????? ls -a 列出目錄所有文件,包含以.開始的隱藏文件
???????? ls -A 列出除.及..的其它文件
???????? ls -r 反序排列
???????? ls -t 以文件修改時間排序
???????? ls -S 以文件大小排序
???????? ls -h 以易讀大小顯示
???????? ls -l 除了文件名之外,還將文件的權限、所有者、文件大小等信息詳細列出來
不同的顏色,表示的含義不一樣:
白色:普通文件
藍色:目錄
綠色:可執行文件
紅色:壓縮文件
淺藍色:鏈接文件
黃色:設備文件
灰色:其他文件
(6)復制目錄:cp -r
cp命令既可用于拷貝文件,又可用于拷貝目錄,但是拷貝目錄時必須使用-r參數
命令格式:cp -r 原目錄 目標目錄
? ??
? ? ? ?常用參數:
? ? ? ????-a 歸檔,相當于-dR --preserv=all
? ? ? ? ? -b 目標存在,覆蓋前先備份,形式為 filename~
? ? ? ? ? ?-d --no-dereference --preserv=links 不復制原文件,只復制鏈接名
? ? ? ? ?-r 復制目錄及目錄內所有項目
? ? ? ? ?-i 覆蓋前提示
? ? ? ? -n 不覆蓋,注意兩者順序
? ? ? ? ?r, -R 遞歸復制目錄及內部的所有內容
? ? ? ? ?--backup=numbered 目標存在,覆蓋前先備份加數字后綴
將tmp3目錄下所有文件復制成ttmp4
(7)移動目錄:mv
命令格式: mv 源目錄 目標目錄
常用參數:? ??
-i 覆蓋前提示
-f 強制
-b 目標存在,覆蓋前先備份
mv命令移動文件或修改文件名
將tmp3目錄下的fstab文件移動tmp7目錄下,并給新的文件起名為fstab1(備注:文件移動后,tmp3目錄下fstab文件將不存在)
mv f7 f8(修改f7文件名稱,改為f8)
?(8)
(8)刪除目錄:rm
? ? ? ? ? ? ? ? ?命令格式: rm 目錄名
? ? ? ? ? ? ? ? ?刪除tmp8目錄
? ? 常用參數:
? ? ?-i? ?刪除前提示
? ? ? -f? ?強制刪除
? ? ? -r? ?遞歸
(9)cat命令:
? 命令格式:cat 文件名
cat主要有三大功能:
???????? 1.一次顯示整個文件:cat filename
???????? 2.從鍵盤創建一個文件:cat > filename 只能創建新文件,不能編輯已有文件.
???????? 3.將幾個文件合并為一個文件:cat file1 file2 > file
? ? ? ? ? ? 常用參數:
? ? ? ? ? ? ? ?-E:顯示行結束符$
? ? ? ? ? ? ? -n:對顯示出的每一行編號
? ? ? ? ? ? ? -A:顯示所有控制符
? ? ? ? ? ? ? -b:非空行編號
? ? ? ? ? ? ?-s:壓縮連續的空行成一行
查看更多文件內容:more、less
當文件內容太多,一屏不能顯示完,如果用cat就只能顯示最后面的部分,這時候就需要用more或者less了。
more看完一屏后,就可以通過空格(打印下一屏)、或者回車鍵(打印下一行),可以隨時通過q結束瀏覽模式
(10)head命令? ??head 用來顯示文件開頭至標準輸出中,默認head命令打印其相應文件的開頭10行。
? ?常用參數 -n? 顯示行數
? ? 命令格式:head -n 文件名
?默認打印前十行
head -2 /etc/passwd? ?顯示/etc/passwd文件下前2行
(11)tail命令? ??打印/etc/profile文件結尾后10行
?用于顯示指定文件末尾內容,不指定文件時,作為輸入信息進行處理。常用查看日志文件。
?
用戶user
令牌token,identity
Linux用戶:Username/UID
管理員:root, 0
普通用戶:1-60000 自動分配
系統用戶:1-499, 1-999 (CentOS7)
對守護進程獲取資源進行權限分配
登錄用戶:500+, 1000+(CentOS7)
交互式登錄
組group
Linux組:Groupname/GID
管理員組:root, 0
普通組:
系統組:1-499, 1-999(CENTOS7)
普通組:500+, 1000+(CENTOS7)
組的類別
Linux組的類別
用戶的主要組(primary group)
用戶必須屬于一個且只有一個主組
組名同用戶名,且僅包含一個用戶,私有組
用戶的附加組(supplementary group)
一個用戶可以屬于零個或多個輔助組
生成隨機口令
密碼的復雜性策略
足夠長
使用數字、大寫字母、小寫字母及特殊字符中至少3種
使用隨機密碼
定期更換,不要使用最近曾經使用過的密碼
用戶和組的配置文件
Linux用戶和組的主要配置文件:
/etc/passwd:用戶及其屬性信息(名稱、UID、主組ID等)
/etc/group:組及其屬性信息
/etc/shadow:用戶密碼及其相關屬性
/etc/gshadow:組密碼及其相關屬性
(12)chown? ?更改所屬主:
命令格式:chown 用戶名 文件名
把原來的root用戶改成張三用戶
(13)chgrp??更改所屬組:
把原來root組改成張三組
? ?
(14)更改用戶操作權限:chmod
?命令格式:chmod 權限值 文件名
為方便權限的修改,將權限用數字表示,r:4,w:2,x:1,-:0,三個權限組的值拼接在一起,比如:上面的rw-r--r--,第一個權限組:rw-等于4+2+0=6,第二個權限組:r--等于4+0+0=4,第三個權限組:r--等于4+0+0=4,所以其權限值為644。
同樣,使用-R參數,實現級聯更改。
在linux系統中,默認一個目錄的權限為 755,而一個文件的默認權限為644。
-rwxrwx---用數字表示就是770,下面我們通過chmod命令將5.txt文件進行權限修改。
模式修改文件權限方式
將fstab文件3中身份對應的3中權限,修改為u=rw,g=rw,o=rw
數字修改文件權限方式:
目錄:
讀權限:可以列出文件名
執行權限:可以進入目錄,可以訪問目錄的文件的內容
寫權限:創建和刪除文件
刪除一個文本和文件本身沒有關系,和該文件的父目錄有關。
一個文件或目錄最大權限為666或777
文件默認權限:644? ? ? ? ? ?目錄默認權限:755? ? ?usmak:0022
文件默認權限? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
666-umask,如果結果有奇數,就加1,偶數不變
目錄默認權限
777-umask
Linux系統中三種特殊權限
特殊權限
suid: 作用于可執行的二進制的程序,權限數字4(單獨計算),功能:用戶執行此程序時,將繼承此程序所有者的權限
sgid:
作用于可執行的二進制的程序,權限數字2(單獨計算),功能:用戶執行此程序時,將繼承此程序所屬組的權限
作用于目錄,功能:新建的文件將自動繼承此目錄的所屬組
?
sticky:作用于目錄,權限數字1(單獨計算),功能:只有刪除自已的文件
?
(15)useradd 創建用戶
命令格式:useradd?用戶名
常用參數:
? ? -u UID
-d<登入目錄> 指定用戶登入時的目錄。-g 指定初始群組,這個組必須存在。-G 指定附加組,這個村必須存在。-m 自動創建用戶的家目錄。-M 不要創建用戶的家目錄。-N 不要創建以用戶名稱為名的群組。-s 指定用戶登入后所使用的shell。創建mayun用戶并且指定他的主組為zhangsa,附加組為lisi
給magedu這個用戶指定登錄密碼
(16)usermod 修改用戶屬性
將一個用戶添加到組中
usermod -G mail test 加入mail組? ??
usermod -G new test 加入new組
使用vim編輯器需要讀的權限,可以使用echo替代,ehco? abcd > f1(文件名)
?
命令格式:usermod -aG 組名 用戶名
給mage這個用戶指定兩個附加組分別為zhangsan和jack
查看一個組下有哪些用戶
groupmems -l -g 組名
?
groupdel 刪除組
命令格式:groupdel 組名
?
?
?
切換用戶或以其他用戶身份執行命令
su切換用戶卻不切換工作環境
?
su - 同時切換用戶與工作環境 。直接現象就是su切換當前目錄不變,環境不變
?
在Ubuntu版本中使用sudo -i命令切換root賬戶
?
命令提示符:[root@localhost ~]#
修改提示符顏色:
PS1="\[\e[1;5;41;33m\][\u@\h \W]\\$\[\e[0m\]"
?
cp /etc/fstab /data/dir/ 普通用戶需要什么最少權限?
cp 執行權限
/etc/fstab /etc/執行權限,fstab需要有讀權限
/data/dir/ /data至少有執行權限,/data/dir/至少有xw權限
設定文件特定屬性
chattr +i 不能刪除,改名,更改
chattr +a 只能追加內容
lsattr 顯示特定屬性
訪問控制列表
ACL:Access Control List,實現靈活的權限管理
除了文件的所有者,所屬組和其它人,可以對更多的用戶設置權限
CentOS7 默認創建的xfs和ext4文件系統具有ACL功能
CentOS7 之前版本,默認手工創建的ext4文件系統無ACL功能,需手動增加
tune2fs –o acl /dev/sdb1
mount –o acl /dev/sdb1 /mnt/test
ACL生效順序:所有者,自定義用戶,自定義組,其他人
什么是shell
Shell 是Linux系統的用戶界面,提供了用戶與內核進行交互操作的一種接口。它接收用戶輸入的命令并把它送入內核去執行
shell也被稱為LINUX的命令解釋器(command interpreter)
shell是一種高級程序設計語言
顯示當前使用的shell
echo $SHELL
顯示當前系統所有的shell
cat /etc/shells
在shell中可執行的命令有兩類
內部命令:由shell自帶的,而且通過某命令形式提供
help 內部命令列表
enable cmd 啟用內部命令
enable –n cmd 禁用內部命令
enable –n 查看所有禁用的內部命令
外部命令:在文件系統路徑下有對應的可執行程序文件
查看路徑:which -a |--skip-alias ; whereis
區別指定的命令是內部或外部命令
格式:type 命令名
(17)Hash緩存表
系統初始hash表為空,當外部命令執行時,默認會從PATH路徑下尋找該命令,找到后會將這條命令的
路徑記錄到hash表中,當再次使用該命令時,shell解釋器首先會查看hash表,
存在將執行之,如果不存在,將會去PATH路徑下尋找,利用hash緩存表可大大提高命令的調用速率。
hash常見用法
hash 顯示hash緩存
hash –l 顯示hash緩存,可作為輸入使用
hash –p path name 將命令全路徑path起別名為name
hash –t name 打印緩存中name的路徑
hash –d name 清除name緩存
hash –r 清除緩存
(18)alias命令別名
alias?
刪除別名
顯示當前shell進程所有可用的命令別名
alias
定義別名NAME,其相當于執行命令VALUE
alias NAME='VALUE'
在命令行中定義的別名,僅對當前shell進程有效
如果想永久有效,要定義在配置文件中
僅對當前用戶:~/.bashrc
對所有用戶有效:/etc/bashrc
別名不會立即生效,想要別名立即生效
. .bashrc
.
?
如果別名同原命令同名,如果要執行原命令,可使用
\ALIASNAME
“ALIASNAME”
‘ALIASNAME’
命令執行過程
1別名
2內部命令
3hash表
4外部命令$PATH
5該命令不存在
(19)日期和時間
Linux的兩種時鐘
系統時鐘:由Linux內核通過CPU的工作頻率進行的
硬件時鐘:主板
相關命令
date 顯示和設置系統時間
date +%s
date -d @1509536033
hwclock,clock: 顯示硬件時鐘
hctosys? -s 以硬件時鐘為準,校正系統時鐘
hctosys?-w?以系統時鐘為準,校正硬件時鐘
時區:/etc/localtime
顯示日歷:cal –y
顯示當前系統時間
(20)nano 命令
命令格式:nano 文件名
?打開或新建文件
(21)echo 命令
命令格式:echo?echo [-ne][字符串]或 echo [--help][--version]
功能說明:顯示文字
啟用命令選項-e,若字符串中出現以下字符,則特別加以處理,而不會將它當成一般文字輸出
? ?\a 發出警告聲;
?? \b 刪除前一個字符;
? ?\c 最后不加上換行符號;
?? \f 換行但光標仍舊停留在原來的位置
?? \n 換行且光標移至行首;
?? \r 光標移至行首,但不換行;
?? \t 插入tab;
?? \v 與\f相同;
?? \\ 插入\字符;
?? \nnn 插入nnn(八進制)所代表的ASCII字符;
–help 顯示幫助
–version 顯示版本信息
(22)screen? 命令
可以實現桌面共享。
GNU Screen是一款由GNU計劃開發的用于命令行終端切換的自由軟件。用戶可以通過該
軟件同時連接多個本地或遠程的命令行會話,并在其間自由切換。
要想使用screen功能,首先必須安裝screen命令,在線安裝:yum install screen -y
創建會話:screen -S 會話名
查看創建的會話
screen -ls
加入screen -x 會話名
剝離當前screen會話
Ctrl+a,d
退出并關閉會話
exit
命令行擴展、被括起來的集合
括號擴展:{ }打印重復字符串的簡化形式
echo file{1,3,5} 結果為:file1 file3 file5
rm -f file{1,3,5}
echo {1..10}
echo {a..z}
echo {000..20..2}
(23)history 命令
功能:可以通過history來查看歷史命令,用來確認在某個時刻使用了哪個命令。但是,history的默認的,
只會輸出命令的序號以及命令。這時我們就需要對history進行一些配置,讓它報告命令執行的具體時間。
-c: 清空命令歷史
-d offset: 刪除歷史中指定的第offset個命令
n: 顯示最近的n條歷史
-a: 追加本次會話新執行的命令歷史列表至歷史文件
-r: 讀歷史文件附加到歷史列表
-w: 保存歷史列表到指定的歷史文件
-n: 讀歷史文件中未讀過的行到歷史列表
-p: 展開歷史參數成多行,但不存在歷史列表中
-s: 展開歷史參數成一行,附加在歷史列表后
注意:history命令會把我們以前敲過所有的命令保存到一個.bash_history磁盤文件中,
它不會立即保存我們敲過的命令到.bash_history磁盤文件中,重啟操作系統,就會保存
我們敲過的命令到.bash_history磁盤文件中。
(24)獲得幫助
獲取幫助的能力決定了技術的能力!
多層次的幫助
命令格式:whatis 命令名
whatis rm
whatis命令只能給出一些命令非常簡單的幫助信息
用來查看內部命令的幫助信息
格式:help - 命令名
(23)man命令
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? man章節
提供命令幫助的文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? man 1 man
手冊頁存放在/usr/share/man? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1:用戶命令
幾乎每個命令都有man的“頁面”? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2:系統調用
man頁面分組為不同的“章節”? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3:C庫調用
統稱為Linux手冊? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4:設備文件及特殊文件? ? ?5:配置文件格式?
中文man需安裝包man-pages-zh-CN(不推薦使用中文幫助信息)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??6:游戲? ? ?7:雜項? ? 8:管理類的命令? ?9:Linux內核API?
man命令的操作方法:使用less命令實現
space, ^v, ^f, ^F: 向文件尾翻屏
b, ^b: 向文件首部翻屏
d, ^d: 向文件尾部翻半屏
u, ^u: 向文件首部翻半屏
RETURN, ^N, e, ^E or j or ^J: 向文件尾部翻一行
y or ^Y or ^P or k or ^K:向文件首部翻一行
q: 退出
#:跳轉至第#行
1G: 回到文件首部
G:翻至文件尾部
(24)touch命令
touch命令有兩個功能:一是用于把已存在文件的時間標簽更新為系統當前的時間(默認方式),它們的數據將原封不動地保留下來;二是用來創建新的空文件。
命令格式:touch 文件名
linux?件系統上的?件類型如下:
-:表示普通文件
d:表示目錄文件
b:表示塊設備文件
c:表示字符設備文件
l:表示軟鏈接文件
p:表示管道文件
s:表示套接字文件
(25)rename 批量修改文件名
?在Linux系統中一個文件有三個時間分別是:
讀文件內容時間(atime):?
修改文件內容時間(mtime):
? ?? ? ?
修改文件屬性包括:(文件名、大小、內容、權限、屬主、屬組)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? 文件通配符? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?預定義的字符類:man 7 glob ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
* 匹配零個或多個字符? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [:digit:]:任意數字,相當于0-9
?? 匹配任何單個字符? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [:lower:]:任意小寫字母
~ 當前用戶家目錄? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [:upper:]: 任意大寫字母
~mage 用戶mage家目錄? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[:alpha:]: 任意大小寫字母
~+ 當前工作目錄? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [:alnum:]:任意數字或字母
~- 前一個工作目錄? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[:blank:]:水平空白字符
?[0-9] 匹配數字范圍? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [:space:]:水平或垂直空白字符
?[a-z]:字母? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [:punct:]:標點符號
?[A-Z]:字母? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[:cntrl:]:控制(非打印)字符
?[wang] 匹配列表中的任何的一個字符? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[:graph:]:圖形字符
[^wang] 匹配列表中的所有字符以外的字符? ? ? ? ? ? ? ? ? ? ? ?[:xdigit:]:十六進制字符
basename命令:取路徑基民
dirname:取路徑名
硬鏈接:
命令格式:ln f1 f1_link
1.同一個文件可以有多個名稱。
2.多個文件名的索引編號相同。
3.不支持跨區。
4.創建源文件的多個名稱,增長鏈接數。
5.不支持目錄。
6.刪除原始文件,不影響其它文件名。
7.沒有依賴性。
軟連接:
在創建軟鏈接的時候,如果原始文件要寫相對路徑,一定是相對軟鏈接的路徑,而不是相對當前工作目錄。
1.創建文件的快捷方式與原文件不是同一個文件 。
2.創建源文件的快捷方式,不增長鏈接數。
3.原文件的快捷方式與文件名的索引編號不同。
4.支持跨分區,跨設備。
5.支持目錄創建快捷方式。
6.刪除原始文件,該文件快捷方式沒用。
7.有依賴性。
標準輸出重定向
>表示標準輸出重定向
輸出重定向就是指不使用linux默認的標準輸出設備顯示,而是指定某個文件做為標準輸出設備來存儲文件信息。
程序:指令+數據
讀入數據:Input
輸出數據:Output
打開的文件都有一個fd: file descriptor (文件描述符)
Linux給程序提供三種 I/O 設備
標準輸入(STDIN)-0 默認接受來自鍵盤的輸入
標準輸出(STDOUT)-1 默認輸出到終端窗口
標準錯誤(STDERR)-2 默認輸出到終端窗口
I/O重定向:改變默認位置
hostname命令使用>標準輸出重定向到/dev/pts/2終端,改變默認輸出終端窗/dev/pts/1
把輸出和錯誤重新定向到文件
2> 覆蓋重定向錯誤輸出數據流
2>> 追加重定向錯誤輸出數據流
標準輸出和錯誤輸出各自定向至不同位置
COMMAND > /path/to/file.out 2> /path/to/error.out
合并標準輸出和錯誤輸出為同一個數據流進行重定向
&> 覆蓋重定向
&>> 追加重定向
COMMAND > /path/to/file.out 2>&1 (順序很重要)
COMMAND >> /path/to/file.out 2>&1
():合并多個程序的STDOUT
( cal 2007 ; cal 2008 ) > all.txt
把out.txt?件?的內容,寫到file.txt?件?
?
標準輸入重定向
輸入重定向:是指不使用系統提供的標準輸入端口,而進行重新的指定。換言之,輸入重定向就是不使用
標準輸入端口輸入文件,而是使用指定的文件作為標準輸入設備。(重定向簡單理解就是使用 “<”符來修改標準輸入設備)
<表示標準輸入重定向
tr命令
tr 轉換和刪除字符
tr [OPTION]... SET1 [SET2]
選項:
-c –C --complement:取字符集的補集
-d --delete:刪除所有屬于第一字符集的字符
-s --squeeze-repeats:把連續重復的字符以單獨一個字符表示
-t --truncate-set1:將第一個字符集對應字符轉化為第二字符集對應的字符
[:alnum:]:字母和數字 [:alpha:]:字母 [:cntrl:]:控制(非打印)字符
[:digit:]:數字 [:graph:]:圖形字符 [:lower:]:小寫字母 [:print:]:可打印字符
[:punct:]:標點符號 [:space:]:空白字符 [:upper:]:大寫字母
[:xdigit:]:十六進制字符
?
?
?
mail 發送郵件?
管道(使用符號"|"表示)? 用來連接命令
命令1 | 命令2 |命令3 | ...
命令1表示標準輸出?命令2表示標準輸入
命令1與命令2結合使用邏輯關系:把命令1標準輸出傳遞給命令2,作為命令2的標準輸入。
?
文本處理工具和正則表達式
抽取文本的工具
文件內容: cat ,more,less
文件截取:head,tail
按列抽取:cut
排序和統計:sort,wc
按關鍵字抽取:grep
文件查看
文件查看命令:
cat,nl,tac,rev
cat [OPTION]... [FILE]...
-E:顯示行結束符$
-n:對顯示出的每一行進行編號
-A:顯示所有控制符
-b:非空行編號
-s:壓縮連續的空行成一行
nl
tac
rev
分頁查看文件內容
more:分頁查看文件
more [OPTIONS...] FILE...
-d: 顯示翻頁及退出提示
less:一頁一頁地查看文件或STDIN輸出
查看時有用的命令包括:
/文本 搜索 文本
n/N 跳到下一個 或 上一個匹配
less 命令是man命令使用的分頁器
顯示文本前或后行內容
head [OPTION]... [FILE]...
-c # 指定獲取前#字節
-n # 指定獲取前#行
-# 指定行數
tail [OPTION]... [FILE]...
-c # 指定獲取后#字節
-n # 指定獲取后#行
-# 同上
-f 跟蹤顯示文件fd新追加的內容,常用日志監控
相當于 --follow=descriptor
-F 跟蹤文件名,相當于--follow=name --retry
tailf 類似tail –f,當文件不增長時并不訪問文件
按列抽取文本cut和合并文件paste
cut [OPTION]... [FILE]...
-d DELIMITER: 指明分隔符,默認tab
-f FILEDS:
#: 第#個字段
#,#[,#]:離散的多個字段,例如1,3,6
#-#:連續的多個字段, 例如1-6
混合使用:1-3,7
-c 按字符切割
--output-delimiter=STRING指定輸出分隔符
cut和paste
顯示文件或STDIN數據的指定列
cut -d: -f1 /etc/passwd
cat /etc/passwd | cut -d: -f7
cut -c2-5 /usr/share/dict/words
paste 合并兩個文件同行號的列到一行
paste [OPTION]... [FILE]...
-d 分隔符:指定分隔符,默認用TAB
-s : 所有行合成一行顯示
示例:
paste f1 f2
paste -s f1 f2
分析文本的工具
文本數據統計:wc
整理文本:sort
比較文件:diff和patch
收集文本統計數據wc
計數單詞總數、行總數、字節總數和字符總數
可以對文件或STDIN中的數據運行
wc story.txt
39 237 1901 story.txt
行數 字數 字節數
常用選項
-l 只計數行數
-w 只計數單詞總數
-c 只計數字節總數
-m 只計數字符總數
-L 顯示文件中最長行的長度
文本排序sort
把整理過的文本顯示在STDOUT,不改變原始文件
sort [options] file(s)
常用選項
-r 執行反方向(由上至下)整理
-R 隨機排序
-n 執行按數字大小整理
-f 選項忽略(fold)字符串中的字符大小寫
-u 選項(獨特,unique)刪除輸出中的重復行
-t c 選項使用c做為字段界定符
-k X 選項按照使用c字符分隔的X列來整理能夠使用多次
uniq
uniq命令:從輸入中刪除前后相接的重復的行
uniq [OPTION]... [FILE]...
-c: 顯示每行重復出現的次數
-d: 僅顯示重復過的行
-u: 僅顯示不曾重復的行
注:連續且完全相同方為重復
常和sort 命令一起配合使用:
sort userlist.txt | uniq -c
比較文件
比較兩個文件之間的區別
diff foo.conf foo2.conf
5c5
< use_widgets = no
---
> use_widgets = yes
注明第5行有區別(改變)
復制對文件改變patch
diff 命令的輸出被保存在一種叫做“補丁”的文件中
使用 -u 選項來輸出“統一的(unified)”diff格式文件,最適用于補丁文件
patch 復制在其它文件中進行的改變(要謹慎使用)
適用 -b 選項來自動備份改變了的文件
diff -u foo.conf foo2.conf > foo.patch
patch -b foo.conf foo.patch
Linux文本處理三劍客
grep:文本過濾(模式:pattern)工具
grep, egrep, fgrep(不支持正則表達式搜索)
sed:stream editor,文本編輯工具
awk:Linux上的實現gawk,文本報告生成器
grep
grep: Global search REgular expression and Print out the line
作用:文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查;打印匹配到的行
模式:由正則表達式字符及文本字符所編寫的過濾條件
grep [OPTIONS] PATTERN [FILE...]
grep root /etc/passwd
grep "$USER" /etc/passwd
grep '$USER' /etc/passwd
grep `whoami` /etc/passwd
grep命令選項
--color=auto: 對匹配到的文本著色顯示
-m # 匹配#次后停止
-v 顯示不被pattern匹配到的行
-i 忽略字符大小寫
-n 顯示匹配的行號
-c 統計匹配的行數
-o 僅顯示匹配到的字符串
-q 靜默模式,不輸出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 實現多個選項間的邏輯or關系
grep –e ‘cat ’ -e ‘dog’ file
-w 匹配整個單詞
-E 使用ERE
-F 相當于fgrep,不支持正則表達式
-f file 根據模式文件處理
正則表達式
REGEXP: Regular Expressions,由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能
程序支持:grep,sed,awk,vim, less,nginx,varnish等
分兩類:
基本正則表達式:BRE
擴展正則表達式:ERE
grep -E, egrep
正則表達式引擎:
采用不同算法,檢查處理正則表達式的軟件模塊
PCRE(Perl Compatible Regular Expressions)
元字符分類:字符匹配、匹配次數、位置錨定、分組
man 7 regex
基本正則表達式元字符
字符匹配:
. 匹配任意單個字符
[] 匹配指定范圍內的任意單個字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范圍外的任意單個字符
[:alnum:] 字母和數字
[:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z
[:lower:] 小寫字母 [:upper:] 大寫字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范圍廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...)
[:digit:] 十進制數字 [:xdigit:]十六進制數字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標點符號
正則表達式
匹配次數:用在要指定次數的字符后面,用于指定前面的字符要出現的次數
* 匹配前面的字符任意次,包括0次
貪婪模式:盡可能長的匹配
.* 任意長度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
位置錨定:定位出現的位置
^ 行首錨定,用于模式的最左側
$ 行尾錨定,用于模式的最右側
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 詞首錨定,用于單詞模式的左側
\> 或 \b 詞尾錨定,用于單詞模式的右側
\<PATTERN\> 匹配整個單詞
分組:\(\) 將一個或多個字符捆綁在一起,當作一個整體處理,如:\(root\)\+
分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命名方式為: \1, \2, \3, ...
\1 表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
示例: \(string1\(string2\)\)
\1 :string1\(string2\)
\2 :string2
后向引用:引用前面的分組括號中的模式所匹配字符,而非模式本身
或者:\|
示例:a\|b a或b
C\|cat C或cat
\(C\|c\)at Cat或cat
egrep及擴展的正則表達式
egrep = grep -E
egrep [OPTIONS] PATTERN [FILE...]
擴展正則表達式的元字符:
字符匹配:
. 任意單個字符
[] 指定范圍的字符
[^] 不在指定范圍的字符
擴展正則表達式
次數匹配:
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{m} 匹配m次
{m,n} 至少m,至多n次
擴展正則表達式
位置錨定:
^ 行首
$ 行尾
\<, \b 語首
\>, \b 語尾
?分組:
()
后向引用:\1, \2, ...
或者:
a|b a或b
C|cat C或cat
(C|c)at Cat或cat
文件查找
在文件系統上查找符合條件的文件
文件查找:locate, find
非實時查找(數據庫查找):locate
實時查找:find
locate
查詢系統上預建的文件索引數據庫
/var/lib/mlocate/mlocate.db
依賴于事先構建的索引
索引的構建是在系統較為空閑時自動進行(周期性任務),管理員手動更新數據庫(updatedb)
索引構建過程需要遍歷整個根文件系統,極消耗資源
工作特點:
?查找速度快
?模糊查找
?非實時查找
?搜索的是文件的全路徑,不僅僅是文件名
?可能只搜索用戶具備讀取和執行權限的目錄
locate KEYWORD
有用的選項
-i 不區分大小寫的搜索
-n N 只列舉前N個匹配項目
-r 使用基本正則表達式
示例
搜索名稱或路徑中帶有“conf”的文件
locate conf
使用Regex來搜索以“.conf”結尾的文件
locate -r ‘\.conf$’
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
組合條件:
與:-a
或:-o
非:-not !
德·摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
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傳遞查找到的文件至后面指定的命令時,查找到所有符合條件的文件一次性傳遞給后面的命令
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
?
參數替換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分隔
壓縮、解壓縮及歸檔工具
file-roller
compress/uncompress: .Z
gzip/gunzip: .gz
bzip2/bunzip2: .bz2
xz/unxz: .xz
zip/unzip
tar
cpio
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 不顯式解壓縮的前提下查看文本文件內容
xz/unxz/xzcat
xz [OPTION]... FILE ...
-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(Tape ARchive,磁帶歸檔的縮寫)
tar [OPTION]...
(1) 創建歸檔,保留權限
tar -cpvf /PATH/FILE.tar FILE...
(2) 追加文件至歸檔: 注:不支持對壓縮文件追加
tar -r -f /PATH/FILE.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
-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
cpio
功能:復制文件從或到歸檔
cpio命令是通過重定向的方式將文件進行打包備份,還原恢復的工具,它可以解壓以“.cpio”或者“.tar”結尾的文件
cpio [選項] > 文件名或者設備名
cpio [選項] < 文件名或者設備名
選項
-o 將文件拷貝打包成文件或者將文件輸出到設備上
-O filename 輸出到指定的歸檔文件名
-A 向已存在的歸檔文件中追加文件
-i 解包,將打包文件解壓或將設備上的備份還原到系統
-I filename 對指定的歸檔文件名解壓
-t 預覽,查看文件內容或者輸出到設備上的文件內容
-F filename 使用指定的文件名替代標準輸入或輸出
-d 解包生成目錄,在cpio還原時,自動的建立目錄
-v 顯示打包過程中的文件名稱
處理文本的工具sed
Stream EDitor, 行編輯器
sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把
緩沖區的內容送往屏幕。然后讀入下行,執行下一個循環。如果沒有使諸如‘D’的特殊命令,那會在兩個循環之間清空模式空間,但不會清空保留空間。這樣不斷重復,直到文件末尾。文件內
容并沒有改變,除非你使用重定向存儲輸出。
功能:主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等
參考: http://www.gnu.org/software/sed/manual/sed.html
sed工具
用法:
sed [option]... 'script' inputfile...
常用選項:
-n 不輸出模式空間內容到屏幕,即不自動打印
-e 多點編輯
-f /PATH/SCRIPT_FILE 從指定文件中讀取編輯腳本
-r 支持使用擴展正則表達式
-i.bak 備份文件并原處編輯
script:
'地址命令'
地址定界:
(1) 不給地址:對全文進行處理
(2) 單地址:
#:指定的行,$:最后一行
/pattern/:被此處模式所能夠匹配到的每一行
(3) 地址范圍:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步進
1~2 奇數行
2~2 偶數行
編輯命令:
d 刪除模式空間匹配的行,并立即啟用下一輪循環
p 打印當前模式空間內容,追加到默認輸出之后
a [\]text 在指定行后面追加文本,支持使用\n實現多行追加
i [\]text 在行前面插入文本
c [\]text 替換行為單行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 讀取指定文件的文本至模式空間中匹配到的行后
= 為模式空間中的行打印行號
! 模式空間中匹配行取反處理
?
d 刪除模式空間匹配的行,并立即啟用下一輪循環
p 打印當前模式空間內容,追加到默認輸出之后
a [\]text 在指定行后面追加文本,支持使用\n實現多行追加
i [\]text 在行前面插入文本
c [\]text 替換行為單行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 讀取指定文件的文本至模式空間中匹配到的行后
= 為模式空間中的行打印行號
! 模式空間中匹配行取反處理
?
s/// 查找替換,支持使用其它分隔符,s@@@,s###
替換標記:
g 行內全局替換
p 顯示替換成功的行
w /PATH/FILE 將替換成功的行保存至文件中
高級編輯命令
P: 打印模式空間開端至\n內容,并追加到默認輸出之前
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N:讀取匹配到的行的下一行追加至模式空間
d: 刪除模式空間中的行
D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本,并不會讀取新的輸入行,而使用合成的模式空間重新啟動循環。如果模式空間不包含換行符,則會像發出d命令那樣啟動正常的新循環
?
軟件運行和編譯
ABI:Application Binary Interface
Windows與Linux不兼容
ELF(Executable and Linkable Format)
PE(Portable Executable)
庫級別的虛擬化:
Linux: WINE
Windows: Cygwin
API:Application Programming Interface
POSIX:Portable OS
程序源代碼 --> 預處理 --> 編譯 --> 匯編 --> 鏈接
靜態編譯:.a
動態編譯:.so
C程序編譯過程
靜態和動態鏈接
鏈接主要作用是把各個模塊之間相互引用的部分處理好,使得各個模塊之間能夠正確地銜接,分為靜態鏈接和動態鏈接
靜態鏈接
把程序對應的依賴庫復制一份到包
libxxx.a
嵌入程序包
升級難,需重新編譯
占用較多空間,遷移容易
動態鏈接
只把依賴加做一個動態鏈接
libxxx.so
連接指向
占用較少空間,升級方便
靜態和動態鏈接
C程序靜態鏈接
Java程序運行
?
?
?
yum 在線管理就可以自動處理 RPM 包的依賴性問題,從而大大簡化 RPM 包的安裝過程。但需要
注意的是,首先,yum 安裝的還是 RPM 包,其次,yum安裝是需要有可用的 yum 服務器存在的,當然
這個 yum 服務器可以在網上,也可以使用光盤在本地搭建。
yum 可以方便地進行 RPM 包的安裝、升級、査詢和卸載,而且可以自動解決依賴性問題,非常方便和快捷。但是,一定
要注意 yum 的卸載功能。yum 在卸載軟件的同時會卸載這個軟件的依賴包,但是如果卸載的依賴包是系統的必備軟件包,就有
可能導致系統崩潰。除非你確實知道 yum 在自動卸載時會卸載哪些軟件包,否則最好不要執行 yum 卸載。
?
?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: 強制安裝
升級注意項
注意:
(1) 不要對內核做升級操作;Linux支持多內核版本并存,因此直接安裝新版本內核
(2) 如果原程序包的配置文件安裝后曾被修改,升級時,新版本提供的同一個配置文件不會直接覆蓋老版本的配置文件,而把新版本文件重命名(FILENAME.rpmnew)后保留
包查詢
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:重建已安裝的包頭的數據庫索引目錄
yum?
首先將光盤掛載到/mnt目錄下
mount -r /dev/cdrom /mnt??
CentOS: yum, dnf
YUM: Yellowdog Update Modifier,rpm的前端程序,可解決軟件包相關依賴性,可在多個庫之間定位軟件包,up2date的替代工具
yum repository: yum repo,存儲了眾多rpm包,以及包的相關的元數據文件(放置于特定目錄repodata下)
文件服務器:
http://
https://
ftp://
file://
要當yum路徑的前提,repodata這個文件夾所在的目錄,該目錄就是yum路徑。
實驗:基于光盤的yum源
systemctl start autofs
systemctl enable autofs
mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
vim /etc/yum.repos.d/base.repo
[base]
name=cdrom repo
baseurl=file:///misc/cd/
gpgcheck=0
yum配置文件
?
實驗:基于http協議的Yum源
1 selinux 關閉
2 systemctl stop firewalld ;systemctl disable 或 service iptables stop ;chkconfig iptables off
?
實驗:基于http協議的Yum源
1 selinux 關閉
2 systemctl stop firewalld ;systemctl disable 或 service iptables stop ;chkconfig iptables off
服務器配置
yum install httpd -y
systemctl start httpd
cd /var/www/html
mkdir centos/{6,7}/os/x86_64/ -pv
echo '- - -' > /sys/class/scsi_host/host2/scan
mount /dev/sr0 centos/7/os/x86_64/
mount /dev/sr1 centos/6/os/x86_64/
?
客戶端配置
vim /etc/yum.repos.d/test.repo
[test]
name=base yum
baseurl=http://192.168.37.7/centos/$releasever/os/$basearch/
gpgkey=http://192.168.37.7/centos/6/os/x86_64/RPM-GPG-KEY-CentOS-6
?
?
?
服務器配置
yum install httpd -y
systemctl start httpd
cd /var/www/html
mkdir centos/{6,7}/os/x86_64/ -pv
echo '- - -' > /sys/class/scsi_host/host2/scan
mount /dev/sr0 centos/7/os/x86_64/
mount /dev/sr1 centos/6/os/x86_64/
?
yum客戶端配置文件:
/etc/yum.conf:為所有倉庫提供公共配置
/etc/yum.repos.d/*.repo:為倉庫的指向提供配置
倉庫指向的定義:
[repositoryID]
name=Some name for this repository
baseurl=url://path/to/repository/
enabled={1|0}
gpgcheck={1|0}
gpgkey=URL
enablegroups={1|0}
failovermethod={roundrobin|priority}
roundrobin:意為隨機挑選,默認值
priority:按順序訪問
cost= 默認為1000
yum倉庫
yum的repo配置文件中可用的變量:
$releasever: 當前OS的發行版的主版本號
$arch: 平臺,i386,i486,i586,x86_64等
$basearch:基礎平臺;i386, x86_64
$YUM0-$YUM9:自定義變量
示例:
http://server/centos/$releasever/$basearch/
http://server/centos/7/x86_64
http://server/centos/6/i386
yum源
阿里云repo文件
http://mirrors.aliyun.com/repo/
CentOS系統的yum源
阿里云:https://mirrors.aliyun.com/centos/$releasever/os/x86_64/
清華大學:https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/x86_64/
EPEL的yum源
阿里云:https://mirrors.aliyun.com/epel/$releasever/x86_64
阿里巴巴開源軟件
https://opsx.alibaba.com/
生成172.16.0.1_cobbler_ks_mirror_CentOS-X-x86_64_.repo
yum-config-manager --add-repo= http://172.16.0.1/cobbler/ks_mirror/7/
yum-config-manager --disable “倉庫名" 禁用倉庫
yum-config-manager --enable “倉庫名” 啟用倉庫
yum-config-manager
yum命令
yum命令的用法:
yum [options] [command] [package ...]
顯示倉庫列表:
yum repolist [all|enabled|disabled]
顯示程序包:
yum list
yum list [all | glob_exp1] [glob_exp2] [...]
yum list {available|installed|updates} [glob_exp1] [...]
安裝程序包:
yum install package1 [package2] [...]
yum reinstall package1 [package2] [...] (重新安裝)
yum-config-manager
生成172.16.0.1_cobbler_ks_mirror_CentOS-X-x86_64_.repo
yum-config-manager --add-repo= http://172.16.0.1/cobbler/ks_mirror/7/
yum-config-manager --disable “倉庫名" 禁用倉庫
yum-config-manager --enable “倉庫名” 啟用倉庫
yum命令
yum命令的用法:
yum [options] [command] [package ...]
顯示倉庫列表:
yum repolist [all|enabled|disabled]
顯示程序包:
yum list
yum list [all | glob_exp1] [glob_exp2] [...]
yum list {available|installed|updates} [glob_exp1] [...]
安裝程序包:
yum install package1 [package2] [...]
yum reinstall package1 [package2] [...] (重新安裝)
升級程序包:
yum update [package1] [package2] [...]
yum downgrade package1 [package2] [...] (降級)
檢查可用升級:
yum check-update
卸載程序包:
yum remove | erase package1 [package2] [...]
查看程序包information:
yum info [...]
查看指定的特性(可以是某文件)是由哪個程序包所提供:
yum provides | whatprovides feature1 [feature2] [...]
清理本地緩存:
清除/var/cache/yum/$basearch/$releasever緩存
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
構建緩存:
yum makecache
yum命令
搜索:yum search string1 [string2] [...]
以指定的關鍵字搜索程序包名及summary信息
查看指定包所依賴的capabilities:
yum deplist package1 [package2] [...]
查看yum事務歷史:
yum history [info|list|packages-list|packages-info|
summary|addon-info|redo|undo|
rollback|new|sync|stats]
yum history
yum history info 6
yum history undo 6
日志 :/var/log/yum.log
安裝及升級本地程序包:
yum localinstall rpmfile1 [rpmfile2] [...]
(用install替代)
yum localupdate rpmfile1 [rpmfile2] [...]
(用update替代)
包組管理的相關命令:
yum groupinstall group1 [group2] [...]
yum groupupdate group1 [group2] [...]
yum grouplist [hidden] [groupwildcard] [...]
yum groupremove group1 [group2] [...]
yum groupinfo group1 [...]
yum的命令行選項:
--nogpgcheck:禁止進行gpg check
-y: 自動回答為“yes”
-q:靜默模式
--disablerepo=repoidglob:臨時禁用此處指定的repo
--enablerepo=repoidglob:臨時啟用此處指定的repo
--noplugins:禁用所有插件
系統光盤yum倉庫
系統安裝光盤作為本地yum倉庫:
(1) 掛載光盤至某目錄,例如/mnt/cdrom
mount /dev/cdrom /mnt/cdrom
(2) 創建配置文件
[CentOS7]
name=
baseurl=
gpgcheck=
enabled=
創建yum倉庫:
createrepo [options] <directory>
?
?
編譯httpd-2.4.25.tar.bz包,第一步:
安裝httpd-2.4.25.tar.bz包,解包 tar xvf httpd-2.4.25.tar.bz
./configure --prefix=/apps/httpd24 --sysconfdir=/etc/httpd --enable-ssl --enable-so
以下是編譯httpd-2.4.25.tar.bz編代碼,所需要安裝的yum包
yum install gcc -y
yum install apr-devel -y
yum install apr-util-devel -y
yum install pcre-devel -y
yum install mod_ssl -y
./表示當前路徑,要運行configure,就要寫configure的路徑。
第二步:
?
第三步:
最后一步執行make install
?
?
DNF (DaNdiFied)
NF 介紹:新一代的RPM軟件包管理器。DNF 發行日期是2015年5月11日,DNF 包管理器采用Python 編寫,發行許可為GPL v2,首先出現在Fedora 18 發行版中。在 RHEL 8.0 版本正式取代了 YUM,DNF包管理器克服了YUM包管理器的一些瓶頸,提升了包括用戶體驗,內存占用,依賴分析,運行速度等
安裝所需軟件包,依賴epel源
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-conf-0.6.4-2.sdl7.noarch.rpm
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64//dnf-0.6.4-2.sdl7.noarch.rpm
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/python-dnf-0.6.4-2.sdl7.noarch.rpm
yum install python-dnf-0.6.4-2.sdl7.noarch.rpm dnf-0.6.4-2.sdl7.noarch.rpm dnf-conf-0.6.4-2.sdl7.noarch.rpm python2-libcomps-0.1.8-3.el7.x86_64.rpm libcomps-0.1.8-3.el7.x86_64.rpm
配置文件:/etc/dnf/dnf.conf
倉庫文件:/etc/yum.repos.d/ *.repo
日志: /var/log/dnf.rpm.log
DNF 使用
幫助:man dnf
dnf 用法:與yum一致
dnf [options] <command> [<arguments>...]
dnf --version
dnf repolist
dnf clean all
dnf makecache
dnf list installed
dnf list available
dnf search nano
dnf history
dnf history undo 1
程序包編譯
程序包編譯安裝:
Application-VERSION-release.src.rpm --> 安裝后,使用rpmbuild命令制作成二進制格式的rpm包,而后再安裝
源代碼-->預處理-->編譯-->匯編-->鏈接-->執行
源代碼組織格式:
多文件:文件中的代碼之間,很可能存在跨文件依賴關系
C、C++:make 項目管理器
configure腳本 --> Makefile.in --> Makefile
java: maven
編譯安裝C語言源代碼編譯安裝三步驟:
1、./configure
(1) 通過選項傳遞參數,指定啟用特性、安裝路徑等;執行時會參考用戶的指定以及Makefile.in文件生成Makefile
(2) 檢查依賴到的外部環境,如依賴的軟件包
2、make 根據Makefile文件,構建應用程序
?3、make install 復制文件到相應路徑
開發工具:
autoconf: 生成configure腳本
automake:生成Makefile.in
注意:安裝前查看INSTALL,README
開源程序源代碼的獲取:
官方自建站點:
apache.org (ASF:Apache Software Foundation)
mariadb.org
...
代碼托管:
SourceForge.net
Github.com
code.google.com
c/c++編譯器: gcc (GNU C Complier)
編譯C源代碼:
準備:提供開發工具及開發環境
開發工具:make, gcc等
開發環境:開發庫,頭文件
glibc:標準庫
實現:通過“包組”提供開發組件
Development Tools
Server Platform Development
生產實踐:(基于最小化安裝的系統)
yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree screen lsof tcpdump wget ntpdate net-tools iotop bc zip unzip nfs-utils
?
第一步:configure腳本
選項:指定安裝位置、指定啟用的特性
--help: 獲取其支持使用的選項
選項分類:
安裝路徑設定:
--prefix=/PATH:指定默認安裝位置,默認為/usr/local/
--sysconfdir=/PATH:配置文件安裝位置
System types:支持交叉編譯
Optional Features: 可選特性
--disable-FEATURE
--enable-FEATURE[=ARG]
?Optional Packages: 可選包
--with-PACKAGE[=ARG] 依賴包
--without-PACKAGE 禁用依賴關系
注意:通常被編譯操作依賴的程序包,需要安裝此程序包的“開發”組件,其包名一般類似于name-devel-VERSION
第二步:make
第三步:make install
?
安裝后的配置:
(1) 二進制程序目錄導入至PATH環境變量中
編輯文件/etc/profile.d/NAME.sh
export PATH=/PATH/TO/BIN:$PATH
(2) 導入幫助手冊
編輯/etc/man.config|man_db.conf文件
添加一個MANPATH
Ubuntu 軟件管理
Debian軟件包通常為預編譯的二進制格式的擴展名“.deb”,類似rpm文件,因此安裝快速,無需編譯軟件。包文件包括特定功能或軟件所必需的文件、元數據和指令
dpkg:package manager for Debian,類似于rpm, dpkg是基于Debian的系統的包管理器。可以安裝,刪除和構建軟件包,但無法自動下載和安裝軟件包或其依賴項
APT:Advanced Packaging Tool,功能強大的軟件管理工具,甚至可升級整個Ubuntu的系統,基于客戶/服務器架構
APT工作原理:在服務器上先復制所有DEB包,然后用APT的分析工具genbasedir根據每個DEB 包的包頭(Header)信息對所有的DEB包進行分析,并將該分析結果記錄在文件夾base內的一個DEB 索引清單文件中,一旦APT 服務器內的DEB有所變動,要使用genbasedir產生新的DEB索引清單。客戶端在進行安裝或升級時先要查詢DEB索引清單,從而獲知所有具有依賴關系的軟件包,并一同下載到客戶端以便安裝。當客戶端需要安裝、升級或刪除某個軟件包時,客戶端計算機取得DEB索引清單壓縮文件后,會將其解壓置放于 /var/cache/apt/,而客戶端使用apt-get install或apt-get upgrade命令的時候,就會將這個文件夾內的數據和客戶端計算機內的DEB數據庫比對,知道哪些DEB已安裝、未安裝或是可以升級的
?
dpkg常見用法: man dpkg
dpkg -i package.deb 安裝包
dpkg -r package 刪除包,不建議,不自動卸載依賴于它的包
dpkg -P package 刪除包(包括配置文件)
dpkg -l 列出當前已安裝的包,類似rpm -qa
dpkg -l package 顯示該包的簡要說明,類似rpm –qi
dpkg -L package 列出該包中所包含的文件,類似rpm –ql
dpkg -S <pattern> 搜索包含pattern的包,類似rpm –qf
dpkg -s package 列出該包的狀態,包括詳細信息,類似rpm –qi
dpkg --configure package 配置包,-a 使用,配置所有沒有配置的軟件包
dpkg -c package.deb 列出 deb 包的內容,類似rpm –qpl
dpkg --unpack package.deb 解開 deb 包的內容
dpkg示例:
列出系統上安裝的所有軟件包
dpkg -l
列出軟件包安裝的文件
dpkg -L bash
查看/bin/bash來自于哪個軟件包
dpkg -S /bin/bash
安裝本地的 .deb 文件
dpkg -i /mnt/cdrom/pool/main/z/zip/zip_3.0-11build1_amd64.deb
卸載軟件包
dpkg -r zip
注意:一般建議不要使用dpkg卸載軟件包。因為刪除包時,其它依賴它的包不會卸載,并且可能無法再正常運行
?
Debian 使用APT工具來管理包系統,它與 apt 命令不同。在基于 Debian 的 Linux 發行版中,有各種工具可以與 APT 進行交互,以方便用戶安裝、刪除和管理的軟件包。apt-get 是其中一個常用的命令行工具,另外一款較為流行的命令行與 GUI 兼顧的工具是 aptitude ,之前最常用的 Linux 包管理命令都被分散在了 apt-get、apt-cache 和 apt-config 這三條命令中
在 2014 年apt 命令發布第一個穩定版,Ubuntu 16.04 引入新特性之一便是 apt 命令,apt 命令解決了命令過于分散的問題,它包括 apt-get 命令出現以來使用最廣泛的功能選項,以及 apt-cache 和 apt-config 命令中很少用到的功能。在使用 apt 命令時,用戶不必再由 apt-get 轉到 apt-cache 或 apt-config,提供管理軟件包所需的必要選項
apt 相當于 apt-get、apt-cache 和 apt-config 中最常用命令選項的集合
apt 具有更精減但足夠的命令選項,而且參數選項的組織方式更為有效。此外,啟用的幾個特性也非常有幫助。例如:可以在使用 apt 命令安裝或刪除程序時看到進度條,apt 還會在更新存儲庫數據庫時提示用戶可升級的軟件包個數
apt 與 apt-get 有一些類似的命令選項,但它并不能完全向下兼容 apt-get 命令,也即可用 apt 替換部分 apt-get 系列命令,但不是全部
?
查看幫助:apt help
apt與apt-get命令對比
apt 命令 被取代的命令 命令的功能
apt install apt-get install 安裝軟件包
apt remove apt-get remove 移除軟件包
apt purge apt-get purge 移除軟件包及配置文件
apt update apt-get update 刷新存儲庫索引
apt upgrade apt-get upgrade 升級所有可升級的軟件包
apt autoremove apt-get autoremove 自動刪除不需要的包
apt full-upgrade apt-get dist-upgrade 在升級軟件包時自動處理依賴關系
apt search apt-cache search 搜索應用程序
apt show apt-cache show 顯示安裝細節
?
Ubuntu 軟件管理
apt 特有的命令
apt list 列出包含條件的包(已安裝,可升級等)
apt edit-sources 編輯源列表
APT包索引來自/etc/apt/sources.list文件和/etc/apt/sources.list.d目錄中定義的存儲庫的可用包的數據庫。要使用存儲庫中所做的最新更改來更新本地程序包索引
apt命令操作(如安裝和刪除軟件包)記錄在/var/log/dpkg.log日志文件中
?
apt示例:
安裝包:
apt install tree zip
刪除包:
apt remove tree zip
說明:apt remove中添加--purge選項會刪除包配置文件,謹慎使用
更新包索引:
apt update
升級包:要升級系統,請首先更新軟件包索引,再升級
apt upgrade
Ubuntu操作
在Ubuntu版本中使用sudo -i命令切換root賬戶
apt update? ? 與互聯網數據庫同步
apt install ubuntu-desktop? 安裝圖形界面命令
?
?
轉載于:https://www.cnblogs.com/quguwei/p/10839915.html
總結
以上是生活随笔為你收集整理的Linux基础常用命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单理解Ext.DomQuery操作CS
- 下一篇: Web后台服务开发——数据库查询之引入T