第七章 Linux文件與目錄管理

  1. 目錄與路徑
      1.1 相對路徑與絕對路徑
      1.2 目錄的相關操做: cd, pwd, mkdir, rmdir
      1.3 關於運行檔路徑的變量: $PATH
  2. 文件與目錄管理
      2.1 文件與目錄的檢視: ls
      2.2 複製、刪除與移動: cp, rm, mv
      2.3 取得路徑的文件名稱與目錄名稱
  3. 文件內容查閱:
      3.1 直接檢視文件內容: cat, tac, nl
      3.2 可翻頁檢視: more, less
      3.3 數據擷取: head, tail
      3.4 非純文字檔: od
      3.5 修改文件時間與建置新檔: touch
  4. 文件與目錄的默認權限與隱藏權限
      4.1 文件默認權限:umask
      4.2 文件隱藏屬性: chattr, lsattr
      4.4 文件特殊權限:SUID, SGID, SBIT, 權限配置
      4.3 觀察文件類型:file
  5. 命令與文件的搜尋:
      5.1 命令檔名的搜尋:which
      5.2 文件檔名的搜尋:whereis, locate, find
  6. 極重要!權限與命令間的關係:
  7. 重點回顧
  8. 本章習題
  9. 參考數據與延伸閱讀
  10. 針對本文的建議:http://phorum.vbird.org/viewtopic.php?t=23879

1,目錄與路徑

1.1 相對路徑與絕對路徑
1.2 目錄的相關操做: cd, pwd, mkdir, rmdir
1.3 關於運行檔路徑的變量: $PATHphp

相對路徑與絕對路徑
。。。
目錄的相關操做
cd(change directory):變換目錄
.           表明此層目錄
..          表明上層目錄
-           表明前一個工做目錄
~           表明當前用戶身份所在的家目錄
~account            表明account這個用戶的家目錄
pwd(print working directory):顯示當前目錄
pwd [-P]
-P:顯示出確實的路徑,而非使用連接(link)路徑
mkdir(make directory):創建新目錄
-m XXX:配置文件案的權限,直接設定,不準要看預設權限(umask)的臉色
注:若是沒有加上-m來強制設定屬性,系統會使用默認屬性
-p:幫助你直接將所需的目錄(包含上層目錄)遞歸的創建起來,如 mkdir test1/test2/test3將出錯,而mkdir -p test1/test2/test3將遞歸的建立這兩個目錄,而且若是test2原本就存在,系統也不會報錯
注:命令 mkdir -p -m 744 test3/test4 只會將test4的權限設爲744,而test3的權限將由系統默認屬性決定
rmdir:刪除一個空目錄
-p:連同上層[空的]目錄一塊兒刪除
注:目錄須要一層一層的刪除,並且被刪除的目錄裏面一定不能存在其餘的目錄或檔案。
注:命令rmdir -p test1/test2/test3 ,若是三個目錄都是空的,則能夠所有刪除,如果其中有一個文件夾內有文件,則只能刪除到該文件夾,如test1中由其餘文件,以下
hong@PC:/tmp$ mkdir -p test1/test2/test3
hong@PC:/tmp$ cd test1
hong@PC:/tmp/test1$ touch file1
hong@PC:/tmp/test1$ cd ..
hong@PC:/tmp$ rmdir -p test1/test2/test3/
rmdir: failed to remove directory ‘test1’: Directory not empty
hong@PC:/tmp$ cd test1/
hong@PC:/tmp/test1$ ls
file1
關於執行文件路徑的變量:$PATH

當咱們在執行一個指令的時候,如ls,系統會按照PATH的設定無每一個PATH定義的目錄下
echo $PATH:查看PATH的設定
不一樣身份使用者預設的PATH不一樣,默認可以隨意執行的命令也不一樣(如root和vbird)
PATH是能夠修改的,因此通常使用者仍是能夠透過修改PATH來執行某些位於/sbin或/usr/sbin下的指令來查詢
使用絕對路徑或相對路徑直接指定某個指令的文件名來執行,會比搜尋PATH來的正確
指令應該放置到正確的目錄下,執行纔會比較方便
本目錄(.)最好不要放在PATH當中
注:對於PATH更詳細的說明

2,文件與目錄管理

2.1 文件與目錄的檢視: ls
2.2 複製、刪除與移動: cp, rm, mv
2.3 取得路徑的文件名稱與目錄名稱html

文件與目錄的檢視:ls

[root@www ~]# ls [-aAdfFhilnrRSt] 目錄名稱
[root@www ~]# ls [--color={never,auto,always}] 目錄名稱
[root@www ~]# ls [--full-time] 目錄名稱
選項與參數:
-a  :所有的文件,連同隱藏檔( 開頭爲 . 的文件) 一塊兒列出來(經常使用)
-A  :所有的文件,連同隱藏檔,但不包括 . 與 .. 這兩個目錄
-d  :僅列出目錄自己,而不是列出目錄內的文件數據(經常使用)
-f  :直接列出結果,而不進行排序 (ls 默認會以檔名排序!)
-F  :根據文件、目錄等資訊,給予附加數據結構,例如:
      *:表明可運行檔; /:表明目錄; =:表明 socket 文件; |:表明 FIFO 文件;
-h  :將文件容量以人類較易讀的方式(例如 GB, KB 等等)列出來;
-i  :列出 inode 號碼,inode 的意義下一章將會介紹;
-l  :長數據串列出,包含文件的屬性與權限等等數據;(經常使用)
-n  :列出 UID 與 GID 而非使用者與羣組的名稱 (UID與GID會在賬號管理提到!)
-r  :將排序結果反向輸出,例如:本來檔名由小到大,反向則爲由大到小;
-R  :連同子目錄內容一塊兒列出來,等於該目錄下的全部文件都會顯示出來;
-S  :以文件容量大小排序,而不是用檔名排序;
-t  :依時間排序,而不是用檔名。
--color=never  :不要依據文件特性給予顏色顯示;
--color=always :顯示顏色
--color=auto   :讓系統自行依據配置來判斷是否給予顏色
--full-time    :以完整時間模式 (包含年、月、日、時、分) 輸出
--time={atime,ctime} :輸出 access 時間或改變權限屬性時間 (ctime),而非內容變動時間 (modification time)
當你只有下達 ls 時,默認顯示的只有:非隱藏檔的檔名、 以檔名進行排序及檔名錶明的顏色顯示如此而已。
複製、刪除、移動

cp!

[root@www ~]# cp [-adfilprsu] 來源檔(source) 目標檔(destination)
[root@www ~]# cp [options] source1 source2 source3 .... directory
選項與參數:
-a  :至關於 -pdr 的意思,至於 pdr 請參考下列說明;(經常使用)
-d  :若來源檔爲連結檔的屬性(link file),則複製連結檔屬性而非文件自己;
-f  :爲強制(force)的意思,若目標文件已經存在且沒法開啓,則移除後再嘗試一次;
-i  :若目標檔(destination)已經存在時,在覆蓋時會先詢問動做的進行(經常使用)
-l  :進行硬式連結(hard link)的連結檔建立,而非複製文件自己;
-p  :連同文件的屬性一塊兒複製過去,而非使用默認屬性(備份經常使用);
-r  :遞迴持續複製,用於目錄的複製行爲;(經常使用)
-s  :複製成爲符號連結檔 (symbolic link),亦即『捷徑』文件;
-u  :若 destination 比 source 舊才升級 destination !
最後須要注意的,若是來源檔有兩個以上,則最後一個目的檔必定要是『目錄』才行!
複製(cp)這個命令是很是重要的,不一樣身份者運行這個命令會有不一樣的結果產生,尤爲是那個-a, -p的選項, 對於不一樣身份來講,差別則很是的大!

範例一:用root身份,將家目錄下的 .bashrc 複製到 /tmp 下,並改名爲 bashrc
[root@www ~]# cp ~/.bashrc /tmp/bashrc
[root@www ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? n  <==n不覆蓋,y爲覆蓋
# 重複做兩次動做,由於 /tmp 底下已經存在 bashrc 了,加上 -i 選項後,
# 則在覆蓋前會詢問使用者是否肯定!能夠按下 n 或者 y 來二次確認呢!

範例二:變換目錄到/tmp,並將/var/log/wtmp複製到/tmp且觀察屬性:
[root@www ~]# cd /tmp
[root@www tmp]# cp /var/log/wtmp . <==想要複製到目前的目錄,最後的 . 不要忘
[root@www tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-r--r-- 1 root root 96384 Sep 24 14:06 wtmp
# 注意上面的特殊字體,在不加任何選項的狀況下,文件的某些屬性/權限會改變;
# 這是個很重要的特性!要注意喔!還有,連文件建立的時間也不同了!
# 那若是你想要將文件的全部特性都一塊兒複製過來該怎辦?能夠加上 -a 喔!以下所示:
[root@www tmp]# cp -a /var/log/wtmp wtmp_2
[root@www tmp]# ls -l /var/log/wtmp wtmp_2
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 wtmp_2
# 了了吧!整個數據特性徹底如出一轍ㄟ!真是不賴~這就是 -a 的特性!

通常來講,咱們若是去複製別人的數據 (固然,該文件你必需要有 read 的權限才行啊! ^_^) 時, 老是但願複製到的數據最後是咱們本身的,因此,在默認的條件中, cp 的來源檔與目的檔的權限是不一樣的,目的檔的擁有者一般會是命令操做者自己。

由於具備這個特性,所以當咱們在進行備份的時候,某些須要特別注意的特殊權限文件, 例如密碼檔 (/etc/shadow) 以及一些配置檔,就不能直接以 cp 來複制,而必需要加上 -a 或者是 -p 等等能夠完整複製文件權限的選項才行!另外,若是你想要複製文件給其餘的使用者, 也必需要注意到文件的權限(包含讀、寫、運行以及文件擁有者等等), 不然,其餘人仍是沒法針對你給予的文件進行修訂的動做喔!注意注意!

範例三:複製 /etc/ 這個目錄下的全部內容到 /tmp 底下
[root@www tmp]# cp /etc/ /tmp
cp: omitting directory `/etc'   <== 若是是目錄則不能直接複製,要加上 -r 的選項
[root@www tmp]# cp -r /etc/ /tmp
# 仍是要再次的強調喔! -r 是能夠複製目錄,可是,文件與目錄的權限可能會被改變
# 因此,也能夠利用『 cp -a /etc /tmp 』來下達命令喔!尤爲是在備份的狀況下!

範例四:將範例一複製的 bashrc 建立一個連結檔 (symbolic link)
[root@www tmp]# ls -l bashrc
-rw-r--r-- 1 root root 176 Sep 24 14:02 bashrc  <==先觀察一下文件狀況
[root@www tmp]# cp -s bashrc bashrc_slink
[root@www tmp]# cp -l bashrc bashrc_hlink
[root@www tmp]# ls -l bashrc*
-rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc  <==與原始文件不太同樣了!
-rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc_hlink
lrwxrwxrwx 1 root root   6 Sep 24 14:20 bashrc_slink -> bashrc

範例五:若 ~/.bashrc 比 /tmp/bashrc 新才複製過來
[root@www tmp]# cp -u ~/.bashrc /tmp/bashrc
# 這個 -u 的特性,是在目標文件與來源文件有差別時,纔會複製的。
# 因此,比較常被用於『備份』的工做當中喔! ^_^

範例六:將範例四形成的 bashrc_slink 複製成爲 bashrc_slink_1 與bashrc_slink_2
[root@www tmp]# cp bashrc_slink bashrc_slink_1
[root@www tmp]# cp -d bashrc_slink bashrc_slink_2
[root@www tmp]# ls -l bashrc bashrc_slink*
-rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc
lrwxrwxrwx 1 root root   6 Sep 24 14:20 bashrc_slink -> bashrc
-rw-r--r-- 1 root root 176 Sep 24 14:32 bashrc_slink_1       <==與原始文件相同
lrwxrwxrwx 1 root root   6 Sep 24 14:33 bashrc_slink_2 
例題:
你可否使用vbird的身份,完整的複製/var/log/wtmp文件到/tmp底下,並改名爲vbird_wtmp呢?
答:
實際作看看的結果以下:

[vbird@www ~]$ cp -a /var/log/wtmp /tmp/vbird_wtmp
[vbird@www ~]$ ls -l /var/log/wtmp /tmp/vbird_wtmp
-rw-rw-r-- 1 vbird vbird 96384  9月 24 11:54 /tmp/vbird_wtmp
-rw-rw-r-- 1 root  utmp  96384  9月 24 11:54 /var/log/wtmp
由於vbird的身份並不能隨意修改文件的擁有者與羣組,所以雖然可以複製wtmp的相關權限與時間等屬性, 可是與擁有者、羣組相關的,本來vbird身份沒法進行的動做,即便加上 -a 選項,也是沒法達成完整複製權限的-> bashrc <==是連結檔!
# 這個例子也是頗有趣喔!本來複制的是連結檔,可是卻將連結檔的實際文件複製過來了
# 也就是說,若是沒有加上任何選項時,cp複製的是原始文件,而非連結檔的屬性!
# 若要複製連結檔的屬性,就得要使用 -d 的選項了!如 bashrc_slink_2 所示。
範例七:將家目錄的 .bashrc 及 .bash_history 複製到 /tmp 底下
[root@www tmp]# cp ~/.bashrc ~/.bash_history /tmp
# 能夠將多個數據一次複製到同一個目錄去!最後面必定是目錄

注:在複製時,你必需要清楚的瞭解到:
是否須要完整的保留來源文件的資訊?
來源文件是否爲連結檔 (symbolic link file)?
來源檔是否爲特殊的文件,例如 FIFO, socket 等?
來源檔是否爲目錄?
rm (移除文件或目錄)
[root@www ~]# rm [-fir] 文件或目錄
選項與參數:
-f  :就是 force 的意思,忽略不存在的文件,不會出現警告信息;
-i  :互動模式,在刪除前會詢問使用者是否動做
-r  :遞迴刪除啊!最經常使用在目錄的刪除了!這是很是危險的選項!!!

範例一:將剛剛在 cp 的範例中建立的 bashrc 刪除掉!
[root@www ~]# cd /tmp
[root@www tmp]# rm -i bashrc
rm: remove regular file `bashrc'? y
# 若是加上 -i 的選項就會主動詢問喔,避免你刪除到錯誤的檔名!

範例二:透過萬用字節*的幫忙,將/tmp底下開頭爲bashrc的檔名統統刪除:
[root@www tmp]# rm -i bashrc*
# 注意那個星號,表明的是 0 到無窮多個任意字節喔!很好用的東西!

範例三:將 cp 範例中所建立的 /tmp/etc/ 這個目錄刪除掉!
[root@www tmp]# rmdir /tmp/etc
rmdir: etc: Directory not empty  <== 刪不掉啊!由於這不是空的目錄!
[root@www tmp]# rm -r /tmp/etc
rm: descend into directory `/tmp/etc'? y
....(中間省略)....
# 由於身份是 root ,默認已經加入了 -i 的選項,因此你要一直按 y 纔會刪除!
# 若是不想要繼續按 y ,能夠按下『 [ctrl]-c 』來結束 rm 的工做。
# 這是一種保護的動做,若是肯定要刪除掉此目錄而不要詢問,能夠這樣作:
[root@www tmp]# \rm -r /tmp/etc
# 在命令前加上反斜線,能夠忽略掉 alias 的指定選項喔!至於 alias 咱們在bash再談!

範例四:刪除一個帶有 - 開頭的文件
[root@www tmp]# touch ./-aaa-  <==touch這個命令能夠建立空文件!
[root@www tmp]# ls -l 
-rw-r--r-- 1 root  root      0 Sep 24 15:03 -aaa-  <==文件大小爲0,因此是空文件
[root@www tmp]# rm -aaa-
Try `rm --help' for more information.  <== 由於 "-" 是選項嘛!因此係統誤判了!
[root@www tmp]# rm ./-aaa-
其實還有一種方法,那就是『 rm -- -aaa- 』也能夠啊!
mv(移動檔案與目錄,或改名)

[root@www ~]# mv [-fiu] source destination
[root@www ~]# mv [options] source1 source2 source3 .... directory
選項與參數:
-f  :force 強制的意思,若是目標文件已經存在,不會詢問而直接覆蓋;
-i  :若目標文件 (destination) 已經存在時,就會詢問是否覆蓋!
-u  :若目標文件已經存在,且 source 比較新,纔會升級 (update)

範例一:複製一文件,建立一目錄,將文件移動到目錄中
[root@www ~]# cd /tmp
[root@www tmp]# cp ~/.bashrc bashrc
[root@www tmp]# mkdir mvtest
[root@www tmp]# mv bashrc mvtest
# 將某個文件移動到某個目錄去,就是這樣作!
範例二:將剛剛的目錄名稱改名爲 mvtest2
[root@www tmp]# mv mvtest mvtest2 <== 這樣就改名了!簡單~
# 其實在 Linux 底下還有個有趣的命令,名稱爲 rename ,
# 該命令專職進行多個檔名的同時改名,並不是針對單一檔名變動,與mv不一樣。請man rename。
範例三:再建立兩個文件,再所有移動到 /tmp/mvtest2 當中
[root@www tmp]# cp ~/.bashrc bashrc1
[root@www tmp]# cp ~/.bashrc bashrc2
[root@www tmp]# mv bashrc1 bashrc2 mvtest2
# 注意到這邊,若是有多個來源文件或目錄,則最後一個目標檔必定是『目錄!』
# 意思是說,將全部的數據移動到該目錄的意思!
取得路徑的文件名稱與目錄名稱
[root@www ~]# basename /etc/sysconfig/network
network         <== 很簡單!就取得最後的檔名~
[root@www ~]# dirname /etc/sysconfig/network
/etc/sysconfig  <== 取得的變成目錄名了!

三、文件內容查閱

3.1 直接檢視文件內容: cat, tac, nl
3.2 可翻頁檢視: more, less
3.3 數據擷取: head, tail
3.4 非純文字檔: od
3.5 修改文件時間與建置新檔: touchnode

cat  由第一行開始顯示文件內容
tac  從最後一行開始顯示,能夠看出 tac 是 cat 的倒著寫!
nl   顯示的時候,順道輸出行號!
more 一頁一頁的顯示文件內容
less 與 more 相似,可是比 more 更好的是,他能夠往前翻頁!
head 只看頭幾行
tail 只看尾巴幾行
od   以二進位的方式讀取文件內容!
直接檢查文件內容***************************************************************

cat(concatenate):
正向列示

[root@www ~]# cat [-AbEnTv]
選項與參數:
-A  :至關於 -vET 的整合選項,可列出一些特殊字符而不是空白而已;
-b  :列出行號,僅針對非空白行作行號顯示,空白行不標行號!
-E  :將結尾的斷行字節 $ 顯示出來;
-n  :列印出行號,連同空白行也會有行號,與 -b 的選項不一樣;
-T  :將 [tab] 按鍵以 ^I 顯示出來;
-v  :列出一些看不出來的特殊字符

tac(反向列示)
由最後一行到第一行反向在屏幕上顯示出來

nl(添加行號列印)

[root@www ~]# nl [-bnw] 文件
選項與參數:
-b  :指定行號指定的方式,主要有兩種:
      -b a :表示不管是否爲空行,也一樣列出行號(相似 cat -n);
      -b t :若是有空行,空的那一行不要列出行號(默認值);(相似cat -b)
-n  :列出行號表示的方法,主要有三種:
      -n ln :行號在螢幕的最左方顯示;
      -n rn :行號在本身欄位的最右方顯示,且不加 0 ;
      -n rz :行號在本身欄位的最右方顯示,且加 0 ;
-w  :行號欄位的佔用的位數。

範例一:用 nl 列出 /etc/issue 的內容
[root@www ~]# nl /etc/issue
     1  CentOS release 5.3 (Final)
     2  Kernel \r on an \m

# 注意看,這個文件其實有三行,第三行爲空白(沒有任何字節),
# 由於他是空白行,因此 nl 不會加上行號喔!若是肯定要加上行號,能夠這樣作:

[root@www ~]# nl -b a /etc/issue
     1  CentOS release 5.3 (Final)
     2  Kernel \r on an \m
     3
# 呵呵!行號加上來羅~那麼若是要讓行號前面自動補上 0 呢?可這樣

[root@www ~]# nl -b a -n rz /etc/issue
000001  CentOS release 5.3 (Final)
000002  Kernel \r on an \m
000003
# 嘿嘿!自動在本身欄位的地方補上 0 了~默認欄位是六位數,若是想要改爲 3 位數?

[root@www ~]# nl -b a -n rz -w 3 /etc/issue
001     CentOS release 5.3 (Final)
002     Kernel \r on an \m
003
# 變成僅有 3 位數羅~

注:nl 能夠將輸出的文件內容自動的加上行號!其默認的結果與 cat -n 有點不太同樣, nl 能夠將行號作比較多的顯示設計,包括位數與是否自動補齊 0 等等的功能呢。

可翻頁檢視

more
空白鍵 (space):表明向下翻一頁;
Enter         :表明向下翻『一行』;
/字串         :表明在這個顯示的內容當中,向下搜尋『字串』這個關鍵字;
:f            :馬上顯示出檔名以及目前顯示的行數;
q             :表明馬上離開 more ,再也不顯示該文件內容。
b 或 [ctrl]-b :表明往回翻頁,不過這動做只對文件有用,對管線無用。
輸入了 / 以後,光標就會跑到最底下一行,而且等待你的輸入, 你輸入了字串並按下[enter]以後,嘿嘿! more 就會開始向下搜尋該字串羅~而重複搜尋同一個字串, 能夠直接按下 n 便可啊!

less(一頁一頁翻動)(less更強一點)
空白鍵    :向下翻動一頁;
[pagedown]:向下翻動一頁;
[pageup]  :向上翻動一頁;
/字串     :向下搜尋『字串』的功能;
?字串     :向上搜尋『字串』的功能;
n         :重複前一個搜尋 (與 / 或 ? 有關!)
N         :反向的重複前一個搜尋 (與 / 或 ? 有關!)
q         :離開 less 這個程序;
注:由於man這個命令就是呼叫 less 來顯示說明文件的內容的! 如今你是否以爲 less 很重要呢? ^_^
數據擷取***************************************************

head(取出前面幾行)

[root@www ~]# head [-n number] 文件 
選項與參數:
-n  :後面接數字,表明顯示幾行的意思

[root@www ~]# head /etc/man.config
# 默認的狀況中,顯示前面十行!若要顯示前 20 行,就得要這樣:
[root@www ~]# head -n 20 /etc/man.config

範例:若是後面100行的數據都不列印,只列印/etc/man.config的前面幾行,該如何是好?
[root@www ~]# head -n -100 /etc/man.config  

tail(取出後面幾行)

[root@www ~]# tail [-n number] 文件 
選項與參數:
-n  :後面接數字,表明顯示幾行的意思
-f  :表示持續偵測後面所接的檔名,要等到按下[ctrl]-c纔會結束tail的偵測

[root@www ~]# tail /etc/man.config
# 默認的狀況中,顯示最後的十行!若要顯示最後的 20 行,就得要這樣:
[root@www ~]# tail -n 20 /etc/man.config

範例一:若是不知道/etc/man.config有幾行,卻只想列出100行之後的數據時?
[root@www ~]# tail -n +100 /etc/man.config

範例二:持續偵測/var/log/messages的內容
[root@www ~]# tail -f /var/log/messages
  <==要等到輸入[crtl]-c以後纔會離開tail這個命令的偵測!

例題:
假如我想要顯示 /etc/man.config 的第 11 到第 20 行呢?
答:
這個應該不算難,想想,在第 11 到第 20 行,那麼我取前 20 行,再取後十行,因此結果就是:『 head -n 20 /etc/man.config | tail -n 10 』,這樣就能夠獲得第 11 到第 20 行之間的內容了! 可是裏面涉及到管線命令,須要在第三篇的時候纔講的到!
注:也可以使用命令  tail -n +11 /etc/man.config | head -n 10
非純文字檔:od *****************************************************

[root@www ~]# od [-t TYPE] 文件
選項或參數:
-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 ;

範例一:請將/usr/bin/passwd的內容使用ASCII方式來展示!
[root@www ~]# od -t c /usr/bin/passwd
0000000 177   E   L   F 001 001 001  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000020 002  \0 003  \0 001  \0  \0  \0 260 225 004  \b   4  \0  \0  \0
0000040 020   E  \0  \0  \0  \0  \0  \0   4  \0      \0  \a  \0   (  \0
0000060 035  \0 034  \0 006  \0  \0  \0   4  \0  \0  \0   4 200 004  \b
0000100   4 200 004  \b 340  \0  \0  \0 340  \0  \0  \0 005  \0  \0  \0
.....(後面省略)....
# 最左邊第一欄是以 8 進位來表示bytes數。以上面範例來講,第二欄0000020表明開頭是
# 第 16 個 byes (2x8) 的內容之意。

範例二:請將/etc/issue這個文件的內容以8進位列出儲存值與ASCII的對照表
[root@www ~]# od -t oCc /etc/issue
0000000 103 145 156 164 117 123 040 162 145 154 145 141 163 145 040 065
          C   e   n   t   O   S       r   e   l   e   a   s   e       5
0000020 056 062 040 050 106 151 156 141 154 051 012 113 145 162 156 145
          .   2       (   F   i   n   a   l   )  \n   K   e   r   n   e
0000040 154 040 134 162 040 157 156 040 141 156 040 134 155 012 012
          l       \   r       o   n       a   n       \   m  \n  \n
0000057
# 如上所示,能夠發現每一個字節能夠對應到的數值爲什麼!
# 例如e對應的記錄數值爲145,轉成十進位:1x8^2+4x8+5=101。

利用這個命令,能夠將 data file 或者是 binary file 的內容數據給他讀出來喔! 雖然讀出的來數值默認是使用非文字檔,亦便是 16 進位的數值來顯示的, 不過,咱們仍是能夠透過 -t c 的選項與參數來將數據內的字節以 ASCII 類型的字節來顯示, 雖然對於通常使用者來講,這個命令的用處可能不大,可是對於工程師來講, 這個命令能夠將 binary file 的內容做一個大體的輸出,他們能夠看得出東西的啦~ ^_^
修改文件時間或新建文檔*****************************************
每一個文件在linux底下都會記錄許多的時間參數, 實際上是有三個主要的變更時間,那麼三個時間的意義是什麼呢:

modification time (mtime):
當該文件的『內容數據』變動時,就會升級這個時間!內容數據指的是文件的內容,而不是文件的屬性或權限喔!

status time (ctime):
當該文件的『狀態 (status)』改變時,就會升級這個時間,舉例來講,像是權限與屬性被更改了,都會升級這個時間啊。 (?文件的屬性包括哪些?所屬組,所屬用戶?)

access time (atime):
當『該文件的內容被取用』時,就會升級這個讀取時間 (access)。舉例來講,咱們使用 cat 去讀取 /etc/man.config , 就會升級該文件的 atime 了。
注:在ubuntu 14.04下,cat不會更新atime,但在centos 6.6中,cat會更新atime

[root@www ~]# ls -l /etc/man.config
-rw-r--r-- 1 root root 4617 Jan  6  2007 /etc/man.config
[root@www ~]# ls -l --time=atime /etc/man.config
-rw-r--r-- 1 root root 4617 Sep 25 17:54 /etc/man.config
[root@www ~]# ls -l --time=ctime /etc/man.config
-rw-r--r-- 1 root root 4617 Sep  4 18:03 /etc/man.config

在默認的狀況下,ls 顯示出來的是該文件的 mtime ,也就是這個文件的內容上次被更動的時間。
注:文件的時間是很重要的,由於,若是文件的時間誤判的話,可能會形成某些程序沒法順利的運行。 OK!那麼萬一我發現了一個文件來自將來,該如何讓該文件的時間變成『如今』的時刻呢? 很簡單啊!就用『touch』這個命令便可!


[root@www ~]# touch [-acdmt] 文件
選項與參數:
-a  :僅修訂 access time;
-c  :僅修改文件的時間,若該文件不存在則不建立新文件;
-d  :後面能夠接欲修訂的日期而不用目前的日期,也可使用 --date="日期或時間"
-m  :僅修改 mtime ;
-t  :後面能夠接欲修訂的時間而不用目前的時間,格式爲[YYMMDDhhmm]

範例一:新建一個空的文件並觀察時間
[root@www ~]# cd /tmp
[root@www tmp]# touch testtouch
[root@www tmp]# ls -l testtouch
-rw-r--r-- 1 root root 0 Sep 25 21:09 testtouch
# 注意到,這個文件的大小是 0 呢!在默認的狀態下,若是 touch 後面有接文件,
# 則該文件的三個時間 (atime/ctime/mtime) 都會升級爲目前的時間。若該文件不存在,
# 則會主動的建立一個新的空的文件喔!例如上面這個例子!

範例二:將 ~/.bashrc 複製成爲 bashrc,假設複製徹底的屬性,檢查其日期
[root@www tmp]# cp -a ~/.bashrc bashrc
[root@www tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rw-r--r-- 1 root root 176 Jan  6  2007 bashrc  <==這是 mtime
-rw-r--r-- 1 root root 176 Sep 25 21:11 bashrc  <==這是 atime
-rw-r--r-- 1 root root 176 Sep 25 21:12 bashrc  <==這是 ctime

注:數據的內容與屬性是被複制過來的,所以文件內容時間(mtime)與原文件相同,可是因爲這個文件是剛被建立的,因此狀態時間(ctime)與讀取時間就便呈如今的時間了。


範例三:修改案例二的 bashrc 文件,將日期調整爲兩天前
[root@www tmp]# touch -d "2 days ago" bashrc
[root@www tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rw-r--r-- 1 root root 176 Sep 23 21:23 bashrc
-rw-r--r-- 1 root root 176 Sep 23 21:23 bashrc
-rw-r--r-- 1 root root 176 Sep 25 21:23 bashrc
# 跟上個範例比較看看,原本是 25 日的變成了 23 日了 (atime/mtime)~
# 不過, ctime 並無跟著改變喔!

範例四:將上個範例的 bashrc 日期改成 2007/09/15 2:02
[root@www tmp]# touch -t 0709150202 bashrc
[root@www tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rw-r--r-- 1 root root 176 Sep 15  2007 bashrc
-rw-r--r-- 1 root root 176 Sep 15  2007 bashrc
-rw-r--r-- 1 root root 176 Sep 25 21:25 bashrc
# 注意看看,日期在 atime 與 mtime 都改變了,可是 ctime 則是記錄目前的時間!

由以上的案例可知:即便咱們複製一個文件時,複製全部的屬性,但也沒有辦法複製ctime這個屬性的。ctime能夠記錄這個文件最近的狀態(status)被改變的時間。

不管如何, touch 這個命令最常被使用的狀況是:
建立一個空的文件;
將某個文件日期修訂爲目前 (mtime 與 atime)

四、文件與目錄的默認權限與隱藏權限

4.1 文件默認權限:umask
4.2 文件隱藏屬性: chattr, lsattr
4.4 文件特殊權限:SUID, SGID, SBIT, 權限配置
4.3 觀察文件類型:filelinux

文件的默認權限********************************************************

注:文件的屬性有:讀寫運行(rwx)等基本權限、是否爲目錄(d)、是否爲文件(-)或是鏈接檔(l)等等的屬性,(未完待續)

在Linux的Ext2/Ext3文件系統下,還能夠配置其餘的系統隱藏屬性,這部分可由chattr來配置,以lsattr來查看。最重要的屬性是配置其不可修改的特性,讓連文件的擁有者都不能進行修改!!!

umask,用來制定目前使用者在建立文件或目錄時的權限默認值

umask的查閱方式:
[root@www ~]# umask
0022             <==與通常權限有關的是後面三個數字!
[root@www ~]# umask -S
u=rwx,g=rx,o=rx

在默認權限的屬性上,目錄與文件是不同的。從第六章咱們知道 x 權限對於目錄是很是重要的! 可是通常文件的建立則不該該有運行的權限,由於通常文件一般是用在於數據的記錄嘛!固然不須要運行的權限了。 所以,默認的狀況以下:

若使用者建立爲『文件』則默認『沒有可運行( x )權限』,亦即只有 rw 這兩個項目,也就是最大爲 666 分,默認權限以下:
-rw-rw-rw-

若使用者建立爲『目錄』,則由於 x 與是否能夠進入此目錄有關,所以默認爲全部權限均開放,亦即爲 777 分,默認權限以下:
drwxrwxrwx

若是以上面的例子來講明的話,由於 umask 爲 022 ,因此 user 並無被拿掉任何權限,不過 group 與 others 的權限被拿掉了 2 (也就是 w 這個權限),那麼當使用者:

建立文件時:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
建立目錄時:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x

umask的利用與重要性:專題製做

配置umask

[root@www ~]# umask 002
[root@www ~]# touch test3
[root@www ~]# mkdir test4
[root@www ~]# ll 
-rw-rw-r-- 1 root root     0 Sep 27 00:36 test3
drwxrwxr-x 2 root root  4096 Sep 27 00:36 test4

umask 對於新建文件與目錄的默認權限是頗有關係的!這個概念能夠用在任何服務器上面, 尤爲是將來在你架設文件服務器 (file server) ,舉例來講, SAMBA Server 或者是 FTP server 時, 都是很重要的觀念!這牽涉到你的使用者是否可以將文件進一步利用的問題喔!不要等閒視之!

例題:
假設你的 umask 爲 003 ,請問該 umask 狀況下,建立的文件與目錄權限爲?
答:
umask 爲 003 ,因此拿掉的權限爲 --------wx,所以:
文件: (-rw-rw-rw-) - (--------wx) = -rw-rw-r--
目錄: (drwxrwxrwx) - (--------wx) = drwxrwxr--

注:(!!!)有的書籍或者是 BBS 上面的朋友,喜歡使用文件默認屬性 666 與目錄默認屬性 777 來與 umask 進行相減的計算~這是很差的喔!以上面例題來看, 若是使用默認屬性相加減,則文件變成:666-003=663,亦便是 -rw-rw--wx ,這但是徹底不對的喔! 想一想看,本來文件就已經去除 x 的默認屬性了,怎麼可能忽然間冒出來了? 因此,這個地方得要特別當心喔!
最好用符號的方式來計算,清晰不易出錯

在默認的狀況中, root 的 umask 會拿掉比較多的屬性,root 的 umask 默認是 022 , 這是基於安全的考量啦~至於通常身份使用者,一般他們的 umask 爲 002 ,亦即保留同羣組的寫入權力! 

關於默認 umask 的配置能夠參考 /etc/bashrc 這個文件的內容,不過,不建議修改該文件, 你能夠參考第十一章 bash shell 提到的環境參數配置檔 (~/.bashrc) 的說明!
文件的隱藏屬性***************************************

不過要先強調的是,底下的chattr命令只能在Ext2/Ext3的文件系統上面生效, 其餘的文件系統可能就沒法支持這個命令了。

chatter(配置文件的隱藏屬性)change file attributes on a Linux file system

[root@www ~]# chattr [+-=][ASacdistu] 文件或目錄名稱
選項與參數:
+   :添加某一個特殊參數,其餘本來存在參數則不動。
-   :移除某一個特殊參數,其餘本來存在參數則不動。
=   :配置必定,且僅有後面接的參數

A  :當配置了 A 這個屬性時,若你有存取此文件(或目錄)時,他的存取時間 atime
     將不會被修改,可避免I/O較慢的機器過分的存取磁碟。這對速度較慢的計算機有幫助
S  :通常文件是非同步寫入磁碟的(原理請參考第五章sync的說明),若是加上 S 這個
     屬性時,當你進行任何文件的修改,該更動會『同步』寫入磁碟中。
a  :當配置 a 以後,這個文件將只能添加數據,而不能刪除也不能修改數據,只有root 
     才能配置這個屬性。 
c  :這個屬性配置以後,將會自動的將此文件『壓縮』,在讀取的時候將會自動解壓縮,
     可是在儲存的時候,將會先進行壓縮後再儲存(看來對於大文件彷佛蠻有用的!)
d  :當 dump 程序被運行的時候,配置 d 屬性將可以使該文件(或目錄)不會被 dump 備份
i  :這個 i 可就很厲害了!他可讓一個文件『不能被刪除、更名、配置連結也沒法
     寫入或新增數據!』對於系統安全性有至關大的助益!只有 root 能配置此屬性
s  :當文件配置了 s 屬性時,若是這個文件被刪除,他將會被徹底的移除出這個硬盤
     空間,因此若是誤刪了,徹底沒法救回來了喔!
u  :與 s 相反的,當使用 u 來配置文件時,若是該文件被刪除了,則數據內容其實還
     存在磁碟中,可使用來救援該文件喔!
注意:屬性配置常見的是 a 與 i 的配置值,並且不少配置值必需要身爲 root 才能配置

範例:請嘗試到/tmp底下建立文件,並加入 i 的參數,嘗試刪除看看。
[root@www ~]# cd /tmp
[root@www tmp]# touch attrtest     <==建立一個空文件
[root@www tmp]# chattr +i attrtest <==給予 i 的屬性
[root@www tmp]# rm attrtest        <==嘗試刪除看看
rm: remove write-protected regular empty file `attrtest'? y
rm: cannot remove `attrtest': Operation not permitted  <==操做不準可
# 看到了嗎?呼呼!連 root 也沒有辦法將這個文件刪除呢!趕忙解除配置!

範例:請將該文件的 i 屬性取消!
[root@www tmp]# chattr -i attrtest

這個命令是很重要的,尤爲是在系統的數據安全上面!
注:vbird認爲,最終要的當屬+i和+a這個屬性了,+i可讓一個文件沒法被更動
注:若是是log file這種文檔,就更須要+a這個能夠添加但不能修改舊有的數據與刪除的參數了。

lsattr(顯示文件隱藏屬性)list file attributes on a Linux second extend file system

[root@www ~]# lsattr [-adR] 文件或目錄
選項與參數:
-a :將隱藏檔的屬性也秀出來;
-d :若是接的是目錄,僅列出目錄自己的屬性而非目錄內的檔名;
-R :連同子目錄的數據也一併列出來! 

[root@www tmp]# chattr +aij attrtest
[root@www tmp]# lsattr attrtest
----ia---j--- attrtest
文件的特殊權限*********************************************

[root@www ~]# ls -ld /tmp ; ls -l /usr/bin/passwd
drwxrwxrwt 7 root root 4096 Sep 27 18:23 /tmp
-rwsr-xr-x 1 root root 22984 Jan  7  2007 /usr/bin/passwd

由於 s 與 t 這兩個權限的意義與系統的賬號 (第十四章)及系統的程序(process, 第十七章)較爲相關, 因此等到後面的章節談完後你纔會比較有概念!

Set UID

當 s 這個標誌出如今文件擁有者的 x 權限上時,例如剛剛提到的 /usr/bin/passwd 這個文件的權限狀態:『-rwsr-xr-x』,此時就被稱爲 Set UID,簡稱爲 SUID 的特殊權限。基本上SUID有這樣的限制與功能:
一、SUID 權限僅對二進位程序(binary program)有效;
二、運行者對於該程序須要具備 x 的可運行權限;
三、本權限僅在運行該程序的過程當中有效 (run-time);
四、運行者將具備該程序擁有者 (owner) 的權限。

舉個例子來講:Linux系統中,全部帳號的密碼都記錄在/etc/shadow這個文件裏面,vbird帳號不具備w權限,但能夠修改這個文件內的密碼,由於
vbird 對於 /usr/bin/passwd 這個程序來講是具備 x 權限的,表示 vbird 能運行 passwd;
passwd 的擁有者是 root 這個賬號;
vbird 運行 passwd 的過程當中,會『暫時』得到 root 的權限;
/etc/shadow 就能夠被 vbird 所運行的 passwd 所修改。

注意:SUID 僅可用在binary program 上, 不可以用在 shell script 上面!這是由於 shell script 只是將不少的 binary 運行檔叫進來運行而已!因此 SUID 的權限部分,仍是得要看 shell script 呼叫進來的程序的配置, 而不是 shell script 自己。固然,SUID 對於目錄也是無效的~這點要特別留意。

Set GID

當 s 標誌在文件擁有者的 x 項目爲 SUID,那 s 在羣組的 x 時則稱爲 Set GID, SGID 羅!
[root@www ~]# ls -l /usr/bin/locate   (ubuntu 14.04 不一樣)(centos 6.6 中,符合)
注:因爲ubuntu 14.04 與 centos 6.6 關於文件的權限配置方面差異很大,因此,絕對實驗儘可能在 centos 6.6 上進行
-rwx--s--x 1 root slocate 23856 Mar 15  2007 /usr/bin/locate

與 SUID 不一樣的是,SGID 能夠針對文件或目錄來配置!

若是是對文件來講, SGID 有以下的功能:
SGID 對二進位程序有用;
程序運行者對於該程序來講,需具有 x 的權限;
運行者在運行的過程當中將會得到該程序羣組的支持!

舉例來講,上面的 /usr/bin/locate 這個程序能夠去搜尋 /var/lib/mlocate/mlocate.db 這個檔案的內容,mlocate.db的權限以下
[root@www ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
-rwx--s--x 1 root slocate   23856 Mar 15  2007 /usr/bin/locate
-rw-r----- 1 root slocate 3175776 Sep 28 04:02 /var/lib/mlocate/mlocate.db

除了 binary program 以外,SGID也可以用在目錄上,當一個目錄設定了 SGID 的權限後,他將具備以下功能:

用戶若對此目錄具備r與x的權限時,該用戶可以進入此目錄;
用戶在此目錄下的有效組(effective group) 將會變成該目錄的羣組;
用途:若用戶在此目錄下具備 w 的權限(能夠新建檔案),則使用者所創建的新檔案,該檔案的羣組與此目錄的羣組相同

注:SGID對於項目開發來講是很是重要的,由於這涉及羣組權限的問題,參考本章後續情境模擬的案例

Stick Bit

SBIT 目前只針對目錄有效,對於檔案沒有效果。
SBIT對於目錄的做用是:
當用戶對於此目錄具備w、x權限,亦即具備寫入的權限時;
當用戶在該目錄下簡歷檔案或目錄時,僅由本身與root才由權利刪除該檔案

換句話說:當甲這個用戶於A目錄具備羣組或其餘人的身份,而且擁有該目錄的w權限,這表示甲用戶對該目錄內任何人創建的目錄或檔案都可進行刪除、改名、搬移等動做,若是將A目錄加上了SBIT的權限項目時,則甲只可以針對本身創建的檔案或目錄進行刪除、改名、搬移等動做,而沒法刪除他人的檔案

舉例來講,咱們的/tmp自己的權限是 drwxrwxrwt ,在這樣的權限內容下,任何人均可以在 /tmp 內新增、修改文件,但僅有該文件/目錄建立者與 root 可以刪除本身的目錄或文件。

注:由於 SUID/SGID/SBIT 牽涉到程序的概念,所以再次強調,這部份的數據在您讀完第十七章關於程序方面的知識後,要再次的回來瞧瞧喔! 

SUID/SGID/SBIT 權限配置

數字法:
4 爲 SUID
2 爲 SGID
1 爲 SBIT

Tips:
注意:底下的範例只是練習而已,因此鳥哥使用同一個文件來配置,你必須瞭解 SUID 不是用在目錄上,而 SBIT 不是用在文件上的喔!
[root@www ~]# cd /tmp
[root@www tmp]# touch test                  <==建立一個測試用空檔
[root@www tmp]# chmod 4755 test; ls -l test <==加入具備 SUID 的權限
-rwsr-xr-x 1 root root 0 Sep 29 03:06 test
[root@www tmp]# chmod 6755 test; ls -l test <==加入具備 SUID/SGID 的權限
-rwsr-sr-x 1 root root 0 Sep 29 03:06 test
[root@www tmp]# chmod 1755 test; ls -l test <==加入 SBIT 的功能!
-rwxr-xr-t 1 root root 0 Sep 29 03:06 test
[root@www tmp]# chmod 7666 test; ls -l test <==具備空的 SUID/SGID 權限
-rwSrwSrwT 1 root root 0 Sep 29 03:06 test

最後一個例子就要特別當心啦!怎麼會出現大寫的 S 與 T 呢?不都是小寫的嗎? 由於 s 與 t 都是取代 x 這個權限的,可是你有沒有發現阿,咱們是下達 7666 喔!也就是說, user, group 以及 others 都沒有 x 這個可運行的標誌( 由於 666 嘛 ),因此,這個 S, T 表明的就是『空的』啦!怎麼說? SUID 是表示『該文件在運行的時候,具備文件擁有者的權限』,可是文件 擁有者都沒法運行了,哪裏來的權限給其餘人使用?固然就是空的啦! ^_^

符號法:
SUID 爲 u+s
SGID 爲 g+s
SBIT 爲 o+t
觀察文件類型:fiile

若是你想要知道某個文件的基本數據,例如是屬於 ASCII 或者是 data 文件,或者是 binary , 且其中有沒有使用到動態函式庫 (share library) 等等的資訊,就能夠利用 file 這個命令來檢閱喔!

[root@www ~]# file ~/.bashrc
/root/.bashrc: ASCII text  <==告訴咱們是 ASCII 的純文字檔啊!
[root@www ~]# file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1 
(SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for 
GNU/Linux 2.6.9, stripped
# 運行檔的數據可就多的不得了!包括這個文件的 suid 權限、兼容於 Intel 386
# 等級的硬件平臺、使用的是 Linux 核心 2.6.9 的動態函式庫連結等等。
[root@www ~]# file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: data  <== 這是 data 文件!

透過這個命令,咱們能夠簡單的先判斷這個文件的格式爲什麼喔!

五、命令與文件的搜尋

5.1 命令檔名的搜尋:which
5.2 文件檔名的搜尋:whereis, locate, findshell

命令檔名的搜尋:數據庫

which(尋找運行檔)

咱們經常須要知道那個文件放在哪裏,纔可以對該文件進行一些修改或維護等動做。 有些時候某些軟件配置檔的檔名是不變的,可是各 distribution 放置的目錄則不一樣。 此時就得要利用一些搜尋命令將該配置檔的完整檔名捉出來,這樣才能修改嘛!

[root@www ~]# which [-a] command
選項或參數:
-a :將全部由 PATH 目錄中能夠找到的命令均列出,而不止第一個被找到的命令名稱

範例一:分別用root與通常賬號搜尋 ifconfig 這個命令的完整檔名
[root@www ~]# which ifconfig
/sbin/ifconfig            <==用 root 能夠找到正確的運行檔名喔!
[root@www ~]# su - vbird <==切換身份成爲 vbird 去!
[vbird@www ~]$ which ifconfig
/usr/bin/which: no ifconfig in (/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin
:/home/vbird/bin)         <==見鬼了!居然通常身份賬號找不到!
# 由於 which 是根據使用者所配置的 PATH 變量內的目錄去搜尋可運行檔的!因此,
# 不一樣的 PATH 配置內容所找到的命令固然不同啦!由於 /sbin 不在 vbird 的 
# PATH 中,找不到也是理所固然的啊!了乎?
[vbird@www ~]$ exit      <==記得將身份切換回本來的 root

範例二:用 which 去找出 which 的檔名爲什麼?
[root@www ~]# which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot '
        /usr/bin/which
# 居然會有兩個 which ,其中一個是 alias 這玩意兒呢!那是啥?
# 那就是所謂的『命令別名』,意思是輸入 which 會等於後面接的那串命令啦!
# 更多的數據咱們會在 bash 章節中再來談的!

範例三:請找出 cd 這個命令的完整檔名
[root@www ~]# which cd
/usr/bin/which: no cd in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin
:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
# 瞎密?怎麼可能沒有 cd ,我明明就可以用 root 運行 cd 的啊!

由於 cd 是『bash 內建的命令』。 可是 which 默認是找 PATH 內所規範的目錄,因此固然必定找不到的啊!咱們能夠透過 type 這個命令喔! 關於 type 的用法咱們將在 第十一章的 bash 再來談!

文件檔名的搜尋:ubuntu

一般 find 不很經常使用的!由於速度慢以外, 也很操硬盤!一般咱們都是先使用 whereis 或者是 locate 來檢查,若是真的找不到了,才以 find 來搜尋呦! 爲何呢?由於 whereis 與 locate 是利用數據庫來搜尋數據,因此至關的快速,並且並無實際的搜尋硬盤, 比較省時間啦!centos

whereis (尋找特定文件)
[root@www ~]# whereis [-bmsu] 文件或目錄名
選項與參數:
-b    :只找 binary 格式的文件
-m    :只找在說明檔 manual 路徑下的文件
-s    :只找 source 來源文件
-u    :搜尋不在上述三個項目當中的其餘特殊文件

範例一:請用不一樣的身份找出 ifconfig 這個檔名
[root@www ~]# whereis ifconfig 
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
[root@www ~]# su - vbird        <==切換身份成爲 vbird
[vbird@www ~]$ whereis ifconfig <==找到一樣的結果喔!
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
[vbird@www ~]$ exit              <==迴歸身份成爲 root 去!
# 注意看,明明 which 通常使用者找不到的 ifconfig 卻可讓 whereis 找到!
# 這是由於系統真的有 ifconfig 這個『文件』,可是使用者的 PATH 並無加入 /sbin
# 因此,將來你找不到某些命令時,先用文件搜尋命令找找看再說!

範例二:只找出跟 passwd 有關的『說明文件』檔名(man page)
[root@www ~]# whereis -m passwd
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
 
 find 是很強大的搜尋命令,但時間花用的很大!由於 find 是直接搜尋硬盤。
whereis 搜尋的速度比 find 快不少Linux 系統會將系統內的全部文件都記錄在一個數據庫文件裏面, 而當使用 whereis 或者是底下要說的 locate 時,都會以此數據庫文件的內容爲準, 所以,有的時後你還會發現使用這兩個運行檔時,會找到已經被殺掉的文件! 並且也找不到最新的剛剛建立的文件呢!
locate

[root@www ~]# locate [-ir] keyword
選項與參數:
-i  :忽略大小寫的差別;
-r  :後面可接正規表示法的顯示方式

範例一:找出系統中全部與 passwd 相關的檔名
[root@www ~]# locate passwd
/etc/passwd
/etc/passwd-
/etc/news/passwd.nntp
/etc/pam.d/passwd
....(底下省略)....
 
locate使用簡單,速度快,可是也有限制,即他是經由數據庫來搜尋的,而數據庫的建立默認是天天運行一次(每一個發行版不一樣),因此當你新建立起來的文件, 卻還在數據庫升級以前搜尋該文件,那麼 locate 會告訴你『找不到!』呵呵!由於必需要升級數據庫呀!

注:
updatedb:根據 /etc/updatedb.conf 的配置去搜尋系統硬盤內的檔名,並升級 /var/lib/mlocate 內的數據庫文件;
locate:依據 /var/lib/mlocate 內的數據庫記載,找出使用者輸入的關鍵字檔名
find

[root@www ~]# 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 還要新的文件檔名

範例一:將過去系統上面 24 小時內有更動過內容 (mtime) 的文件列出
[root@www ~]# find / -mtime 0
# 那個 0 是重點!0 表明目前的時間,因此,從如今開始到 24 小時前,
# 有變更過內容的文件都會被列出來!那若是是三天前的 24 小時內?
# find / -mtime 3 有變更過的文件都被列出的意思!

範例二:尋找 /etc 底下的文件,若是文件日期比 /etc/passwd 新就列出
[root@www ~]# find /etc -newer /etc/passwd
# -newer 用在分辨兩個文件之間的新舊關係是頗有用的!

![](https://images0.cnblogs.com/blog2015/731538/201503/182142220481384.gif)

 +4表明大於等於5天前的檔名:ex> find /var -mtime +4
-4表明小於等於4天內的文件檔名:ex> find /var -mtime -4
 4則是表明4-5那一天的文件檔名:ex> find /var -mtime 4

很是有趣吧!你能夠在 /var/ 目錄下搜尋一下,感覺一下輸出文件的差別喔!

選項與參數:
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 搜尋。

範例三:搜尋 /home 底下屬於 vbird 的文件
[root@www ~]# find /home -user vbird
# 這個東西也頗有用的~當咱們要找出任何一個使用者在系統當中的全部文件時,
# 就能夠利用這個命令將屬於某個使用者的全部文件都找出來喔!

範例四:搜尋系統中不屬於任何人的文件
[root@www ~]# find / -nouser
# 透過這個命令,能夠輕易的就找出那些不太正常的文件。
# 若是有找到不屬於系統任何人的文件時,不要太緊張,
# 那有時候是正常的~尤爲是你曾經以原始碼自行編譯軟件時。

若是你想要找出某個使用者在系統底下建立了啥咚咚,使用上述的選項與參數,就可以找出來啦!

選項與參數:
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.... 的屬性存在!

範例五:找出檔名爲 passwd 這個文件
[root@www ~]# find / -name passwd
# 利用這個 -name 能夠搜尋檔名啊!

範例六:找出 /var 目錄下,文件類型爲 Socket 的檔名有哪些?
[root@www ~]# find /var -type s
# 這個 -type 的屬性也頗有幫助喔!尤爲是要找出那些怪異的文件,
# 例如 socket 與 FIFO 文件,能夠用 find /var -type p 或 -type s 來找!

範例七:搜尋文件當中含有 SGID 或 SUID 或 SBIT 的屬性
[root@www ~]# find / -perm +7000 
# 所謂的 7000 就是 ---s--s--t ,那麼只要含有 s 或 t 的就列出,
# 因此固然要使用 +7000 ,使用 -7000 表示要含有 ---s--s--t 的全部三個權限,
# 所以,就是 +7000 ~了乎?

假設我想要找出來 /bin, /sbin 這兩個目錄下, 只要具備 SUID 或 SGID 就列出來該文件,你能夠這樣作:
[root@www ~]# find /bin /sbin -perm +6000

注: find 後面能夠接多個目錄來進行搜尋!另外, find 原本就會搜尋次目錄,這個特點也要特別注意喔! 

選項與參數:
4. 額外可進行的動做:
   -exec command :command 爲其餘命令,-exec 後面可再接額外的命令來處理搜尋到
                   的結果。
   -print        :將結果列印到螢幕上,這個動做是默認動做!

範例八:將上個範例找到的文件使用 ls -l 列出來~
[root@www ~]# find / -perm +7000 -exec ls -l {} \;
# 注意到,那個 -exec 後面的 ls -l 就是額外的命令,命令不支持命令別名,
# 因此僅能使用 ls -l 不可使用 ll 喔!注意注意!

範例九:找出系統中,大於 1MB 的文件
[root@www ~]# find / -size +1000k

find 的特殊功能就是可以進行額外的動做(action)。咱們將範例八的例子以圖解來講明以下:
![](https://images0.cnblogs.com/blog2015/731538/201503/182142490632803.gif)

該範例中特殊的地方有 {} 以及 \; 還有 -exec 這個關鍵字,這些東西的意義爲:
{} 表明的是『由 find 找到的內容』,如上圖所示,find 的結果會被放置到 {} 位置中;
-exec 一直到 \; 是關鍵字,表明 find 額外動做的開始 (-exec) 到結束 (\;) ,在這中間的就是 find 命令內的額外動做。 在本例中就是『 ls -l {} 』羅!
由於『 ; 』在 bash 環境下是有特殊意義的,所以利用反斜線來跳脫。

find 還能夠利用萬用字節來找尋檔名呢!舉例來講,你想要找出 /etc 底下檔名包含 httpd 的文件, 那麼你就能夠這樣作:

[root@www ~]# find /etc -name '*httpd*'

不過由於 find 在尋找數據的時後至關的操硬盤!因此沒事情不要使用 find 啦!

6. 極重要!權限與命令間的關係:

在這一章咱們介紹了不少文件系統的管理命令,第六章則介紹了不少文件權限的意義。在這個小節當中, 咱們就將這二者結合起來,說明一下什麼命令在什麼樣的權限下才可以運行吧!^_^安全

1、讓使用者能進入某目錄成爲『可工做目錄』的基本權限爲什麼:
可以使用的命令:例如 cd 等變換工做目錄的命令;
目錄所需權限:使用者對這個目錄至少須要具備 x 的權限
額外需求:若是使用者想要在這個目錄內利用 ls 查閱檔名,則使用者對此目錄還須要 r 的權限。bash

2、使用者在某個目錄內讀取一個文件的基本權限爲什麼?
可以使用的命令:例如本章談到的 cat, more, less等等
目錄所需權限:使用者對這個目錄至少須要具備 x 權限;
文件所需權限:使用者對文件至少須要具備 r 的權限才行!

3、讓使用者能夠修改一個文件的基本權限爲什麼?
可以使用的命令:例如 nano 或將來要介紹的 vi 編輯器等;
目錄所需權限:使用者在該文件所在的目錄至少要有 x 權限;
文件所需權限:使用者對該文件至少要有 r, w 權限

4、讓一個使用者能夠建立一個文件的基本權限爲什麼?
目錄所需權限:使用者在該目錄要具備 w,x 的權限,重點在 w 啦!

5、讓使用者進入某目錄並運行該目錄下的某個命令之基本權限爲什麼?
目錄所需權限:使用者在該目錄至少要有 x 的權限;
文件所需權限:使用者在該文件至少須要有 x 的權限

例題:
讓一個使用者 vbird 可以進行『cp /dir1/file1 /dir2』的命令時,請說明 dir1, file1, dir2 的最小所需權限爲什麼? 
答:
運行 cp 時, vbird 要『可以讀取來源檔,而且寫入目標檔!』因此應參考上述第二點與第四點的說明! 所以各文件/目錄的最小權限應該是: •dir1 :至少須要有 x 權限;
file1:至少須要有 r 權限;
dir2 :至少須要有 w, x 權限。

例題:
有一個文件全名爲 /home/student/www/index.html ,各相關文件/目錄的權限以下: drwxr-xr-x 23 root    root    4096 Sep 22 12:09 /
drwxr-xr-x  6 root    root    4096 Sep 29 02:21 /home
drwx------  6 student student 4096 Sep 29 02:23 /home/student
drwxr-xr-x  6 student student 4096 Sep 29 02:24 /home/student/www
-rwxr--r--  6 student student  369 Sep 29 02:27 /home/student/www/index.html
請問 vbird 這個賬號(不屬於student羣組)可否讀取 index.html 這個文件呢? 答:
雖然 www 與 index.html 是可讓 vbird 讀取的權限,可是由於目錄結構是由根目錄一層一層讀取的, 所以 vbird 可進入 /home 可是卻不可進入 /home/student/ ,既然連進入 /home/student 都不準了, 固然就讀不到 index.html 了!因此答案是『vbird不會讀取到 index.html 的內容』喔!

 那要如何修改權限呢?其實只要將 /home/student 的權限修改成最小 711 ,或者直接給予 755 就能夠羅! 這但是很重要的概念喔!

情境模擬題一:假設系統中有兩個賬號,分別是 alex 與 arod ,這兩我的除了本身羣組以外還共同支持一個名爲 project 的羣組。假設這兩個用戶須要共同擁有 /srv/ahome/ 目錄的開發權,且該目錄不準其餘人進入查閱。 請問該目錄的權限配置應爲什麼?請先以傳統權限說明,再以 SGID 的功能解析。
目標:瞭解到爲什麼專案開發時,目錄最好須要配置 SGID 的權限!
前提:多個賬號支持同一羣組,且共同擁有目錄的使用權!
需求:須要使用 root 的身份來進行 chmod, chgrp 等幫用戶配置好他們的開發環境才行! 這也是管理員的重要任務之一!

首先咱們得要先製做出這兩個賬號的相關數據,賬號/羣組的管理在後續咱們會介紹, 您這裏先照著底下的命令來製做便可:

[root@www ~]# groupadd project <==添加新的羣組
[root@www ~]# useradd -G project alex <==建立 alex 賬號,且支持 project
[root@www ~]# useradd -G project arod <==建立 arod 賬號,且支持 project
[root@www ~]# id alex <==查閱 alex 賬號的屬性
uid=501(alex) gid=502(alex) groups=502(alex),501(project) <==確實有支持!
[root@www ~]# id arod
uid=502(arod) gid=503(arod) groups=503(arod),501(project)

而後開始來解決咱們所須要的環境吧!

1.首先建立所須要開發的專案目錄:
[root@www ~]# mkdir /srv/ahome
[root@www ~]# ll -d /srv/ahome
drwxr-xr-x 2 root root 4096 Sep 29 22:36 /srv/ahome

2.從上面的輸出結果可發現 alex 與 arod 都不能在該目錄內建立文件,所以須要進行權限與屬性的修改。 由於其餘人均不可進入此目錄,所以該目錄的羣組應爲project,權限應爲770才合理。
[root@www ~]# chgrp project /srv/ahome
[root@www ~]# chmod 770 /srv/ahome
[root@www ~]# ll -d /srv/ahome
drwxrwx--- 2 root project 4096 Sep 29 22:36 /srv/ahome
//從上面的權限結果來看,由於 alex/arod 均支持 project,所以彷佛沒問題了!

3.實際分別以兩個使用者來測試看看,狀況會是如何?先用 alex 建立文件,而後用 arod 去處理看看。
[root@www ~]# su - alex <==先切換身份成爲 alex 來處理
[alex@www ~]$ cd /srv/ahome <==切換到羣組的工做目錄去
[alex@www ahome]$ touch abcd <==建立一個空的文件出來!
[alex@www ahome]$ exit <==離開 alex 的身份

[root@www ~]# su - arod
[arod@www ~]$ cd /srv/ahome
[arod@www ahome]$ ll abcd
-rw-rw-r-- 1 alex alex 0 Sep 29 22:46 abcd
//仔細看一下上面的文件,由於羣組是 alex ,arod並不支持!
//所以對於 abcd 這個文件來講, arod 應該只是其餘人,只有 r 的權限而已啊!
[arod@www ahome]$ exit
由上面的結果咱們能夠知道,若單純使用傳統的 rwx 而已,則對剛剛 alex 建立的 abcd 這個文件來講, arod 能夠刪除他,可是卻不能編輯他!這不是咱們要的樣子啊!趕忙來從新規劃一下。

4.加入 SGID 的權限在裏面,並進行測試看看:
[root@www ~]# chmod 2770 /srv/ahome
[root@www ~]# ll -d /srv/ahome
drwxrws--- 2 root project 4096 Sep 29 22:46 /srv/ahome

測試:使用 alex 去建立一個文件,而且查閱文件權限看看:
[root@www ~]# su - alex
[alex@www ~]$ cd /srv/ahome
[alex@www ahome]$ touch 1234
[alex@www ahome]$ ll 1234
-rw-rw-r-- 1 alex project 0 Sep 29 22:53 1234
//沒錯!這纔是咱們要的樣子!如今 alex, arod 建立的新文件所屬羣組都是 project,
//由於兩人均屬於此羣組,加上 umask 都是 002,這樣兩人才能夠互相修改對方的文件!

因此最終的結果顯示,此目錄的權限最好是『2770』,所屬文件擁有者屬於root便可,至於羣組必需要爲兩人共同支持的project 這個羣組才行!

相關文章
相關標籤/搜索