目錄的相關(guān)操作
.. 代表上一層目錄
- 代表前一個(gè)工作目錄
~ 代表『目前用戶身份』所在的家目錄
~account 代表 account 這個(gè)用戶的家目錄(account 是個(gè)賬號(hào)名稱)
在所有目錄底下都會(huì)存在的兩個(gè)目錄,分別是『.』與『..』 分別代表此層與上層目錄的意思(表根目錄的上一層(..)與根目錄自己(.)是同一個(gè)目錄)
常用指令
復(fù)制,創(chuàng)建、刪除、移動(dòng)、顯示文件或目錄
cd :變換目錄
pwd [ options ] :顯示當(dāng)前目錄
-P :不以連結(jié)文件的數(shù)據(jù)顯示,而是顯示正確的完整路徑
mkdir [ options ] 目錄 :建立一個(gè)新的目錄
-p :直接將所需要的目錄(包含上層目錄)遞歸建立起來(lái)
-m :配置文件案的權(quán)限喔!直接設(shè)定
rmdir [ options ] :刪除一個(gè)空的目錄,被刪除的目錄里面必定不能存在其他的目錄或文件(另行參考 rm 指令)
-p:連同『上層』『空的』目錄也一起刪除
echo :有『顯示、印出』的意思
ls [ options ] [文件名] :文件與目錄的檢視
-a :全部的文件,連同隱藏檔( 開(kāi)頭為 . 的文件) 一起列出來(lái)(常用)
-A :全部的文件,連同隱藏檔,但不包括 . 與 .. 這兩個(gè)目錄
-d :僅列出目錄本身,而不是列出目錄內(nèi)的文件數(shù)據(jù)(常用)
-f :直接列出結(jié)果,而不進(jìn)行排序 (ls 預(yù)設(shè)會(huì)以檔名排序!)
-F :根據(jù)文件、目錄等信息,給予附加數(shù)據(jù)結(jié)構(gòu),例如:
*:代表可執(zhí)行文件; /:代表目錄; =:代表 socket 文件; |:代表 FIFO 文件;
-h :將文件容量以人類較易讀的方式(例如 GB, KB 等等)列出來(lái);
-i :列出 inode 號(hào)碼,inode 的意義下一章將會(huì)介紹;
-l :長(zhǎng)數(shù)據(jù)串行出,包含文件的屬性與權(quán)限等等數(shù)據(jù);(常用)
-n :列出 UID 與 GID 而非使用者與群組的名稱 (UID 與 GID 會(huì)在賬號(hào)管理提到!)
-r :將排序結(jié)果反向輸出,例如:原本檔名由小到大,反向則為由大到?。? -R :連同子目錄內(nèi)容一起列出來(lái),等于該目錄下的所有文件都會(huì)顯示出來(lái);
-S :以文件容量大小排序,而不是用檔名排序;
-t :依時(shí)間排序,而不是用檔名。
--color=never :不要依據(jù)文件特性給予顏色顯示;
--color=always :顯示顏色
--color=auto :讓系統(tǒng)自行依據(jù)設(shè)定來(lái)判斷是否給予顏色
--full-time :以完整時(shí)間模式 (包含年、月、日、時(shí)、分) 輸出
--time={atime,ctime} :輸出 access 時(shí)間或改變權(quán)限屬性時(shí)間 (ctime) 而非內(nèi)容變更時(shí)間 (modification time)
cp [ options ] : 文件路徑 或 cp [options] 文件1 文件2 ... 目錄:復(fù)制
-a :相當(dāng)于 -dr --preserve=all 的意思,至于 dr 請(qǐng)參考下列說(shuō)明;(常用)
-d :若來(lái)源文件為鏈接文件的屬性(link file),則復(fù)制鏈接文件屬性而非文件本身;
-f :為強(qiáng)制(force)的意思,若目標(biāo)文件已經(jīng)存在且無(wú)法開(kāi)啟,則移除后再嘗試一次;
-i :若目標(biāo)文件(destination)已經(jīng)存在時(shí),在覆蓋時(shí)會(huì)先詢問(wèn)動(dòng)作的進(jìn)行(常用)
-l :進(jìn)行硬式連結(jié)(hard link)的連結(jié)檔建立,而非復(fù)制文件本身;
-p :連同文件的屬性(權(quán)限、用戶、時(shí)間)一起復(fù)制過(guò)去,而非使用默認(rèn)屬性(備份常用);
-r :遞歸持續(xù)復(fù)制,用于目錄的復(fù)制行為;(常用)
-s :復(fù)制成為符號(hào)鏈接文件 (symbolic link),亦即『快捷方式』文件;
-u :destination 比 source 舊才更新 destination,或 destination 不存在的情況下才復(fù)制
rm [ options ] : 文件或文件夾:刪除
-f :就是 force 的意思,忽略不存在的文件,不會(huì)出現(xiàn)警告訊息;
-i :互動(dòng)模式,在刪除前會(huì)詢問(wèn)使用者是否動(dòng)作
-r :遞歸刪除??!最常用在目錄的刪除了!這是非常危險(xiǎn)的選項(xiàng)?。?!
mv [ options ] : 源文件 目標(biāo)文件/ 源文件.. 目錄:移動(dòng)
-f :force 強(qiáng)制的意思,如果目標(biāo)文件已經(jīng)存在,不會(huì)詢問(wèn)而直接覆蓋;
-i :若目標(biāo)文件 (destination) 已經(jīng)存在時(shí),就會(huì)詢問(wèn)是否覆蓋!
-u :若目標(biāo)文件已經(jīng)存在,且 source 比較新,才會(huì)更新 (update)
取得路徑的文件名與目錄名稱
basename name [ SUFFIX ] :從文件名中剝離目錄和后綴
dirname name :從文件名剝離非目錄的后綴
文件內(nèi)容查閱
cat [ options ] :由第一行開(kāi)始顯示文件內(nèi)容
-A :相當(dāng)于 -vET 的整合選項(xiàng),可列出一些特殊字符而不是空白而已;
-b :列出行號(hào),僅針對(duì)非空白行做行號(hào)顯示,空白行不標(biāo)行號(hào)!
-E :將結(jié)尾的斷行字符 $ 顯示出來(lái);
-n :打印出行號(hào),連同空白行也會(huì)有行號(hào),與 -b 的選項(xiàng)不同;
-T :將 [tab] 按鍵以 ^I 顯示出來(lái);
-v :列出一些看不出來(lái)的特殊字符
tac : 從最后一行開(kāi)始顯示,可以看出 tac 是 cat 的倒著寫
nl : (添加行號(hào)打印)
-b :指定行號(hào)指定的方式,主要有兩種:
-b a :表示不論是否為空行,也同樣列出行號(hào)(類似 cat -n);
-b t :如果有空行,空的那一行不要列出行號(hào)(默認(rèn)值);
-n :列出行號(hào)表示的方法,主要有三種:
-n ln :行號(hào)在屏幕的最左方顯示;
-n rn :行號(hào)在自己字段的最右方顯示,且不加 0 ;
-n rz :行號(hào)在自己字段的最右方顯示,且加 0 ;
-w :行號(hào)字段的占用的字符數(shù)。
more : 一頁(yè)一頁(yè)的顯示文件內(nèi)容
空格鍵 (space):代表向下翻一頁(yè);
Enter :代表向下翻『一行』;
/字符串 :代表在這個(gè)顯示的內(nèi)容當(dāng)中,向下搜尋『字符串』這個(gè)關(guān)鍵詞;
:f :立刻顯示出文件名以及目前顯示的行數(shù);
q :代表立刻離開(kāi) more ,不再顯示該文件內(nèi)容。
b 或 [ctrl]-b :代表往回翻頁(yè),不過(guò)這動(dòng)作只對(duì)文件有用,對(duì)管線無(wú)用。
less :一頁(yè)一頁(yè)翻動(dòng)
空格鍵 :向下翻動(dòng)一頁(yè);
[pagedown]:向下翻動(dòng)一頁(yè);
[pageup] :向上翻動(dòng)一頁(yè);
/字符串 :向下搜尋『字符串』的功能;
?字符串 :向上搜尋『字符串』的功能;
n :重復(fù)前一個(gè)搜尋 (與 / 或 ? 有關(guān)!)
N :反向的重復(fù)前一個(gè)搜尋 (與 / 或 ? 有關(guān)!)
g :前進(jìn)到這個(gè)資料的第一行去;
G :前進(jìn)到這個(gè)數(shù)據(jù)的最后一行去 (注意大小寫);
q :離開(kāi) less 這個(gè)程序;
head :取出前面幾行
-n :后面接數(shù)字,代表顯示幾行的意思
tail :取出后面幾行
-n :后面接數(shù)字,代表顯示幾行的意思
-f :表示持續(xù)偵測(cè)后面所接的檔名,要等到按下[ctrl]-c 才會(huì)結(jié)束 tail 的偵測(cè)
| 管線 :管線 (|) 的符號(hào)存在,這個(gè)管線的意思是:『前面的指令所輸出的訊息,請(qǐng)透過(guò)管線交由后續(xù)的指令繼續(xù)使用』
例如 :head -n 20 /etc/man_db.conf | tail -n 10
解釋 :head -n 20 /etc/man_db.conf 會(huì)將文件內(nèi)的 20 行取出來(lái),但不輸出到屏幕上,而是轉(zhuǎn)交給后續(xù)的 tail 指令繼續(xù)處理。 因此 tail 『不需要接檔名』,因?yàn)?tail 所需要的數(shù)據(jù)是來(lái)自于head 處理后的結(jié)果!
修改文件時(shí)間
touch [options] [-t] [-d] filename:修改文件時(shí)間或建置新檔(參考本文目錄:修改文件時(shí)間或建置新檔: touch)
-a :僅修訂 atime;
-c :僅修改文件的時(shí)間,若該文件不存在則不建立新文件;
-d :后面可以接欲修訂的日期而不用目前的日期,也可以使用 --date="日期或時(shí)間"
-m :僅修改 mtime ;
-t :后面可以接欲修訂的時(shí)間而不用目前的時(shí)間,格式為[YYYYMMDDhhmm]
文件隱藏屬性
umask [ -S ] [ # ]:文件預(yù)設(shè)權(quán)限
# :代表數(shù)字,可修改默認(rèn)文件預(yù)設(shè)權(quán)限
-S :這個(gè)選項(xiàng),就會(huì)以符號(hào)類型的方式來(lái)顯示出權(quán)限
chattr [+-=] [ASacdistu] 文件或目錄名稱 :
+ :增加某一個(gè)特殊參數(shù),其他原本存在參數(shù)則不動(dòng)。
- :移除某一個(gè)特殊參數(shù),其他原本存在參數(shù)則不動(dòng)。
= :設(shè)定一定,且僅有后面接的參數(shù)
A :當(dāng)設(shè)定了 A 這個(gè)屬性時(shí),若你有存取此文件(或目錄)時(shí),他的訪問(wèn)時(shí)間 atime 將不會(huì)被修改,可避免 I/O 較慢的機(jī)器過(guò)度的存取磁盤。(目前建議使用文件系統(tǒng)掛載參數(shù)處理這個(gè)項(xiàng)目)
S :一般文件是異步寫入磁盤的(原理請(qǐng)參考前一章 sync 的說(shuō)明),如果加上 S 這個(gè)屬性時(shí),當(dāng)你進(jìn)行任何文件的修改,該更動(dòng)會(huì)『同步』寫入磁盤中。
a :當(dāng)設(shè)定 a 之后,這個(gè)文件將只能增加數(shù)據(jù),而不能刪除也不能修改數(shù)據(jù),只有 root 才能設(shè)定這屬性
c :這個(gè)屬性設(shè)定之后,將會(huì)自動(dòng)的將此文件『壓縮』,在讀取的時(shí)候?qū)?huì)自動(dòng)解壓縮,但是在儲(chǔ)存的時(shí)候,將會(huì)先進(jìn)行壓縮后再儲(chǔ)存(看來(lái)對(duì)于大文件似乎蠻有用的!)
d :當(dāng) dump 程序被執(zhí)行的時(shí)候,設(shè)定 d 屬性將可使該文件(或目錄)不會(huì)被 dump 備份
i :這個(gè) i 可就很厲害了!他可以讓一個(gè)文件『不能被刪除、改名、設(shè)定連結(jié)也無(wú)法寫入或新增數(shù)據(jù)!』對(duì)于系統(tǒng)安全性有相當(dāng)大的幫助!只有 root 能設(shè)定此屬性
s :當(dāng)文件設(shè)定了 s 屬性時(shí),如果這個(gè)文件被刪除,他將會(huì)被完全的移除出這個(gè)硬盤空間,所以如果誤刪了,完全無(wú)法救回來(lái)了喔!
u :與 s 相反的,當(dāng)使用 u 來(lái)配置文件案時(shí),如果該文件被刪除了,則數(shù)據(jù)內(nèi)容其實(shí)還存在磁盤中,可以使用來(lái)救援該文件喔!
注意 1:屬性設(shè)定常見(jiàn)的是 a 與 i 的設(shè)定值,而且很多設(shè)定值必須要身為 root 才能設(shè)定
注意 2:xfs 文件系統(tǒng)僅支援 AadiS 而已
lsattr [-adR] :文件或目錄
-a :將隱藏文件的屬性也秀出來(lái);
-d :如果接的是目錄,僅列出目錄本身的屬性而非目錄內(nèi)的文件名;
-R :連同子目錄的數(shù)據(jù)也一并列出來(lái)!
file 文件名 :觀察文件類型
腳本文件名的搜尋
which [options] command: 尋找『執(zhí)行檔』(這個(gè)指令是根據(jù)『PATH』這個(gè)環(huán)境變量所規(guī)范的路徑,去搜尋『執(zhí)行檔』的檔名)
-a :將所有由 PATH 目錄中可以找到的指令均列出,而不止第一個(gè)被找到的指令名稱
whereis [-bmsu] 文件或目錄名:由一些特定的目錄中尋找文件文件名(whereis 主要是針對(duì) /bin /sbin 底下的執(zhí)行檔, 以及 /usr/share/man 底下的 man page 文件,)
-l :可以列出 whereis 會(huì)去查詢的幾個(gè)主要目錄而已
-b :只找 binary 格式的文件
-m :只找在說(shuō)明文件 manual 路徑下的文件
-s :只找 source 來(lái)源文件
-u :搜尋不在上述三個(gè)項(xiàng)目當(dāng)中的其他特殊文件
locate [-ir] keyword / updatedb :搜尋完整文件名,包含路徑名稱(限制:當(dāng)新建立起來(lái)的文件, 卻還在數(shù)據(jù)庫(kù)更新之前搜尋該文件,那么 locate 會(huì)告訴你『找不到!』!因?yàn)楸仨氁聰?shù)據(jù)庫(kù)!更新 locate 數(shù)據(jù)庫(kù)的方法非常簡(jiǎn)單,直接輸入『 updatedb 』)
-i :忽略大小寫的差異;
-c :不輸出檔名,僅計(jì)算找到的文件數(shù)量
-l :僅輸出幾行的意思,例如輸出五行則是 -l 5
-S :輸出 locate 所使用的數(shù)據(jù)庫(kù)文件的相關(guān)信息,包括該數(shù)據(jù)庫(kù)紀(jì)錄的文件/目錄數(shù)量等
-r :后面可接正規(guī)表示法的顯示方式
find [PATH] [option] [action] :
1. 與時(shí)間有關(guān)的選項(xiàng):共有 -atime, -ctime 與 -mtime ,以 -mtime 說(shuō)明
-mtime n :n 為數(shù)字,意義為在 n 天之前的『一天之內(nèi)』被更動(dòng)過(guò)內(nèi)容的文件;
-mtime +n :列出在 n 天之前(不含 n 天本身)被更動(dòng)過(guò)內(nèi)容的文件檔名;
-mtime -n :列出在 n 天之內(nèi)(含 n 天本身)被更動(dòng)過(guò)內(nèi)容的文件檔名。
-newer file :file 為一個(gè)存在的文件,列出比 file 還要新的文件檔名
2. 與使用者或組名有關(guān)的參數(shù):
-uid n :n 為數(shù)字,這個(gè)數(shù)字是用戶的賬號(hào) ID,亦即 UID ,這個(gè) UID 是記錄在
/etc/passwd 里面與賬號(hào)名稱對(duì)應(yīng)的數(shù)字。這方面我們會(huì)在第四篇介紹。
-gid n :n 為數(shù)字,這個(gè)數(shù)字是組名的 ID,亦即 GID,這個(gè) GID 記錄在
/etc/group,相關(guān)的介紹我們會(huì)第四篇說(shuō)明~
-user name :name 為使用者賬號(hào)名稱喔!例如 dmtsai
-group name:name 為組名喔,例如 users ;
-nouser :尋找文件的擁有者不存在 /etc/passwd 的人!
-nogroup :尋找文件的擁有群組不存在于 /etc/group 的文件!當(dāng)你自行安裝軟件時(shí),很可能該軟件的屬性當(dāng)中并沒(méi)有文件擁有者,這是可能的!在這個(gè)時(shí)候,就可以使用 -nouser 與 -nogroup 搜尋。
3. 與文件權(quán)限及名稱有關(guān)的參數(shù):
-name filename:搜尋文件名為 filename 的文件;
-size [+-]SIZE:搜尋比 SIZE 還要大(+)或小(-)的文件。這個(gè) SIZE 的規(guī)格有:
c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB還要大的文件,就是『 -size +50k 』
-type TYPE :搜尋文件的類型為 TYPE 的,類型主要有:一般正規(guī)文件 (f), 裝置文件 (b, c),目錄 (d), 連結(jié)檔 (l), socket (s), 及 FIFO (p) 等屬性。
-perm mode :搜尋文件權(quán)限『剛好等于』 mode 的文件,這個(gè) mode 為類似 chmod的屬性值,舉例來(lái)說(shuō), -rwsr-xr-x 的屬性為 4755 !
-perm -mode :搜尋文件權(quán)限『必須要全部囊括 mode 的權(quán)限』的文件,舉例來(lái)說(shuō),我們要搜尋 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744,當(dāng)一個(gè)文件的權(quán)限為 -rwsr-xr-x ,亦即 4755 時(shí),也會(huì)被列出來(lái),因?yàn)?-rwsr-xr-x 的屬性已經(jīng)囊括了 -rwxr--r-- 的屬性了。
-perm /mode :搜尋文件權(quán)限『包含任一 mode 的權(quán)限』的文件,舉例來(lái)說(shuō),我們搜尋-rwxr-xr-x ,亦即 -perm /755 時(shí),但一個(gè)文件屬性為 -rw-------也會(huì)被列出來(lái),因?yàn)樗?-rw.... 的屬性存在!
4. 額外可進(jìn)行的動(dòng)作:
-exec command :command 為其他指令,-exec 后面可再接額外的指令來(lái)處理搜尋到的結(jié)果。
-print :將結(jié)果打印到屏幕上,這個(gè)動(dòng)作是預(yù)設(shè)動(dòng)作!
例如:find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;
該范例中特殊的地方有 {} 以及 \; 還有 -exec 這個(gè)關(guān)鍵詞,這些東西的意義為:
1、{} 代表的是『由 find 找到的內(nèi)容』,如上圖所示,find 的結(jié)果會(huì)被放置到 {} 位置中;
2、 -exec 一直到 \; 是關(guān)鍵詞,代表 find 額外動(dòng)作的開(kāi)始 (-exec) 到結(jié)束 (\;) ,在這中間的就是 find 指令內(nèi)的額外動(dòng)作。 在本例中就是『 ls -l {} 』!
3、因?yàn)椤?; 』在 bash 環(huán)境下是有特殊意義的,因此利用反斜杠來(lái)跳脫。
關(guān)于執(zhí)行文件路徑的變量: $PATH
我們知道查閱文件屬性的指令 ls 完整文件名為:/bin/ls(這是絕對(duì)路徑),那你會(huì)不會(huì)覺(jué)得很奇怪:『為什么我可以在任何地方執(zhí)行/bin/ls 這個(gè)指令呢? 』 為什么我在任何目錄下輸入 ls 就一定可以顯示出一些訊息而不會(huì)說(shuō)找不到該 /bin/ls 指令呢? 這是因?yàn)榄h(huán)境變量PATH 的幫助所致呀!
當(dāng)我們?cè)趫?zhí)行一個(gè)指令的時(shí)候,舉例來(lái)說(shuō)『ls』好了,系統(tǒng)會(huì)依照 PATH 的設(shè)定去每個(gè) PATH 定義的目錄下搜尋文件名為 ls 的可執(zhí)行文件,如果在 PATH 定義的目錄中含有多個(gè)文件名為 ls 的可執(zhí)行文件,那么先搜尋到的同名指令先被執(zhí)行!
修改文件時(shí)間或建置新檔: touch
每個(gè)文件在 linux 底下都會(huì)記錄許多的時(shí)間參數(shù), 其實(shí)是有三個(gè)主要的變動(dòng)時(shí)間:
1、modification time (mtime):
當(dāng)該文件的『內(nèi)容數(shù)據(jù)』變更時(shí),就會(huì)更新這個(gè)時(shí)間!內(nèi)容數(shù)據(jù)指的是文件的內(nèi)容,而不是文件的屬性或權(quán)限喔!
2、status time (ctime):
當(dāng)該文件的『狀態(tài) (status)』改變時(shí),就會(huì)更新這個(gè)時(shí)間,舉例來(lái)說(shuō),像是權(quán)限與屬性被更改了,都會(huì)更新這個(gè)時(shí)間啊。
3、access time (atime):
當(dāng)『該文件的內(nèi)容被取用』時(shí),就會(huì)更新這個(gè)讀取時(shí)間 (access)。舉例來(lái)說(shuō),我們使用 cat 去讀取/etc/man_db.conf , 就會(huì)更新該文件的 atime 了。
touch 這個(gè)指令最常被使用的情況是:
1、建立一個(gè)空的文件;
2、 將某個(gè)文件日期修訂為目前 (mtime 與 atime)
文件預(yù)設(shè)權(quán)限:umask
umask 就是指定 『目前用戶在建立文件或目錄時(shí)候的權(quán)限默認(rèn)值』
[root@study ~]# umask
0022 <==與一般權(quán)限有關(guān)的是后面三個(gè)數(shù)字!
[root@study ~]# umask -S
u=rwx,g=rx,o=rx
查閱的方式有兩種,一種可以直接輸入 umask ,就可以看到數(shù)字型態(tài)的權(quán)限設(shè)定分?jǐn)?shù), 一種則是加入 -S (Symbolic) 這個(gè)選項(xiàng),就會(huì)以符號(hào)類型的方式來(lái)顯示出權(quán)限了!
在默認(rèn)權(quán)限的屬性上,目錄與文件是不一樣的。x 權(quán)限對(duì)于目錄是非常重要的!但是一般文件的建立則不應(yīng)該有執(zhí)行的權(quán)限,因?yàn)橐话阄募ǔJ怯迷谟跀?shù)據(jù)的記錄嘛!當(dāng)然不需要執(zhí)行的權(quán)限了。 因此,預(yù)設(shè)的情況如下:
若使用者建立為『文件』則預(yù)設(shè)『沒(méi)有可執(zhí)行( x )權(quán)限』,亦即只有 rw 這兩個(gè)項(xiàng)目,也就是最大為 666 分,預(yù)設(shè)權(quán)限如下:
-rw-rw-rw-
若用戶建立為『目錄』,則由于 x 與是否可以進(jìn)入此目錄有關(guān),因此默認(rèn)為所有權(quán)限均開(kāi)放,亦即為 777 分,預(yù)設(shè)權(quán)限如下:
drwxrwxrwx
要注意的是,umask 的分?jǐn)?shù)指的是『該默認(rèn)值需要減掉的權(quán)限!』因?yàn)?r、w、x 分別是 4、2、1 分,所以啰!也就是說(shuō),當(dāng)要拿掉能寫的權(quán)限,就是輸入 2 分,而如果要拿掉能讀的權(quán)限,也就是 4 分,那么要拿掉讀與寫的權(quán)限,也就是 6 分,而要拿掉執(zhí)行與寫入的權(quán)限,也就是 3 分。
如果以上面的例子來(lái)說(shuō)明的話,因?yàn)?umask 為 022 ,所以 user 并沒(méi)有被拿掉任何權(quán)限,不過(guò) group 與 others 的權(quán)限被拿掉了 2 (也就是 w 這個(gè)權(quán)限),那么當(dāng)使用者:
1、建立文件時(shí):(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
2、建立目錄時(shí):(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
文件隱藏屬性
1、chattr (配置文件案隱藏屬性)
2、lsattr (顯示文件隱藏屬性)
文件特殊權(quán)限: SUID, SGID, SBIT

SUID
當(dāng) s 這個(gè)標(biāo)志出現(xiàn)在文件擁有者的 x 權(quán)限上時(shí),例如剛剛提到的 /usr/bin/passwd 這個(gè)文件的權(quán)限狀態(tài):『-rwsr-xr-x』,此時(shí)就被稱為 Set UID,簡(jiǎn)稱為 SUID 的特殊權(quán)限。 那么 SUID 的權(quán)限對(duì)于一個(gè)文件的特殊功能是什么呢?基本上 SUID 有這樣的限制與功能:
1、 SUID 權(quán)限僅對(duì)二進(jìn)制程序(binary program)有效;
2、 執(zhí)行者對(duì)于該程序需要具有 x 的可執(zhí)行權(quán)限;
3、 本權(quán)限僅在執(zhí)行該程序的過(guò)程中有效 (run-time);
4、 執(zhí)行者將具有該程序擁有者 (owner) 的權(quán)限。
例子來(lái)說(shuō)明。我們的 Linux系統(tǒng)中,所有賬號(hào)的密碼都記錄在 /etc/shadow 這個(gè)文件里面,這個(gè)文件的權(quán)限為:『---------- 1 root root』,意思是這個(gè)文件僅有 root 可讀且僅有 root 可以強(qiáng)制寫入而已。 既然這個(gè)文件僅有 root 可以修改,那么 dmtsai 這個(gè)一般賬號(hào)使用者能否自行修改自己的密碼呢? 你可以使用你自己的賬號(hào)輸入『passwd』這個(gè)指令來(lái)看看。一般用戶當(dāng)然可以修改自己的密碼了!
明明 /etc/shadow 就不能讓 dmtsai 這個(gè)一般賬戶去存取的,為什么 dmtsai 還能夠修改這個(gè)文件內(nèi)的密碼呢? 這就是 SUID 的功能啦!藉由上述的功能說(shuō)明,我們可以知道
- dmtsai 對(duì)于 /usr/bin/passwd 這個(gè)程序來(lái)說(shuō)是具有 x 權(quán)限的,表示 dmtsai 能執(zhí)行 passwd;
- passwd 的擁有者是 root 這個(gè)賬號(hào);
- dmtsai 執(zhí)行 passwd 的過(guò)程中,會(huì)『暫時(shí)』獲得 root 的權(quán)限;
- /etc/shadow 就可以被 dmtsai 所執(zhí)行的 passwd 所修改
但如果 dmtsai 使用 cat 去讀取 /etc/shadow 時(shí),他能夠讀取嗎?因?yàn)?cat 不具有 SUID 的權(quán)限,所以 dmtsai 執(zhí)行 『cat /etc/shadow』 時(shí),是不能讀取 /etc/shadow 的。我們用一張示意圖來(lái)說(shuō)明如下:

SGID
當(dāng) s 標(biāo)志在文件擁有者的 x 項(xiàng)目為 SUID,那 s 在群組的 x 時(shí)則稱為 Set GID, SGID。 舉例來(lái)說(shuō),你可以用底下的指令來(lái)觀察到具有 SGID 權(quán)限的文件喔:
與 SUID 不同的是,SGID 可以針對(duì)文件或目錄來(lái)設(shè)定!如果是對(duì)文件來(lái)說(shuō), SGID 有如下的功能:
1、 SGID 對(duì)二進(jìn)制程序有用;
2、 程序執(zhí)行者對(duì)于該程序來(lái)說(shuō),需具備 x 的權(quán)限;
3、 執(zhí)行者在執(zhí)行的過(guò)程中將會(huì)獲得該程序群組的支持!
舉例來(lái)說(shuō),上面的 /usr/bin/locate 這個(gè)程序可以去搜尋 /var/lib/mlocate/mlocate.db 這個(gè)文件的內(nèi)容(詳細(xì)說(shuō)明會(huì)在下節(jié)講述), mlocate.db 的權(quán)限如下:

除了 binary program 之外,事實(shí)上 SGID 也能夠用在目錄上,這也是非常常見(jiàn)的一種用途! 當(dāng)一個(gè)目錄設(shè)定了 SGID 的權(quán)限后,他將具有如下的功能:
1、 用戶若對(duì)于此目錄具有 r 與 x 的權(quán)限時(shí),該用戶能夠進(jìn)入此目錄;
2、 用戶在此目錄下的有效群組(effective group)將會(huì)變成該目錄的群組;
3、 用途:若用戶在此目錄下具有 w 的權(quán)限(可以新建文件),則使用者所建立的新文件,該新文件的群組與此目錄的群組相同。
SBIT
當(dāng) t 這個(gè)標(biāo)志出現(xiàn)在文件擁有者的 x 權(quán)限上時(shí),則稱為SBIT。這個(gè) SBIT 目前只針對(duì)目錄有效,對(duì)于文件已經(jīng)沒(méi)有效果了。SBIT 對(duì)于目錄的作用是:
1、 當(dāng)用戶對(duì)于此目錄具有 w, x 權(quán)限,亦即具有寫入的權(quán)限時(shí);
2、 當(dāng)用戶在該目錄下建立文件或目錄時(shí),僅有自己與 root才有權(quán)力刪除該文件
換句話說(shuō):當(dāng)甲這個(gè)用戶于 A 目錄是具有群組或其他人的身份,并且擁有該目錄 w 的權(quán)限, 這表示『甲用戶對(duì)該目錄內(nèi)任何人建立的目錄或文件均可進(jìn)行 "刪除/更名/搬移" 等動(dòng)作?!?不過(guò),如果將 A 目錄加上了 SBIT 的權(quán)限項(xiàng)目時(shí),則甲只能夠針對(duì)自己建立的文件或目錄進(jìn)行刪除/更名/移動(dòng)等動(dòng)作,而無(wú)法刪除他人的文件
SUID/SGID/SBIT 權(quán)限設(shè)定
現(xiàn)在你應(yīng)該已經(jīng)知道數(shù)字型態(tài)更改權(quán)限的方式為『三個(gè)數(shù)字』的組合, 那么如果在這三個(gè)數(shù)字之前再加上一個(gè)數(shù)字的話,最前面的那個(gè)數(shù)字就代表這幾個(gè)權(quán)限了!
1、 4 為 SUID
2、 2 為 SGID
3、 1 為 SBIT
假設(shè)要將一個(gè)文件權(quán)限改為『-rwsr-xr-x』時(shí),由于 s 在用戶權(quán)力中,所以是 SUID ,因此, 在原
先的 755 之前還要加上 4 ,也就是:『 chmod 4755 filename 』來(lái)設(shè)定!此外,還有大 S 與大 T 的
產(chǎn)生喔!參考底下的范例啦!


最后一個(gè)例子就要特別小心啦!怎么會(huì)出現(xiàn)大寫的 S 與 T 呢?不都是小寫的嗎? 因?yàn)?s 與 t 都是取代 x 這個(gè)權(quán)限的,但是你有沒(méi)有發(fā)現(xiàn)阿,我們是下達(dá) 7666 喔!也就是說(shuō), user, group 以及others 都沒(méi)有 x 這個(gè)可執(zhí)行的標(biāo)志( 因?yàn)?666 嘛 ),所以,這個(gè) S, T 代表的就是『空的』! SUID 是表示『該文件在執(zhí)行的時(shí)候,具有文件擁有者的權(quán)限』,但是文件 擁有者都無(wú)法執(zhí)行了,哪里來(lái)的權(quán)限給其他人使用?當(dāng)然就是空的! 而除了數(shù)字法之外,你也可以透過(guò)符號(hào)法來(lái)處理!其中 SUID 為 u+s ,而 SGID 為 g+s ,SBIT則是 o+t 啰!來(lái)看看如下的范例:

總結(jié)
0、絕對(duì)路徑:『一定由根目錄 / 寫起』;相對(duì)路徑:『不由 / 寫起,而是由相對(duì)當(dāng)前目錄寫起』
1、特殊目錄有:., .., -, ~, ~account 需要注意;
2、與目錄相關(guān)的指令有:cd, mkdir, rmdir, pwd 等重要指令;
3、rmdir 僅能刪除空目錄,要?jiǎng)h除非空目錄需使用『 rm -r 』指令;
4、用戶能使用的指令是依據(jù) PATH 變量所規(guī)定的目錄去搜尋的;
5、ls 可以檢視文件的屬性,尤其 -d, -a, -l 等選項(xiàng)特別重要!
6、文件的復(fù)制、刪除、移動(dòng)可以分別使用:cp, rm , mv 等指令來(lái)操作;
7、檢查文件的內(nèi)容(讀文件)可使用的指令包括有:cat, tac, nl, more, less, head, tail, od 等
8、cat -n 與 nl 均可顯示行號(hào),但默認(rèn)的情況下,空白行會(huì)不會(huì)編號(hào)并不相同;
9、touch 的目的在修改文件的時(shí)間參數(shù),但亦可用來(lái)建立空文件;
10、一個(gè)文件記錄的時(shí)間參數(shù)有三種,分別是 access time(atime), status time (ctime),
modification time(mtime),ls 默認(rèn)顯示的是 mtime。
11、除了傳統(tǒng)的 rwx 權(quán)限之外,在 Ext2/Ext3/Ext4/xfs 文件系統(tǒng)中,還可以使用 chattr 與 lsattr
設(shè)定及觀察隱藏屬性。 常見(jiàn)的包括只能新增數(shù)據(jù)的 +a 與完全不能更動(dòng)文件的 +i 屬性。
12、新建文件/目錄時(shí),新文件的預(yù)設(shè)權(quán)限使用 umask 來(lái)規(guī)范。默認(rèn)目錄完全權(quán)限為 drwxrwxrwx, 文件則為-rw-rw-rw-。
13、文件具有 SUID 的特殊權(quán)限時(shí),代表當(dāng)用戶執(zhí)行此一 binary 程序時(shí),在執(zhí)行過(guò)程中用戶會(huì)暫時(shí)具有程序擁有者的權(quán)限
14、目錄具有 SGID 的特殊權(quán)限時(shí),代表用戶在這個(gè)目錄底下新建的文件之群組都會(huì)與該目錄
的組名相同。
15、目錄具有 SBIT 的特殊權(quán)限時(shí),代表在該目錄下用戶建立的文件只有自己與 root 能夠刪除!
16、觀察文件的類型可以使用 file 指令來(lái)觀察;
17、搜尋指令的完整文件名可用 which 或 type ,這兩個(gè)指令都是透過(guò) PATH 變量來(lái)搜尋文件名;
18、搜尋文件的完整檔名可以使用 whereis 找特定目錄或 locate 到數(shù)據(jù)庫(kù)去搜尋,而不實(shí)際搜尋文件系統(tǒng);
19、利用 find 可以加入許多選項(xiàng)來(lái)直接查詢文件系統(tǒng),以獲得自己想要知道的檔名