[Linux] Linux learning note 檔案與目錄管理
chattr - 設定檔案或目錄隱藏屬性
SUID - Set UID
SGID - Set GID
- usage : chattr [+-=] [attribute] 檔案 or 目錄名稱
- attribute
- a : 設定此檔案只能增加資料,不能刪除也不能修改資料,只有root才能設定此屬性
- i : 讓檔案不能被刪除、改名、設定連結也無法寫入或新增資料,只有 root 能設定此屬性
- S : 進行任何檔案的修改,該更動會同步寫入磁碟中
- 選項
- 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, SBIT 目前只針對目錄有效
- 當使用者對於此目錄具有 w, x 權限,亦即具有寫入的權限時;
- 當使用者在該目錄下建立檔案或目錄時,僅有自己與 root 才有權力刪除該檔
- 換句話說:當甲這個使用者在 A 目錄是具有群組或其他人的身份,並且擁有該目錄 w 的權限, 這表示『甲使用者對該目錄內任何人建立的目錄或檔案均可進行 "刪除/更名/搬移" 等動作。』 不過,如果將 A 目錄加上了 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 <==建立一個測試用空檔
- 為什麼此處的S跟T為大寫?
- 因為給此檔案test的權限為7666,代表不含x的權限,user、group跟other都沒有可執行的權限,所以大寫的S跟T代表「空的」
- SUID 是表示『該檔案在執行的時候,具有檔案擁有者的權限』,但是檔案 擁有者都無法執行了,哪裡來的權限給其他人使用,也就是空的啦
[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
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
- 範例3
- [root@www ~]# file /var/lib/mlocate/mlocate.db /var/lib/mlocate/mlocate.db: data <== 這是 data 檔案
(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 的動態函式庫連結等等。
檔名的搜尋
- which - 尋找執行檔
- usage : which [-a] 指令
- -a : 將所有由 PATH 路徑中可以找到的指令均列出,而不止第一個被找到的指令名稱
- 範例一:分別用root與一般帳號搜尋 ifconfig 這個指令的完整檔名 [root@www ~]# which ifconfig
- 範例二:用 which 去找出 which 的檔名為何? [root@www ~]# which which
- 範例三:請找出 cd 這個指令的完整檔名 [root@www ~]# which cd
- whereis - 尋找特定檔案
- usage : whereis [-bmsu] 檔案或目錄名
- -b :只找 binary 格式的檔案
- -m :只找在說明檔 manual 路徑下的檔案
- -s :只找 source 來源檔案
- -u :搜尋不在上述三個項目當中的其他特殊檔案
- 範例一:請用不同的身份找出 ifconfig 這個檔名 [root@www ~]# whereis ifconfig
- 範例二:只找出跟 passwd 有關的『說明文件』檔名(man page) [root@www ~]# whereis -m passwd
- locate
- usage : find [-ir] keyword
- 選項
- -i :忽略大小寫的差異;
- -r :後面可接正規表示法的顯示方式
- 範例一:找出系統中所有與 passwd 相關的檔名 [root@www ~]# locate 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 用在分辨兩個檔案之間的新舊關係是很有用的!
/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
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot '
/usr/bin/which
# 竟然會有兩個 which ,其中一個是 alias 這玩意兒呢!那是啥?
# 那就是所謂的『命令別名』,意思是輸入 which 會等於後面接的那串指令啦!
# 更多的資料我們會在 bash 章節中再來談的!
/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內建的指令!
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: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
/etc/passwd
/etc/passwd-
/etc/news/passwd.nntp
/etc/pam.d/passwd
....(底下省略)....
圖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 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
- 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
- 一、讓使用者能進入某目錄成為『可工作目錄』的基本權限為何:
- 可使用的指令:例如 cd 等變換工作目錄的指令;
- 目錄所需權限:使用者對這個目錄至少需要具有 x 的權限
- 額外需求:如果使用者想要在這個目錄內利用 ls 查閱檔名,則使用者對此目錄還需要 r 的權限。
# 這個東西也很有用的~當我們要找出任何一個使用者在系統當中的所有檔案時,
# 就可以利用這個指令將屬於某個使用者的所有檔案都找出來喔!
# 透過這個指令,可以輕易的就找出那些不太正常的檔案。
# 如果有找到不屬於系統任何人的檔案時,不要太緊張,
# 那有時候是正常的~尤其是你曾經以原始碼自行編譯軟體時
find 的特殊功能就是能夠進行額外的動作(action)。我們將範例八的例子以圖解來說明如下:
圖5.2.2、find 相關的額外動作
該範例中特殊的地方有 {} 以及 \; 還有 -exec 這個關鍵字,這些東西的意義為:
{} 代表的是『由 find 找到的內容』,如上圖所示,find 的結果會被放置到 {} 位置中;
-exec 一直到 \; 是關鍵字,代表 find 額外動作的開始 (-exec) 到結束 (\;) ,在這中間的就是 find 指令內的額外動作。 在本例中就是『 ls -l {} 』囉!
因為『 ; 』在 bash 環境下是有特殊意義的,因此利用反斜線來跳脫。
- 二、使用者在某個目錄內讀取一個檔案的基本權限為何?
- 可使用的指令:例如本章談到的 cat, more, less等等
- 目錄所需權限:使用者對這個目錄至少需要具有 x 權限;
- 檔案所需權限:使用者對檔案至少需要具有 r 的權限才行!
- 三、讓使用者可以修改一個檔案的基本權限為何?
- 可使用的指令:例如 nano 或未來要介紹的 vi 編輯器等;
- 目錄所需權限:使用者在該檔案所在的目錄至少要有 x 權限;
- 檔案所需權限:使用者對該檔案至少要有 r, w 權限
- 四、讓一個使用者可以建立一個檔案的基本權限為何?
- 目錄所需權限:使用者在該目錄要具有 w,x 的權限,重點在 w !
- 五、讓使用者進入某目錄並執行該目錄下的某個指令之基本權限為何?
- 目錄所需權限:使用者在該目錄至少要有 x 的權限
- 檔案所需權限:使用者在該檔案至少需要有 x 的權限
留言
張貼留言