-
目錄與路徑
-
絕對路徑與相對路徑:略
-
目錄的相關操作
-
幾個特殊目錄
- . 代表此層目錄
- .. 代表上一層目錄
- - 代表前一個工作目錄
- ~ 代表『目前用戶身份』所在的家目錄
- ~account 代表 account 這個用戶的家目錄(account 是個賬號名稱)
-
-
幾個常見處理目錄的指令
-
cd(change directory, 變換目錄)
-
pwd(顯示目前所在的目錄)
- 選項與參數:
1. [-P]:顯示出實際路徑而非(link)路徑
- 選項與參數:
- mkdir(建立新目錄)
- 選項與參數:
1. -m:指定文件權限而不需要看預設權限(umask) eg:mkdir -m 711 file_name 2. -p:直接將需要的目錄遞歸創建起來 eg:mkdir -p a/b/c/d
- 選項與參數:
- rmdir(刪除[空]目錄)
- 選項與參數:
1. -p:連同『上層』『空的』目錄也一起刪除
- 選項與參數:
-
-
關于執行文件路徑的變量:$PATH
+ echo $PATH:顯示目前的PATH,執行順序即搜到的順序 + 添加PATH:PATH="${PATH}:/root"
- 不同身份預設的PATH不同,默認能夠隨意執行的指令也不同
-
-
文件與目錄管理
-
文件與目錄檢索:ls
- 語法
1. ls [-aAdfFhilnrRSt] 文件名或目錄名稱 2. ls [--color={never,auto,always}] 文件名或目錄名稱 3. ls [--full-time] 文件名或目錄名稱
- 選項與參數
1. -a :全部的文件, 連同隱藏檔( 開頭為 . 的文件) 一起列出來(常用) 2. -A :全部的文件, 連同隱藏檔,但不包括 . 與 .. 這兩個目錄 3. -d : 僅列出目錄本身,而不是列出目錄內的文件數據(常用) 4. -f :直接列出結果,而不進行排序 (ls 預設會以檔名排序! ) 5. -F :根據文件、目錄等信息, 給予附加數據結構,例如: *:代表可執行文件; /:代表目錄; =:代表 socket 文件; |:代表 FIFO 文件; 6. -h : 將文件容量以易讀的方式(例如 GB, KB 等等)列出來; 7. -i :列出 inode 號碼; 8. -l : 長數據串行出,包含文件的屬性與權限等等數據; (常用) 9. -n :列出 UID 與 GID 而非使用者與群組的名稱 10. -r : 將排序結果反向輸出,例如:原本檔名由小到大,反向則為由大到?。?11. -R : 連同子目錄內容一起列出來,等于該目錄下的所有文件都會顯示出來; 12. -S :以文件容量大小排序,而不是用檔名排序; 13. -t :依時間排序,而不是用檔名。 14. --color=never :不要依據文件特性給予顏色顯示; 15. --color=always : 顯示顏色 16. --color=auto : 讓系統自行依據設定來判斷是否給予顏色 17. --full-time :以完整時間模式 (包含年、月、日、 時、分) 輸出 18. --time={atime,ctime} : 輸出 access 時間或改變權限屬性時間 (ctime)而非內容變更時間 (modification time) eg:ll -alF --color=never --full-time ~
- 語法
-
復制、刪除和移動:cp/rm/mv
- 語法:
1. cp [-adfilprsu] 來源文件(source) 目標文件(destination) 2. cp [options] source1 source2 source3 .... directory
- 選項和參數
1. -a :相當于 -dr --preserve=all (常用) 2. -d :若來源文件為鏈接文件的屬性(link file), 則復制鏈接文件屬性而非文件本身; 3. -f : 為強制(force)的意思,若目標文件已經存在且無法開啟, 則移除后再嘗試一次; 4. -i :若目標文件(destination)已經存在時,在覆蓋時會先詢問動作的進行(常用) 5. -l : 進行硬式連結(hard link)的連結檔建立,而非復制文件本身; 6. -p : 連同文件的屬性(權限、用戶、 時間)一起復制過去,而非使用默認屬性(備份常用); 7. -r : 遞歸持續復制,用于目錄的復制行為; (常用) 8. -s :復制成為符號鏈接文件 (symbolic link); 9. -u : destination 比 source 舊才更新 destination,或 destination 不存在的情況下才復制。 10. --preserve=all :除了 -p 的權限相關參數外, 還加入 SELinux 的屬性, links, xattr 等也復制了。 注:如果source有兩個以上,destination必須得是目錄
- 在預設條件中,cp的源文件與目標文件的權限事不同的,目標文件的擁有者通常事指令操作者本身,三思而后復制哈哈
- 語法:
-
rm (移除文件或目錄)
- 選線和參數:
1. -f:(force) ,忽略不存在的文件,不會出現警告訊息 2. -i:刪除前詢問使用者 3. -r:遞歸刪除
- 選線和參數:
-
mv (移動文件與目錄,或更名)
- 語法:
1. mv [-fiu] source destination 2. mv [options] source1 source2 source3 .... directory
- 選項與參數
1. -f:如果目標文件已經存在,不會詢問而直接覆蓋 2. -i:若目標文件 (destination) 已經存在時,就會詢問是否覆蓋 3. -u:若目標文件已經存在,且 source 比較新,才會更新 (update)
- 語法:
- 取得路徑的文件名與目錄名稱
1. basename /etc/sysconfig/network-->network 2. dirname /etc/sysconfig/network-->/etc/sysconfig
-
-
文件內容查閱
-
直接查看文件內容
-
cat(concatenate)
選項與參數:
1. -A :等于 -vET 2. -b :列出行號, 僅針對非空白行做行號顯示 3. -E : 顯示結尾斷行符 $ 4. -n :列出行號, 連同空白行也會有行號 5. -T : 將 [tab] 按鍵以 ^I 顯示出來; 6. -v :列出一些看不出來的特殊字符
-
tac(反向顯示)
-
nl(添加行號打印)
選項和參數:
1. -b :指定行號指定的方式,主要有兩種: -b a :表示不論是否為空行,也同樣列出行號(類似 cat -n); -b t :如果有空行,空的那一行不要列出行號(默認值); 2. -n :列出行號表示的方法,主要有三種: -n ln :行號在屏幕的最左方顯示; -n rn :行號在自己字段的最右方顯示,且不加 0 ; -n rz :行號在自己字段的最右方顯示,且加 0 ; 3. -w :行號字段的占用的字符數。
-
-
可翻頁查看
-
more (一頁一頁翻動)
選項和參數:1. 空格鍵 (space):代表向下翻一頁 2. Enter :代表向下翻『一行』 3. /字符串 :代表在這個顯示的內容當中,向下搜尋『字符串』這個關鍵詞 4. f :立刻顯示出文件名以及目前顯示的行數 5. q :代表立刻離開 more ,不再顯示該文件內容 6. b 或 [ctrl]-b :代表往回翻頁,不過這動作只對文件有用,對管線無用
-
less (一頁一頁翻動,man就是使用less來顯示說明文件的)
選項和參數:1. 空格鍵 :向下翻動一頁; 2. [pagedown]:向下翻動一頁; 3. [pageup] :向上翻動一頁; 4. /字符串 :向下搜尋『字符串』的功能; 5. ?字符串 :向上搜尋『字符串』的功能; 6. n :重復前一個搜尋 (與 / 或 ? 有關! ) 7. N :反向的重復前一個搜尋 (與 / 或 ? 有關! ) 8. g :前進到這個資料的第一行去; 9. G :前進到這個數據的最后一行去 (注意大小寫); 10. q :離開 less 這個程序;
-
-
資料擷取
-
head (取出前面幾行)
- 語法
1. head [-n number] 文件
- 選項與參數
1. -n :后面接數字,代表顯示幾行,不加此選項默認顯示十行,如為負數代表顯示負數絕對值前面的行
- 語法
-
tail (取出后面幾行)
- 語法
1. head [-n number] 文件
- 選項與參數
1. -n :后面接數字,代表顯示幾行,如選項為+n,則代表顯示n行以后的數據 2. -f :表示持續偵測后面所接的檔名,要等到按下[ctrl]-c 才會結束 tail 的偵測
- 語法
- 非純文本檔: od(我覺得自己暫時用不到O(∩_∩)O)
-
-
修改文件時間或建置新檔: touch
- 文件的三個主要變動時間
- modification time (mtime):文件的內容數據(文件的內容,非屬性或權限)變更時的時間
- status time (ctime):當文件的狀態(比如權限和屬性)改變時會更新的時間
- access time (atime):當文件的內容被讀取時候會更新的讀取時間
- ls默認情況顯示的是文件的mtime,其余可用ls -l --time={atime,ctime}來查看
- 語法
1. touch [-acdmt] 文件
- 選項與參數
1. -a : 僅修改access time; 2. -c : 僅修改文件的時間,若該文件不存在則不建立新文件(全都修改了) 3. -d :后面可以接欲修訂的日期而不用目前的日期,也可以使用--date="日期或時間"(atime/mtime) 4. -m : 僅修改 mtime ; 5. -t :后面可以接欲修訂的時間而不用目前的時間,格式為[YYYYMMDDhhmm])(atime/mtime)
- 文件的三個主要變動時間
-
-
文件與目錄的默認權限與隱藏權限
-
文件預設權限:
umask(目前用戶在建立文件or目錄時的權限默認值,可直接通過umask value設定)-
兩種查閱方式:
- 直接輸入umask,可見到數字形態的權限設定
- 加上-S可以符號形式來顯示
- 注:為啥有四組,第一組是特殊權限
-
兩種預設情況
- 目錄:drwxrwxrwx,建立目錄時: (drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
- 文件:-rw-rw-rw-,建立文件時: (-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
-
-
文件隱藏屬性
- 注:chattr指令只在ext2/ext3/ext4的Linux傳統文件系統完整生效,其他文件系統eg:xfs只支持部分參數
-
chattr (配置文件案隱藏屬性)
- 語法
1. chattr [+-=][ASacdistu] 文件或目錄名稱
- 選項與參數
1. + :增加某一個特殊參數,其他原本存在參數則不動。 2. - :移除某一個特殊參數,其他原本存在參數則不動。 3. = : 更新為指定參數 4. A:文件的atime(access time)不可被修改,這樣可以減少磁盤I/O數量,對于筆記本電腦有利于提高續航能力 5. S:硬盤I/O同步選項,功能類似sync 6. a : 當設定 a 之后, 這個文件將只能增加數據,而不能刪除也不能修改數據,只有 root 才能設定這屬性 7. c:即compresse,文件會自動的經壓縮后再存儲,讀取時會自動的解壓 8. d:不被dump程序備份 9. i:設定該屬性后,可使得文件不能被刪除、重命名、設定連接關系、寫入或新增數據,僅有root可設定此屬性 10. s:文件被刪除后將被完全移除硬盤空間,不能救回 11. u:與s相反,文件刪除后可救回
- 注意
1. 常見使用a與i,很多屬性需要root才能設定 2. xfs文件系統僅支持AadiS
- 語法
-
lsattr(顯示文件隱藏屬性)
- 語法
1. lsattr [-adR] 文件或目錄
- 選項與參數
1. -a : 顯示所有文件的隱藏權限,包括隱藏文件 2. -d:顯示目錄的屬性而非目錄內文件的屬性 3. 遞歸顯示目錄下文件和子目錄的屬性
- 語法
-
文件特殊權限:SUID,SGID,SBIT
-
Set UID
當s標志出現在文件owner的權限上時,(eg:/usr/bin/passwd)此時被稱為Set UID(簡稱SUID的特殊權限)- SUID的限制有功能
- SUID權限僅對二進制程序有效(不能用在shell script上)
- 執行者需對該程序有x權限
- SUID權限僅僅在執行該程序的過程中有效
- 執行者在此過程中將具有該程序owner的權限
- 這里給的例子真的是讓人一下就明白了,/etc/shadow的權限為---------- 1 root root,但是一個一般賬號也可以通過passwd指令來修改密碼呀,這就是SUID的功能啦,/usr/bin/passwd的權限是rwsr-xr-x,所以一般賬號也有x權限,臨時借用了一下root的權限對etc/shadow進行修改
- SUID的限制有功能
-
Set GID
當s標志在文件group權限上時,稱為Set GID(簡稱SGID),(eg /usr/bin/locate)- 與SUID不同,SGID可以針對文件或目錄及來設置
- 對文件
- SGID對二進制程序有效
- 執行者需要對該程序有x的權限
- 執行者在執行過程中將會得到程序群組的支持
- eg,locate可以搜尋/var/lib/mlocate/mlocate.db中的內容,mlocate.db的權限為-rw-r-----,locate的權限為-rwx--s--x,那么一般賬號在執行locate時將會在執行過程中的到slocate群組的支持,于是才能讀取mlocate.db的內容
- 對文件
- 對目錄
- 用戶對于此目錄具有r與x權限時,該用戶能夠進入此目錄
- 用戶在此目錄下的有效群組將會變成該目錄的群組
- 用途:若用戶在此目錄具有w的權限,則使用則鎖建立的新文件,該新文件的群組與此目錄的群組相同
- 與SUID不同,SGID可以針對文件或目錄及來設置
-
Sticky Bit
(簡稱SBIT),只針對目錄有效- 對目錄
- 當用戶對此目錄具有w權限(具有group或others的權限時)
- 當用戶在該目錄下建立文件or目錄時,僅有自己與root才有權力刪除/重命名/移動文件
- eg:以不同用戶在tmp下建立文件,切換用戶嘗試刪除操作
- 對目錄
- SUID/SGID/SBIT權限設定
- 4:SUID
- 2:SGID
- 1:SBIT
- eg:需要將一個文件權限修改為-rwsr-xr-x,即加入SUID權限
chmod 4755 filename 順便試一下其他幾種情況 chmod 6755 filename chmod 1755 filename chmod 7666 filename,(這種情況下會出現S和T,這是因為文件本身都不具有x的權限,想一想SUID時文件執行時具有文件owner的權限,既然都不能執行,哪來的的權限借用,所以S、T代表就是“空的”的意思) 這是符號法來處理(個人認為不如數字法方便) chmod u=rwxs,go=x filename chmod g+s,o+t filename
-
-
觀察文件類型:file
- 如果想知道某個文件的基本數據類型,可以使用file
- 語法
1. file filename
-
-
指令與文件的搜索
-
腳本文件名的搜索
-
which
- 語法
1. which [-a] command
- 選項與參數
1. -a:將所有PATH目錄中可以找到的指令列出而不僅僅是列出第一個被找到的指令名稱
- 注:which預設找PATH內所規范的目錄,但是找不到bash內建的指令,eg:which history是找不到的
- 語法
-
- 文件檔名的搜尋
-
whereis(有一些特定的目錄中尋找文件文件名)
- 語法
1. whereis [-bmsu] 文件或目錄名
- 選項與參數
1. -l:列出whereis會查詢的幾個主要目錄 2. -b:執照二進制格式的文件 3. -m:只找在說明文件manual路徑下的文件 4. -s:只找source來源文件 5. -u:搜尋不在上面三個選項中的其他特殊文件
- 語法
-
locate/updatedb
- 語法
1. locate [-ir] keyword
- 選項與參數
1. -i:忽略大小寫差異 2. -c:不輸出檔名,僅計算找到的數據量 3. -l:輸出幾行的意思,eg,輸出5行: -l 5 4. -S:輸出locate所使用數據庫文件的相關信息,包括該數據庫記錄的文件/目錄數量...etc 5. -r:后面可接正則表達式的顯示方式
- 注:locate搜索快的原因是因為他是經由數據庫搜尋的,而在CentOS7.x中數據庫是每天更新一次的,所以可能對于新建立的文件無法搜尋到,需要使用updatedb讀取/etc/updatedb.conf配置更新數據庫
- updatedb:根據/etc/updatedb.conf的設置搜尋硬盤內文件名并跟新/var/lib/mlocate內的數據庫文件
- locate:根據/var/lib/mlocate的數據庫記載找出用戶輸入的關鍵詞文件名
- 語法
-
find
-
語法
1. find [PATH] [option] [action]
-
選項與參數
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 :查找符合指定的擁有者名稱的文件或目錄 -group name: 查找符合指定的組名稱的文件或目錄 -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的屬性值,eg:-rwsr-xr-x 的屬性為 4755 -perm -mode:搜尋文件權限『必須要全部囊括 mode 的權限』的文件,比如4755包括0744啦 -perm /mode:搜尋文件權限『包含任一 mode 的權限』的文件,就是會搜索到他的子集啦 4. 額外可進行的動作 -exec command: command 為其他指令, -exec 后面可再接額外的指令來處理搜尋到的結果 -print:將結果打印到屏幕上(這是默認的)
-
幾個例子
1. find / -name ”*passwd*“ 2. find /run -type s 3. find / -perm /7000,這個比較有意思7000表示---s--s--t,那么搜索其子集的話呢,意味著具有SUID,SGID,SBIT權限的問價or目錄會被列出 4. find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \; {}代表由find找到的內容,或者說find的結果會被放置到{}中 -exec到\;之間是關鍵詞,代表find額外的動作
-
關于時間參數可參見下圖:
+4 代表大于等于 5 天前的文件名: find /var -mtime +4
-4 代表小于等于 4 天內的文件名:find /var -mtime -4
4 則是代表 4-5 那一天的文件名:find /var -mtime 4
-
-
-
-
權限與指令之間的關系
-
讓用戶能進入某目錄的基本權限:
- 目錄:用戶對此目錄至少有x權限
- 額外:若過想查閱目錄內文件名(ls),需有r權限
-
讓用戶在某個目錄內讀取一個文件的基本權限:
- 目錄:用戶至少有x權限
- 文件:用戶至少有r權限
-
讓用戶可修改一個文件的基本權限:
- 目錄:用戶至少有x權限
- 文件:用戶至少對該文件有r,w權限
-
用戶建立一個文件的基本權限:
- 目錄:用戶在該目錄要有x,w權限
-
用戶進入某目錄并執行目錄內某個指令:
- 目錄:至少有x權限
- 文件:至少有x權限
-
-
重點回顧
- ls 可以檢視文件的屬性,尤其 -d, -a, -l 等選項特別重要
- cat -n 與 nl 均可顯示行號,但默認的情況下,空白行會不會編號并不相同
- 除了傳統的 rwx 權限之外,在 Ext2/Ext3/Ext4/xfs 文件系統中,還可以使用 chattr 與 lsattr 設定及觀察隱藏屬性。 常見的包括只能新增數據的 +a 與完全不能更動文件的 +i 屬性
- 新建文件/目錄時,新文件的預設權限使用 umask 來規范。默認目錄完全權限為 drwxrwxrwx, 文件則為-rw-rw-rw-
- 文件具有 SUID 的特殊權限時,代表當用戶執行此一 binary 程序時,在執行過程中用戶會暫時具有程序擁有者的權限
- 目錄具有 SGID 的特殊權限時,代表用戶在這個目錄底下新建的文件之群組都會與該目錄的組名相同
- 目錄具有 SBIT 的特殊權限時,代表在該目錄下用戶建立的文件只有自己與 root 能夠刪除
-
課后問題
- 假設系統中有兩個賬號,分別是 alex 與 arod ,這兩個人除了自己群組之外還共同支持一個名為project 的群組。假設這兩個用戶需要共同擁有 /srv/ahome/ 目錄的開發權,且該目錄不許其他人進入查閱。 請問
該目錄的權限設定應為何?(真的做一遍就明白了)groupadd project useradd -G project alex useradd -G project arod mkdir /srv/ahome chgrp project /srv/ahome chmod 2770 /srv/ahome
- 找出 /etc 底下, 文件大小介于 50K 到 60K 之間的文件,并且將權限完整的列出 (ls -l)
find /etc -size +50k -a -size -60k -exec ls -l {} \;( -a 是 and 的意思)
找出 /etc 底下, 文件容量大于 50K 且文件所屬人不是 root 的檔名,且將權限完整的列出 (ls -l)
find /etc -size +50k -a ! -user root -exec ls -ld {} \;
find /etc -size +50k -a ! -user root -type f -exec ls -l {} \;( ! 代表的是反向選擇)
找出 /etc 底下,容量大于 1500K 以及容量等于 0 的文件
find /etc -size +1500k -o -size 0(-o 就是或 (or) )
- 假設系統中有兩個賬號,分別是 alex 與 arod ,這兩個人除了自己群組之外還共同支持一個名為project 的群組。假設這兩個用戶需要共同擁有 /srv/ahome/ 目錄的開發權,且該目錄不許其他人進入查閱。 請問