博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

linux_bug

linuxbug.cublog.cn


Linux 档案与目录管理

Linux 档案与目录管理

1 目錄與路徑:
1.1 目錄的相關操作:
1.1.1 特殊的目錄:

.        代表此層目錄

..       代表上一層目錄

-        代表前一個工作目錄

~        代表『目前使用者身份』所在的家目錄

~account 代表 account 這個使用者的家目錄

常見的處理目錄的指令:
  • cd:變換目錄
  • pwd:顯示目前的目錄
  • mkdir:建立一個新的目錄
  • rmdir:刪除一個空的目錄
1.1.2 指令大全:
pwd (顯示目前所在的目錄)
[root@linux ~]# pwd [-P]
參數:

-P  :顯示出確實的路徑,而非使用連結 (link) 路徑。

範例:
[root@linux ~]# cd /var/spool/mail
[root@linux mail]# pwd
/var/spool/mail  <== 顯示出目錄~
[root@linux mail]# pwd -P
/var/mail   <== 怎麼回事?有沒有加 -P 差很多~
[root@linux mail]# ls -l /var/spool/mail

lrwxrwxrwx  1 root root 10 Jun 25 08:25 /var/spool/mail -> ../mail

# 看到這裡應該知道為啥了吧?因為 /var/mail 是連結檔,連結到 /var/spool/mail,所以,加上 pwd -P 的參數後,會不以連結檔的資料顯示,而是顯示正確的完整路徑!
 
mkdir (建立新目錄)
[root@linux ~]# mkdir [-mp] 目錄名稱
參數:
-m :設定檔案的權限!直接設定,不需要看預設權限 (umask) 的臉色~
[root@linux ~]# mkdir -m 755 a
[root@linux mail]# ls -l -d a
drwxr-xr-x 2 root root 4096 Jul 22 18:29 a

-p :幫助你直接將所需要的目錄遞迴建立起來!路径中的目錄本來就已經存在時,系統也不會顯示錯誤訊息!

 
rmdir (刪除『空』的目錄)
[root@linux ~]# rmdir [-p] 目錄名稱

下面两个语句等价:
[root@linux ~]# rmdir -p a/b/c
[root@linux ~]# rmdir a/b/c a/b a
參數:
-p :連同上層『空的』目錄也一起刪除
注意:rmdir 僅能『刪除空的目錄』喔!
如果要將所有目錄下的東西都殺掉就必須使用 rm -rf file/directory

1.1.2.1
關於執行檔路徑的變數: $PATH
當我們在執行一個指令的時候, 系統會依照 PATH 的設定去每個 PATH 定義的路徑下搜尋執行檔,先搜尋到的指令先被執行!
添加路径:
例:
  • 將 /root 的路徑加入 PATH 當中:

[root@linux ~]# PATH="$PATH":/root

這種方式來增加 PATH 搜尋目錄!
结论:絕對路徑下達指令的方法比相對路徑要正確的多!所以一般在Shell Script里面我们都用绝对路径下达命令。
 
2 檔案與目錄管理:
2.1 指令大全:
2.1.1 檔案與目錄的查看: ls
[root@linux ~]# ls [-aAdfFhilRS] 目錄名稱

[root@linux ~]# ls [--color={none,auto,always}] 目錄名稱

[root@linux ~]# ls [--full-time] 目錄名稱
參數:

-a  :全部的檔案,連同隱藏檔( 開頭為 . 的檔案) 一起列出來~

-A  :全部的檔案,連同隱藏檔,但不包括 . 與 .. 這兩個目錄,一起列出來~

-d  :僅列出目錄本身,而不是列出目錄內的檔案資料

-f  :直接列出結果,而不進行排序 (ls 預設會以檔名排序!)

-F  :根據檔案、目錄等資訊,給予附加資料結構,例如:

     *:代表可執行檔; /:代表目錄; =:代表 socket 檔案; |:代表 FIFO 檔案;

-h  :將檔案容量以人類較易讀的方式(例如 GB, KB 等等)列出來;

-i  :列出 inode 位置,而非列出檔案屬性;

-l  :長資料串列出,包含檔案的屬性等等資料;

-n  :列出 UID 與 GID 而非使用者與群組的名稱;

-r  :將排序結果反向輸出,例如:原本檔名由小到大,反向則為由大到小;

-R  :連同子目錄內容一起列出來;

-S  :以檔案容量大小排序!

-t  :依時間排序

--color=never  :不要依據檔案特性給予顏色顯示;
--color=always :顯示顏色
--color=auto   :讓系統自行依據設定來判斷是否給予顏色
--full-time    :以完整時間模式 (包含年、月、日、時、分) 輸出
--time={atime,ctime} :輸出 access 時間 或 改變權限屬性時間 (ctime) 而非內容變更時間 (modification time)
ls 的用法有很多,包括查閱檔案所在 i-node 的 ls -i 參數,以及用來進行檔案排序的 -S 參數,還有用來查閱不同時間的動作的 --time=atime 等參數。而這些參數的存在都是因為 Linux 檔案系統記錄了很多有用的資訊的緣故。在 Linux 的檔案系統中,這些與權限、屬性有關的資料放在i-node 裡。
 
cp (複製檔案或目錄)
[root@linux ~]# cp [-adfilprsu] 來源檔(source) 目的檔(destination)

[root@linux ~]# cp [options] source1 source2 source3 .... directory

參數:

-a  :相當於 -pdr 的意思;

-d  :若來源檔為連結檔的屬性(link file),則複製連結檔屬性而非檔案本身;

-f  :為強制 (force) 的意思,若有重複或其他疑問時,不會詢問使用者,而強制複製;

-i  :若目的檔(destination)已經存在時,在覆蓋時會先詢問是否真的動作!

-l  :進行硬式連結 (hard link) 的連結檔建立,而非複製檔案本身;

-p  :連同檔案的屬性一起複製過去,而非使用預設屬性;

-r  :迭代複製,用於目錄的複製行為;

-s  :複製成為符號連結檔 (symbolic link),亦即『捷徑』檔案;

-u  :若 destination 比 source 舊才更新 destination !

最後需要注意的,如果來源檔有兩個以上,則最後一個目的檔一定要是『目錄』才行!
範例:
範例一:將 /var/log/wtmp 複製到 /tmp 底下
[root@linux tmp]# cp /var/log/wtmp .

[root@linux tmp]# ls -l /var/log/wtmp wtmp

-rw-rw-r--  1 root utmp 71808 Jul 18 12:46 /var/log/wtmp

-rw-r--r--  1 root root 71808 Jul 18 21:58 wtmp
# 在不加任何參數的情況下,檔案的所屬者會改變,連權限也跟著改變了~
# 這是個很重要的特性!要注意喔!還有,連檔案建立的時間也不一樣了!
# 如果您想要將檔案的所有特性都一起複製過來,可以加上 -a!

[root@linux tmp]# cp -a /var/log/wtmp wtmp_2

[root@linux tmp]# ls -l /var/log/wtmp wtmp_2

-rw-rw-r--  1 root utmp 71808 Jul 18 12:46 /var/log/wtmp

-rw-rw-r--  1 root utmp 71808 Jul 18 12:46 wtmp_2
# 瞭了吧!整個資料特性完全一模一樣!真是不賴~這就是 -a 的特性!
 
範例二:複製 /etc/ 這個目錄下的所有內容到 /tmp 底下
[root@linux tmp]# cp /etc/ /tmp
cp: omitting directory `/etc'   <== 如果是目錄,不能直接複製,要加上 -r 的參數
[root@linux tmp]# cp -r /etc/ /tmp
# 還是要再次的強調喔! -r 是可以複製目錄,但是,檔案與目錄的權限會被改變~所以,也可以利用 cp -a /etc /tmp 來下達指令喔!
 
範例三:將範例一複製的 bashrc 建立一個連結檔 (symbolic link)
[root@linux tmp]# ls -l bashrc
-rw-r--r--  1 root root 395 Jul 18 22:08 bashrc

[root@linux tmp]# cp -s bashrc bashrc_slink

[root@linux tmp]# cp -l bashrc bashrc_hlink

[root@linux tmp]# ls -l bashrc*
-rw-r--r--  2 root root 395 Jul 18 22:08 bashrc
-rw-r--r--  2 root root 395 Jul 18 22:08 bashrc_hlink
lrwxrwxrwx  1 root root   6 Jul 18 22:31 bashrc_slink -> bashrc
# 那個 bashrc_slink 是由 -s 的參數造成的,建立的是一個『捷徑』,
# 所以您會看到在檔案的最右邊,會顯示這個檔案是『連結』到哪裡去的!
# 至於那個 bashrc_hlink 有趣了!建立了這個檔案之後, bashrc 與 bashrc_hlink所有的參數都一樣,只是,第二欄的 link 數改變成為 2 了~而不是原本的 1 喔!
 
範例四:若 ~/.bashrc 比 /tmp/bashrc 新才複製過來

[root@linux tmp]# cp -u ~/.bashrc /tmp/bashrc

# 這個 -u 的特性,是在目標檔案與來源檔案有差異時,才會複製的。
# 所以,比較常被用於『備份』的工作當中喔!
 
範例五:將範例四造成的 bashrc_slink 複製成為 bashrc_slink_2

[root@linux tmp]# cp bashrc_slink bashrc_slink_2

[root@linux tmp]# ls -l bashrc_slink*
lrwxrwxrwx  1 root root   6 Jul 18 22:31 bashrc_slink -> bashrc
-rw-r--r--  1 root root 395 Jul 18 22:48 bashrc_slink_2
# 這個例子也是很有趣喔!原本複製的是連結檔,但是卻將連結檔的實際檔案複製過來了,也就是說,如果沒有加上任何參數時,複製的是原始檔案,而非連結檔的屬性!
# 若要複製連結檔的屬性,就得要使用 -d 或者 -a 的參數了!
 
範例六:將家目錄的 .bashrc 及 .bash_history 複製到 /tmp 底下

[root@linux tmp]# cp ~/.bashrc ~/.bash_history /tmp

# 可以將多個資料一次複製到同一個目錄去!

我們如果去複製別人的資料 (該檔案您必須要有 read 的權限),總是希望複製到的資料最後是我們自己的,所以,在預設的條件中,cp 的來源檔與目的檔的權限是不同的,目的檔的擁有者通常會是指令操作者本身。由於具有這個特性,因此,當我們在進行備份的時候,某些需要特別注意的特殊權限檔案, 例如密碼檔 (/etc/shadow) 以及一些設定檔,就不能直接以 cp 來複製,而必須要加上 -a 或者是 -p 等等可以完整複製檔案權限的參數才行!另外,如果您想要複製檔案給其他的使用者, 也必須要注意到檔案的權限(包含讀、寫、執行以及檔案擁有者等等), 否則,其他人還是無法針對您給予的檔案進行修訂的動作喔!

總之,由於 cp 有種種的檔案屬性與權限的特性,所以,在複製時,您必須要清楚的瞭解到:
  • 是否需要完整的保留來源檔案的資訊?
  • 來源檔案是否為連結檔 (symbolic link file)?
  • 來源檔是否為特殊的檔案,例如 FIFO, socket 等?
  • 來源檔是否為目錄?
rm (移除檔案或目錄)
[root@linux ~]# rm [-fir] 檔案或目錄
參數:

-f  :就是 force 的意思,強制移除;

-i  :互動模式,在刪除前會詢問使用者是否動作

-r  :迭代刪除啊!最常用在目錄的刪除了

 
範例:刪除一個帶有 - 開頭的檔案
[root@linux tmp]# ls *aa*

-rw-r--r--  1 root  root      0 Aug 22 10:52 -aaa-

[root@linux tmp]# rm -aaa-    
rm: invalid option -- a

Try `rm --help' for more information.  <== 因為 "-" 是參數嘛!

[root@linux tmp]# rm ./-aaa-   或  rm -- -aaa-


mv (移動檔案與目錄,或更名)

[root@linux ~]# mv [-fiu] source destination

[root@linux ~]# mv [options] source1 source2 source3 .... directory

參數:

-f  :force 強制的意思,強制直接移動而不詢問;

-i  :若目標檔案 (destination) 已經存在時,就會詢問是否覆蓋!

-u  :若目標檔案已經存在,且 source 比較新,才會更新 (update)

 
# 其實在 Linux 底下還有個有趣的指令,名稱為 rename,該指令則專職進行檔案的更名呢!可以用來更改大量檔案的檔名~可以參閱 man rename!(需要有Perl相关知识)
 

basename, dirname(取得路徑的檔案名稱與目錄名稱)

取得檔名或者是目錄名稱,一般的用途應該是在寫程式的時候,用來判斷用的~

[root@linux ~]# basename /etc/sysconfig/network

network  <== 很簡單!就取得最後的檔名~

[root@linux ~]# dirname /etc/sysconfig/network

/etc/sysconfig  <== 取得的變成目錄名了!
 
2.1.2檔案內容查閱:
常用指令的用途:
  • cat  由第一行開始顯示檔案內容
  • tac  從最後一行開始顯示,可以看出 tac 是 cat 的倒著寫!
  • nl   顯示的時候,順道輸出行號!
  • more 一頁一頁的顯示檔案內容
  • less 與 more 類似,但是比 more 更好的是,它可以往前翻頁!
  • head 只看頭幾行
  • tail 只看尾巴幾行
  • od   以二進位的方式讀取檔案內容!
直接檢視檔案內容:cat/tac/nl
cat (concatenate)
[root@linux ~]# cat [-AEnTv]
參數:

-A  :相當於 -vET 的整合參數,可列出一些特殊字符~

-E  :將結尾的斷行字元 $ 顯示出來;

-n  :列印出行號;

-T  :將 [tab] 按鍵以 ^I 顯示出來;

-v  :列出一些看不出來的特殊字符

範例:
[root@linux ~]# cat /etc/issue
Fedora Core release 4 (Stentz)
Kernel \r on an \m
 
# 在一般的環境中,列印出來的結果在有 [tab] 與空白鍵,其實看不出來,使用 cat -A 時,會將 [tab] 按鍵以 ^I 顯示,而斷行字元也會顯示出來~

# 最特殊的當然就是斷行字元了!這個段行字元在 Linux 與 Windows 是不一樣的。

# 在 Linux 是以 $ 為斷行字元,而在 Windows 則是以 ^M$ 為斷行字元。
cat一般配合more或less一起执行。

tac (反向列示)
[root@linux ~]# tac /etc/issue
 
Kernel \r on an \m
Fedora Core release 4 (Stentz)
# 嘿嘿!與剛剛上面的範例比較,是由最後一行先顯示喔!
 
nl (添加行號列印)
[root@linux ~]# nl [-bnw] 檔案
參數:

-b  :指定行號指定的方式,主要有兩種:

      -b a :表示不論是否為空行,也同樣列出行號;

      -b t :如果有空行,空的那一行不要列出行號;

-n  :列出行號表示的方法,主要有三種:

      -n ln :行號在螢幕的最左方顯示;

      -n rn :行號在自己欄位的最右方顯示,且不加 0 ;

      -n rz :行號在自己欄位的最右方顯示,且加 0 ;

-w  :行號欄位的佔用的位元數。


可翻頁檢視:more/less
more (一頁一頁翻動)
[root@linux ~]# more /etc/man.config
#

# Generated automatically from man.conf.in by the

# configure script.
#
# man.conf from man-1.5p
#
.......中間省略.......
--More--(28%) <== 重點在這一行喔!
可以在最後一行輸入一些有用的指令!在 more 這個程式的運作過程中,你有幾個按鍵可以按的:
  • 空白鍵 (space):代表向下翻一頁;
  • Enter        :代表向下翻『一行』;
  • /字串         :代表在這個顯示的內容當中,向下搜尋『字串』;
  • :f           :立刻顯示出檔名以及目前顯示的行數;
  • q            :代表立刻離開 more ,不再顯示該檔案內容。
less (一頁一頁翻動)
[root@linux ~]# less /etc/man.config
#

# Generated automatically from man.conf.in by the

# configure script.
#
# man.conf from man-1.5p
......中間省略........
:   <== 這裡可以等待您輸入指令!
可以輸入的指令有:
  • 空白鍵     :向下翻動一頁;
  • [pagedown]:向下翻動一頁;
  • [pageup]  :向上翻動一頁;
  • /字串      :向下搜尋『字串』的功能;
  • ?字串      :向上搜尋『字串』的功能;
  • n         :重複前一個搜尋 (與 / 或 ? 有關!)
  • N         :反向的重複前一個搜尋 (與 / 或 ? 有關!)
  • q         :離開 less 這個程式;
 
資料擷取:head/tail (以『行』為單位來進行資料的擷取)
head (取出前面幾行)
[root@linux ~]# head [-n number] 檔案
參數:

-n  :後面接數字,代表顯示幾行的意思

# 預設的情況中,顯示前面十行!
tail (取出後面幾行)
[root@linux ~]# tail [-n number] 檔案
參數:

-n  :後面接數字,代表顯示幾行的意思

# 預設的情況中,顯示最後的十行!
例題:想要顯示 ~/.bashrc 的第 11 到第 20 行?
head –n 20 ~/.bashrc | tail –n 10
 
非純文字檔: od
上面提到的,都是在查閱純文字檔 (ASCII 格式的檔案) 的內容。
可以利用 od 這個指令來讀取binary file的内容:

[root@linux ~]# 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;

範例:

[root@linux ~]# 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

.....中間省略.......
對於工程師來說, od指令可以將 binary file 的內容作一個大致的輸出,他們可以看得出東西的啦~
 
2.1.3修改檔案時間與建置新檔: touch
linux下的每个档案都會記錄三個主要的變動時間:

modification time (mtime):當該檔案的『內容資料』變更時,就會更新這個時間!內容資料指的是檔案的內容,而不是檔案的屬性喔!

status time (ctime):當該檔案的『狀態 (status)』改變時,就會更新這個時間,舉例來說,像是權限與屬性被更改了,都會更新這個時間~

access time (atime):當『該檔案的內容被取用』時,就會更新這個讀取時間 (access)。 舉例來說,我們使用 cat 去讀取 ~/.bashrc ,就會更新 atime 了。

[root@linux ~]# touch [-acdmt] 檔案
參數:

-a  :僅修訂 access time;

-c  :僅修改時間,而不建立檔案;

-d  :後面可以接日期,也可以使用 --date="日期或時間"

-m  :僅修改 mtime ;

-t  :後面可以接時間,格式為[YYMMDDhhmm]

範例:
在預設的狀態下,如果 touch 後面有接檔案,則該檔案的三個時間 (atime/ctime/mtime) 都會更新為目前的時間。若該檔案不存在,則會主動的建立一個新的空的檔案!
 
範例一:修改bashrc 檔案,將日期調整為兩天前

[root@linux tmp]# touch -d "2 days ago" bashrc

# (atime/mtime)变为2天前~但ctime 並沒有跟著改變!
 
範例四:將上個範例的 bashrc 日期改為 2005/07/15 2:02
[root@linux tmp]# touch -t 0507150202 bashrc

[root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc

-rwxr-xr-x  1 root root 395 Jul 15 02:02 bashrc
-rwxr-xr-x  1 root root 395 Jul 15 02:02 bashrc
-rwxr-xr-x  1 root root 395 Jul 19 21:05 bashrc
# 注意看看,日期在 atime 與 mtime 都改變了,但是 ctime 則是記錄目前的時間!

我們平時看的檔案屬性中,比較重要的還是屬於那個 mtime 啊!我們關心的常常是這個檔案的『內容』是什麼時候被更動的說。

touch 這個指令最常被使用的情況是:
  • 建立一個空的檔案;
  • 將某個檔案日期修訂為目前 (mtime 與 atime)
2.1.4檔案與目錄的預設權限與隱藏權限

我們知道一個檔案有若干個屬性,包括 ( r, w, x ) 等基本屬性,及是否為目錄 (d) 與檔案 (-) 或者是連結檔 (l) 等等的屬性!

此外,由於 Linux 還可以設定其他的系統安全屬性,使用 chattr 來設定,而以 lsattr 來查看,最重要的屬性就是可以設定其不可修改的特性!讓連檔案的擁有者都不能進行修改! 這個屬性可是相當重要的,尤其是在安全機制上面 ( security )!--下面会讲到:

檔案預設權限:umask
查阅umask:
[root@linux ~]# umask
0022
[root@linux ~]# umask -S
u=rwx,g=rx,o=rx
在預設權限的屬性上,目錄與檔案是不一樣的。由於檔案我們不希望他具有可執行的權力, 預設情況中,檔案是沒有可執行 (x) 權限的。因此:
  • 若使用者建立為『檔案』則預設『沒有可執行 ( x ) 項目』,亦即只有 rw 這兩個項目,也就是最大為 666 分,預設屬性如下:
    -rw-rw-rw-
  • 若使用者建立為『目錄』,則由於 x 與是否可以進入此目錄有關,因此預設為所有權限均開放,亦即為 777 分,預設屬性如下:
    drwxrwxrwx

那麼 umask 指定的是『該預設值需要減掉的權限!』以umask 為 0022来说明 ,所以 user 並沒有被拿掉屬性,不過 group 與 others 的屬性被拿掉了 2 ( 也就是 w 這個屬性 ),那麼由於當使用者:

  • 建立檔案時:(-rw-rw-rw-) – (-----w--w-) ==> -rw-r--r--
  • 建立目錄時:(drwxrwxrwx) – (d----w--w-) ==> drwxr-xr-x
設定 umask:
[root@linux ~]# umask 0002或002
關於預設 umask 的設定可以參考 /etc/bashrc 這個檔案的內容,不過,不建議修改該檔案。
 
檔案隱藏屬性:

隱藏的屬性於系統有很大的幫助的~ 尤其是在系統安全 (Security) 上面:

chattr (設定檔案隱藏屬性)
[root@linux ~]# chattr [+-=][ASacdistu] 檔案或目錄名稱
參數:

+   :增加某一個特殊參數,其他原本存在參數則不動。

-   :移除某一個特殊參數,其他原本存在參數則不動。

=   :設定一定,且僅有後面接的參數

 

A  :當設定了 A 這個屬性時,這個檔案(或目錄)的存取時間 atime (access)

     將不可被修改,可避免例如手提式電腦容易有磁碟 I/O 錯誤的情況發生!

S  :這個功能有點類似 sync 的功能!就是會將資料同步寫入磁碟當中!

     可以有效的避免資料流失!

a  :當設定 a 之後,這個檔案將只能增加資料,而不能刪除,只有 root

     才能設定這個屬性。

c  :這個屬性設定之後,將會自動的將此檔案『壓縮』,在讀取的時候將會自動解壓縮,但是在儲存的時候,將會先進行壓縮後再儲存(看來對於大檔案似乎蠻有用的!)

d  :當dump(備份)程序被執行的時候,設定 d 屬性將可使該檔案(或目錄)不具有dump功能

i  :這個 i 可就很厲害了!他可以讓一個檔案『不能被刪除、改名、設定連結、也無法寫入或新增資料!』對於系統安全性有相當大的助益!

j  :當使用 ext3 這個檔案系統格式時,設定 j 屬性將會使檔案在寫入時先記錄在 journal 中!但是當 filesystem 設定參數為 data=journalled 時,由於已經設定了日誌了,所以這個屬性無效!

s  :當檔案設定了 s 參數時,他將會被完全的移除出這個硬碟空間。

u  :與 s 相反的,當使用 u 來設定檔案時,則資料內容其實還存在磁碟中,

     可以使用來 undeletion.

注意:這個屬性設定上面,比較常見的是 a 與 i 的設定值,而且很多設定值必須要身為root 才能夠設定的喔!
範例:
[root@linux ~]# cd /tmp
[root@linux tmp]# touch attrtest
[root@linux tmp]# chattr +i attrtest
[root@linux tmp]# rm attrtest

rm: remove write-protected regular empty file `attrtest'? y

rm: cannot remove `attrtest': Operation not permitted

# 看到了嗎?連 root 也沒有辦法將這個檔案刪除呢!趕緊解除設定!
[root@linux tmp]# chattr -i attrtest

這這個指令是重要的,尤其是在系統的安全性上面!由於這些屬性是隱藏的性質,所以需要以 lsattr 才能看到該屬性呦!其中,個人認為最重要的當屬 +i 這個屬性了,因為他可以讓一個檔案無法被更動,對於需要強烈的系統安全的人來說,真是相當的重要的!裡頭還有相當多的屬性是需要 root 才能設定的呢!此外,如果是 log file 這種的登錄檔,就更需要 +a 這個可以增加,但是不能修改舊有的資料與刪除的參數了!

lsattr (顯示檔案隱藏屬性)
[root@linux ~]# lsattr [-aR] 檔案或目錄
參數:
-a :將隱藏檔的屬性也秀出來;
-R :連同子目錄的資料也一併列出來!
範例:
[root@linux tmp]# chattr +aij attrtest
[root@linux tmp]# lsattr
----ia---j--- ./attrtest

使用 chattr 設定後,可以利用 lsattr 來查閱隱藏的屬性。不過, 這兩個指令在使用上必須要特別小心,否則會造成很大的困擾。例如:某天你心情好,突然將 /etc/shadow 這個重要的密碼記錄檔案給他設定成為具有 i 的屬性,那麼過了若干天之後, 你突然要新增使用者,卻一直無法新增!別懷疑,趕快去將 i 的屬性拿掉吧!

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

[root@linux ~]# ls -ld /tmp ; ls -l /usr/bin/passwd

drwxrwxrwt  5 root root 4096 Jul 20 10:00 /tmp

-r-s--x--x  1 root root 18840 Mar  7 18:06 /usr/bin/passwd

·  Set UID

會製作出 s 與 t 的權限,是為了讓一般使用者在執行某些程式的時候,能夠暫時的具有該程式擁有者的權限,即程序的有效群组为该程式的拥有者。

SUID 僅可用在『二進位制檔案(binary file)』上,不能夠用在批次檔 (shell script) 上面!當然,SUID 對於目錄也是無效的~。

·  Set GID

進一步來說,如果 s 的權限是在 group 時,那麼就是 Set GID ,簡稱為 SGID。

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

目錄:如果 SGID 是設定在 A 目錄上面,則在該 A 目錄內所建立的檔案或目錄的 group ,將會是 此 A 目錄的 group !
一般來說, SGID 應該是比較多用在特定的多人團隊的專案開發上。

·  Sticky Bit

這個 Sticky Bit 目前只針對目錄有效,對於檔案已經沒有效果了。 SBit 對於目錄的作用是:『在具有 SBit 的目錄下,使用者若在該目錄下具有 w 及 x 的權限, 則當使用者在該目錄下建立檔案或目錄時,只有檔案擁有者與 root 才有權力刪除』。
舉例來說,我們的 /tmp 本身的權限是『drwxrwxrwt』, 在這樣的權限內容下,任何人都可以在 /tmp 內新增、修改檔案,但僅有該檔案/目錄建立者與 root 能夠刪除自己的目錄或檔案。
 

·  SUID/SGID/SBIT 權限設定

通常我們使用 chmod xyz filename 的方式來設定 filename 的屬性時,則是假設沒有 SUID, SGID 及 Sticky bit!如果以 chmod wxyz filename来设定就可以设置SUID,SGID和Sticky bit了!
  • 4 為 SUID
  • 2 為 SGID
  • 1 為 Sticky bit
『-rwsr-xr-x』 :『 chmod 4755 filename 』來設定!其他类似

[root@linux tmp]# chmod 7666 test; ls -l test

-rwSrwSrwT  1 root root 0 Jul 20 11:27 test
# 這個例子就要特別小心啦!怎麼會出現大寫的 S 與 T 呢?不都是小寫的嗎?
# 因為 s 與 t 都是取代 x 這個參數的,但是你有沒有發現阿,我們是下達
# 7666 喔!也就是說, user, group 以及 others 都沒有 x 這個可執行的標誌
# ( 因為 666 嘛! ),所以,這個 S, T 代表的就是『空的』啦!怎麼說?
# SUID 是表示『該檔案在執行的時候,具有檔案擁有者的權限』,但是檔案
# 擁有者都無法執行了,哪裡來的權限給其他人使用?當然就是空的啦!
 
檔案類型:file
想要知道某個檔案的基本資料,例如是屬於 ASCII 或者是 data 檔案,或者是 binary , 且其中有沒有使用到動態函式庫 (share library) 等等的資訊,就可以利用 file 這個指令來檢閱!:
[root@linux ~]# file ~/.bashrc
/root/.bashrc: ASCII text  <== 告訴我們是 ASCII 的純文字檔啊!

[root@linux ~]# file /usr/bin/passwd

/usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped

# 資料可多了~包括這個 Set UID 2的檔案,使用 shared libs,

# 適合於 Intel 的 386 以上機種的硬體,很清楚吧!

[root@linux ~]# file /var/lib/slocate/slocate.db

/var/lib/slocate/slocate.db: data  <== 這是 data 檔案!
 
檔案的搜尋:
通常我們都是先使用 whereis 或者是 locate 來檢查,如果真的找不到了,才以 find 來搜尋呦!為什麼呢?因為 whereis 與 locate 是利用資料庫來搜尋資料,所以相當的快速,而且並沒有實際的搜尋硬碟,比較省時間

which (尋找『執行檔』)

[root@linux ~]# which [-a] command
參數:
-a :將所有可以找到的指令均列出,而不止第一個被找到的指令名稱
範例:
[root@linux ~]# which passwd
/usr/bin/passwd
[root@linux ~]# which traceroute -a
/usr/sbin/traceroute
/bin/traceroute

這個指令是根據『PATH』這個環境變數所規範的路徑,去搜尋『執行檔』的檔名~ 所以,重點是找出『執行檔』!且 which 後面接的是『完整檔名』!

 
whereis (尋找特定檔案)

[root@linux ~]# whereis [-bmsu] 檔案或目錄名

參數:
-b    :只找 binary 的檔案
-m    :只找在說明檔 manual 路徑下的檔案

-s    :只找 source 來源檔案

-u    :沒有說明檔的檔案!

範例:
[root@linux ~]# whereis passwd

passwd: /usr/bin/passwd /etc/passwd /etc/passwd.OLD

/usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

# 任何與 passwd 有關的檔名都會被列出來~
 
[root@linux ~]# whereis -b passwd

passwd: /usr/bin/passwd /etc/passwd /etc/passwd.OLD

 
[root@linux ~]# whereis -m passwd

passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

Linux 系統會將系統內的所有檔案都記錄在一個資料庫檔案裡面, 而當使用 whereis 或者locate 時,都會以此資料庫檔案的內容為準。

基本上 Linux 每天會針對 Linux 主機上所有檔案的所在進行搜尋資料庫的更新, 更新的程式就是 updatedb(/usr/bin/updatedb)。

 
locate
[root@linux ~]# locate filename
[root@linux ~]# locate passwd
/lib/security/pam_passwdqc.so
/lib/security/pam_unix_passwd.so
/usr/lib/kde3/kded_kpasswdserver.so
/usr/lib/kde3/kded_kpasswdserver.la
.......中間省略.......
直接在後面輸入『檔案的部分名稱』後,就能夠得到結果。 舉上面的例子來說,我輸入 locate passwd ,那麼在完整檔名 (包含路徑名稱) 當中,只要有 passwd 在其中, 就會被顯示出來!這也是個很方便好用的指令,如果您忘記某個檔案的完整檔名時~~
因為他是經由資料庫來搜尋的,所以當您新建立起來的檔案, 卻還在資料庫更新之前搜尋該檔案,那麼 locate 會告訴您『找不到!』!因為必須要更新資料庫!


find

[root@linux ~]# find [PATH] [option] [action]

參數:
1. 與時間有關的參數:

   -atime n :n 為數字,意義為在 n 天之前的『一天之內』被 access 過的檔案;

   -ctime n :n 為數字,意義為在 n 天之前的『一天之內』被 change 過狀態的檔案;

   -mtime n :n 為數字,意義為在 n 天之前的『一天之內』被 modification 過的檔案;

   -newer file :file 為一個存在的檔案,意思是說,只要檔案比 file 還要新,就會被列出來~

2. 與使用者或群組名稱有關的參數:

   -uid n :n 為數字,這個數字是使用者的帳號 ID,亦即 UID ,這個 UID 是記錄在/etc/passwd 裡面與帳號名稱對應的數字。

   -gid n :n 為數字,這個數字是群組名稱的 ID,亦即 GID,這個 GID 記錄在/etc/group。

   -user name :name 為使用者帳號名稱喔!例如 benben

   -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.... 的屬性存在!
4. 額外可進行的動作:

   -exec command :command 為其他指令,-exec 後面可再接額外的指令來處理搜尋到

                   的結果。

   -print        :將結果列印到螢幕上,這個動作是預設動作!

範例:
範例一:將過去系統上面 24 小時內有更動過內容 (mtime) 的檔案列出
[root@linux ~]# find / -mtime 0
# 那個 0 是重點!0 代表目前的時間,所以,從現在開始到 24 小時前,
# 有變動過內容的檔案都會被列出來!那如果是三天前的 24 小時內?
# find / -mtime 3 ,意思是說今天之前的 3*24 ~ 4*24 小時之間

# 有變動過的檔案都被列出的意思!同時 -atime 與 -ctime 的用法相同。

 
範例二:尋找 /etc 底下的檔案,如果檔案日期比 /etc/passwd 新就列出

[root@linux ~]# find /etc -newer /etc/passwd

# -newer 用在分辨兩個檔案之間的新舊關係是很有用的!
 
範例三:搜尋 /home 底下屬於 benben 的檔案
[root@linux ~]# find /home -user benben
# 這個東西也很有用的~當我們要找出任何一個使用者在系統當中的所有檔案時,
# 就可以利用這個指令將屬於某個使用者的所有檔案都找出來喔!
 
範例四:搜尋系統中不屬於任何人的檔案
[root@linux ~]# find / -nouser
# 透過這個指令,可以輕易的就找出那些不太正常的檔案。
# 如果有找到不屬於系統任何人的檔案時,不要太緊張,
# 那有時候是正常的~尤其是您曾經以原始碼自行編譯軟體時。

範例五:找出檔名為 passwd 這個檔案
[root@linux ~]# find / -name passwd
# 利用這個 -name 可以搜尋檔名啊!
 
範例六:搜尋檔案屬性為 f (一般檔案) 的檔案
[root@linux ~]# find /home -type f
# 這個 -type 的屬性也很有幫助喔!尤其是要找出那些怪異的檔案,例如 socket 與 FIFO 檔案,可以用 find /var -type p 或 -type s 來找!
 

範例七:搜尋檔案當中含有 SGID/SUID/SBIT 的屬性

[root@linux ~]# find / -perm +7000
# 所謂的 7000 就是 ---s--s--t ,那麼只要含有 s 或 t 的就列出,
# 所以當然要使用 +7000 ,使用 -7000 表示要含有 ---s--s--t 的所有三個權限,
# 因此,就是 +7000 ~understand?
 
範例八:將上個範例找到的檔案使用 ls -l 列出來~

[root@linux ~]# find / -perm +7000 -exec ls -l {} \;

# 注意到,那個 -exec 後面的 ls -l 就是額外的指令,
# 而那個 {} 代表的是『由 find 找到的內容』的意思~所以, -exec ls -l {}

# 就是將前面找到的那些檔案以 ls -l 列出長的資料!至於 \; 則是表示 -exec 的指令到此為止的意思~也就是說,-exec 最後一定要以 \; 結束才行!

 
範例九:找出系統中,大於 1MB 的檔案
[root@linux ~]# find / -size +1000k   或
[root@linux ~]# find / -size +M

find 在找尋特殊的檔案屬性,以及特殊的檔案權限 (SUID/SGID等等) 時, 是相當有用的工具程式之一!


上面这些内容是Linux使用和管理的基础中的基础,一定要细心掌握,不过多查阅资料多和朋友交流,当然最主要的是自己动手把每一个命令都敲1遍,印象是最为深刻的哦^_^。

#----------------------------结束---------------------------------------#

发表于: 2007-07-22 ,修改于: 2007-07-23 11:16,已浏览353次,有评论0条 推荐 投诉


网友评论

发表评论