# 鳥哥 week1
###### tags: `鳥哥`
[TOC]
## [第五章、Linux 的檔案權限與目錄配置](http://linux.vbird.org/linux_basic/0210filepermission.php)
### 1. 檔案屬性

- 檔案權限類型

:::info
- 檔案類型是[ d ]則為目錄
- 檔案類型是[ - ]則為檔案
- 檔案類型是[ l ]則表示為連結檔(link file)
- 檔案類型是[ b ]則表示為裝置檔裡面的可供儲存的周邊設備
- 檔案類型是[ c ]則表示為裝置檔裡面的序列埠設備
:::

### 2. 如何改變檔案屬性與權限
- chgrp :改變檔案所屬群組
```
chgrp [-R] dirname/filename
```
- chown :改變檔案擁有者
```
chown [-R] 帳號名稱:群組名稱 檔案或目錄
```
- chmod :改變檔案的權限
```
chmod [-R] xyz 檔案或目錄
```

- 使用者操作功能與權限

### 3. 目錄配置的依據--FHS(Filesystem Hierarchy Standard)
- FHS依據檔案系統使用的頻繁與否與是否允許使用者隨意更動, 而將目錄定義成為四種交互作用的形態,用表格來說有點像底下這樣

:::info
- 可分享的:可以分享給其他系統掛載使用的目錄,所以包括執行檔與使用者的郵件等資料, 是能夠分享給網路上其他主機掛載用的目錄
- 不可分享的:自己機器上面運作的裝置檔案或者是與程序有關的socket檔案等, 由於僅與自身機器有關,所以當然就不適合分享給其他主機了
- 不變的:有些資料是不會經常變動的,跟隨著distribution而不變動。 例如函式庫、文件說明檔、系統管理員所管理的主機服務設定檔等等
- 可變動的:經常改變的資料,例如登錄檔、一般用戶可自行收受的新聞群組等
:::
- FHS針對目錄樹架構僅定義出三層目錄底下應該放置什麼資料
- / (root, 根目錄):與開機系統有關
- /usr (unix software resource):與軟體安裝/執行有關
- /var (variable):與系統運作過程有關
## [第六章 、目錄與路徑](http://linux.vbird.org/linux_basic/0220filemanager.php)
### 1. 目錄的相關操作
- 絕對路徑與相對路徑
- 絕對路徑:路徑的寫法『一定由根目錄 / 寫起』
- 相對路徑:路徑的寫法『不是由 / 寫起』
:::info
- .代表此層目錄
- ..代表上一層目錄
- -代表前一個工作目錄
- ~代表『目前使用者身份』所在的家目錄
- ~account代表account 這個使用者的家目錄(account是個帳號名稱)
:::
- 常用指令
- cd (change directory, 變換目錄)
- pwd (Print Working Directory, 顯示目前所在的目錄)
:::warning
-P : 顯示出確實的路徑,而非使用連結 (link) 路徑
:::
- mkdir (make directory, 建立新目錄)
:::warning
-p : 幫助你直接將所需要的目錄(包含上層目錄)遞迴建立起來
-m : 直接設定檔案的權限
:::
```
mkdir -m xyz [dir_name]
```
- rmdir (刪除空的目錄)
:::warning
-r : 刪除有內容的目錄
-p : 連同上層空的目錄也一起刪除
:::
- 關於執行檔路徑的變數: $PATH
當我們在執行一個指令的時候,舉例來說『ls』好了,系統會依照PATH的設定去每個PATH定義的目錄下搜尋檔名為ls的可執行檔, 如果在PATH定義的目錄中含有多個檔名為ls的可執行檔,那麼先搜尋到的同名指令先被執行
### 2. 檔案與目錄管理
- ls (list, 檔案與目錄的檢視)
:::warning
-a :全部的檔案,連同隱藏檔( 開頭為 . 的檔案) 一起列出來(常用)
-A :全部的檔案,連同隱藏檔,但不包括 . 與 .. 這兩個目錄
-d :僅列出目錄本身,而不是列出目錄內的檔案資料(常用)
-f :直接列出結果,而不進行排序 (ls 預設會以檔名排序!)
-F :根據檔案、目錄等資訊,給予附加資料結構
例如:*代表可執行檔; /代表目錄; =代表 socket 檔案; |代表 FIFO 檔案
-h :將檔案容量以人類較易讀的方式(例如 GB, KB 等等)列出來
-i :列出 inode 號碼,inode 的意義下一章將會介紹
-l :長資料串列出,包含檔案的屬性與權限等等資料(常用)
-n :列出 UID 與 GID 而非使用者與群組的名稱
-r :將排序結果反向輸出,例如:原本檔名由小到大,反向則為由大到小
-R :連同子目錄內容一起列出來,等於該目錄下的所有檔案都會顯示出來
-S :以檔案容量大小排序,而不是用檔名排序
-t :依時間排序,而不是用檔名
--color=never :不要依據檔案特性給予顏色顯示
--color=always :顯示顏色
--color=auto :讓系統自行依據設定來判斷是否給予顏色
--full-time :以完整時間模式 (包含年、月、日、時、分) 輸出
--time={atime,ctime} :輸出 access 時間或改變權限屬性時間 (ctime)
而非內容變更時間 (modification time)
:::
- cp (copy, 複製檔案或目錄)
:::warning
-a :相當於 -dr --preserve=all 的意思,至於 dr 請參考下列說明;(常用)
-d :若來源檔為連結檔的屬性(link file),則複製連結檔屬性而非檔案本身
-f :為強制(force)的意思,若目標檔案已經存在且無法開啟,則移除後再嘗試一次
-i :若目標檔(destination)已經存在時,在覆蓋時會先詢問動作的進行(常用)
-l :進行硬式連結(hard link)的連結檔建立,而非複製檔案本身
-p :連同檔案的屬性(權限、用戶、時間)一起複製,而非預設屬性(備份常用)
-r :遞迴持續複製,用於目錄的複製行為(常用)
-s :複製成為符號連結檔 (symbolic link),亦即『捷徑』檔案
-u :destination 比 source 舊才更新 destination或 destination 不存在的情況下才複製
--preserve=all :除了 -p 的權限參數外,還加入 SELinux 的屬性, links, xattr 等也複製
如果來源檔有兩個以上,則最後一個目的檔一定要是『目錄』才行
:::
- rm (remove, 移除檔案或目錄)
:::warning
-f :就是 force 的意思,忽略不存在的檔案,不會出現警告訊息
-i :互動模式,在刪除前會詢問使用者是否動作
-r :遞迴刪除
\rm :可以忽略掉 alias 的指定選項
:::
- mv (move, 移動檔案與目錄或更名)
:::warning
-f :force 強制的意思,如果目標檔案已經存在,不會詢問而直接覆蓋;
-i :若目標檔案 (destination) 已經存在時,就會詢問是否覆蓋!
-u :若目標檔案已經存在,且 source 比較新,才會更新 (update)
:::
- basename 取得的檔案名稱
- dirname 取得的目錄名稱
### 3. 檔案內容查閱
- cat (concatenate, 由第一行開始顯示檔案內容)
:::warning
-A :相當於 -vET 的整合選項,可列出一些特殊字符而不是空白而已
-b :列出行號,僅針對非空白行做行號顯示,空白行不標行號
-E :將結尾的斷行字元 $ 顯示出來
-n :列印出行號,連同空白行也會有行號,與 -b 的選項不同
-T :將 [tab] 按鍵以 ^I 顯示出來
-v :列出一些看不出來的特殊字符
:::
- tac (反向列示, 與cat相反)
- nl (添加行號列印, 可以將行號做比較多的顯示設計)
:::warning
-b :指定行號指定的方式,主要有兩種
-b a :表示不論是否為空行,也同樣列出行號(類似 cat -n)
-b t :如果有空行,空的那一行不要列出行號(預設值)
-n :列出行號表示的方法,主要有三種
-n ln :行號在螢幕的最左方顯示
-n rn :行號在自己欄位的最右方顯示,且不加 0
-n rz :行號在自己欄位的最右方顯示,且加 0
-w :行號欄位的佔用的字元數
:::
- more (一頁一頁翻動)
:::warning
空白鍵 (space):代表向下翻一頁
Enter :代表向下翻『一行』
/字串 :代表在這個顯示的內容當中,向下搜尋『字串』這個關鍵字
:f :立刻顯示出檔名以及目前顯示的行數
q :代表立刻離開 more ,不再顯示該檔案內容
b 或 [ctrl]-b :代表往回翻頁,不過這動作只對檔案有用,對管線無用
:::
- less (一頁一頁翻動)
:::warning
空白鍵 :向下翻動一頁;
[pagedown]:向下翻動一頁;
[pageup] :向上翻動一頁;
/字串 :向下搜尋『字串』的功能;
?字串 :向上搜尋『字串』的功能;
n :重複前一個搜尋 (與 / 或 ? 有關!)
N :反向的重複前一個搜尋 (與 / 或 ? 有關!)
g :前進到這個資料的第一行去;
G :前進到這個資料的最後一行去 (注意大小寫);
q :離開 less 這個程式;
:::
- head (取出前面幾行)
:::warning
-n :後面接數字,代表顯示幾行的意思 (-的話表示後面的n行不顯示)
:::
- tail (取出後面幾行)
:::warning
-n :後面接數字,代表顯示幾行的意思 (+的話表示第n行後開始顯示)
-f :表示持續偵測後面所接的檔名,要等到按下[ctrl]-c才會結束tail的偵測
:::
- od (顯示非文字檔)
:::warning
-t :後面可以接各種『類型 (TYPE)』的輸出,例如:
a :利用預設的字元來輸出
c :使用 ASCII 字元來輸出
d[size] :利用十進位(decimal)來輸出資料,每個整數佔用 size bytes
f[size] :利用浮點數值(floating)來輸出資料,每個數佔用 size bytes
o[size] :利用八進位(octal)來輸出資料,每個整數佔用 size bytes
x[size] :利用十六進位(hexadecimal)來輸出資料,每個整數佔用 size bytes
:::
- touch (修改檔案時間或建置新檔)
:::warning
-a :僅修訂 access time;
-c :僅修改檔案的時間,若該檔案不存在則不建立新檔案;
-d :後面可以接欲修訂的日期而不用目前的日期,也可以使用 --date="日期或時間"
-m :僅修改 mtime ;
-t :後面可以接欲修訂的時間而不用目前的時間,格式為[YYYYMMDDhhmm]
:::
### 4. 檔案與目錄的預設權限與隱藏權限
- umask (檔案預設權限)
:::warning
若使用者建立為『檔案』則預設『沒有可執行( x )權限』,亦即只有 rw 這兩個項目,也就是最大為 666 分,預設權限如下:-rw-rw-rw-
若使用者建立為『目錄』,則由於 x 與是否可以進入此目錄有關,因此預設為所有權限均開放,亦即為 777 分,預設權限如下:drwxrwxrwx
umask 的分數指的是該預設值需要減掉的權限
:::
- chattr (設定檔案隱藏屬性)
:::warning
+:增加某一個特殊參數,其他原本存在參數則不動。
-:移除某一個特殊參數,其他原本存在參數則不動。
= :設定一定,且僅有後面接的參數
A :當設定了 A 這個屬性時,若你有存取此檔案(或目錄)時,他的存取時間 atime 將不會被修改,可避免 I/O 較慢的機器過度的存取磁碟
S :一般檔案是非同步寫入磁碟的,如果加上 S 這個屬性時,進行任何檔案的修改,該更動會『同步』寫入磁碟中。
a :檔案將只能增加資料,而不能刪除也不能修改資料,只有root才能設定這屬性
c :這個屬性設定之後,將會自動的將此檔案『壓縮』,在讀取的時候將會自動解壓縮,
但是在儲存的時候,將會先進行壓縮後再儲存(看來對於大檔案似乎蠻有用的!)
d :當 dump 程序被執行的時候,設定 d 屬性將可使該檔案(或目錄)不會被 dump 備份
i :檔案不能被刪除、改名、設定連結也無法寫入或新增資料
對於系統安全性有相當大的助益!只有 root 能設定此屬性
s :當檔案設定了 s 屬性時,如果這個檔案被刪除,他將會被完全的移除出這個硬碟空間,
所以如果誤刪了,完全無法救回來了喔!
u :與 s 相反的,當使用 u 來設定檔案時,如果該檔案被刪除了,則資料內容其實還存在磁碟中,可以使用來救援該檔案喔
:::
- lsattr (顯示檔案隱藏屬性)
:::warning
-a :將隱藏檔的屬性也秀出來;
-d :如果接的是目錄,僅列出目錄本身的屬性而非目錄內的檔名;
-R :連同子目錄的資料也一併列出來!
:::
- SUID (Set UID)
:::warning
- SUID 權限僅對二進位程式(binary program)有效
- 執行者對於該程式需要具有 x 的可執行權限
- 本權限僅在執行該程式的過程中有效 (run-time)
- 執行者將具有該程式擁有者 (owner) 的權限
:::

- file (觀察檔案類型)
### 5. 指令與檔案的搜尋
- which (尋找執行檔)
:::warning
-a :將所有由 PATH 目錄中可以找到的指令均列出,而不止第一個被找到的指令名稱
:::
- whereis (由一些特定的目錄中尋找檔案檔名, 速度快但不能找到全部)
:::warning
-l :可以列出 whereis 會去查詢的幾個主要目錄而已
-b :只找 binary 格式的檔案
-m :只找在說明檔 manual 路徑下的檔案
-s :只找 source 來源檔案
-u :搜尋不在上述三個項目當中的其他特殊檔案
:::
- find (find [PATH] [option] [action])
:::warning
1. 與時間有關的選項:共有 -atime, -ctime 與 -mtime ,以 -mtime 說明
-mtime n :n 為數字,意義為在 n 天之前的『一天之內』被更動過內容的檔案;
-mtime +n :列出在 n 天之前(不含 n 天本身)被更動過內容的檔案檔名;
-mtime -n :列出在 n 天之內(含 n 天本身)被更動過內容的檔案檔名。
-newer file :file 為一個存在的檔案,列出比 file 還要新的檔案檔名
2. 與使用者或群組名稱有關的參數:
-uid n :n 為數字,這個數字是使用者的帳號 ID,亦即 UID ,這個 UID 是記錄在
/etc/passwd 裡面與帳號名稱對應的數字。這方面我們會在第四篇介紹。
-gid n :n 為數字,這個數字是群組名稱的 ID,亦即 GID,這個 GID 記錄在
/etc/group,相關的介紹我們會第四篇說明~
-user name :name 為使用者帳號名稱喔!例如 dmtsai
-group name:name 為群組名稱喔,例如 users ;
-nouser :尋找檔案的擁有者不存在 /etc/passwd 的人!
-nogroup :尋找檔案的擁有群組不存在於 /etc/group 的檔案,當你自行安裝軟體時,很可能該軟體的屬性當中並沒有檔案擁有者,這是可能的!在這個時候,就可以使用 -nouser 與 -nogroup 搜尋
3. 與檔案權限及名稱有關的參數:
-name filename:搜尋檔案名稱為 filename 的檔案;
-size [+-]SIZE:搜尋比 SIZE 還要大(+)或小(-)的檔案。這個 SIZE 的規格有:
c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB還要大的檔案,就是『 -size +50k 』
-type TYPE :搜尋檔案的類型為 TYPE 的,類型主要有:一般正規檔案 (f), 裝置檔案 (b, c)
目錄 (d), 連結檔 (l), socket (s), 及 FIFO (p) 等屬性。
-perm mode :搜尋檔案權限『剛好等於』 mode 的檔案,這個 mode 為類似 chmod
的屬性值,舉例來說, -rwsr-xr-x 的屬性為 4755 !
-perm -mode :搜尋檔案權限『必須要全部囊括 mode 的權限』的檔案,舉例來說,
我們要搜尋 -rwxr--r-- ,亦即 0744 的檔案,使用 -perm -0744,
當一個檔案的權限為 -rwsr-xr-x ,亦即 4755 時,也會被列出來,
因為 -rwsr-xr-x 的屬性已經囊括了 -rwxr--r-- 的屬性了。
-perm /mode :搜尋檔案權限『包含任一 mode 的權限』的檔案,舉例來說,我們搜尋
-rwxr-xr-x ,亦即 -perm /755 時,但一個檔案屬性為 -rw-------
也會被列出來,因為他有 -rw.... 的屬性存在
:::