用戶與權限


操作範例

  1. UNIX 系統如何將同一部機器上的硬碟儲存空間分給很多使用者用, 又讓每個人保有自己的檔案, 不被別人看到甚至修改? 每個檔案的主人 (owner) 可以用 chmod 命令來開放或關閉該檔案的權限給別人. 先看看自己是誰: whoami
  2. 看看系統內所有使用者的家: cd ~/.. ; ls -l | less 第三欄與第四欄就是擁有該檔案的主人與群 (group). 第一欄最左邊的字母代表檔案形態; 剩下 9 個字元看成 9 個 bits, 切成三組:
             rwx  rwx  rwx
            主人  群  他人
        
    

    r, w, x 分別代表開放 讀, 寫, 執行 的權限; - 表該權限不開放. 這三組分別代表開放給 主人自己 (user), 同一群的人 (group), 其他所有人 (others) 的各項 rwx 權限.
  3. 學校的系統比較少「根據任務編組的 group」, 所以一般使用者擁有的檔案, 開放給 group 的權限與開放給 others 的權限一樣. 如果不是私密文件, 通常開放 rw 給自己; 開放 r 給其他所有人. 普通私密的文件只開放 rw 給自己. 高度機密的文件還要用其他方式加密, 以免系統管理員看到. 有時候為避免檔案被自己不小心刪除, 只開放 r 給自己. 至於 x 權限, 等一下解釋.
  4. 查看自己的 uid 及自己所屬的 primary group 的 gid: grep "^你的帳號名稱:" /etc/passwd 所列出來的資訊以 : 分隔欄位, 其中第三四兩個欄位就是自己的 uid 與所屬 primary group 的 gid. 詳見 passwd(5) 與 group(5)
  5. (在 penguin 帳號下) 查看 postgres 使用者的家開放了那些權限給大家: ls -l ~/.. | grep postgres 這奇怪的寫法是因為如果用 ls -l ~postgres 會看到 postgres 家裡面的檔案的細節; 又因為系統管理者不一定都把所有使用者的家放在 /home 下, 所以用 ~/.. (其實用 ls -ld ~postgres 也可以)
  6. (假設剛才看到的 permission 設定是 rwx--x--x) 試著要看 postgres 的家裡面有什麼: ls -l ~postgres 結果出現 Permission denied 錯誤訊息. 但是卻可以進入該目錄: cd ~postgres 甚至可以印出該目錄下的檔案 -- 只要你知道那裡面有什麼檔案可以讀: cat ~postgres/.login
  7. 使用 chmod 開放/關閉 檔案/目錄 權限的語法一 (增/減權限):
            chmod u+x ...   允許自己可以執行 ... 檔案/進入 ... 目錄
            chmod og-r ...  不許工作群及他人讀 ... 檔案/目錄
            chmod a-w ...   不允許任何人寫入 ... 檔案/目錄
        
    

    語法二 (全面重新設定權限):
            chmod 777 ...   允許所有人對 ... 做任何動作
            chmod 711 ...   允許自己對 ... 做任何動作; 工作群及他人只能執行/進入
            chmod 644 ...   允許自己可以讀寫; 工作群及他人都只能讀, 而不能寫或執行
        
    

    重要選項: -R 遞迴進入子目錄, 孫目錄, ...
  8. 重要觀念: 把目錄想成是一個檔案, 裡面記載著這個目錄底下所有檔案與子目錄的名稱. 請與隔壁的同學 B 共同練習 (要接近同步練習, 改變任何檔案或目錄的權限之前, 要停下來先等 B 做到相對應的步驟.):
    1. 先把自己的家改成: 別人只能進入 (即執行) 而不能讀.
    2. 在自己家裡建立一個目錄叫做 pub, 設定成所有人都可以 rwx. 再在 pub 下建立一個檔案叫做 ro. (內定 permission 應為 rw-r--r--)
    3. 進入 B 的家 (應該沒有問題, 可用 pwd 看目前目錄)
    4. 試著看看 B 的家裡有什麼 (應該出現 permission denied)
    5. 進入 B 的 pub 子目錄並看看裡面有什麼.
    6. 建立一個檔案叫做 ext (成功地存檔!)
    7. 試著修改 B 的 ro 檔: 結果發現可讀不可寫
    8. 試著把 B 的 ro 檔改名為 junk: 居然成功! 接下來把 junk 檔刪除, 居然也成功!
    9. 一步跳回自己家裡的 pub 子目錄: cd ~/pub 並關閉工作群與其他人對 pub 子目錄的寫的權限: chmod og-w .
    10. 看一下剛才 B 在我家的 pub 下建立的 ext 檔的內容.
    11. 跳回 B 的 pub 目錄下: cd - 試著修改我放在 B 的 pub 下的 ext 檔的內容, 居然還是可以修改! 並關閉工作群與其他人對我的 ext 檔的讀的權限, 也成功了! 再試著刪除我的 ext 檔, 結果失敗.
    12. 再跳回自己家裡的 pub 子目錄: cd - 再試一次讀 B 在我家的 pub 下建立的 ext 檔的內容, 結果出現 permission denied. 但是卻可以把這個檔刪除掉!
  9. 特殊權限一: 請見 ls -l /usr/bin/passwd 這個 "s" 的 permission flag 表示執行該程式的人 (real user) 暫時可以用程式擁有者的身份做事 (effective user) 這是因為 passwd 命令必須去修改系統的 /etc/passwd 或 /etc/shadow 檔案, 而這些檔案的擁有者是 root. 像 passwd 這種把 "檔案擁有者自己的執行權限欄位" 設定成 s 的程式稱為 setuidsuid.
  10. 特殊權限二: 請見 ls -lL / | grep tmp (其中 ls 的 -L 選項表示在列出 symbolic link 的時候, 你想看到 symbolic link 所指到的東西的屬性, 而不想看 symbolic link 本身的屬性. 把 L 拿掉, 再試一次看看) /tmp 這個目錄有 "t" 的 permission flag, 表示大家都可以寫入, 但是任何人不得刪除他人的檔案.
  11. 每次建立新目錄時, 系統自動將該目錄的權限設定為 ...? 視 umask 的值而定. 請以 umask 命令檢視你的內定值, 應該是 (八進位的) 022. 把 umask 的值看成 9 個 bits, 有值的 bit 會阻礙該權限, 所以內定建立目錄時, 自己可以 rwx, 工作群和他人都只能 r-x. 詳見 tcsh 或 bash 的手冊 (Q: 為什麼我們知道要看 shell 的手冊, 而不是看 umask 的手冊?) Q: 如何讓你在產生目錄時, 內定值為: 工作群和他人皆不可 rwx? 這個命令要放在那個檔案裡面?
  12. umask 對新建檔案的影響: 一般新檔本來就沒有任何 x 的權限, 因此 umask 只對新檔的 rw 有影響.
  13. Q: 下 find ~ckhung/public_html -type d 看看使用者 ckhung 家的 public_html 底下有那些子目錄, 孫目錄... 再用 output redirection 把結果存檔到 ~/a. 結果發現螢幕上還是有一兩列輸出, 這是怎麼回事? 印出來這些資訊為什麼沒有被 redirect? 而你的 ~/a 當中有沒有錯誤訊息? 出問題的目錄沒有開放什麼權限? 要如何驗証你的推測?
  14. 下列指令可以找出家目錄 (及底下所有的子目錄孫目錄) 裡面, 所有 「對群組或對別人關閉讀取權限」 的檔案: find ~ -type f -not -perm -044。 如果要找 「對群組或對別人開放讀取權限」 的檔案, 則可以: find ~ -type f -perm +044

名詞解釋

  1. user 使用者: 一部機器上的各種資源 (CPU time, 儲存空間, ...) 可以供許多人使用. 每個 user 有自己的帳號 (account); 每個使用者都屬於某一個 primary group.
  2. uid (user id): 使用者的數字代號.
  3. gid (group id): 使用者群的數字代號.
  4. (file/directory) owner (檔案/目錄的) 擁有者: 每個檔案/目錄都有其 owner (也就是系統內的某個 user). Owner 除了可以使用該檔案/目錄外, 還可以決定要把那些使用權限開放給系統內的其他人. 例如每個人都是自己的 home directory 的 owner.
  5. permission 權限: 上述的使用權限包含了三種: read 讀取, write 寫入, execute 執行. 用 ls -l 命令可以得知各檔案/目錄的 owner 是誰, 並得知該 owner 把該檔案的那些權限開放出來給大家使用. 一般使用者通常只擁有自己家裡 (home directory) 的檔案與目錄, 因此可以自由地在自己家裡建立檔案, 但是不能在系統內其他地方建立檔案, 甚至不可以進入 (cd) 他人的目錄或讀取他人的檔案. 注意: 對目錄而言:
    1. "讀" 的權限是指 "可否列出本目錄下的檔案名稱大小等相關資料"
    2. "寫" 的權限是指 "可否在本目錄下建立/刪除檔案, 及更改本目錄下的檔名"
    3. "執行" 的權限是指 "可否更換工作目錄至本目錄底下"
  6. root (也叫做 super user): 系統內權限最大的使用者. 他有權限可以讀取, 寫入, 執行任何檔案, 也可以進入任何目錄.