接續上次講的檔案權限。

【特殊權限】


一般檔案的權限雖然可以表示成如 755 等型式,但其完整權限應該是 0755。這邊要討論的是特殊權限的部分。

真正的密碼檔路徑在 /etc/shadow,這個檔案不能讀、但是我們更改密碼時可以寫入,因此這指涉特殊權限。

特殊權限有以下:

setuid = r = 4  (對目錄而言無效果)
setgid = w = 2
stickybit = x = 1   (對檔案而言無效果)

對檔案來講,setuid 的作用是:當檔案設此權限後,一般使用者執行此檔案時,會以擁有者的權限執行。例如對 abc.bin 設定此權限後,原本的在使用者權限欄位的 x 權限會變成 s。

以 /usr/bin/passwd 為例,其權限為 rwsr-xr-x,使用者權限中的 s 表示 suid 屬性,亦即為 chmod 4755。若前述的 S 為大寫時,則表示該欄位無 x 權限,亦即為 chmod 4655。

若有一檔案的權限是 rwxr-sr-x,其 setgid 權限即為中間三碼的 r-s,其權限就是 2745。

若將一個目錄設定了 setgid,該目錄下所有新增檔案的權限將為相同的 sgid 屬性(現有檔案不受影響)。sgid 可以維持群組的一致性,讓該目錄下的群組權限都相同,方便同一群組中的使用者共同存取檔案,不過實務上一般很少用,通常會搭配其他的權限控管方式。

stickybit 是一個特殊的權限,僅對目錄有效、對檔案無影響,可以參考 /tmp 目錄的權限設定:
  $ ls -ld /tmp
  drwxrwxrwt 6 root root 4096 2008-06-07 19:39 /tmp

任何人都可以在此權限的資料夾中新增檔案,但刪除者僅限 root、目錄擁有者(在此例中目錄擁有者同時也是 rott)、檔案擁有者。

在 /tmp 的權限 rwxrwxrwt 中,該權限為 1777;若權限為 rwxrwxrwT 則為 1776。

特殊權限必須以四碼的形式設定,且僅有 root 可設定。



【Shell Script】


BASH 的語法和一般寫程式的語法不盡相同(幾乎跟 perl 完全相反?),不要花太多時間去管它。XD

由 /etc/passwd 中最後一個欄位分配各個使用者預設的 shell。config 讀取的順序依序是:(1) /etc/profile (2) ~/.bash_profile


alias:
shell 可以簡化長的指令成為另一個指令,例如常使用 ls -l / 查詢目錄下所有檔案時,可以把它簡化為 alias ll='ls -l',以後只要輸入 ll 就可以得到與 ls -l 相同的結果。須注意的是,alias 後設定的等號前後不可有空白,例如 alias ll = 'ls -l' 就是錯誤的設定範例。

這個別名設定的有效期限僅有此次登入,登出後就沒有效了,若要它長久有效,必須把這行 alias 加在 ~/.bash_profile 的檔尾,而且設定後得登出再登入才會生效。


variable:
shell 中也支援簡單的變數使用,例如以下:
  $ username='test'
  $ echo $username

第一行表示將字串 test 指定給變數 username,第二行 echo 則是將變數內容印出,須注意要在變數名稱前加上錢字號 ($)。

也可以把時間變數丟進來:
  $ now=`date`
  $ echo $now

這樣就會把現在時間寫入變數 now 中。這個變數可以運用在批次檔設定中,例如每天產生以時間為檔名的 log 檔等等。



幾個快速鍵:
Ctrl-A:將游標移到該行開頭
Ctrl-E:將游標移到該行結尾
Ctrl-U:刪除現在游標位置到開頭這段的字元
Ctrl-K:刪除現在游標位置到結尾這段的字元


process:
下 bash 後會 fork 生出子行程,對子行程做動作,完成後系統提示字元會再出現。例如執行以下:
  $ find /

按下 enter 後子行程即開始列出所有檔案,執行結束後才會把主控權還給 bash。

又或者下 pstree(如果無此指令可以 aptitude install psmisc),會印出目前系統所執行的行程,可以看出目前的各個子行程的階層狀態。

變數分為全域變數 (global variable) 和區域變數 (local variable)。若是前者,所有的子行程都會認得這個變數;後者的話只能在宣告時的行程才能使用該變數,僅存在獨一的行程中。

來測試一下全域變數與區域變數,先編輯檔案 test.sh,內容如下:
#!/bin/bash
echo $username

依以下過程執行:
  $ chmod +x test.sh
  $ username=willie
  $ ./test.sh
  $ echo $username

此時由於是區域變數,因此無法印出,把第二行改成 export username=willie 才能夠印出。
arrow
arrow
    全站熱搜

    小攻城師 發表在 痞客邦 留言(0) 人氣()