訪問博客查看 本文 排版更美觀ヾ(?ω?`)o
Linux 系列學(xué)習(xí)筆記:
在前文的基礎(chǔ)上判耕,記錄了 Linux 中如何充分利用 Shell 命令舌剂,以及對文件權(quán)限的管理版确。
本文部分內(nèi)容參考了清華 ZAH 同學(xué)的教程菩暗,部分參考了 劉遄 老師的《Linux 就該這么學(xué)》,菜鳥教程-Linux鞍匾。
高級的 Shell
Linux 中可以將簡單的 Shell 命令組合以發(fā)揮更大的作用瞳氓,常見的如:與文件讀寫操作有關(guān)的重定向技術(shù)送粱、處理命令輸出值的管道命令符、通配符和轉(zhuǎn)義字符等时捌。這些技巧在 Shell 腳本批處理中十分常用怒医。
輸入輸出重定向
輸入重定向是指把文件導(dǎo)入到命令中,而輸出重定向則是指把原本要輸出到屏幕的數(shù)據(jù)信息寫入到指定文件中奢讨。
日常的學(xué)習(xí)和工作中稚叹,使用輸出重定向的頻率更高,所以又將輸出重定向分為了標準輸出重定向和錯誤輸出重定向兩種不同的技術(shù)拿诸,以及覆蓋寫入與追加寫入兩種模式扒袖。
錯誤信息的輸出對于執(zhí)行一個自動化的 Shell 腳本非常有用,它可以把整個腳本執(zhí)行過程中的報錯信息都記錄到文件中佳镜,便于安裝后的排錯工作僚稿。
對于輸入重定向,格式如下:
格式 | 功能 |
---|---|
命令 < 文件 |
將文件作為命令的標準輸入 |
命令 << 分界符 |
從鍵盤輸入中讀入蟀伸,直到遇見分界符才停止 |
命令 < 文件A > 文件B |
將文件 A 作為命令的輸入并將標準輸出到文件 B |
通常用輸入重定向能做的事情蚀同,直接執(zhí)行該命令也能做缅刽,因此使用頻率較低。
對于輸出重定向蠢络,格式如下:
格式 | 功能 |
---|---|
命令 > 文件 |
將標準輸出重定向到一個文件中(清空原有文件的數(shù)據(jù)) |
命令 2> 文件 |
將錯誤輸出重定向到一個文件中(清空原有文件的數(shù)據(jù)) |
命令 >> 文件 |
將標準輸出重定向到一個文件中(追加到原有內(nèi)容的后面) |
命令 2>> 文件 |
將錯誤輸出重定向到一個文件中(追加到原有內(nèi)容的后面) |
管道命令符
管道命令符 |
用于把前一個命令原本要輸出到屏幕的信息當(dāng)作后一個命令的標準輸入衰猛,就像一個「管道」連接了兩條命令一樣,其本質(zhì)是創(chuàng)建一個臨時文件用以讀寫刹孔。
下面用一些例子來展示管道命令符的巧妙之處:
$ grep /sbin/nologin /etc/passwd | wc -l # 抓取文件中含 /sbin/nologin 的行啡省,統(tǒng)計行數(shù)
$ ls -lah /etc/ | more # 羅列目錄下的文件信息,用翻頁的形式查看
$ ls -lah usr/bin | grep echo # 羅列目錄下的文件信息髓霞,抓取 echo 文件
$ ps aux | grep bash # 顯示全部進程卦睹,抓取 bash 的進程信息
此外,管道命令符在一條命令中還可以多次復(fù)用方库,完成更復(fù)雜的工作结序。
但是,由于管道運算符實現(xiàn)的本質(zhì)纵潦,它默認會將前者的輸出作為一整個臨時文件傳給后者徐鹤,而有時候我們卻需要拆散這個文件,依次輸入到后者邀层,這時就需要這個命令:
-
xargs
:代表 eXtended ARGuments返敬,管道命令傳遞參數(shù)的一個過濾器,格式為:命令1 | xargs [參數(shù)] 命令2
寥院。
通配符
在 Git 學(xué)習(xí)中劲赠,已經(jīng)介紹了一些常用的通配符,這里附上完整表格:
通配符 | 含義 |
---|---|
* |
任意字符 |
? |
單個任意字符 |
[a-z] |
單個小寫字母 |
[A-Z] |
單個大寫字母 |
[a-Z] |
單個字母 |
[0-9] |
單個數(shù)字 |
[[:alpha:]] |
任意字母 |
[[:upper:]] |
任意大寫字母 |
[[:lower:]] |
任意小寫字母 |
[[:digit:]] |
所有數(shù)字 |
[[:alnum:]] |
任意字母加數(shù)字 |
[[:punct:]] |
標點符號 |
轉(zhuǎn)義字符
轉(zhuǎn)義字符通常用于避免命令的歧義只磷,最常用的有如下幾種:
- 反斜杠
\
:使反斜杠后面的一個保留字符變?yōu)閱渭兊淖址?/li> - 單引號
‘’
:轉(zhuǎn)義其中所有的變量為單純的字符串经磅。 - 雙引號
“”
:保留其中的變量屬性,不進行轉(zhuǎn)義處理钮追。
環(huán)境變量
回歸一個最本質(zhì)的問題预厌,當(dāng)我們在 Shell 環(huán)境中輸入一條命令時(我們知道這條命令其實是一個 C 編寫的程序),Shell 是如何找到這個程序的呢元媚?
首先轧叽,Shell 會用戶是否以絕對路徑或相對路徑的方式輸入命令(如 /bin/ls),如果是絕對路徑則直接執(zhí)行刊棕。如果不是炭晒,系統(tǒng)則需要在多個路徑中查找用戶輸入的命令文件,而定義這些路徑的變量就叫作 PATH甥角。我們可以通過如下命令來查看:
$ echo $PATH # 符號 $ 表示輸出環(huán)境變量的值
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin
可以看到网严,PATH 文件中含有多個量,都是這條命令可能存放的位置嗤无,于是解釋器會在這些位置中逐個查找震束。
當(dāng)然怜庸,為了 Linux 這樣龐大系統(tǒng)的運行,類似的環(huán)境還有許多垢村,我們可以使用 env
命令來查看所有環(huán)境變量割疾。這里列出常用的一些變量:
變量名稱 | 含義 |
---|---|
HOME | 用戶的主目錄(即家目錄) |
SHELL | 用戶在使用的 Shell 解釋器名稱 |
HISTSIZE | 輸出的歷史命令記錄條數(shù) |
HISTFILESIZE | 保存的歷史命令記錄條數(shù) |
郵件保存路徑 | |
LANG | 系統(tǒng)語言、語系名稱 |
RANDOM | 生成一個隨機數(shù)字 |
PS1 | Bash 解釋器的提示符 |
PATH | 定義解釋器搜索用戶執(zhí)行命令的路徑 |
PATH 是最重要的一個環(huán)境變量嘉栓,許多黑客會在 /tmp 中存放一個與 ls 或 cd 同名的木馬文件宏榕,再把路徑加入 PATH。
文件權(quán)限管理
Linux 作為一個多用戶侵佃、多任務(wù)的操作系統(tǒng)麻昼,具有很好的穩(wěn)定性與安全性,在幕后保障 Linux 系統(tǒng)的安全則是一系列復(fù)雜的配置工作趣钱。這里暫不介紹用戶身份相關(guān)的命令涌献,只介紹文件權(quán)限與歸屬。
目錄詳解
Unix/Linux 中首有,一切皆文件。涉及權(quán)限操作時枢劝,不可避免地要接觸各個目錄井联,這里簡單介紹一些常用目錄的作用:
系統(tǒng)啟動項:
/boot:存放的啟動 Linux 時使用的內(nèi)核文件,包括連接文件以及鏡像文件您旁。
/etc:表示 Etcetera烙常,存放所有的系統(tǒng)需要的配置文件和子目錄列表。
指令集合:
/bin:存放著最常用的程序和指令鹤盒,如
ls
就是在 /bin/ls 目錄下的蚕脏。/sbin:表示 Super User,只有系統(tǒng)管理員能使用的程序和指令侦锯。
賬戶:
/root:系統(tǒng)管理員的用戶主目錄驼鞭。
/home:用戶的主目錄,以各個用戶的賬號命名尺碰,支持多用戶挣棕。
-
/usr:表示 Unix Shared Resources,用戶的很多應(yīng)用程序和文件都放在這個目錄下亲桥,類似 Windows 下的 Program Files 目錄洛心。
- /usr/bin:系統(tǒng)用戶使用的應(yīng)用程序與指令。
- /usr/sbin:超級用戶使用的比較高級的管理程序和系統(tǒng)守護程序题篷。
- /usr/src:內(nèi)核源代碼默認的放置目錄词身。
其他:
- 外部文件管理:/dev、/media番枚、/mnt法严,掛載外部設(shè)備璧瞬,如 U盤,光驅(qū)等渐夸。
- 臨時文件:/run嗤锉,存儲系統(tǒng)運行信息;/tmp墓塌,存儲用戶臨時信息瘟忱。
- 運行過程項:/var,存放日志等苫幢;/proc访诱,管理內(nèi)存空間,系統(tǒng)內(nèi)存的映射韩肝。
- 擴展目錄:/src触菜,存放服務(wù)啟動后需要提取的數(shù)據(jù),不用服務(wù)器就是空哀峻。
權(quán)限類型
在 Linux 系統(tǒng)中涡相,每個文件和目錄都有歸屬的所有者和所屬組,并且規(guī)定了其所有者剩蟀、所屬組以及其他人所擁有的可讀却呋取(r)、可寫入(w)育特、可執(zhí)行(x丙号,代表 execute)的權(quán)限。
這三個權(quán)限對于文件和目錄的含義各不相同:
權(quán)限 | 文件 | 目錄 |
---|---|---|
讀如衷(r) | 能讀取文件 | 能夠讀取目錄內(nèi)的文件列表 |
寫入(w) | 能編輯犬缨、新增、修改棉浸、刪除文件 | 能夠在目錄內(nèi)新增怀薛、刪除、重命名文件 |
執(zhí)行(r) | 能運行一個腳本程序 | 能夠進入該目錄 |
三類對象涮拗,三種權(quán)限乾戏,總共需要九個標志位來限定一個文件或目錄的權(quán)限范圍,為了區(qū)分文件和目錄等三热,還有一個附加標志位鼓择。權(quán)限的表示就分為字符表示和數(shù)字表示兩種:
數(shù)字表示即在字符對應(yīng)的二進制位填寫 1 或 0,表示授權(quán)或未授權(quán)就漾,轉(zhuǎn)換為十進制就是 4呐能、2、1。
下面以一個例子來說明這兩種表示法:現(xiàn)在有這樣一個文件摆出,其所有者擁有可讀朗徊、可寫、可執(zhí)行的權(quán)限偎漫,其文件所屬組擁有可讀爷恳、可寫的權(quán)限;其他人只有可讀的權(quán)限象踊。
- 字符表示:
rwxrw-r--
- 數(shù)字表示:
111110100
即764
那么現(xiàn)在我們用 ls -l
查看文件的信息:
這些信息依次為:文件類型與權(quán)限温亲;硬鏈接數(shù);所有者杯矩;所有組栈虚;文件大小(字節(jié))史隆;最后修改時間魂务;文件名。
文件類型有 7 種泌射,最常見的是
-
表示普通文件粘姜,d
表示目錄文件。硬鏈接數(shù)魄幕,對于普通文件相艇,表示指向存儲數(shù)據(jù)塊中該文件的鏈接數(shù)(相當(dāng)于 Windows 的快捷方式);對于目錄文件纯陨,表示所在子目錄級數(shù)。
在復(fù)雜的實際情況中留储,單純設(shè)置 rwx 權(quán)限已無法滿足需求翼抠,因此還有 SUID、SGID 與 SBIT 三個特殊權(quán)限位获讳,這里不多贅述。
修改權(quán)限
通常來講,修改權(quán)限的操作有以下兩個:
chmod
:代表 Change mode酒请,格式為chmod [參數(shù)] 文件名稱
淫半。其中參數(shù)為數(shù)字表示的權(quán)限。chown
:代表 Change owner帅矗,格式為chown 所有者:所有組 文件名
偎肃。
樣例 | 功能 |
---|---|
chmod +x script.sh |
給腳本添加可執(zhí)行權(quán)限(默認對于任何人) |
chmod 777 a.txt |
賦予所有人完整權(quán)限 |
chmod 000 a.txt |
賦予最小權(quán)限,只有 root 才能操作 |
chown root:root a.txt |
修改所有者和所有組為 root |
此外浑此,它們還有一個特別的共性累颂,就是針對目錄進行操作時需要加上大寫參數(shù) -R
來表示遞歸操作,即對目錄內(nèi)所有的文件進行整體操作。
管理員權(quán)限
Linux 系統(tǒng)為了安全性考慮紊馏,使得許多系統(tǒng)命令和服務(wù)只能被 root 管理員來使用料饥,通過一些命令可以切換或暫時切換 root 權(quán)限。
-
su
:不退出登錄的情況下朱监,切換用戶身份岸啡,格式為su - 用戶名稱
。
注意到命令中間有個 -
符號赫编,這意味著完全切換到新的用戶巡蘸,即把環(huán)境變量信息也變更為新用戶的相應(yīng)信息,而不是保留原始的信息沛慢。用戶名稱可以是普通用戶赡若,也可以是 root。由普通用戶切換至 root 需要輸入管理員密碼团甲。
$ su - root
Password: #此處輸入管理員密碼
-
sudo
:代表 Superuser do逾冬,給普通用戶提供額外的權(quán)限,格式為sudo [參數(shù)] 用戶名稱
躺苦。
最常用的是為當(dāng)前用戶暫時提供 root 權(quán)限身腻,此時不需要輸入管理員密碼,只需要當(dāng)前用戶密碼匹厘。該命令可以避免顯式輸入管理員密碼嘀趟,但有效時間僅有 5 分鐘。
$ sudo su
Password: #此處輸入當(dāng)前用戶密碼
此外愈诚,sudo
還可加在其他命令前面她按,以獲取高權(quán)限的執(zhí)行,常用的有包管理命令炕柔。