[Linux] Linux learning note 檔案與目錄管理

chattr - 設定檔案或目錄隱藏屬性
  • usage : chattr [+-=] [attribute] 檔案 or 目錄名稱
  • attribute
    • a : 設定此檔案只能增加資料,不能刪除也不能修改資料,只有root才能設定此屬性
    • i : 讓檔案不能被刪除、改名、設定連結也無法寫入或新增資料,只有 root 能設定此屬性
    • S : 進行任何檔案的修改,該更動會同步寫入磁碟中
  • 選項
    • + : 增加特殊屬性
    • - : 移除特殊屬性
    • = : 設定一定只有此屬性
lsattr - 顯示檔案或目錄隱藏屬性

  • usage : lsattr [-adR] 檔案或目錄名稱
  • 選項
    • -a : 顯示隱藏檔的屬性
    • -d : 如果接的是目錄,僅列出目錄本身的屬性而非目錄內的檔名
    • -R : 連同子目錄的資料也一併列出來
  • 範例 
    • [root@www tmp]# chattr +aij attrtest
    • [root@www tmp]# lsattr attrtest
    • ----ia---j--- attrtest

SUID - Set UID

  • /usr/bin/passwd 這個檔案的權限狀態: -rwsr-xr-x , 此時就被稱為 Set UID,簡稱為 SUID 的特殊權限
  • SUID 權限僅對二進位程式(binary program)有效
  • 執行者對於該程式需要具有 x 的可執行權限
  • 本權限僅在執行該程式的過程中有效 (run-time)
  • 執行者將具有該程式擁有者 (owner) 的權限
  • 鳥哥範例
    •  Linux 系統中,所有帳號的密碼都記錄在 /etc/shadow 這個檔案裡面,這個檔案的權限為:『-r-------- 1 root root』,意思是這個檔案僅有root可讀且僅有root可以強制寫入而已。 既然這個檔案僅有 root 可以修改,那麼鳥哥的 vbird 這個一般帳號使用者能否自行修改自己的密碼呢? 你可以使用你自己的帳號輸入『passwd』這個指令來看看,嘿嘿!一般使用者當然可以修改自己的密碼了!
    • 唔!有沒有衝突啊!明明 /etc/shadow 就不能讓 vbird 這個一般帳戶去存取的,為什麼 vbird 還能夠修改這個檔案內的密碼呢? 這就是 SUID 的功能啦!藉由上述的功能說明,我們可以知道vbird 對於 /usr/bin/passwd 這個程式來說是具有 x 權限的,表示 
      • vbird 能執行passwd
      • passwd 的擁有者是 root 這個帳號
      • vbird 執行 passwd 的過程中,會『暫時』獲得 root 的權限
      • /etc/shadow 就可以被 vbird 所執行的 passwd 所修改
    • 但如果 vbird 使用 cat 去讀取 /etc/shadow 時,他能夠讀取嗎?
      • 因為 cat 不具有 SUID 的權限,所以 vbird 執行 『cat /etc/shadow』 時,是不能讀取 /etc/shadow 的。

SGID - Set GID

  • s 在群組的 x 時則稱為 Set GID
  • 與 SUID 不同的是,SGID 可以針對檔案或目錄來設定
  • 是對檔案來說, SGID 有如下的功能
    • SGID 對二進位程式有用
    • 程式執行者對於該程式來說,需具備 x 的權限
    • 執行者在執行的過程中將會獲得該程式群組的支援
  • 對於目錄而言,SGID有以下的功能
    • 使用者若對於此目錄具有 r 與 x 的權限時,該使用者能夠進入此目錄
    • 使用者在此目錄下的有效群組(effective group)將會變成該目錄的群組
    • 若使用者在此目錄下具有 w 的權限(可以新建檔案),則使用者所建立的新檔案,該新檔案的群組與此目錄的群組相同
Sticky Bit
  • Sticky Bit, SBIT 目前只針對目錄有效
  • 當使用者對於此目錄具有 w, x 權限,亦即具有寫入的權限時;
    • 當使用者在該目錄下建立檔案或目錄時,僅有自己 root 才有權力刪除該檔
    • 換句話說:當甲這個使用者在 A 目錄是具有群組或其他人的身份並且擁有該目錄 w 的權限, 這表示『甲使用者對該目錄內任何人建立的目錄或檔案均可進行 "刪除/更名/搬移" 等動作。』 不過,如果將 A 目錄加上了 SBIT 的權限項目時, 則甲只能夠針對自己建立的檔案或目錄進行刪除/更名/移動等動作,而無法刪除他人的檔案
SUID/SGID/SBIT 權限設定
  • 數字型態更改權限的方式為『三個數字』的組合, 那麼如果在這三個數字之前再加上一個數字的話,最前面的那個數字就代表這幾個權限了
    • 4 為 SUID
    • 2 為 SGID
    • 1 為 SBIT
  • 假設要將一個檔案權限改為『-rwsr-xr-x』時,由於 s 在使用者權限中,所以是 SUID ,因此, 在原先的 755 之前還要加上 4 ,也就是:『 chmod 4755 filename 』來設定
  • 範例
    • # 設定權限成為 -rws--x--x 的模樣:
    • [root@www tmp]# chmod u=rwxs,go=x test; ls -l test
      -rws--x--x 1 root root 0 Aug 18 23:47 test

      # 承上,加上 SGID 與 SBIT 在上述的檔案權限中
      [root@www tmp]# chmod g+s,o+t test; ls -l test
      -rws--s--t 1 root root 0 Aug 18 23:47 test
    • [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為大寫?
        • 因為給此檔案test的權限為7666,代表不含x的權限,user、group跟other都沒有可執行的權限,所以大寫的S跟T代表「空的」
        • SUID 是表示『該檔案在執行的時候,具有檔案擁有者的權限』,但是檔案 擁有者都無法執行了,哪裡來的權限給其他人使用,也就是空的啦
file - 顯示檔案的類型
  • 範例
    • [root@www ~]# file ~/.bashrc
    • /root/.bashrc: ASCII text <== ASCII 的純文字檔
  • 範例2
    • [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 的動態函式庫連結等等。
  • 範例3
    • [root@www ~]# file /var/lib/mlocate/mlocate.db
    • /var/lib/mlocate/mlocate.db: data <== 這是 data 檔案
檔名的搜尋
  • which - 尋找執行檔
    • usage : which [-a] 指令
    • -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為bash內建的指令!
  • whereis - 尋找特定檔案
    • usage : 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
  • locate
    • usage : find [-ir] keyword
    • 選項
      • -i  :忽略大小寫的差異;
      • -r  :後面可接正規表示法的顯示方式
    • 範例一:找出系統中所有與 passwd 相關的檔名
    • [root@www ~]# locate passwd
      /etc/passwd
      /etc/passwd-
      /etc/news/passwd.nntp
      /etc/pam.d/passwd
      ....(底下省略)....
    • locate 尋找的資料是由『已建立的資料庫 /var/lib/mlocate/』裡面的資料所搜尋到的
    • 當你新建立起來的檔案, 卻還在資料庫更新之前搜尋該檔案,那麼 locate 會告訴你『找不到!』
    • 更新 locate 資料庫的方法非常簡單,直接輸入『 updatedb 』就可以了! updatedb 指令會去讀取 /etc/updatedb.conf 這個設定檔的設定,然後再去硬碟裡面進行搜尋檔名的動作, 最後就更新整個資料庫檔案!因為 updatedb 會去搜尋硬碟,所以當你執行 updatedb 時,可能會等待數分鐘的時間!
  • find 
    • usage : find [PATH] [option] [action]
    • option 1 : 與時間有關的選項
      • 共有 -atime, -ctime 與 -mtime ,以 -mtime 說明
      • -mtime  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 用在分辨兩個檔案之間的新舊關係是很有用的!
    圖5.2.1、find 相關的時間參數意義
    • 圖中最右邊為目前的時間,越往左邊則代表越早之前的時間軸啦。由圖5.2.1我們可以清楚的知道:
    • +4代表大於等於5天前的檔名:ex> find /var -mtime +4
    • -4代表小於等於4天內的檔案檔名:ex> find /var -mtime -4
    • 4則是代表4-5那一天的檔案檔名:ex> find /var -mtime 4
    • option 2 - 與使用者或群組名稱有關的選項
      •    -uid n :n 為數字,是使用者的帳號 ID,即 UID ,這個 UID 是記在etc/passwd 裡面與帳號名稱對應的數字。
      •    -gid n :n 為數字,是群組名稱的 ID,亦即 GID,這個 GID 記在/etc/group
      •    -user namename 為使用者帳號名稱!例如 dmtsai 
      •    -group namename 為群組名稱,例如 users ;
      •    -nouser    :尋找檔案的擁有者不存在 /etc/passwd 的人!
      •    -nogroup   :尋找檔案的擁有群組不存在於 /etc/group 的檔案!當你自行安裝軟體時,很可能該軟體的屬性當中並沒有檔案擁有者,這是可能的!在這個時候,就可以使用 -nouser 與 -nogroup 搜尋。
    • 範例三:搜尋 /home 底下屬於 vbird 的檔案
    • [root@www ~]# find /home -user vbird
      # 這個東西也很有用的~當我們要找出任何一個使用者在系統當中的所有檔案時,
      # 就可以利用這個指令將屬於某個使用者的所有檔案都找出來喔!
    • 範例四:搜尋系統中不屬於任何人的檔案
    • [root@www ~]# find / -nouser
      # 透過這個指令,可以輕易的就找出那些不太正常的檔案。
      # 如果有找到不屬於系統任何人的檔案時,不要太緊張,
      # 那有時候是正常的~尤其是你曾經以原始碼自行編譯軟體時
    • optin 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 的所有三個權限
    • 選項與參數:
    • option 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
    • # 雖然在 man page 提到可以使用 M 與 G 分別代表 MB 與 GB


    • find 的特殊功能就是能夠進行額外的動作(action)。我們將範例八的例子以圖解來說明如下:
      圖5.2.2、find 相關的額外動作

      該範例中特殊的地方有 {} 以及 \; 還有 -exec 這個關鍵字,這些東西的意義為:
      {} 代表的是『由 find 找到的內容』,如上圖所示,find 的結果會被放置到 {} 位置中;
      -exec 一直到 \; 是關鍵字,代表 find 額外動作的開始 (-exec) 到結束 (\;) 在這中間的就是 find 指令內的額外動作。 在本例中就是『 ls -l {} 』囉!
      因為『 ; 』在 bash 環境下是有特殊意義的,因此利用反斜線來跳脫。
  • 一、讓使用者能進入某目錄成為『可工作目錄』的基本權限為何
    • 可使用的指令:例如 cd 等變換工作目錄的指令;
    • 目錄所需權限:使用者對這個目錄至少需要具有 x 的權限
    • 額外需求:如果使用者想要在這個目錄內利用 ls 查閱檔名,則使用者對此目錄還需要 r 的權限。
  • 二、使用者在某個目錄內讀取一個檔案的基本權限為何
    • 可使用的指令:例如本章談到的 cat, more, less等等
    • 目錄所需權限:使用者對這個目錄至少需要具有 x 權限;
    • 檔案所需權限:使用者對檔案至少需要具有 r 的權限才行!
  • 三、讓使用者可以修改一個檔案的基本權限為何
    • 可使用的指令:例如 nano 或未來要介紹的 vi 編輯器等;
    • 目錄所需權限:使用者在該檔案所在的目錄至少要有 x 權限;
    • 檔案所需權限:使用者對該檔案至少要有 r, w 權限
  • 四、讓一個使用者可以建立一個檔案的基本權限為何
    • 目錄所需權限:使用者在該目錄要具有 w,x 的權限重點在 w
  • 五、讓使用者進入某目錄並執行該目錄下的某個指令之基本權限為何
    • 目錄所需權限:使用者在該目錄至少要有 x 的權限
    • 檔案所需權限:使用者在該檔案至少需要有 x 的權限

留言

這個網誌中的熱門文章

[MySQL] schema 與資料類型優化

[翻譯] 介紹現代網路負載平衡與代理伺服器