天天看點

Linux學習之CentOS(十八)--與Linux檔案和目錄管理相關的一些重要指令②

一、修改檔案時間與建立新檔案

在上一篇随筆介紹ls指令時,就有提到每個檔案在Linux下面都會記錄3個主要的修改時間:

modification time (mtime): 當該檔案的 内容資料 變更時,就會更新這個時間!内容資料指的是檔案的内容,而不是檔案的屬性或權限!

status time (ctime): 當該檔案的 狀态 (status) 改變時,就會更新這個時間,例如如果像是權限與屬性被更改了,都會更新這個時間啊。

access time (atime): 當 該檔案的内容被修改 時,就會更新這個讀取時間 (access)。舉例來說,我們使用 cat 去讀取 /etc/passwd, 就會更新該檔案的 atime。

在預設情況下,ls顯示的是該檔案的 mtime ,也就是這個檔案的内容上次更改的時間。

在Linux系統中,檔案的時間非常的重要,因為如果誤判檔案時間,可能就會造成某些程式無法順利運作。但是,萬一我們發現一個檔案的時間不對頭,例如時間變成了未來的某個時間(這種現象在我們安裝Linux系統時會出現這個情況),此時我們如何将該檔案的時間變成"現在"的正常時間呢?這裡就要用到本篇随筆要介紹的第一個指令了——touch指令。

1. touch 指令  (修改檔案時間與建立新檔案)

接下來我們通過一些執行個體來看一下touch指令的這幾個參數的使用方法:

通過touch這個指令,我們就可以輕松的改變檔案的日期和時間,并且會建立一個空檔案。

【注意】:當我們複制一個檔案,并且複制了檔案的所有屬性,也沒有辦法改變該檔案的ctime屬性。ctime可以記錄檔案最近改變狀态的時間。不過我們平常看到的檔案屬性中,我們最常關心的還是該檔案的mtime,即該檔案最近被修改的時間。

touch指令最常用的情況:

建立一個空的檔案;

将某個檔案日期修改為目前 (mtime 與 atime)

二、檔案與目錄的預設權限與隐藏權限

1.umask (檔案預設權限)

在之前的随筆當中我們已經學習了如何建立或者是改變一個目錄或檔案的屬性了。但是,我們是否有考慮過這樣一個問題,當建立一個新的檔案或者目錄時,它的預設權限是什麼?

這就要跟現在所講解的umask指令扯上關系了。通常,umask就是指定 "目前使用者在建立檔案或目錄時候的權限預設值".那麼我們如何設定umask呢?首先我們來檢視一下我們系統裡預設的umask是什麼樣的

檢視方式有兩種,一種可以直接輸入 umask ,就可以看到數字型态的權限配置分數, 一種則是加入 -S (Symbolic) 這個選項,就會以符号類型的方式來顯示出權限了! 這裡顯示的 umask 有四組數字, 第一組是特殊權限用的,我們先不要理他,先看後面三組數字。

在預設權限的屬性上,目錄與檔案是不一樣的。由于我們不希望檔案具有可執行的權限,預設情況下,檔案是沒有可執行(x)權限的。是以:

若使用者建立為 檔案 則預設【沒有可運作( x )權限】,亦即隻有 rw 這兩個權限,也就是最大為 666 分,預設權限如下: -rw-rw-rw-

若使用者建立為 目錄 ,則由于 x 與是否可以進入此目錄有關,是以預設為所有權限均開放,亦即為 777 分,預設權限如下: drwxrwxrwx

umask 指定的是【該預設值需要減掉的權限!】因為 r、w、x 分别是 4、2、1 ,也就是說,當要拿掉能寫的權限,就是輸入 2 分,而如果要拿掉能讀的權限,也就是 4 分,那麼要拿掉讀與寫的權限,也就是 6 分,而要拿掉執行與寫入的權限,也就是 3 分,如果我拿掉5 分的話,那就是拿掉讀與執行的權限啦!如果以上面的例子來說明的話,因為 umask 為 022 ,是以 user 并沒有被拿掉屬性,不過 group 與 others 的屬性被拿掉了 2 ( 也就是 w 這個屬性 ),那麼由于當使用者:

建立檔案時:(-rw-rw-rw-) – (-----w--w-) ==> -rw-r--r--

建立目錄時:(drwxrwxrwx) – (d----w--w-) ==> drwxr-xr-x

我們可以通過執行個體來看一下:

是以,umask與檔案和目錄的預設權限是有很大關系的。如果我們希望編寫的檔案具有的權限是 -rw-rw-r-- 權限,則此時應該将umask改成 002 才對。例如如下例子:

在預設的情況中, root 的 umask 會拿掉比較多的屬性,root 的 umask 預設是 022 , 這是基于安全的考量。至于一般身份使用者,通常他們的 umask 為 002 ,亦即保留同群組的寫入權力! 關于預設 umask 的配置可以參考 /etc/bashrc 這個檔案的内容,不過,不建議修改該檔案。

二、檔案隐藏屬性

我們通過 ls -l 指令來檢視檔案的資訊時,一般列出來的檔案屬性隻有9個,但是檔案是有隐藏屬性的,隐藏屬性對系統有很大的幫助,尤其是系統安全性方面,非常的重要。

1.chattr (設定檔案隐藏屬性)

這個指令是很重要的,尤其是在系統的資料安全上面!由於這些屬性是隐藏的性質,是以需要以 lsattr 指令 才能看到該屬性!其中,最重要的當屬 +i 與 +a 這個屬性了。+i 可以讓一個檔案無法被更改,對于需要強烈的系統安全的人來說, 這兩個屬性是最重要的!

2. lsattr (顯示檔案的隐藏屬性)

使用chattr設定了檔案的隐藏屬性後,我們可以通過lsattr這個指令來檢視該檔案的隐藏屬性。

三、檔案特殊權限:  SUID/SGID/Sticky Bit

在之前一直提到的檔案的重要權限時,就是rwx這三個讀、寫、執行的權限。但是,我們可以看一下/tmp 以及 /usr/bin/passwd 的權限:

在這裡我們可以看到,在/tmp的權限中多出了一個t權限,/usr/bin/passwd 的權限裡多了一個s權限,這是什麼原因呢?這就是跟馬上要講解的 SUID/SGID/Sticky Bit 扯上關系了。

1.SUID (Set UID)

會建立出 s 與 t 的權限,是為了讓一般使用者在執行某些程式的時候, 能夠暫時的具有該程式擁有者的權限。 舉例來說,我們知道賬号與密碼的存放檔案其實是 /etc/passwd 與 /etc/shadow 。 而 /etc/shadow 這個檔案的權限是什麼呢?

是『----------』。且他的擁有者是 root !在這個權限中,僅有 root 可以強制儲存,其他人是連看都沒有辦法看!

但是偏偏我們使用 xiaoluo 這個一般身份使用者去更新自己的密碼時,使用的就是 /usr/bin/passwd 這個程式, 卻是可以更新自己的密碼的,也就是說, xiaoluo 這個一般身份使用者可以存取 /etc/shadow 這個密碼檔案!  但是我們也可以看到,明明 /etc/shadow 就是沒有 xiaoluo 可以存取的權限!是以這就是 s 這個權限的用處了! 當 s 這個權限在 user 的 x 時,也就是類似上表的 -r-s--x--x ,稱為 Set UID ,簡稱為 SUID , 這個 UID 代表的是 User 的 ID ,而 User 代表的則是這個程式 (/usr/bin/passwd) 的擁有者 (當然就是root了 !)。 那麼由上面的定義中,我們知道了,當 xiaoluo 這個使用者執行 /usr/bin/passwd 時,他就會 暫時 的得到檔案擁有人 root 的權限。

SUID 僅可用在【二進制制檔案(binary file)】上, SUID 因為是程式在執行的過程中擁有檔案擁有者的權限,是以,他僅可用于 binary file , 不能夠用在批處理檔案 (shell script) 上面的!這是因為 shell script 隻是将很多的 binary 執行檔叫進來執行而已!是以 SUID 的權限部分,還是得要看 shell script 呼叫進來的程式的設定, 而不是 shell script 本身。當然,SUID 對于目錄也是無效的,這點要特别留意。是以總結一點:SUID是隻能作用在檔案上的,不能作用在目錄上。

2.SGID (Set GID)

進一步來說,如果 s 的權限是在 group 時,那麼就是 Set GID ,簡稱為 SGID。SGID可以用在兩個方面上:

檔案:如果 SGID 是設定在 binary file 上面,則不論使用者是誰,在執行該程式的時候, 他的有效群組 (effective group) 将會變成該程式的群組所有人 (group id)。

目錄:如果 SGID 是設定在 A 目錄上面,則在該 A 目錄内所建立的檔案或目錄的 group ,将會是 此 A 目錄的 group !

一般來說,SGID多用在特定的多人團隊的項目開發商,在系統中用得較少。

3.Sticky Bit

Sticky Bit 目前隻針對目錄有效,對于檔案已經沒有效果了。 SBit 對于目錄的作用是:【在具有 SBit 的目錄下,使用者若在該目錄下具有 w 及 x 的權限, 則當使用者在該目錄下建立檔案或目錄時,隻有檔案擁有者與 root 才有權力删除】。換句話說:當甲這個使用者于 A 目錄下是擁有 group 或者是 other 的項目,并且擁有 w 的權限, 這表示【甲使用者對該目錄内任何人建立的目錄或檔案均可進行 "删除/更名/移動" 等動作。】 不過,如果将 A 目錄加上了 Sticky bit 的權限項目時, 則甲隻能夠針對自己建立的檔案或目錄進行删除/更名/移動等動作。

舉例來說,我們的 /tmp 本身的權限是『drwxrwxrwt』, 在這樣的權限内容下,任何人都可以在 /tmp 内新增、修改檔案,但僅有該檔案/目錄建立者與 root 能夠删除自己的目錄或檔案。這個特性非常重要!

4. SUID/SGID/SBIT 權限設定

上面介紹了SUID與SGID的功能,那麼,如何打開檔案使其成為具有SUID與SGID的權限呢?這就需要使用數字的那種方式來更改權限了。我們修改檔案的rwx屬性用的是3個數字,是以如果我們需要使檔案具有SUID或者SGID的權限,這時就要用到4組數字,即在rwx的3組數字前面加上一個數字就行了。

4 為 SUID

2 為 SGID

1 為 Sticky bit

 假設我們要将一個檔案屬性改為 "-rwsr-xr-x",由于s在使用者權限中,是以是SUID,是以,我們修改該檔案的權限指令應該要寫成 【chmod 4755 filename】。我們通過一些執行個體來看一下:(注意:【SUID不是用在目錄上,SBIT不是用在檔案上】)

4.檔案類型 file

如果我們想知道某個檔案的基本資訊,例如,是屬于 ASCII 或者是 data 檔案,或者是 binary , 且其中有沒有使用到動态函式庫 (share library) 等等的資訊,就可以利用 file 這個指令來檢視!

通過這個指令,我們就能先簡單判定檔案的格式了。

三、搜尋檔案

搜尋檔案功能是每個作業系統所必須具備的一個功能,因為我們通常需要知道某個檔案放在哪裡。在Linux系統中,也有相當優秀的搜尋系統,最熟悉的應該就是 find 指令了,但是通常情況下find并不怎麼常用,因為其速度非常緩慢,耗費硬碟空間。通常我們先使用 whereis 或者是 locate 指令先來搜尋,如果真的找不到了,才以find來進行搜尋。因為whereis和locate 指令是使用資料庫來搜尋資料,而且并沒有實際搜尋硬碟,是以速度相當的快,比較省時。

1.which (尋找"執行檔案")

這個指令是根據【PATH】這個環境變量所規範的路徑,去搜尋【執行檔案】的檔案名。是以,重點是找出【執行檔案】而已!且 which 後面接的是要是 完整的檔案名字 !若加上 -a 參數,則可以列出所有的可以找到的同名執行檔案,而非僅顯示第一個而已!

2.whereis (尋找特定檔案)

等一下我們會介紹 find 這個搜尋指令, find 是很強大的搜尋指令,但時間花用的很大! (因為 find 是直接搜尋硬碟,會花費比較多的時間)這個時候 whereis 就相當的好用了!另外, whereis 可以加入參數來找尋相關的資料, 例如如果你是要找可執行檔案 ( binary ) 那麼加上 -b 就可以了!例如上面的執行個體如果不加任何參數的話,那麼就将所有的passwd資料列出來!

為什麼 whereis 指令能搜尋的這麼快呢?這是因為 Linux 系統會将系統内的所有檔案都記錄在一個資料庫檔案裡面, 而當使用 whereis 或者是 locate 時,都會以此資料庫檔案的内容為準, 是以,有的時後你還會發現使用這兩個執行檔案時,會找到已經被删掉的檔案,  而且也找不到最新的剛剛建立的檔案! 這就是因為這兩個指令是由資料庫當中的結果去搜尋檔案。

3.locate (尋找特定檔案)

locate的使用比whereis更簡單,直接在後面輸入 "檔案的部分名稱" 後,就能得到結果了。例如我們這個例子輸入的是 locate passwd,那麼,在完整的檔案名(包含路徑名稱)中,隻要其中有passwd,就會被搜尋顯示出來。如果忘記了某個檔案的完整檔案名時,這是以惡很友善好用的指令。

locate來搜尋檔案也非常的快,這是因為locate與whereis指令一樣都是從資料庫中去搜尋檔案,是以比find指令直接去硬碟裡搜尋速度要快的多。

4.find

我們現在知道 atime, ctime 不 mtime 的意義,如果你想要找出一天内被更改過的癿檔案名, 可以使用上述執行個體一的作法。但如果我想要找出 (4 天内被更改過的檔案名)呢?那

可以使用【find /var -mtime -4 】。那如果是【4 天前的那一天】就用【 find /var -mtime 4 】。有沒有加上【+, -】差别非常的大!我們可以用簡單的圖來表示一下:

Linux學習之CentOS(十八)--與Linux檔案和目錄管理相關的一些重要指令②

圖中最右邊為目前的時間,越往左邊則代表越早之前的時間軸。由圖 我們可以清楚的知道:

+4 代表大于等于 5 天前的檔案名:ex> find /var -mtime +4

-4 代表小于等于 4 天内的檔案名:ex> find /var -mtime -4

 4 則是代表 4-5 那一天的檔案名名:ex> find /var -mtime 4

如果要查找一個檔案,使用find指令是一個很不錯的選擇, 它可以根據不同的參數來給予檔案的搜尋功能!例如你要尋找一個檔案名為 httpd.conf 的檔案,你知道它應該是在 /etc 底下,那麼就可以使用『 find /etc -name httpd.conf 』! 那如果你記得有一個檔案名包含了 httpd ,但是不知道全名怎辦?!那就用通配符 *  吧,如上以:【 find /etc -name '*httpd*' 】就可将檔案名含有 httpd 的檔案都列出來!不過,由于 find 在尋找資料的時後相當的耗硬碟!是以一般我們首先通過whereis 或者 locate指令來進行搜尋。

大概花了2個多小時的時間來整理這篇随筆,至此,與Linux檔案和目錄管理相關的一些常用的重要指令的2篇随筆就此完成了。

在後續的學習中,将繼續記錄自己學習Linux的點點滴滴!!!!!!!!!

本文轉自sandshell部落格51CTO部落格,原文連結http://blog.51cto.com/sandshell/1947761如需轉載請自行聯系原作者

sandshell