本文已不再維護,更新文章請參考此處
要登入 Linux 系統一定要有帳號與密碼才行,否則怎麼登入,您說是吧?!不過, 不同的使用者應該要擁有不同的權限才行吧?我們還可以透過 user/group 的特殊權限設定, 來規範出不同的群組開發專案呢∼在 Linux 的環境下,我們可以透過很多方式來限制使用者能夠使用的系統資源, 包括 bash shell 章節提到的 ulimit 限制、還有特殊權限限制,如 umask 等等。 透過這些舉動,我們可以規範出不同使用者的使用資源。另外,還記得系統管理員的帳號嗎?對! 就是 root 。請問一下,除了 root 之外,是否可以有其他的系統管理員帳號? 為什麼大家都要盡量避免使用數字型態的帳號?如何修改使用者相關的資訊呢?這些我們都得要瞭解瞭解的!

1. Linux 的帳號與群組
  1.1 使用者識別: UID 與 GID
  1.2 使用者帳號:/etc/passwd, /etc/shadow
  1.3 關於群組有效與初始群組groups, newgrp
2. 帳號管理:
  2.1 新增與移除使用者useradd, 相關設定檔, passwd, usermod, userdel
  2.2 使用者功能chsh, chfn, finger, id
  2.3 新增與移除群組groupadd, groupmod, groupdel, gpasswd, newgrp
  2.4 密碼管理passwd
3. 使用者身份切換:
  3.1 su
  3.2 sudo, visudo (/etc/sudoers)
4. 使用者的特殊 shell 與 PAM 模組
  4.1 特殊的 shell , /sbin/nologin
  4.2 PAM 模組: /etc/nologin, /etc/securetty, /etc/security/*
5. Linux 系統上使用者的對談與 mail 的使用:
  4.1 查詢使用者: w, who, last, lastlog
  4.2 使用者對談: talk, mesg, wall
  4.3 使用者郵件信箱: mail
6. 手動新增使用者:
  5.1 一些檢查工具pwck, pwconv, pwunconv, chpasswd
  5.2 特殊帳號,如純數字帳號的建立:
  5.3 不開放終端機登入的帳號 (ex>mail acccount)
  5.4 一個大量建置帳號的範例:
7. 本章習題練習
8. 針對本文的建議:http://phorum.vbird.org/viewtopic.php?t=23887

Linux 的帳號與群組
管理員的工作中,相當重要的一環就是『管理帳號』啦!因為整個系統都是你在管理的, 並且所有的一般用戶的申請,都必須要透過你的協助才行!所以你就必須要瞭解一下如何管理好一個網站的帳號管理啦! 在管理 Linux 主機的帳號時,我們必須先來瞭解一下 Linux 到底是如何辨別每一個使用者的!


使用者識別: UID 與 GID
雖然我們登入 Linux 主機的時候,輸入的是我們的帳號,但是,其實 Linux 主機並不會直接認識你的『帳號名稱』的,他僅認識 ID 啊∼ID 就是一組號碼啦∼ 主機對於數字比較有概念的,帳號只是為了讓人們容易記憶而已。 而您的 ID 與帳號的對應就在 /etc/passwd 當中哩。
如果你曾經以 tarball 安裝過軟體的話,那麼應該不難發現,在解壓縮之後的檔案, 檔案擁有者竟然是『不明的數字』?奇怪吧?這沒什麼好奇怪的,因為 Linux 說實在話,他真的只認識代表你身份的號碼而已! 那麼到底有幾種 ID 呢?還記得我們在『檔案屬性與目錄配置』 那一篇文章的時候有提到每一個檔案都具有『擁有人與擁有群組』的屬性嗎? 沒錯啦∼每個登入的使用者至少都會取得兩個 ID ,一個是使用者 ID (User ID ,簡稱 UID)、 一個是群組 ID (Group ID ,簡稱 GID)。

那麼檔案如何判別他的擁有者與群組呢?其實就是利用 UID 與 GID 啦! 每一個檔案都會有所謂的擁有者 ID 與擁有群組 ID ,亦即是 UID 與 GID ,然後系統會依據 /etc/passwd 的內容,去將該檔案的擁有者與群組名稱, 使用帳號的形式來秀出來!我們可以作個小實驗,你可以以 root 的身份 vi /etc/passwd ,然後將你的一般身份的使用者的 ID 隨便改一個號碼, 然後再到你的一般身份的目錄下看看原先該帳號擁有的檔案,你會發現該檔案的擁有人變成了 『數字了』呵呵!這樣可以理解了嗎?
[root@linux ~]# vi /etc/passwd
.....(前面省略).....
dmtsai:x:501:501::/home/dmtsai:/bin/bash  <==將原本的 501:501 改成 3000:501

[root@linux ~]# ls -ld /home/
drwxr-xr-x   3   501 dmtsai 4096 Aug 30 10:37 dmtsai
# 瞧!這裡就能夠知道,其實檔案記錄的是 UID 啦∼
你一定要瞭解的是,上面的例子僅是在說明 UID 與帳號的對應性, 在一部正常運作的 Linux 主機環境下,上面的動作不可隨便進行, 這是因為系統上已經有很多的資料在運行了,隨意修改系統上某些帳號的 UID 很可能會導致某些程序無法進行,這將導致系統無法順利運作的結果。 因為權限的問題啊!所以,瞭解了之後,請趕快回到 /etc/passwd 裡面,將數字改回來喔!

  • 如何登入 Linux 取得 UID/GID
  • 好了,那麼我們再來談一談,到底我們是怎樣登入 Linux 主機的呢?其實也不難啦!當我們在主機前面或者是以 telnet 或者 ssh 登入主機時,系統會出現一個 login 的畫面讓你輸入帳號,這個時候當你輸入帳號與密碼之後, Linux 會:
    1. 先找尋 /etc/passwd 裡面是否有這個帳號?如果沒有則跳出,如果有的話則將該帳號對應的 UID ( User ID )與 GID ( Group ID )讀出來,另外,該帳號的家目錄與 shell 設定也一併讀出;
    2. 再來則是核對密碼表啦!這時 Linux 會進入 /etc/shadow 裡面找出對應的帳號與 UID,然後核對一下你剛剛輸入的密碼與裡頭的密碼是否相符?
    3. 如果一切都 OK 的話,就進入 Shell 控管的階段囉!
    大致上的情況就像這樣,所以呢,當你要登入你的 Linux 主機的時候,那個 /etc/passwd 與 /etc/shadow 就必須要讓系統讀取啦,(這也是很多攻擊者會將特殊帳號寫到 /etc/passwd 裡頭去的緣故!)所以呢,如果你要備份 Linux 的系統的帳號的話, 那麼這兩個檔案就一定需要備份才行呦!

    使用者帳號:/etc/passwd, /etc/shadow
    由上面的說明您大概已經知道,嘿嘿!帳號管理最重要的兩個檔案就是『 /etc/passwd 與 /etc/shadow 』了!這兩個檔案可以說是 Linux 裡頭最重要的檔案之一了! 如果沒有這兩個檔案的話,呵呵!您可是無法登入 Linux 的呦!所以,底下我們先針對這兩個檔案來進行說明。 當然囉,更詳細的資料您可以自行 man 5 passwd 及 man 5 shadow 的啦∼


  • /etc/passwd
  • 這個檔案的構造是這樣的:每一行都代表一個帳號, 有幾行就代表有幾個帳號在你的系統中!不過需要特別留意的是, 裡頭很多帳號本來就是系統中必須要的,我們可以簡稱他為系統帳號, 例如 bin, daemon, adm, nobody 等等,這些帳號是系統正常運作時所需要的,請不要隨意的殺掉他呢! 這個檔案的內容有點像這樣:
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    
    我們先來看一下每個 Linux 系統都會有的第一行,就是 root 這個系統管理員那一行好了, 你可以明顯的看出來,每一行使用『:』分隔開,共有七個咚咚,分別是:
    1. 帳號名稱:就是帳號名稱啦!對應 UID 用的!例如 root 就是預設的系統管理員的帳號名稱;

    2. 密碼:早期的 Unix 系統的密碼是放在這個檔案中的, 但是因為這個檔案的特性是所有的程序都能夠讀取,所以,這樣一來很容易造成資料的被竊取, 因此後來就將這個欄位的密碼資料給他改放到 /etc/shadow 中了,關於 /etc/shadow 這一部份等一下再說。而這裡你會看到一個 x ,呵呵!別擔心,這表示密碼已經被移動到 shadow 這個加密過後的檔案囉;

    3. UID:這個就是使用者識別碼 (ID) 囉!通常 Linux 對於 UID 有幾個限制需要說給您瞭解一下:
    4. id 範圍該 ID 使用者特性
      0當 UID 是 0 時,代表這個帳號是『系統管理員』!所以當你要作另一個系統管理員帳號時, 你可以將該帳號的 UID 改成 0 即可;這也就是說,一部系統上面的系統管理員不見得只有 root 喔! 不過,不很建議有多個帳號的 UID 是 0 啦∼
      1~499保留給系統使用的 ID,其實 1~65534 之間的帳號並沒有不同, 也就是除了 0 之外,其他的 UID 並沒有不一樣,預設 500 以下給系統作為保留帳號只是一個習慣。這樣的好處是,以有名的 DNS 伺服器的啟動服務『 named 』為例,這個程式的預設所有人 named 的帳號 UID 是 25 ,當有其他的帳號同樣是 25 時,很可能會造成系統的一些小問題!為了杜絕這樣的問題,建議保留 500 以前的 UID 給系統吧!
      不過,一般來說, 1~99 會保留給系統預設的帳號,另外 100~499 則保留給一些服務來使用。
      500~65535給一般使用者用的。事實上,目前的 linux 核心 (2.6.x 版)已經可以支援到 4294967295 (2^32-1) 這麼大的 UID 號碼喔!

      上面這樣說明可以瞭解了嗎?是的, UID 為 0 的時候,就是 root 呦!所以請特別留意一下你的 /etc/passwd 檔案!

    5. GID:這個與 /etc/group 有關!其實 /etc/group 的觀念與 /etc/passwd 差不多,只是他是用來規範 group 的而已!

    6. 使用者資訊說明欄:這個欄位基本上並沒有什麼重要用途, 只是用來解釋這個帳號的意義而已!不過,如果您提供使用 finger 的功能時, 這個欄位可以提供很多的訊息呢!底下的 chfn 可以解釋一下囉!

    7. 家目錄:這是使用者的家目錄,以上面為例, root 的家目錄在 /root ,所以當 root 登入之後,就會立刻跑到 /root 裡頭啦!呵呵! 如果你有個帳號的使用空間特別的大,你想要將該帳號的家目錄移動到其他的硬碟去, 沒有錯!可以在這裡進行修改呦!預設的使用者家目錄在 /home/yourIDname

    8. Shell:所謂的 shell 是用來溝通人類下達的指令與硬體之間真正動作的界面!我們通常使用 /bin/bash 這個 shell 來進行指令的下達!嘿嘿!發現了吧?我們在 bash 章節裡面提到很多次,登入 Linux 時為何預設是 bash 呢?就是這裡設定的啦∼ 這裡比較需要注意的是,有一個 shell 可以用來替代成讓帳號無法登入的指令!那就是 /sbin/nologin 這個東西!這也可以用來製作純 pop 郵件帳號者的資料呢!

  • /etc/shadow
  • 上面約略提到,由於每個程序都需要取得 uid 與 gid 來判斷權限的問題,所以, /etc/passwd 的權限必須要設定成為 -rw-r--r-- 這樣的權限,在這樣的情況下, 使用者的密碼不就任何人都可以看到嗎?即使這個檔案內的密碼欄是加密的, 壞心腸的朋友也可能利用暴力破解法去 try and error 找出您的密碼資料......

    因為這樣的關係,所以後來發展出將密碼移動到 /etc/shadow 這個檔案分隔開來的技術, 而且還加入很多的密碼限制參數在 /etc/shadow 裡頭呢!我們先來瞭解一下這個檔案的構造吧! 我的 /etc/shadow 檔案有點像這樣:
    root:$1$i9Ejldjfjio389u9sjl$jljsoi45QE/:12959:0:99999:7:::
    bin:*:12959:0:99999:7:::
    daemon:*:12959:0:99999:7:::
    adm:*:12959:0:99999:7:::
    
    基本上, shadow 同樣以『:』作為分隔符號,如果數一數,會發現共有九個欄位啊, 這九個欄位的用途是這樣的:
    1. 帳號名稱:由於密碼也需要與帳號對應啊∼因此, 這個檔案的第一欄就是帳號,必須要與 /etc/passwd 相同才行!

    2. 密碼:這個才是真正的密碼,而且是 經過編碼過的密碼啦! 你只會看到有一些特殊符號的字母就是了!需要特別留意的是, 雖然這些加密過的密碼很難被解出來,但是『很難』不等於『不會』,所以, 這個檔案的預設屬性是『-rw-------』或者是『-r--------』,亦即只有 root 才可以讀寫就是了!你得隨時注意,不要不小心更動了這個檔案的屬性呢!另外, 如果是在密碼欄的第一個字元為『 * 』或者是『 ! 』,表示這個帳號並不會被用來登入的意思。 所以萬一哪一天你的某個使用者不乖時,可以先在這個檔案中,將他的密碼欄位的最前面多加一個 * !嘿嘿!他就無法使用該帳號囉!直到他變乖了,再給他啟用啊!

    3. 最近更動密碼的日期:這個欄位記錄了『更動密碼的那一天』的日期, 不過,很奇怪呀!在我的例子中怎麼會是 12959 呢?呵呵,這個是因為計算 Linux 日期的時間是以 1970 年 1 月 1 日作為 1 ,而 1971 年 1 月 1 日則為 366 啦! 所以這個日期是累加的呢!得注意一下這個資料呦!那麼最近的 2005 年 1 月 1 日就是 12784 啦,瞭解了嗎?

    4. 密碼不可被更動的天數: 第四個欄位記錄了這個帳號的密碼需要經過幾天才可以被變更!如果是 0 的話, 表示密碼隨時可以更動的意思。這的限制是為了怕密碼被某些人一改再改而設計的!如果設定為 20 天的話,那麼當你設定了密碼之後, 20 天之內都無法改變這個密碼呦!

    5. 密碼需要重新變更的天數: 由於害怕密碼被某些『有心人士』竊取而危害到整個系統的安全,所以有了這個欄位的設計。 你必須要在這個時間之內重新設定你的密碼,否則這個帳號將會暫時失效。 而如果像上面的 99999 的話,那就表示,呵呵,密碼不需要重新輸入啦! 不過,如果是為了安全性,最好可以設定一段時間之後,嚴格要求使用者變更密碼呢!

    6. 密碼需要變更期限前的警告期限:當帳號的密碼失效期限快要到的時候, 就是上面那個『必須變更密碼』的那個時間時, 系統會依據這個欄位的設定,發出『警告』言論給這個帳號,提醒他『再過 n 天你的密碼就要失效了,請盡快重新設定你的密碼呦!』,如上面的例子,則是密碼到期之前的 7 天之內,系統會警告該用戶。

    7. 密碼過期的恕限時間:如果用戶過了警告期限沒有重新輸入密碼, 使得密碼失效了,也就是說,你在『必須變更密碼的期限前,並沒有變更你的密碼!』 那麼該組密碼就稱為『失效的密碼』囉∼怎麼辦?沒關係,還有這個欄位的天數設計啊∼ 意思就是說,當密碼失效後,你還可以用這個密碼在 n 天內進行登入的意思。 而如果在這個天數後還是沒有變更密碼,呵呵!那麼您的帳號就失效了!無法登入!

    8. 帳號失效日期:這個日期跟第三個欄位一樣,都是使用 1970 年以來的總日數設定。這個欄位表示: 這個帳號在此欄位規定的日期之後,將無法再使用。 這個欄位會被使用通常應該是在『收費服務』的系統中, 你可以規定一個日期讓該帳號不能再使用啦!

    9. 保留:最後一個欄位是保留的,看以後有沒有新功能加入。
    舉個例子來說好了,假如我的 dmtsai 這個使用者的密碼欄如下所示:
    dmtsai:$1$8zdAKdfC$XDa8eSus2I7nQL7UjRsIy/:13025:5:60:7:2:13125:
    
    這表示什麼呢?要注意的是, 13025 是 2005/08/30 ,所以, dmtsai 這個使用者他的密碼相關意義是:
    • 最近一次更動密碼的日期是 2005/08/30 (13025);
    • 能夠修改密碼的時間是 5 天以後,也就是 2005/09/04 以前 dmtsai 不能修改自己的密碼; 如果使用者還是嘗試要更動自己的密碼,系統就會出現這樣的訊息:
      You must wait longer to change your password
      passwd: Authentication token manipulation error
      
    • 使用者必須要在 2005/09/04 到 2005/10/29 之間的 60 天限制內去修改自己的密碼,若 2005/10/29 之後還是沒有變更密碼時,該帳號就會宣告失效;
    • 如果使用者一直沒有更改密碼,那麼在 2005/10/29 之前的 7 天內,系統會警告 dmtsai 應該修改密碼的相關資訊;例如當 dmtsai 登入時,系統會主動提示如下的資訊:
      Warning: your password will expire in 5 days
      
    • 如果該帳號一直到 2005/10/29 都沒有更改密碼,由於還有兩天的恕限時間,因此, dmtsai 還是可以在 2005/10/31 以前繼續登入;
    • 如果使用者在 2005/10/29 以前變更過密碼,那麼那個 13025 的日期就會跟著改變,因此, 所有的限制日期也會跟著相對變動喔!^_^
    • 無論使用者如何動作,到了 13125 ,大約是 2005/12/8 左右,該帳號就失效了∼
    透過這樣的說明,您應該會比較容易理解了吧?! ^_^ 常常聽到:我的密碼忘記或者被更動了?怎麼辦?

    有的時候會發生這樣的情況,就是說,你的 root 密碼忘記了!要怎麼辦?重新安裝嗎?另外, 有的時候是被入侵了, root 的密碼被更動過,該如何是好?

    這個時候就必須要使用到 /etc/shadow 這個資料了!我們剛剛知道密碼是存在這個檔案中的, 所以只要你能夠以各種可行的方法開機進入 Linux ,例如單人維護模式,或者是以 live CD (KNOPPIX) 來進入 Linux 系統。之後,將硬碟順利掛載,然後進入 /etc/shadow 這個檔案中,將 root 的密碼這一欄全部清空!然後再登入 Linux 一次,這個時候 root 將不需要密碼 (有的時候需要輸入空白字元) 就可以登入了!這個時候請趕快以 passwd 設定 root 密碼即可。

    關於群組: 有效與初始群組、groups, newgrp
    認識了帳號相關的兩個檔案 /etc/passwd 與 /etc/shadow 之後,您或許還是會覺得奇怪, 那麼群組的設定檔在哪裡?還有,在 /etc/passwd 的第四欄不是所謂的 GID 嗎?那又是啥? 呵呵∼此時就需要瞭解 /etc/group 與 /etc/gshadow 囉∼


  • /etc/group
  • 這個檔案就是在記錄 GID 與群組名稱的對應了∼我的 /etc/group 內容有點像這樣:
    root:x:0:root
    bin:x:1:root,bin,daemon
    daemon:x:2:root,bin,daemon
    sys:x:3:root,bin,adm
    
    也是以冒號『:』作為欄位的分隔符號,共分為四欄,每一欄位的意義是:
    1. 群組名稱:就是群組名稱啦!

    2. 群組密碼:通常不需要設定,因為我們很少使用到群組登入! 不過,同樣的,密碼也是被紀錄在 /etc/gshadow 當中囉!

    3. GID:就是群組的 ID 啊∼

    4. 支援的帳號名稱:加入這個群組裡面的所有的帳號, 我們知道,一個使用者是可以加入多個群組的。舉例來說,如果我想要讓 dmtsai 也加入 root 這個群組,那麼在第一行的最後面加上『,dmtsai』,注意不要有空格, 使成為『 root:x:0:root,dmtsai』就可以囉∼
    比較重要的特色在於第四欄啦,因為每個使用者都可以擁有多個支援的群組, 這就好比在學校唸書的時候,我們可以加入多個社團一樣! ^_^。 不過這裡您或許會覺得奇怪的,那就是:『假如我同時加入多個群組, 那麼我在作業的時候,到底是以那個群組為準?』底下我們就來談一談這個『有效群組』的概念。


  • 有效群組(effective group)與初始群組(initial group)
  • 還記得每個使用者在他的 /etc/passwd 裡面的第四欄有所謂的 GID 吧?那個 GID 就是所謂的『初始群組 ( initial group ) 』了!也就是說,當使用者一登入系統,立刻就擁有這個群組的相關權限的意思。 舉例來說,我們上面提到 dmtsai 這個使用者的 /etc/passwd 與 /etc/group 還有 /etc/gshadow 相關的內容如下:
    [root@linux ~]# grep dmtsai /etc/passwd /etc/group /etc/gshadow
    /etc/passwd:dmtsai:x:501:501::/home/dmtsai:/bin/bash
    /etc/group:users:x:100:dmtsai
    /etc/group:dmtsai:x:501:
    /etc/gshadow:users:::dmtsai
    /etc/gshadow:dmtsai:!::
    
    仔細看到上面這個表格,在 /etc/passwd 裡面,dmtsai 這個使用者所屬的群組為 GID=501 , 也就是 /etc/group 裡頭 dmtsai 那個群組啦∼因為這是 initial group ,所以, 使用者一登入就會主動取得,不需要在 /etc/group 的第四個欄位寫入該帳號的!

    但是非 initial group 的其他群組可就不同了。舉上面這個例子來說,我將 dmtsai 加入 users 這個群組當中,由於 users 這個群組並非是 dmtsai 的初始群組,因此, 我必須要在 /etc/group 這個檔案中,找到 users 那一行,並且將 dmtsai 這個帳號加入第四欄, 這樣 dmtsai 才能夠支援 users 這個群組啊。

    那麼在這個例子當中,因為我的 dmtsai 這個帳號同時支援 dmtsai 與 users 這兩個群組, 因此,在讀取/寫入/執行檔案時,針對群組部分,只要是 users 與 dmtsai 這兩個群組擁有的功能, 我 dmtsai 這個使用者都能夠擁有喔!這樣瞭呼?不過,這是針對已經存在的檔案而言, 如果今天我要建立一個新的檔案或者是新的目錄,請問一下,新檔案的群組是 dmtsai 還是 users ? 呵呵!這就得要檢查一下當時的有效群組了 (effective group)。

    如果我以 dmtsai 這個使用者的身份登入後,該如何知道我所有支援的群組呢? 很簡單啊,直接輸入 groups 就可以了!注意喔,是 groups 有加 s 呢!結果像這樣:
    [dmtsai@linux ~]$ groups
    dmtsai users
    
    在這個輸出的訊息中,我知道我同時屬於 dmtsai 及 users 這個兩個群組,而且, 第一個輸出的群組即為有效群組 (effective group) 了。 也就是說,我的有效群組為 dmtsai 啦∼此時,如果我以 touch 去建立一個新檔,例如: touch test ,那麼這個檔案的擁有者為 dmtsai ,而且群組也是 dmtsai 的啦。 這樣是否可以瞭解什麼是有效群組了?

    那麼如何變更有效群組呢?這個有兩個方法,不論是那個方法,都是以 newgrp 達成的! 以上面這個例子來說,因為我的 dmtsai 使用者同時擁有 dmtsai 與 users 兩個群組,因此, dmtsai 當然可以隨時切換 dmtsai/users 成為有效群組囉。所以,我可以下達:
    [dmtsai@linux ~]$ newgrp users
    [dmtsai@linux ~]$ groups
    users dmtsai
    
    此時,我的有效群組就成為 users 了。當然,要能夠順利切換有效群組的話,還需要 /etc/gshadow 的輔助才行∼這個等一下我們會說明的。好了,那麼如果你開始在 /home/dmtsai 這個家目錄底下嘗試建立一個檔案,例如『 touch test2 』好了,會發生什麼狀態呢? 呵呵!那個檔案的群組竟然變成 users 了!這樣更清楚有效群組的意義了吧?!

    我們額外的來討論一下 newgrp 這個指令,這個指令可以變更目前使用者的有效群組, 而且是另外以一個 shell 來提供登入的喔,所以,以上面的例子來說, dmtsai 這個使用者目前是以另一個 shell 登入的,而且新的 shell 給予 dmtsai 有效 GID 為 users 就是了。當直接執行『 newgrp groupname 』時,使用者的有效群組會成為 groupname , 此時雖然使用者的環境設定(例如環境變數等等其他資料)不會有影響,但是使用者的『權限』將會重新被計算。 舉例來說, dmtsai 此時建立的新檔案群組是 users 了∼

    鳥哥的這個例子當中,要注意的是, dmtsai 這個使用者本來就屬於 users 與 dmtsai 這兩個群組, 所以他可以直接使用 newgrp 來切換有效群組,而要離開新的有效群組時,輸入『 exit 』即可。 假設我的 Linux 系統當中還有另一個群組,名稱為 vbird,那麼 dmtsai 是否可以登入 vbird 這個群組? 在某些前提下是可以的:
    • vbird 這個群組在 /etc/gshadow 的密碼欄為合法的(不具有 ! 開頭!);
    • dmtsai 必須讓 root 或群組管理員 (group administrator) 加入到 vbird 群組中。
    這兩個大前提缺一不可喔!好了,假設我已經使用 gpasswd 建立了 vbird 這個群組的密碼, 而 dmtsai 也被加入群組成員當中了,那麼當 dmtsai 輸入 『newgrp vbird』時, 嘿嘿! dmtsai 這個使用者的有效群組就能夠變成 vbird 囉∼

  • /etc/gshadow
  • 剛剛講了很多關於『有效群組』的概念,另外,也提到 newgrp 這個指令的用法, 但是,如果 /etc/gshadow 這個設定沒有搞懂得話,那麼 newgrp 是無法動作的呢! 我的 /etc/gshadow 的內容有點像這樣:
    root:::root
    bin:::root,bin,daemon
    daemon:::root,bin,daemon
    sys:::root,bin,adm
    
    同樣還是使用冒號『:』來作為欄位的分隔字元,而且你會發現,這個檔案幾乎與 /etc/group 一模一樣啊!是這樣沒錯∼不過,要注意的大概就是第二個欄位吧∼第二個欄位是密碼欄, 如果密碼欄上面是『!』時,表示該群組不能使用密碼來登入呢! 至於第四個欄位也就是支援的帳號名稱囉∼
    1. 群組名稱
    2. 密碼欄,同樣的,開頭為 ! 表示無法登入;
    3. 群組管理員的帳號 (相關資訊在後續介紹)
    4. 該群組的所屬帳號 (與 /etc/group 內容相同!)
    不過,就以系統的操作來說,事實上,這個 /etc/gshadow 的密碼提供,最大的功能是在於『 讓那些不在群組中的成員,臨時加入該群組用的。 』 實際上使用的情況是很少的∼而如果真的要操作這樣的環境,那就得要熟悉 newgrp 的用法囉! 而且還要提供某個群組的密碼出來,真是不好管理。所以,若真的想要讓某個使用者利用該群組的功能時, 還是直接將對方加入群組的支援就好了!省得麻煩∼

    帳號管理
    好啦!既然要管理帳號,當然是由新增與移除使用者開始的囉∼底下我們就分別來談一談如何新增、 移除與更改使用者的相關資訊吧∼


    新增與移除使用者: useradd, 相關設定檔, passwd, usermod, userdel
    要如何在 Linux 的系統新增一個使用者啊?呵呵∼真是太簡單了∼直接利用 useradd 這個指令即可! 他的指令下達方法如下:


  • useradd
  • [root@linux ~]# useradd [-u UID] [-g initial_group] [-G other_group] \
    >  -[Mm] [-c 說明欄] [-d home] [-s shell] username
    參數:
    -u  :後面接的是 UID ,是一組數字。直接指定一個特定的 UID 給這個帳號;
    -g  :後面接的那個群組名稱就是我們上面提到的 initial group 啦∼
          該 group ID (GID) 會被放置到 /etc/passwd 的第四個欄位內。
    -G  :後面接的群組名稱則是這個帳號還可以支援的群組。
          這個參數會修改 /etc/group 內的相關資料喔!
    -M  :強制!不要建立使用者家目錄
    -m  :強制!要建立使用者家目錄!
    -c  :這個就是 /etc/passwd 的第五欄的說明內容啦∼可以隨便我們設定的啦∼
    -d  :指定某個目錄成為家目錄,而不要使用預設值;
    -r  :建立一個系統的帳號,這個帳號的 UID 會有限制 (/etc/login.defs)
    -s  :後面接一個 shell ,預設是 /bin/bash 的啦∼
    範例:
    
    範例一:完全參考預設值建立一個使用者,名稱為 vbird1
    [root@linux ~]# useradd vbird1
    [root@linux ~]# ls -l /home
    drwxr-xr-x   3 vbird1 vbird1 4096 Aug 30 17:33 vbird1
    [root@linux ~]# grep vbird1 /etc/passwd /etc/shadow /etc/group
    /etc/passwd:vbird1:x:502:502::/home/vbird1:/bin/bash
    /etc/shadow:vbird1:!!:13025:0:99999:7:::
    /etc/group:vbird1:x:502:
    # 做這個範例只是想要讓您瞭解,其實系統已經規範好了一些新增使用者時的參數了!
    # 因此,當我們使用 useradd 時,系統會主動的去修改 /etc/passwd 與 /etc/shadow,
    # 而這兩個檔案內的相關欄位參考值,則會以一些設定檔的內容來規範喔!
    # 同時也要注意到,使用 useradd 新增使用者時,這個使用者的 /etc/shadow
    # 密碼欄會是不可登入的 (以 !! 為開頭),因此還需要使用 passwd 
    # 來給予 vbird1 密碼後,才算新增完畢!
    
    範例二:我知道我的系統當中有個群組名稱為 users ,且 UID 700 並不存在,
            請用這兩個參數給予 vbird2 建立一個帳號!
    [root@linux ~]# useradd -u 700 -g users vbird2
    [root@linux ~]# ls -l /home
    drwxr-xr-x   3 vbird2 users  4096 Aug 30 17:43 vbird2
    [root@linux ~]# grep vbird2 /etc/passwd /etc/shadow /etc/group
    /etc/passwd:vbird2:x:700:100::/home/vbird2:/bin/bash
    /etc/shadow:vbird2:!!:13025:0:99999:7:::
    # 看一下,UID 與 initial group 確實改變成我們需要的了!
    
    範例三:建立一個系統帳號,名稱為 vbird3
    [root@linux ~]# useradd -r vbird3
    [root@linux ~]# grep vbird3 /etc/passwd /etc/shadow /etc/group
    /etc/passwd:vbird3:x:101:102::/home/vbird3:/bin/bash
    /etc/shadow:vbird3:!!:13025::::::
    /etc/group:vbird3:x:102:
    # 很重要喔!您會發現, UID 竟然是 101 ,而 GID 怎麼會是 102,
    # 並且與 /etc/group 有對應的關係喔!有沒有加 -r 差很多ㄟ!
    
    我的天吶!這個指令更動的檔案怎麼怎麼多啊?對啊!你才知道啊∼ 這也是為啥我們說帳號管理是很複雜的啦∼而且他參考的設定檔才更多哩! 這個指令至少可能會更動到的地方有:
    • /etc/passwd
    • /etc/shadow
    • /etc/group
    • /etc/gshadow
    • /home/username
    那請教一下,您有沒有想過,以上述的第一個範例一好了,為何 useradd vbird1 他會主動在 /home/vbird1 建立起使用者的家目錄?家目錄內有什麼資料且來自哪裡? 為何預設使用的是 /bin/bash 這個 shell ?呵呵!這就得要說明一下 useradd 所使用的參考檔案囉!


  • 相關設定檔
  • 我們使用 useradd 去新增使用者時,一些在 /etc/passwd 當中的值會去參考『 /etc/default/useradd 』 ,這個檔案的內容有點像這樣:
    GROUP=100		<==預設的群組
    HOME=/home		<==預設的家目錄所在目錄
    INACTIVE=-1		<==在 /etc/shadow 內的第 7 欄
    EXPIRE=			<==在 /etc/shadow 內的第 8 欄
    SHELL=/bin/bash		<==預設的 shell
    SKEL=/etc/skel		<==使用者家目錄的內容資料參考目錄
    

    關於群組的建立機制:

    當我們直接使用 useradd 來新增帳號時,在預設的情況下,相關的資訊都是參考 /etc/default/useradd 這個檔案內容的設定的。不過,對於使用者群組的建立機制中, 則有兩種不一樣的機制存在的:
    • 以 FC4 為代表,新建使用者時,若無指定 initial group , 則系統會主動建立一個與帳號相同的群組名稱,以該群組作為使用者的 initial group;

    • 以 SuSE 9 為代表,新建使用者時,預設不會建立新群組,而以 /etc/default/useradd 內的 GROUP 設定值作為使用者的 initial group 。
    這應該是很容易理解才是∼如果看不懂,請回去前一小節查閱一下 /etc/passwd, /etc/shadow 的相關內容架構。

    關於使用者家目錄的參考:/etc/skel/*

    在這個檔案當中,比較奇怪的是 SKEL 這個玩意兒了,他是啥? 其實,這個咚咚就是使用者家目錄的參考目錄囉∼舉我們的範例一為例,我利用 useradd vbird1 時,他在 /home/vbird1 這個使用者家目錄內的各項資料,都是由 /etc/skel 所複製過去的∼所以呢,未來如果我想要讓新增使用者時,該使用者的環境變數 ~/.bashrc 就設定妥當的話,您可以到 /etc/skel/.bashrc 去編輯一下,也可以建立 /etc/skel/public_html 這個目錄,那麼未來新增使用者後,在他的家目錄下就會有 public_html 那個目錄了!這樣瞭呼?

    關於使用者 UID/GID 的設定:

    另外,與密碼還有 UID/GID 有關的設定檔則是在 /etc/login.defs 裡面, 這個檔案有點像這樣:
    MAIL_DIR        /var/spool/mail	<==使用者預設郵件信箱放置目錄
    
    PASS_MAX_DAYS   99999		<==/etc/shadow 內的第 5 欄
    PASS_MIN_DAYS   0		<==/etc/shadow 內的第 4 欄
    PASS_MIN_LEN    5		<==密碼最短的字元長度,建議可以改到 6 以上
    PASS_WARN_AGE   7		<==/etc/shadow 內的第 6 欄
    
    UID_MIN         500	<==使用者最小的 UID,意即小於 500 的 UID 為系統保留
    UID_MAX       60000	<==使用者能夠用的最大 UID
    GID_MIN         500	<==使用者自訂群組的最小 GID,小於 500 為系統保留
    GID_MAX       60000	<==使用者自訂群組的最大 GID
    
    CREATE_HOME     yes	<==在不加 -M 及 -m 時,是否主動建立使用者家目錄?
    
    看到這個檔案後,您應該曉得的是,為何新建的使用者的 UID 都會大於 500 了吧? 而且某些版本的 distributions (例如 SuSE server 9) 則是將 UID_MIN 設定為 1000 , 所以,他的一般身份使用者的 UID 就會從 1000 起跳囉∼這樣瞭解嗎?!

    那如果我現在新增一個使用者,這個使用者的 UID 會是多少?答案是:『 如果 /etc/passwd 裡面的帳號所屬的 UID 沒有大於 /etc/login.defs 裡頭的 UID_MIN (在本例中是 500)時,則以 UID 500 來作為一個新帳號的 UID。 如果 /etc/passwd 已有大於 500 以上的 UID 時,則取 /etc/passwd 內最大的那個 UID + 1 作為新設帳號的 UID。』而如果我是想要建立系統用的帳號,所以使用 useradd -r sysaccount 這個 -r 的參數時,就會找『比 500 小的最大的那個 UID + 1 』就是了。 ^_^

    關於家目錄預設是否建立:

    另外也要注意那個 CREATE_HOME 的設定值,這個設定值也很重要。一般來說,在 FC4 的環境下, 我們使用 useradd useraccount 時,預設是會主動的建立家目錄的,除非使用 -M 這個參數∼ 至於 SuSE server 9 這個版本來說,嘿嘿!他預設是不建立家目錄的,除非使用 -m 這個參數呢! 因此,在這裡鳥哥也要建議您,如果肯定要建立家目錄的話,不論在那個版本, 你最好還是加上 -m 這個參數來強制建立家目錄吧! ^_^

    那麼您就能知道囉, useradd 這支程式在建立 Linux 上的帳號時,至少會參考:
    • /etc/default/useradd
    • /etc/login.defs
    • /etc/skel/*
    這些檔案,不過,最重要的其實是建立 /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow 還有使用者家目錄就是了∼所以,如果您瞭解整個系統運作的狀態, 也是可以手動直接修改這幾個檔案就是了。


  • passwd
  • 剛剛我們講到了,使用 useradd 建立了帳號之後,在預設的情況下,該帳號是暫時被封鎖的, 也就是說,該帳號是無法登入的,你可以去瞧一瞧 /etc/shadow 內的第二個欄位就曉得囉∼ 那該如何是好?怕什麼?直接給他設定新密碼就好了嘛!對吧∼設定密碼就使用 passwd 囉!
    [root@linux ~]# passwd [useraccount]
    
    範例一:如果 root 要幫 dmtsai 修改密碼時?
    [root@linux ~]# passwd dmtsai
    Changing password for user dmtsai.
    New UNIX password:  <==這裡直接輸入新的密碼,螢幕不會有任何反應
    BAD PASSWORD: it is based on a dictionary word  <==密碼太簡單時的錯誤!
    Retype new UNIX password:  <==再輸入一次同樣的密碼
    passwd: all authentication tokens updated successfully.  <==竟然還是成功修改了!
    
    範例二: dmtsai 這個使用者想要修改自己的密碼時
    [dmtsai@linux ~]$ passwd
    Changing password for user dmtsai.
    Changing password for dmtsai
    (current) UNIX password: <==這裡輸入『原有的舊密碼』
    New password: <==這裡輸入新密碼
    BAD PASSWORD: it is based on your username <==密碼的規範是很嚴格的
    New password:
    BAD PASSWORD: it is based on your username
    New password:
    BAD PASSWORD: it is based on a dictionary word
    passwd: Authentication token manipulation error
    
    先來談一談上面的兩個範例。要注意的是, passwd 這個指令由於使用者的身份而有兩種用法, 如果是 root ,由於 root 具有至高無上的權力,所以 root 可以利用 passwd [username] 來幫使用者修改他們的密碼!因此,『如果使用者的密碼不見了, root 是可以幫他們進行密碼的修改,而不需要知道舊密碼。』另外,也只有 root 可以隨便設定密碼,即使該密碼並不符合系統的密碼驗證要求∼ @_@。例如上面的範例一, 我幫 dmtsai 建立的密碼太簡單,所以其實系統是『警告』過 root 的。 但在重複輸入兩次密碼後,嘿嘿!您還是會看到 successfully 這個成功的字樣呢!

    那麼如果是一般身份使用者,或者是 root 想要修改自己的密碼時,直接輸入『 passwd 』, 就能夠修改自己的密碼了。一般身份使用者輸入的密碼會經過系統的驗證, 驗證的機制除了 /etc/login.defs 裡頭規定的最小密碼字元數之外,還會受到 /etc/pam.d/passwd 這個 PAM 模組的檢驗呢!一般來說,您輸入的密碼最好要符合底下的要求:
    • 密碼不能與帳號相同;
    • 密碼盡量不要選用字典裡面會出現的字串;
    • 密碼需要超過 8 個字元;
    如果無法經過驗證,那麼該密碼就不被接受,當然還是只能使用舊密碼囉! 此外,僅能接受三次密碼輸入,如果輸入的密碼都不被接受,那只好....重新執行一次 passwd 啊!而, 經過這個 passwd [username] 的動作後,您的帳號就會有密碼囉,此時, 如果察看一下 /etc/shadow ,你就會知道密碼內容被改過囉∼ ^_^


  • usermod
  • 所謂這『人有失手,馬有亂蹄』,您說是吧?所以囉,當然有的時候會『不小心』在 useradd 的時候加入了錯誤的設定資料。或者是,在使用 useradd 後,發現某些地方還可以進行細部修改。 此時,當然我們可以直接到 /etc/passwd 或 /etc/shadow 去修改相對應欄位的資料, 不過,Linux 也有提供相關的指令讓大家來進行帳號相關資料的微調呢∼那就是 usermod 囉∼
    [root@linux ~]# usermod [-cdegGlsuLU] username
    參數:
    -c  :後面接帳號的說明,即 /etc/passwd 第五欄的說明欄,可以加入一些帳號的說明。
    -d  :後面接帳號的家目錄,即修改 /etc/passwd 的第六欄;
    -e  :後面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 內的第八個欄位資料啦!
    -g  :後面接 group name,修改 /etc/passwd 的第四個欄位,亦即是 GID 的欄位!
    -G  :後面接 group name,修改這個使用者能夠支援的群組,修改的是 /etc/group 囉∼
    -l  :後面接帳號名稱。亦即是修改帳號名稱, /etc/passwd 的第一欄!
    -s  :後面接 Shell 的實際檔案,例如 /bin/bash 或 /bin/csh 等等。
    -u  :後面接 UID 數字啦!即 /etc/passwd 第三欄的資料;
    -L  :暫時將使用者的密碼凍結,讓他無法登入。其實僅改 /etc/shadow 的密碼欄。
    -U  :將 /etc/shadow 密碼欄的 ! 拿掉,解凍啦!
    範例:
    
    範例一:修改使用者 dmtsai 的說明欄,加上『VBird's test』的說明。
    [root@linux ~]# usermod -c "VBird's test" dmtsai
    [root@linux ~]# grep dmtsai /etc/passwd
    dmtsai:x:501:501:VBird's test:/home/dmtsai:/bin/bash
    
    範例二:使用者 dmtsai 密碼在 2006/01/01 失效。
    [root@linux ~]# usermod -e "2006-01-01" dmtsai
    [root@linux ~]# grep dmtsai /etc/shadow
    dmtsai:$1$24ISJM4K$bbdijdreoieaVaBMAHsm6.:13026:0:99999:7::13149:
    
    範例三:暫時凍結 dmtsai 的密碼!
    [root@linux ~]# usermod -L dmtsai
    [root@linux ~]# grep dmtsai /etc/shadow
    dmtsai:!$1$24ISJM4K$bbdijdreoieaVaBMAHsm6.:13026:0:99999:7::13149:
    # 注意到,密碼欄(第二欄)多了一個 ! 號!那個驚嘆號會讓密碼無效喔!
    [root@linux ~]# usermod -U dmtsai  <==這樣就解開了!
    
    範例四:萬一 dmtsai 這個傢伙被建立時忘記建立家目錄,該如何是好?
    [root@linux ~]# usermod -d /home/dmtsai2 -m dmtsai
    # 如果僅是 -d /home/dmtsai2 表示僅修改 /etc/passwd 第六欄的內容而已,
    # 如果加上 -m 這個參數,則表示新建一個家目錄的意思!
    # 另外,如果原本的家目錄是 /home/dmtsai ,那 -d /home/dmtsai2 -m
    # 會將原本的 /home/dmtsai 更名為 /home/dmtsai2 喔!
    
    usermod 是系統管理員 root 用來管理帳號身份的相關資料的,不過,這個 usermod 程式的功能其實也被很多其他的指令所取代喔!例如 chfn 與 chsh 等等的∼ 不過,無論如何,您還是可以用 usermod 來微調使用者帳號的相關資料啦!


  • userdel
  • 這個功能就太簡單了∼目的在刪除使用者啦∼與他相關的檔案有:
    • /etc/passwd
    • /etc/shadow
    • /home/username
    整個指令的語法是:
    [root@linux ~]# userdel [-r] username
    參數:
    -r  :連同使用者的家目錄也一起刪除
    範例:
    
    範例一:刪除 vbird2 ,連同家目錄一起刪除
    [root@linux ~]# userdel -r vbird2
    
    這個指令下達的時候要小心了!通常我們要移除一個帳號的時候,你可以手動的將 /etc/passwd 與 /etc/shadow 裡頭的該帳號取消即可!一般而言,如果該帳號只是『 暫時不啟用』的話,那麼將 /etc/shadow 裡頭最後倒數一個欄位設定為 0 就可以讓該帳號無法使用,但是所有跟該帳號相關的資料都會留下來! 使用 userdel 的時機通常是『 你真的確定不要讓該用戶在主機上面使用任何資料了!』

    另外,其實使用者如果在系統上面操作過一陣子了,那麼該使用者其實在系統內可能會含有其他檔案的。 舉例來說,他的郵件信箱 (mail box) 或者是例行性命令 (crontab) 之類的檔案。 所以,如果想要完整的將某個帳號完整的移除,最好可以在下達 userdel -r username 之前, 先以『 find / -user username 』查出整個系統內屬於 username 的檔案, 然後再加以刪除吧!

    使用者功能:chfn, chsh
    不論是 useradd/usermod/userdel ,都是系統管理員所能夠使用的指令, 如果我是一般身份使用者,那麼我是否除了密碼之外,就無法更改其他的資料呢? 當然不是啦!這裡我們介紹兩個一般身份使用者常用的帳號資料變更指令囉!


  • chsh
  • [dmtsai@linux ~]$ chsh [-ls]
    參數:
    -l  :列出目前系統上面可用的 shell ,其實就是 /etc/shells 的內容!
    -s  :設定修改自己的 Shell 囉
    範例:
    
    範例一:列出目前系統上面所以的 shell ,並且指定 csh 為自己的 shell
    [dmtsai@linux ~]$ chsh -l
    /bin/sh
    /bin/bash
    /sbin/nologin
    /bin/ksh
    /bin/tcsh
    /bin/csh
    /bin/zsh
    [dmtsai@linux ~]$ chsh -s /bin/csh; grep dmtsai /etc/passwd
    Password:  <==為了防止帳號被亂搞∼所以需要輸入 dmtsai 的密碼確認!
    Shell changed.
    dmtsai:x:501:501::/home/dmtsai:/bin/csh
    
    這個指令重點就是在更改使用者的 shell 囉∼如上所述,我就可以修訂好 dmtsai 的 shell 啦!


  • chfn
  • [root@linux ~]# chfn [-foph] 
    參數:
    -f  :後面接完整的大名;
    -o  :您辦公室的房間號碼;
    -p  :辦公室的電話號碼;
    -h  :家裡的電話號碼!
    範例:
    
    範例一:我用 dmtsai 這個使用者來更改一下自己的相關資訊!
    [dmtsai@linux ~]$ chfn
    Changing finger information for dmtsai.
    Password: <==為了防止帳號被亂搞∼所以需要輸入 dmtsai 的密碼確認!
    Name []: VBird' Test account
    Office []: Tainan office 1
    Office Phone []: 06-1234567
    Home Phone []: 06-7654321
    
    Finger information changed.
    [dmtsai@linux ~]$ grep dmtsai /etc/passwd
    dmtsai:x:501:501:VBird' Test account,Tainan office 1,06-1234567,06-7654321:
    /home/dmtsai:/bin/bash
    
    這個指令說實在的,除非是你的主機有很多的用戶,否則倒真是用不著這個程式!這就有點像是 bbs 裡頭更改你『個人屬性』的那一個資料啦!這個程式主要都是搭配 finger 這支程式在運作的!不過,由於 finger 這支程式不是很安全,所以預設是沒有安裝他的! 如果您想要玩一下 finger 的話,那麼請先參考 RPM 套件安裝內容後,在安裝 finger 的 RPM 檔案,然後再來玩吧!底下這裡鳥哥還是先簡單的介紹一下就好了!

    使用 chfn 這個指令之後,程式會要求您輸入許多的資訊,包含了:
    • 密碼
    • 暱稱
    • 辦公室號碼
    • 辦公室電話
    • 家裡電話
    不過,這些資訊其實更改的都是原本的 /etc/passwd 裡面的第五欄說明資料啦! 每個資訊中間都以逗號『,』分隔開來而已。如上所示, dmtsai 的說明欄救被更動過囉! ^_^


  • finger
  • finger 的中文字面意義是:『手指』,嘿嘿!這個 finger 可以查閱的資料可就多了! 剛剛我們不是使用 chfn 來修改 dmtsai 這個使用者的相關資訊嗎?那些個相關資訊就可以利用 finger 來查閱出來的!他的查詢方法如下:
    [root@linux ~]# finger [-s] username
    參數:
    -s  :使用長串資料輸出格式。
    範例:
    
    範例一:將剛剛 dmtsai 建立的一些使用者資訊呼叫出來視察!
    [root@linux ~]# finger dmtsai
    Login: dmtsai                           Name: VBird's Test account
    Directory: /home/dmtsai                 Shell: /bin/bash
    Office: Tainan office 1, 06-1234567     Home Phone: 06-7654321
    Last login Tue Aug 30 15:01 (CST) on tty1 from localhost
    No mail.
    No Plan.
    
    有趣吧!這個 finger 還可以用來查詢別部主機的帳號呢!不過,目前通常用在本機帳號的查詢。 因為 finger 算是比較危險的指令,所以,有些 linux distributions 預設是不安裝他的, 不過,如果您按照鳥哥說明的方式來完整安裝 FC4 的話,那就沒有問題的啦!可以操作的。

    不過,你或許會覺得有趣的是,怎麼 finger 的結果最底下顯示『No mail. No Plan.』呢? 呵呵! finger 會主動去 /var/spool/mail 查詢看看有沒有該帳號的郵件信箱 (mailbox), 而且還會去查詢 ~/.plan 那個檔案,那就是計畫檔啦∼比如說,我在 dmtsai 家目錄底下建立 .plan 這個檔案,他的內容是『DmTsai will write something....』,結果使用 finger 時, 嘿嘿!您可以自行看看結果會怎樣啊! ^_^


  • id
  • id 這個指令則可以查詢某人或自己的相關 UID/GID 等等的資訊,他的參數也不少,不過, 都不需要記∼反正使用 id 就全部都列出囉∼ ^_^
    [root@linux ~]# id [username]
    
    範例一:查閱自己的相關資訊!
    [root@linux ~]# id
    uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),10(wheel)
    
    範例二:查閱一下 dmtsai 吧∼
    [root@linux ~]# id dmtsai
    uid=501(dmtsai) gid=501(dmtsai) groups=501(dmtsai),100(users)
    
    再次強調一下,那個 groups 指的是目前該使用者所屬的所有群組,但是您必須要瞭解什麼是『 初始群組與有效群組 』的差異喔!

    新增與移除群組
    OK!瞭解了帳號的新增、刪除、更動與查詢後,再來我們可以聊一聊群組的相關內容了。 基本上,群組的內容都與這兩個檔案有關: 群組的內容其實很簡單,都是上面兩個檔案的新增、修改與移除而已, 不過,如果再加上有效群組的概念,那麼 newgrp 與 gpasswd 則不可不知呢!


  • groupadd
  • [root@linux ~]# groupadd [-g gid] [-r]
    參數:
    -g  :後面接某個特定的 GID ,用來直接給予某個 GID ∼
    -r  :建立系統群組啦!與 /etc/login.defs 內的 GID_MIN 有關。
    範例:
    
    範例一:新建一個群組,名稱為 group1
    [root@linux ~]# groupadd group1
    [root@linux ~]# grep group1 /etc/group /etc/gshadow
    /etc/group:group1:x:502:
    /etc/gshadow:group1:!::
    # 注意注意!在 /etc/gshadow 裡面可以發現,密碼是不許登入的喔!
    
    範例二:新建一個系統群組,名稱為 group2
    [root@linux ~]# groupadd -r group2
    [root@linux ~]# grep group2 /etc/group /etc/gshadow
    /etc/group:group2:x:101:
    /etc/gshadow:group2:!::
    
    瞭解 -r 有沒有的差異了嗎?!是的∼結果會跟 /etc/login.defs 裡面的設定有關喔! 而且以 groupadd 新增的帳號,預設都不能使用密碼的方式登入的∼ 也就是說,預設是私有群組,並無法使用 newgrp 來登入的呢!


  • groupmod
  • 跟 usermod 類似的,這個指令僅是在進行 group 相關參數的修改而已。
    [root@linux ~]# groupmod [-g gid] [-n group_name]
    參數:
    -g  :修改既有的 GID 數字;
    -n  :修改既有的群組名稱
    範例:
    
    範例一:將剛剛上個指令建立的 group2 名稱改為 groupname , GID 為 103
    [root@linux ~]# groupmod -g 103 -n groupname group2
    [root@linux ~]# grep groupname /etc/group /etc/gshadow
    /etc/group:groupname:x:103:
    /etc/gshadow:groupname:!::
    
    不過,還是那句老話,不要隨意的更動 GID ,容易造成系統資源的錯亂喔!


  • groupdel
  • 呼呼! groupdel 自然就是在刪除群組的囉∼用法很簡單:
    [root@linux ~]# groupdel [groupname]
    
    範例一:將剛剛的 groupname 刪除!
    [root@linux ~]# groupdel groupname
    
    範例二:若要刪除 dmtsai 這個群組的話??
    [root@linux ~]# groupdel dmtsai
    groupdel: cannot remove user's primary group.
    
    為什麼 groupname 可以刪除,但是 dmtsai 就不能刪除呢?原因很簡單, 『有某個帳號 (/etc/passwd) 的 initial group 使用該群組!』 如果查閱一下,你會發現在 /etc/passwd 內的 dmtsai 第四欄的 GID 就是 /etc/group 內的 dmtsai 那個群組的 GID ,所以囉,當然無法刪除∼否則 dmtsai 這個使用者登入系統後, 就會找不到 GID ,那可是會造成很大的困擾的!那麼如果要刪除 dmtsai 這個群組呢? 你『必須要確認 /etc/passwd 內的帳號沒有任何人使用該群組作為 initial group 』才行喔!所以,你可以:
    • 修改 dmtsai 的 GID ,或者是:
    • 刪除 dmtsai 這個使用者。

  • gpasswd
  • 除了設定群組之外,我們還可以針對系統上面有的群組進行一些『密碼』的給予喔! 這個密碼給予之後,該群組就能夠讓某些人登入成為有效群組呢!挺有趣的。 另外,如果系統管理員太忙了,無法針對每個群組來管理,那麼『 系統管理員還可以將某位使用者設定成為該群組的團長喔!』 很有趣吧∼雖然目前比較少人這麼玩了,不過,鳥哥在這裡還是跟大家介紹介紹吧!
    關於系統管理員(root)做的動作:
    [root@linux ~]# gpasswd groupname
    [root@linux ~]# gpasswd [-A user1,...] [-M user3,user4...] groupname
    [root@linux ~]# gpasswd [-rR] groupname
    參數:
        :若沒有任何參數時,表示給予 groupname 一個密碼(/etc/gshadow)
    -A  :將 groupname 的主控權交由後面的使用者管理(該群組的管理員)
    -M  :將某些帳號加入這個群組當中!
    -r  :將 groupname 的密碼移除
    -R  :讓 groupname 的密碼欄失效,所以 newgrp 就不能使用了!
    
    關於群組管理員(Group administrator)做的動作:
    [someone@linux ~]$ gpasswd [-ad] user groupname
    參數:
    -a  :將某位使用者加入到 groupname 這個群組當中!
    -d  :將某位使用者移除出 groupname 這個群組當中。
    
    範例一:建立一個新群組,名稱為 testgroup 且群組交由 dmtsai 管理:
    [root@linux ~]# groupadd testgroup
    [root@linux ~]# gpasswd testgroup
    Changing the password for group testgroup
    New Password:
    Re-enter new password:
    # 輸入兩次密碼就對了!
    [root@linux ~]# gpasswd -A dmtsai -M dmtsai,vbird testgroup
    [root@linux ~]# grep testgroup /etc/group /etc/gshadow
    /etc/group:testgroup:x:502:dmtsai,vbird
    /etc/gshadow:testgroup:1CEVbrcjxO6Ps:dmtsai:dmtsai,vbird
    # 很有趣吧!此時 dmtsai 則擁有 testgroup 的主控權喔!若以我們討論區 (
    # http://phorum.vbird.org 的概念來說,群組管理員有點像『版主』啦!
    
    範例二:以 dmtsai 登入系統,並且讓他加入 vbird1 成為 testgroup 成員之一:
    [dmtsai@linux ~]$ gpasswd -a vbird1 testgroup
    Adding user vbird1 to group testgroup
    
    很有趣的一個小實驗吧!我們可以讓 testgroup 成為一個可以公開的群組, 然後建立起群組管理員,群組管理員可以有多個。在這個案例中, 我將他設定為 dmtsai ,所以, dmtsai 就可以自行增加群組成員囉∼ 呼呼!然後,該群組成員就能夠使用 newgrp 囉∼


  • newgrp
  • 還有印象嗎?我們前面談到 /etc/gshadow 時就提過這個指令了! 『newgrp 會額外以另一個 login 來提供使用者登入到另一個 shell 中, 並且將有效群組改為 newgrp 後面接的那個群組,若沒有接群組,則預設群組為 initial group

    密碼管理: passwd
    再來跟大家提一提那個重要的密碼概念!您得要特別留意的是,今天,您的主機若是遭到入侵, 對方的第一個入侵點自然就是您主機上面帳號的『密碼』了,所以, 如果您的密碼定義的比較嚴格的話,那麼自然對方就不容易猜到你的密碼,自然就會比較有保障啦!

    目前一些 Cracker 較常使用的密碼破解軟體,大抵是『字典攻擊法』 及所謂的『暴力破解法』,就字面上的意義來說, 『字典攻擊法』是將字典裡面所查的到的任何單字或片語都輸入的程式中, 然後使用該程式一個一個的去嘗試破解你的密碼,不要覺得這樣的速度似乎很慢,實際上, 現今的電腦運算速度太高了,字典攻擊法的操作效率基本上是很高的!另一個『 暴力破解法』就是直接使用鍵盤上面任何可以使用的按鍵,然後依照組合,以 1 個, 2 個, 3 個…. 密碼組合的方式去破解你的密碼!這個方式就真的比較慢一點,如果你的密碼組合是 6~8 個字元以上,那麼暴力攻擊法還是需要好長一段時間才能夠破解的了的!

    由上面的『字典攻擊法』與『暴力破解法』猜測你的密碼的方式來說,您知道如何設定一個好的密碼了嗎? 是的,您的密碼最好需要底下幾個特性: 這種密碼真的很不容易被破解,但是很不幸的,也很容易被你我忘記!^_^。所以呢, 建議您常常使用一些對別人來說是沒有意義,但是對您確有特殊涵意的字眼! 例如鳥哥常常提到的,我愛我老婆!『 I&Mywife*^』之類的密碼!不容易被猜,也挺容易被你自己記住的! 那麼有沒有『很要命的密碼』呢?有的,底下幾種密碼就很要命: VBird 曾經見過直接以帳號做為密碼的狀況!真是要命∼太好猜了!

    好了!知道了密碼的重要性,與基本的設定之後,接著下來我們談一談如何手動設定密碼吧!基本上, root 可以設定『任何樣式的密碼』,而且, root 也可以幫助 user 訂定他們的密碼!至於 user 僅能修改自己的密碼!那麼修改密碼使用什麼命令?就是 passwd 這個命令啦!咦!這裡突然給他想到幾個重要資訊,大家趕緊複習一下: 這些指令與意義如果都還沒有忘記!恭喜您了!真是不錯!好了,還記得我們密碼放在哪裡嗎?對啦!就是 /etc/shadow 裡面,那個檔案的權限是 -rw------- 所以只有 root 可以修改,因此, passwd 必需要具有 SUID 才能讓一般使用者修改他們的密碼囉!關於 passwd 的用法, 我們前面已經稍微提過一些囉,在底下我們則針對 root 談一下 passwd 還有什麼好功能??


  • passwd
  • [root@linux ~]# passwd [-lunxwS] username
    參數:
    -l  :將 username 這個帳號的密碼鎖住 (lock),在 /etc/shadow 內的密碼欄修訂∼
    -u  :將 -l 的 lock 解開!
    -n  :後面接天數 (數字) ,最短天數;亦即是 /etc/shadow 內的第四欄;
    -x  :後面接天數 (數字) ,最長天數;亦即是 /etc/shadow 內的第五欄;
    -w  :後面接天數 (數字) ,警告天數;亦即是 /etc/shadow 內的第六欄;
    -S  :顯示目前這個 username 的相關資訊。
    範例:
    
    範例一:將 dmtsai 這個使用者的密碼凍結,並觀察他!
    [root@linux ~]# passwd -l dmtsai
    Locking password for user dmtsai.
    passwd: Success
    [root@linux ~]# passwd -S dmtsai
    Password locked.
    [root@linux ~]# grep dmtsai /etc/shadow
    dmtsai:!!$1$TDy6D7eg$jVJV/FMaQn14v5Kl7sqw6/:13026:0:99999:7::13149:
    
    範例二:將上述密碼凍結解開
    [root@linux ~]# passwd -u dmtsai
    
    其實這個 passwd 指令還挺多用的∼尤其很多功能僅有 root 才能執行。 您可以使用 passwd -l 及 passwd -u 來強制讓一個使用者『暫時』無法使用該帳號, 很方便的啦! ^_^

    使用者身份切換:
    什麼?在 Linux 系統當中還要作身份的變換?這是為啥? 但是怎樣變換身份呀?怎麼說呢?就是說,一般而言,我們都不希望以 root 的身份登入主機,以避免被怪客入侵了!但是一部主機又不可能完全不進行修補或者是設定等動作! 這個時候要如何將一般使用者的身份變成 root 呢?主要有兩種方式,分別是: 底下我們就來說一說 su 跟 sudo 的用法啦!


    su
    [root@linux ~]# su [-lcm] [username]
    參數:
    -   :如果執行 su - 時,表示該使用者想要變換身份成為 root ,且使用 root 的
          環境設定參數檔,如 /root/.bash_profile 等等。
    -l  :後面可以接使用者,例如 su -l dmtsai ,這個 -l 好處是,可使用欲變換身份者
          他的所有相關環境設定檔。
    -m  :-m 與 -p 是一樣的,表示『使用目前的環境設定,而不重新讀取新使用者的設定檔。』
    -c  :僅進行一次指令,所以 -c 後面可以加上指令喔!
    範例:
    
    範例一:由原本的 dmtsai 這個使用者,變換身份成為 root 。
    [dmtsai@linux ~]$ su
    Password: <==這裡輸入 root 的密碼喔!
    [root@linux ~]# env
    USER=dmtsai
    USERNAME=root
    MAIL=/var/spool/mail/dmtsai
    LOGNAME=dmtsai
    # 注意到了嗎?如果使用 su 沒有加上 - 的話,那麼很多原本使用者的相關設定會繼續存在,
    # 這也會造成後來的 root 身份在執行時的困擾。最常見的就是 PATH 這個變數的問題!
    
    [root@linux ~]# exit  <==這樣可以離開 su 的環境!
    [dmtsai@linux ~]$ su -
    Password: <==這裡輸入 root 的密碼喔!
    [root@linux ~]# env
    USER=root
    MAIL=/var/spool/mail/root
    LOGNAME=root
    # 瞭解差異了吧?!所以,下次在變換成為 root 時,記得最好使用 su - 喔!
    
    範例二:使用 root 的身份,執行 head -n 3 /etc/shadow
    [dmtsai@linux ~]$ su - -c "head -n 3 /etc/shadow"
    Password: <==這裡輸入 root 的密碼喔!
    root:$1$jaldj9843u29jlj9u839jljlcghjlE/:12959:0:99999:7:::
    bin:*:12959:0:99999:7:::
    daemon:*:12959:0:99999:7:::
    
    範例三:原本是 dmtsai 這個使用者,想要變換身份成為 vbird 時?
    [dmtsai@linux ~]$ su -l vbird
    Password: <==這裡輸入 vbird 的密碼喔!
    
    這個 su 指令可以讓你在不同的使用者之間切換身份,當 su 後面沒有加上使用者帳號時, 那麼預設就是以 root 作為你切換的那個身份啦!其實,這個指令最大的用途也是在這裡! 就是讓一般使用者變成 root 啦!而要特別留意的則是 su 的使用方式上, 由於『是否讀入欲切換的身份者的環境參數檔案』的不同, 所以您必須要留意喔! 雖然使用 su 很方便啦∼不過,缺點是當我有很多管理員時,那麼是否每個人都需要知道 root 的密碼? 這樣很危險ㄟ! root 的密碼可能會外流∼怎麼辦?沒關係,我們可以使用 sudo 來取代 su 喔。


    sudo
    使用 su 切換身份真的是很簡單啦∼不過, su 卻有一個很嚴重的問題, 那就是.....我們必須要知道想要變成的那個人的登入密碼∼ 舉例來說,如果我想要變成 root ,那麼就必須要知道 root 的密碼才行, 如果我想要變成 dmtsai 來工作,那麼除非我是 root ,否則就必須要知道 dmtsai 這個使用者的密碼才行∼而眾所皆知的,如果多人管理一部主機的話, 大家都知道 root 的密碼,那......挺危險的,不是嗎?!

    這個時候, sudo 就派的上用場囉∼那麼 sudo 是怎樣工作的呢? 要注意的是,使用者『輸入的是自己的密碼,而不是欲切換成為他的那個身份的密碼!』 舉例來說,假設 dmtsai 具有執行 sudo 的權限,那麼當他以 sudo 執行 root 的工作時, 他需要輸入的是 dmtsai 自己的密碼,而不是 root 的密碼!嘿嘿!很棒吧! ^_^ 如此一來,大家可以使用自己的密碼執行 root 的工作,而不必知道 root 的密碼,安全多了。 此外,使用者能夠執行的指令是可以被限制的! 所以,我們可以設定 dmtsai 僅能進行 shutdown 的工作,或者是其他一些簡單的指令, 嘿嘿!是否很棒啊!

    不過,由上面的說明當中,您也會瞭解,是否具有 sudo 的執行權限是很重要的, 而 sudo 的執行權限與 /etc/sudoers 這的檔案有關。在預設的情況下,只有 root 才能夠使用 sudo 呢!至於編輯 /etc/sudoers 則需要 visudo 這個指令。好了, 底下我們就來看一看 sudo 的語法先。
    [root@linux ~]# sudo [-u [username|#uid]] command
    參數:
    -u  :後面可以接使用者帳號名稱,或者是 UID。例如 UID 是 500 的身份,可以:
          -u #500 來作為切換到 UID 為 500 的那位使用者。
    範例:
    
    範例一:一般身份使用者使用 sudo 在 /root 底下建立目錄:
    [dmtsai@linux ~]$ sudo mkdir /root/testing
    We trust you have received the usual lecture from the local System
    Administrator. It usually boils down to these three things:
    
        #1) Respect the privacy of others.
        #2) Think before you type.
        #3) With great power comes great responsibility.
    
    Password: <==這裡輸入 dmtsai 自己的密碼
    dmtsai is not in the sudoers file.  This incident will be reported.
    # 瞧!因為 dmtsai 不在 /etc/sudoers ,所以他就無法執行 sudo 喔!
    
    範例二:假設 dmtsai 已經具有 sudo 的執行權限,如何在 /root 底下建立目錄?
    [dmtsai@linux ~]$ sudo mkdir /root/testing
    Password: <==這裡輸入 dmtsai 自己的密碼
    
    範例三:如何將 sudo 與 su 搭配使用?
    [dmtsai@linux ~]$ sudo su -
    
    範例四:dmtsai 想要切換身份成為 vbird 來進行 touch 時?
    [dmtsai@linux ~]$ sudo -u vbird touch /home/vbird/test
    
    上面我進行了四個範例,不過,要注意的是,若我是以 dmtsai 來進行的, 那麼在接下來的五分鐘內,如果你持續使用 sudo 來工作時,那就不需要再次的輸入密碼。 這是因為系統相信你在五分鐘內不會離開而有第二個人跑來操作系統啊! 呼呼!真是很人性化的設計啊∼ ^_^。不過如果兩次 sudo 操作的間隔超過 5 分鐘,那就得要重新輸入一次你的密碼了。 而且要注意的是,因為使用一般帳號時,理論上不會使用到 /sbin, /usr/sbin 等目錄內的指令, 所以 $PATH 變數不會含有這些目錄,因此很多管理指令需要使用絕對路徑來下達比較妥當喔! 或者直接修改您自己的 PATH 變數吧!

    上面這四個範例我都是以 dmtsai 這個使用者來進行的,但是,在預設的情況中, 您的使用者應該是不能使用 sudo 的∼這是因為我們上面提到的啊,還沒有去設定 /etc/sudoers 嘛! 所以囉,如果您要測試上面的範例之前,是需要將 /etc/sudoers 動動手腳的。 不過,因為 /etc/sudoers 需要一些比較特別的語法,因此,如果你直接以 vi 去編輯他時, 如果輸入的字句錯誤,可能會造成無法啟用 sudo 的困擾,因此,建議您一定要使用 visudo 去編輯 /etc/sudoers 喔!(註: visudo 必須要使用 root 的身份來執行!)
    [root@linux ~]# visudo
    # sudoers file.
    # This file MUST be edited with the 'visudo' command as root.
    # See the sudoers man page for the details on how to write a sudoers file.
    #
    # Host alias specification
    # User alias specification
    # Cmnd alias specification
    # Defaults specification
    # Runas alias specification
    # User privilege specification
    root    ALL=(ALL) ALL
    dmtsai  ALL=(ALL) ALL   <==這裡將 dmtsai 製作成完全可用!
    
    # Uncomment to allow people in group wheel to run all commands
    # %wheel        ALL=(ALL)       ALL
    # Same thing without a password
    # %wheel        ALL=(ALL)       NOPASSWD: ALL
    # Samples
    # %users  ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
    # %users  localhost=/sbin/shutdown -h now
    
    使用 visudo 之後,其實就會出現一個 vi 的畫面啦!他就是以 vi 來開啟 /etc/sudoers , 不過,當我們儲存離開時, visudo 會額外去檢查 /etc/sudoers 內部的語法, 以避免使用者輸入錯誤的資訊了。我上面只有加入一行,就是讓那個 dmtsai 成為可以隨意使用 sudo 的身份而已。基本上, /etc/sudoers 的結構您可以使用 man sudoers 去查閱, 該說明內容說的很清楚,而且還有一些範例呢!鳥哥在這裡僅作一些簡單的說明就是了。 那一行『 dmtsai ALL=(ALL) ALL 』代表的意義是: 因此,我上面這一行的意義是:『 dmtsai 這個使用者,不論來自何方, 他可以變換成任何 Linux 本機上面有的所有帳號,並執行所有的指令』的意思啦! 假如您的系統裡面,有個 Web 的軟體是以 www 這個使用者來進行編輯的, 您想要讓 vbird2 這個使用者可以用 www 這個帳號進行編輯,那麼就應該寫成: 如果錯寫成: 亦即沒有加上身份宣告的話,那麼『預設是僅能進行 root 的身份切換』而已喔! ^_^ 這可是很重要的一個觀念呢!另外,如果想要以使用者的群組來進行規範的話,那麼在 『使用者帳號』的欄位,前面加上『 % 』時,就代表是群組 (group) 的身份了。 舉例來說,我想要讓系統裡面所有屬於 wheel 這個群組的使用者都能夠進行 sudo 時,可以這樣寫: 而如果你還想要讓這個群組內的使用者在使用 sudo 時,不需要輸入密碼, 那麼可以在『可以下達的指令』那個欄位內多加入一個參數,名為『NOPASSWD:』即可,亦即: 另外,除了單一個人或單一群組之外,我們還可以額外指定一些『帳號別名、主機別名、指令別名』 等等的資料來相互套用喔!真是好棒啊!不過,關於別名的使用上,『必須要使用大寫字元』才行喔! 好了,我們來做一些練習,讓您可以很清楚的知道如何進行 visudo 的設定吧!

    例題:我想要建立一個可以幫忙系統管理員變更使用者密碼的群組,名稱為 ADMPW ( 注意,在 sudoers 內,這個別名的名稱一定要是大寫字元才行!)但是這個群組不能修改 root 的密碼喔! 且他們執行 sudo 時,不需要密碼驗證。
    答:
      我以 root 的身份使用 visudo ,進入編輯畫面後,去設定成底下的模樣:
      User_Alias ADMPW = vbird, dmtsai, vbird1, vbird3
      ADMPW ALL = NOPASSWD: !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, \
                            !/usr/bin/passwd root
      
      上面的意思是說,我的系統上面有四個帳號,分別是 vbird, vbird1, vbird3 與 dmtsai 這四個帳號加入 sudo 內的 ADMPW 群組中,這四個帳號可以使用 sudo 進行『 /usr/bin/passwd * 』 密碼的更改動作,但是不能 (在指令前面加入 ! 代表不可) 使用 /usr/bin/passwd 或 /usr/bin/passwd root ,如此一來,就讓該 ADMPW 可以更改使用者的密碼,但是不能變更 root 的密碼囉! ^_^

    在 /etc/sudoers 裡頭加入別名有很多的好處,舉例來說,以上面的例子來講, 假設未來我有其他的使用者要加入該密碼管理的群組時,直接將帳號加入 ADMPW 那個群組中就好了,很簡單的使用吧! ^_^。再看看下一題:

    例題:我的系統中有 DNS 服務,他的啟動指令在 /etc/init.d/named ,如果我想要建立一個 DNSMASTER 的群組來管理他時?如何是好?
    答:
      我以 root 的身份使用 visudo ,進入編輯畫面後,去設定成底下的模樣:
      User_Alias DNSMASTER = vbird, dmtsai
      Cmnd_Alias DNSCMD = /etc/init.d/named, /usr/bin/vim /var/named/*
      DNSMASTER ALL = DNSCMD
      
      看的懂嗎?嘿嘿!因為 DNS 的設定檔大多在 /var/named 裡面,所以,我也允許相關帳號用 vi 去處理 DNS 的設定檔啦!很簡單對吧! ^_^

    好了,我們知道 sudo 可以搭配 su 來進行一堆系統的工作對吧! 因為 sudo 僅能進行一次指令,很麻煩,如果我能夠將 sudo 與 su 搭配在一起,不就很棒了嗎? 這個時候,我可以利用上面已經建立好的 ADMPW 群組來新增這一行: 如此一來,在 ADMPW 內的使用者,就可以利用『 sudo su - 』來切換身份成為 root 囉∼ 真是棒得不得了啊! ^_^

    使用者的特殊 shell 與 PAM 模組
    我們前面一直談到的大多是一般身份使用者與系統管理員 (root) 的相關操作, 而且大多是討論關於可登入系統的帳號來說。那麼換個角度想,如果我今天想要建立的, 是一個『僅能使用 mail server 相關郵件服務的帳號,而該帳號並不能登入 Linux 主機』呢? 如果不能給予該帳號一個密碼,那麼該帳號就無法使用系統的各項資源,當然也包括 mail 的資源, 而如果給予一個密碼,那麼該帳號就可能可以登入 Linux 主機啊!呵呵∼傷腦筋吧∼ 所以,底下讓我們來談一談這些有趣的話題囉!


    特殊的 shell, /sbin/nologin
    如果你曾經仔細的看過 /etc/shells 這個系統可用的 shell 檔案,以及 /etc/passwd 這個檔案的內容時,你應該會發現,嘿嘿!怎麼有個怪怪的 /sbin/nologin 啊! 這是什麼 shell 呢?呵呵!趕緊利用 man nologin 就可以知道啦∼

    其實,這個 shell 通常是給系統帳號使用的,因為這個 /sbin/nologin 事實上並無法給予帳號實際登入, 如果你利用 usermod 修改了 dmtsai 這個使用者的 shell 成為 /sbin/nologin 之後, 再次想要以 dmtsai 重新登入系統時,他在螢幕上會出現這樣的訊息:
    This account is currently not available.
    
    嘿嘿!它說的是『這個帳號並不能被允許登入啦!』不過,這個帳號卻可以進行其他的工作喔! 舉例來說,各個系統帳號,列印工作由 lp 這個帳號在管理, WWW 服務由 apache 這個帳號在管理, 他們都可以進行系統程序的工作,但是『就是無法登入主機』而已啦!^_^

    換個角度來想,如果我的 Linux 主機提供的是郵件服務,所以說,在這部 Linux 主機上面的帳號, 其實大部分都是用來收受主機的信件而已,並不需要登入主機的呢! 這個時候,我們就可以考慮讓單純使用 mail 的帳號以 /sbin/nologin 做為他們的 shell , 這樣,最起碼當我的主機被嘗試想要登入系統時,可以拒絕該帳號呢!

    另外,如果我想要讓某個具有 /sbin/nologin 的使用者知道,他們不能登入主機時, 其實我可以建立『 /etc/nologin.txt 』這個檔案, 並且在這個檔案內說明不能登入的原因,那麼下次當這個使用者想要登入系統時, 螢幕上出現的就會是 /etc/nologin.txt 這個檔案的內容,而不是預設的內容了!


    PAM 模組:/etc/nologin, /etc/securetty
    當一個使用者想要登入 Linux 主機時,他受到什麼限制呢?我們說, 他除了必須要通過 /etc/passwd 及 /etc/shadow 的驗證並取得相關的權限資料, 最後獲得一個 shell 之外,事實上,他在登入系統之前,就得要通過 PAM (Pluggable Authentication Modules, 嵌入式模組) 的驗證才行。

    PAM 模組的用途非常的多,除了可以在使用者登入時進行身份的驗證之外, 也可以輔助一些應用程式的驗證之用喔!舉例來說,我們前面提到的密碼修改程式『 passwd 』 ,當我們執行密碼修訂的時候,這個程式不是會告訴我們您輸入的密碼是否合於規範嗎? 如果是記錄在字典當中的密碼,或者是與帳號相同的密碼,那麼就會被 PAM 模組打回票, 也就無法通過驗證了!

    那麼 PAM 怎麼運作呢?我們同樣以 /usr/bin/passwd 這支程式來作為簡單的說明好了:
    1. 使用者開始執行 /usr/bin/passwd 這支程式,並輸入密碼;
    2. passwd 開始呼叫 PAM 模組,PAM 模組會搜尋 passwd 程式的 PAM 相關設定檔案, 這個設定檔一般是在 /etc/pam.d/ 裡面的與程式同名的檔案,所以,在本例中, PAM 會去搜尋 /etc/pam.d/passwd 這個設定檔;
    3. 經由 /etc/pam.d/passwd 設定檔的資料,取用 PAM 所提供的相關模組來進行驗證;
    4. 將驗證結果回傳給 passwd 這支程式,而 passwd 這支程式會根據 PAM 回傳的結果決定下一個動作 (重新輸入新密碼或者通過驗證!)
    這個過程提供我們幾個重要的資訊: 至於 PAM 相關模組的運作,有興趣的話,您可以前往您 Linux 主機的: /usr/share/doc/pam* 目錄去瞧一瞧,裡面有相當多豐富的資訊可以提供給你參考。 我們這裡僅就使用者登入相關的模組來進行一些簡單的說明而已喔。


  • PAM 的設定檔設定範例:
  • 反正 PAM 模組就是讓程式呼叫用的,而當程式呼叫時, PAM 就會利用相對應的設定檔來進行一些驗證就是了。我們還是舉 passwd 為例好了, 如果你去觀察一下 /etc/pam.d/passwd 的內容時,他是這樣的:
    [root@linux ~]# cat /etc/pam.d/passwd
    #%PAM-1.0
    auth       required     pam_stack.so service=system-auth
    account    required     pam_stack.so service=system-auth
    password   required     pam_stack.so service=system-auth
    
    基本上,在這個檔案內,每一行都是一個動作,而每個動作都分為四個欄位,分別是:
      驗證的類別   驗證的控制標準   使用的PAM模組   該模組的能使用的參數
    驗證的類別 (Module type) 共分為四種類,分別說明:
    • auth
      這種類別主要用來檢驗使用者的身份驗證,所以這種類別通常是需要密碼來檢驗的。

    • account
      這種類別則主要在檢驗使用者是否具有正確的使用權限,舉例來說,當你使用一個過期的密碼來登入時, 當然就無法正確的登入了。

    • session
      這種類別主要在管理當使用者正確的使用該程式時的環境設定。舉例來說,我們登入 Linux 其實使用的是 /bin/login 這個程式的相關功能的,所以,當實際登入後,在操作 shell 的過程中,都是受 session 這種類別的設定所控制的喔!另外,如果使用 session 這種類別時, 則該程式在正式使用之前與使用結束之後,都會有相關紀錄被記到登錄檔當中喔!

    • password
      至於這種類別,則主要在提供驗證的修訂工作,舉例來說,就是修改/變更密碼啦!
    那麼『驗證的控制標準(control flag)』又是什麼?簡單的說,他就是『驗證通過的標準』啦! 總共也有四種方式,分別是:
    • required
      當模組設定為這種控制標準時,該模組的驗證必須要成功,否則就會回傳一個 failure 的訊息。 不過,不論此一動作的模組是否成功,接下去的模組都還會繼續動作! 而若有 failure 的訊息時,也會在後續的動作都進行完畢之後,才會回傳給原程式。 比底下的 requisite 還要優秀的地方,在於該模組底下的動作可能具有登錄檔紀錄 (log) 的舉動,則錯誤的訊息才會被紀錄起來喔!

    • requisite
      當模組設定為 requisite 時,該模組的認證要求同樣的需要成功才行。 不過,如果該模組沒有通過驗證,那麼 PAM 會『立刻』回報程式一個 failure 的值, 也就是說,若該次動作的模組後續還有其他模組時,其他模組的動作將不會被啟用。

    • optional
      這個模組控制項目大多是在顯示訊息而已,並不是用在驗證方面的。

    • sufficient
      這個模組控制標準也挺有趣的,相對於 requisite 是『發生錯誤時,立刻回報原執行程式 failure , 並且中斷 PAM 的運作』, sufficient 則是『順利通過驗證時,立刻回報原程式通過的訊息, 並且中斷 PAM 的運作』。呵呵!完全相反喔!
    至於 PAM 的模組方面,目前我們的 FC4 提供的 PAM 模組真的夠多了, 這些模組實際上都放置在 /lib/security/ 目錄中,FC4 相關的 PAM 說明文件則放置在 /usr/share/doc/pam-*/* 裡面,您可以根據每個不同的模組去討論他的用途, 鳥哥在這裡僅針對我們登入時所使用的 login 這個程式的 PAM 設定檔,也就是 /etc/pam.d/login 這個檔案的內容來稍做說明:
    [root@linux ~]# cat /etc/pam.d/login
    #%PAM-1.0
    auth       required	pam_securetty.so
    auth       required	pam_stack.so service=system-auth
    auth       required	pam_nologin.so
    account    required	pam_stack.so service=system-auth
    password   required	pam_stack.so service=system-auth
    # pam_selinux.so close should be the first session rule
    session    required	pam_selinux.so close
    session    required	pam_stack.so service=system-auth
    session    optional	pam_console.so
    # pam_selinux.so open should be the last session rule
    session    required	pam_selinux.so multiple open
    
    在我們登入 Linux 的時候,使用到的 login 這個程式時,他使用的 PAM 設定檔大多是 required 的控制標準,所以必須要通過上述的幾個 PAM 模組的驗證後,才能夠判定是否登入 Linux 。 需要留意的是,我們會看到 session 的模組類型,這表示我們在實際使用 Linux 的資源之前,以及登出 Linux 主機後,相關的資料都會被紀錄到登錄檔當中。 嘿嘿!所以囉,如果您仔細的看過 /var/log/messages 與 /var/log/secure , 就能夠發現你的一舉一動其實是有被紀錄下來的喔! ^_^

    另外,在上面表格當中的模組中,比較有趣的是被鳥哥註明特殊字體的部分, 這兩個模組: pam_securetty.so 及 pam_nologin 是挺有趣的喔! 我們就額外來談一談這兩個關於登入環境的驗證模組吧!


  • /etc/securetty
  • 這個 pam_securetty 模組是幹嘛用的?其實他最主要的功能就是在預防不安全的登入環境啦! 而且主要是針對 root 這個使用者的身份喔! 這個模組在被啟用時,會去讀取 /etc/securetty 這個檔案, 我們『可以將被認定是安全的終端機 (terminal) 環境寫入這個檔案中, 則 root 僅可以在那幾個終端機環境下登入』的啦!

    一般來說,我們會認定在主機前面的環境是安全的,而使用網路登入的環境則比較危險。 因此,一般 /etc/securetty 的內容大多是這樣:
    tty1
    tty2
    tty3
    tty4
    ...
    
    而沒有 pts/0 這類的網路登入的終端介面。這也就是說, root 僅能經由 tty1 這種終端機登入的啦!支援 login 程式的軟體有 telnet 服務與本機前面的 tty1~tty6 的 login, 這也是我們提到的,為何使用傳統的 telnet 連線主機連線到 Linux 時,預設無法使用 root 身份登入的主要原因囉。

    那麼如何克服呢?其實也很簡單啦,就將這個模組的驗證移除即可! 主要有兩種方式:
    • 將 /etc/pam.d/login 內,關於 pam_securetty.so 模組的那一行註解掉;
    • 將 /etc/securetty 這個檔案移除。
    如此一來,當我們使用 telnet 連線到 Linux 主機時,就能夠直接使用 root 的身份登入了。 不過,鳥哥不建議這麼做喔!不過或許您又會問啦,那為什麼我使用 ssh 連線時, 就可以直接使用 root 登入呢?呵呵!這是因為 ssh 沒有用到這個模組ㄇㄟ! 不相信嗎?仔細自己去查閱一下 /etc/pam.d/sshd 就知道啦! ^_^。


  • /etc/nologin
  • 那麼 pam_nologin 又是在搞什麼咚咚啊?其實,這個模組也是在控制使用者登入用的。 不過,這個模組只針對一般身份使用者有效,對 root 是沒有效果的。這個模組必須要與 /etc/nologin 搭配使用,注意喔,是 /etc/nologin ,而不是 /etc/nologin.txt , 這兩個檔案的用途是不相同的喔! ^_^。

    當 /etc/nologin 檔案存在時,則任何一個一般身份帳號在嘗試登入時, 都僅會獲得 /etc/nologin 內容的資訊,而無法登入主機。舉例來說,當我建立 /etc/nologin ,並且內容設定為『This Linux server is maintaining....』, 那麼任何人嘗試登入時,都僅會看到上面提到的這段訊息,而且無法登入喔! 一直要到 /etc/nologin 被移除後,一般身份使用者才能夠再次的登入啊!


  • /etc/security/*
  • 事實上,更多的 PAM 模組設定資訊您可以參考 /etc/security/* 裡面的檔案設定, 尤其是針對使用者利用 Linux 系統資源的 limits.conf 以及時間的 time.conf 。 我們知道使用者利用系統資源的指令是 ulimit ,那麼假如我想要讓 dmtsai 僅能存取 10MBytes (10240KBytes) 的檔案大小,那麼我可以這樣做:
    [root@linux ~]# vi /etc/security/limits.conf
    # 新增這兩行
    dmtsai          hard    fsize   10240
    @users          hard    fsize   10240
    # 注意到,帳號前面加上 @ 表示為『群組!』
    
    那麼下次 dmtsai 或者是屬於 users 的群組的使用者登入這個 Linux 主機時, 你可以利用 ulimit -a 去察看一下,嘿嘿!他們能用的資源就減小很多了! 更多的用法您可以自行參考一下該檔案內的說明啊! ^_^ (記得測試完畢要將資料改回來∼否則....以後就麻煩了!)

    Linux 系統上使用者的對談與 mail 的使用:
    談了這麼多的系統帳號問題,總是該要談一談,那麼如何針對系統上面的使用者進行查詢吧?! 想幾個狀態,如果你在 Linux 上面操作時,剛好有其他的使用者也登入主機,你想要跟他對談,該如何是好? 你想要知道某個帳號的相關資訊,該如何查閱?呼呼!底下我們就來聊一聊∼


    查詢使用者: w, who, last, lastlog
    如何查詢一個使用者的相關資料呢?這還不簡單,我們之前就提過了 w, who, finger 等指令了, 都可以讓您瞭解到一個使用者的相關資訊啦!那麼想要知道使用者到底啥時候登入呢? 最簡單可以使用 last 檢查啊!這個玩意兒我們也在 bash shell 那個章節提過了, 您可以自行前往參考啊!簡單的很。不過, last 僅有列出這個月份的資料而已喔。

    另外,如果您想要知道每個帳號的最近登入的時間,則可以使用 lastlog 這個指令喔! lastlog 會去讀取 /var/log/lastlog 檔案,結果將資料輸出,如下表:
    [root@linux ~]# lastlog
    Username         Port     From             Latest
    root             tty1                      Tue Aug 16 18:06:20 +0800 2005
    bin                                        **Never logged in**
    daemon                                     **Never logged in**
    ....以下省略.....
    
    這樣就能夠知道每個帳號的最近登入的時間囉∼ ^_^


    使用者對談: talk, mesg, wall
    那麼我是否可以跟系統上面的使用者談天說地呢?當然可以啦! 利用 talk 這個指令即可!不過, talk 需要額外的啟動一些網路服務, 對於目前的 Linux distribution 以及網路環境,嘿嘿!咱們還是不要玩這個東西啦∼ 如果您確定想要玩這個玩意兒,那麼請自行 man talk , 同時考慮啟動 ntalk 這個服務看看囉∼

    除了直接線上對談 (talk) 之外,有沒有其他訊息傳送的功能啊? 有啊!利用 write 是不錯的方式啦!他可以直接將訊息傳給接收者囉! 舉例來說,我們的 Linux 目前有 vbird 與 dmtsai 兩個人在線上:
    [vbird@linux ~]$ w
     16:50:39  up  1:58,  2 users,  load average: 0.00, 0.00, 0.00
    USER     TTY      FROM      LOGIN@   IDLE   JCPU   PCPU  WHAT
    vbird    pts/0    vbird     4:37pm  0.00s  0.06s  0.01s  w
    dmtsai   pts/1    dmtsai    4:38pm  1:51   0.07s  0.01s  man write
    
    我以 vbird 傳送一個訊息給 dmtsai 時,可以這樣做:
    [vbird@linux ~]$ write dmtsai
    Hi, How are you doing today....
    Nothing.... just say hello to you!
    <==這裡按下 [ctrl]+d
    
    此時,另一端的 dmtsai 在他的終端介面上就會出現如下所示:
    [dmtsai@linux ~]$ 
    Hi, How are you doing today....
    Nothing.... just say hello to you!
    EOF
    
    怪怪∼立刻會有訊息回應給 dmtsai ㄟ!不過......當時 dmtsai 正在查資料,哇! 這些訊息會立刻打斷 dmtsai 原本的工作喔!所以,如果 dmtsai 這個人不想要接受任何訊息, 直接下達這個動作:
    [dmtsai@linux ~]$ mesg n
    
    所以,當 vbird 再次下達 write 時,就會出現:
    [vbird@linux ~]$ write dmtsai
    write: dmtsai has messages disabled
    
    呼呼!瞭解乎?而如果想要解開的話,再次下達『 mesg y 』就好啦!想要知道目前的 mesg 狀態,直接下達『 mesg 』即可!瞭呼?

    相對於 write 是僅針對一個使用者來傳『簡訊』,我們還可以『對所有系統上面的使用者傳送簡訊』哩∼ 如何下達?呼呼!用 wall 即可啊!他的語法也是很簡單的喔!
    [root@linux ~]# wall "I will shutdown the linux server about 5m later.
    > If you still have to login, please tell me.
    > Or I will do it....."
    
    那麼除非您的 mesg 狀態是 n ,否則,嘿嘿!就能夠收到這個廣播訊息囉! ^_^


    使用者郵件信箱: mail
    使用 wall, write 畢竟要等到使用者在線上才能夠進行,有沒有其他方式來聯絡啊? 不是說每個 Linux 主機上面的使用者都具有一個 mailbox 嗎? 我們可否寄信給使用者啊!呵呵!當然可以啊!我們可以寄、收 mailbox 內的信件呢! 一般來說, mailbox 都會放置在 /var/spool/mail 裡面,一個帳號一個 mailbox (檔案)。 舉例來說,我的 dmtsai 就具有 /var/spool/mail/dmtsai 這個 mailbox 喔!

    那麼我該如何寄出信件呢?嗯!就直接使用 mail 這個指令即可! 這個指令的用法很簡單的,直接這樣下達:『 mail username@localhost -s "郵件標題" 』即可! 一般來說,如果是寄給本機上的使用者,基本上,連『 @localhost 』都不用寫啦! 舉例來說,我以 vbird 寄信給 dmtsai ,信件標題是『 nice to meet you 』,則:
    [vbird@linux ~]$ mail dmtsai -s "nice to meet you"
    Hello, D.M. Tsai
    Nice to meet you in the network.
    You are so nice.  byebye!
    .   <==這裡很重要喔,結束時,最後一行輸入小數點 . 即可!
    Cc:  <==這裡是所謂的『副本』,不需要寄給其他人,所以直接 [Enter]
    [vbird@linux ~]$  <==出現提示字元,表示輸入完畢了!
    
    呼呼!如此一來,你就已經寄出一封信給 dmtsai 這位使用者囉,而且,該信件標題為: nice to meet you,信件內容就如同上面提到的。不過,你或許會覺得 mail 這個程式不好用∼ 因為在信件編寫的過程中,如果寫錯字而按下 Enter 進入次行,前一行的資料很難刪除ㄟ! 那怎麼辦?沒關係啦!我們使用資料流重導向啊!呵呵!利用那個小於的符號 ( < ) 就可以達到取代鍵盤輸入的要求了。也就是說,你可以先用 vi 將信件內容編好, 然後再以 mail dmtsai -s "nice to meet you" < filename 來將檔案內容傳輸即可。

    例題:請將你的家目錄下的環境變數檔 (~/.bashrc) 寄給自己!
    答:
      mail -s "bashrc file content" vbird < ~/.bashrc

    剛剛上面提到的是關於『寄信』的問題,那麼如果是要收信呢?呵呵!同樣的使用 mail 啊! 假設我以 dmtsai 的身份登入主機,然後輸入 mail 後,會得到什麼?
    [dmtsai@linux ~]$ mail
    Mail version 8.1 6/6/93.  Type ? for help.
    "/var/spool/mail/dmtsai": 1 message 1 new
    >N  1 vbird@linux.site  Fri Sep  2 23:53  16/552   "nice to meet you"
    &  <==這裡可以輸入很多的指令,如果要查閱,輸入 ? 即可!
    
    在 mail 當中的提示字元是 & 符號喔,別搞錯了∼輸入 mail 之後,我可以看到我有一封信件, 這封信件的前面那個 > 代表目前處理的信件,而在大於符號的左邊那個 N 代表該封信件尚未讀過, 如果我想要知道這個 mail 內部的指令有哪些,可以在 & 之後輸入『 ? 』,就可以看到如下的畫面:
    & ?
        Mail   Commands
    t <message list>                type messages
    n                               goto and type next message
    e <message list>                edit messages
    f <message list>                give head lines of messages
    d <message list>                delete messages
    s <message list> file           append messages to file
    u <message list>                undelete messages
    R <message list>                reply to message senders
    r <message list>                reply to message senders and all recipients
    pre <message list>              make messages go back to /usr/spool/mail
    m <user list>                   mail to specific users
    q                               quit, saving unresolved messages in mbox
    x                               quit, do not remove system mailbox
    h                               print out active message headers
    !                               shell escape
    cd [directory]                  chdir to directory or home if none given
    
    <message list> 指的是每封郵件的左邊那個數字啦!而幾個比較常見的指令是:

    指令意義
    h將信件的標題列出來。如果想要查閱 40 封信件左右處的所有信件標頭,可以輸入『 h 40 』
    d刪除啦∼假設我要刪除第10封信,可以『 d10 』,假如我想要刪除 20-40 封信,可以『 d20-40 』, 不過,這個動作要生效的話,必須要配合 q 這個指令才行(參考底下說明)!
    s將信件儲存成為檔案。舉例來說,我要將第 5 封信件的內容存成 ~/mail.file 的話,可以: 『 s 5 ~/mail.file 』喔!
    x或者輸入 exit 都可以。這個是『不作任何動作離開 mail 程式』的意思。 不論你剛剛刪除了什麼信件,或者讀過什麼,使用 exit 都會直接離開 mail,所以剛剛進行的刪除與閱讀工作都會無效。 如果您只是查閱一下郵件而已的話,一般來說,建議使用這個離開啦!除非你真的要刪除某些信件。
    q相對於 exit 是不動作離開, q 則會進行兩項動作: 1. 將剛剛刪除的信件移出 mailbox 之外; 2. 將剛剛有閱讀過的信件存入 ~/mbox ,且移出 mailbox 之外。鳥哥通常不很喜歡使用 q 離開, 因為,很容易忘記讀過什麼咚咚∼導致信件給他移出 mailbox 說∼

    mail 這個指令內容還有很多可以玩的,不過,我們這裡僅是介紹給您如何讓一般身份使用者來使用 mail 而已,所以就介紹到此囉∼ ^_^

    手動增加使用者:
    一般來說,我們不很建議大家使用手動的方式來新增使用者,為什麼呢? 因為使用者的建立涉及到 GID/UID 等權限的關係,而且,與檔案/目錄的權限也有關係, 使用 useradd 可以幫我們自動設定好 UID/GID 家目錄以及家目錄相關的權限設定, 但是,手動來增加的時候,有可能會忘東忘西,結果導致一些困擾的發生。

    不過,要瞭解整個系統,最好還是手動來修改過比較好,至少我們的帳號問題可以完全依照自己的意思去修訂, 而不必遷就於系統的預設值啊!但是,還是要告誡一下朋友們,要手動設定帳號時, 您必須要真的很瞭解自己在作什麼,尤其是與權限有關的設定方面喔! 好吧!底下就讓我們來玩一玩囉∼ ^_^


    一些檢查工具
    既然要手動修改帳號的相關設定檔,那麼一些檢查群組、帳號相關的指令就不可不知道啊∼ 尤其是那個密碼轉換的 pwconv 及 pwuconv 這兩個玩意∼可重要的很呢! 底下我們稍微介紹一下這些指令吧!


  • pwck
  • pwck 這個指令在檢查 /etc/passwd 這個帳號設定檔內的資訊,與實際的家目錄是否存在等資訊, 還可以比對 /etc/passwd /etc/shadow 的資訊是否一致,另外, 如果 /etc/passwd 內的資料欄位錯誤時,會提示使用者修訂。 一般來說,我只是利用這個玩意兒來檢查我的輸入是否正確就是了。
    [root@linux ~]# pwck
    user adm: directory /var/adm does not exist
    user news: directory /etc/news does not exist
    user uucp: directory /var/spool/uucp does not exist
    
    瞧!上面僅是告知我,這些帳號並沒有家目錄,由於那些帳號絕大部分都是系統帳號, 確實也不需要家目錄的,所以,那是『正常的錯誤!』呵呵!不理他。 ^_^。 相對應的群組檢查可以使用 grpck 這個指令的啦!


  • pwconv
  • 這個指令主要的目的是在『將 /etc/passwd 內的帳號與密碼,移動到 /etc/shadow 當中!』 早期的 Unix 系統當中並沒有 /etc/shadow 呢,所以,使用者的登入密碼早期是在 /etc/passwd 的第二欄,後來為了系統安全,才將密碼資料移動到 /etc/shadow 內的。 使用 pwconv 後,可以:
    • 比對 /etc/passwd 及 /etc/shadow ,若 /etc/passwd 內存在的帳號並沒有對應的 /etc/shadow 密碼時,則 pwconv 會去 /etc/login.defs 取用相關的密碼資料,並建立該帳號的 /etc/shadow 資料;
    • 若 /etc/passwd 內存在加密後的密碼資料時,則 pwconv 會將該密碼欄移動到 /etc/shadow 內,並將原本的 /etc/passwd 內相對應的密碼欄變成 x !
    一般來說,如果您正常使用 useradd 增加使用者時,使用 pwconv 並不會有任何的動作,因為 /etc/passwd 與 /etc/shadow 並不會有上述兩點問題啊! ^_^。 不過,如果手動設定帳號,這個 pwconv 就很重要囉!


  • pwunconv
  • 相對於 pwconv , pwunconv 則是『將 /etc/shadow 內的密碼欄資料寫回 /etc/passwd 當中, 並且刪除 /etc/shadow 檔案。』這個指令說實在的,最好不要使用啦! 因為他會將你的 /etc/shadow 刪除喔!如果你忘記備份,又不會使用 pwconv 的話, 粉嚴重呢!


  • chpasswd
  • chpasswd 是個挺有趣的指令,他可以『讀入未加密前的密碼,並且經過加密後, 將加密後的密碼寫入 /etc/shadow 當中。』這個指令很常被使用在大量建置帳號的情況中喔! 他可以由 Standard input 讀入資料,每筆資料的格式是『 username:password 』。 舉例來說,我的系統當中有個使用者帳號為 dmtsai ,我想要更新他的密碼 (update) , 假如他的密碼是 abcdefg 的話,那麼我可以這樣做:
    [root@linux ~]# echo "dmtsai:abcdefg" | chpasswd
    
    神奇吧!這樣就可以更新了呢!在預設的情況中, chpasswd 使用的是 DES 加密方法來加密, 我們可以使用 chpasswd -m 來使用 FC4 預設的 MD5 加密方法,不過, FC4 似乎怪怪的,我老是無法使用 -m 來達成這個指令。無論如何, 還是可以直接使用 chpasswd 來應用 DES 加密喔! 使用 DES 方法加密後,在 /etc/shadow 的密碼欄內,他的密碼位數為 13 位, 瞭乎??

    特殊帳號,如純數字帳號的建立
    在我們瞭解了 UID/GID 與帳號的關係之後,基本上,您應該瞭解了,為啥我們不建議使用純數字的帳號了! 因為很多時候,系統會搞不清楚那組數字是『帳號』還是『UID』,這不是很好啦∼ 也因此,在早期某些版本底下,是沒有辦法使用數字來建立帳號的。例如在 Red Hat 9 的環境中, 使用『 useradd 1234 』他會顯示『 useradd: invalid user name '1234' 』呼呼!瞭解了嗎?! (不過,這個問題在 FC4 卻不存在!因為 FC4 可以建立純數字的帳號說∼)

    不過,有的時候,長官的命令難為啊∼有時還是得要建立這方面的帳號的,那該如何是好? 呵呵!當然可以手動來建立這樣的帳號啦!不過,為了系統安全起見,鳥哥還是不建議使用純數字的帳號的啦! 因此,底下的範例當中,我們使用手動的方式來建立一個名為 normaluser 的帳號, 而且這個帳號屬於 normalgroup 這個群組。OK!那麼整個步驟該如何是好呢? 由前面的說明來看,您應該瞭解了帳號與群組是與 /etc/group, /etc/shadow, /etc/passwd, /etc/gshadow 有關,因此,整個動作是這樣的:
    1. 先建立所需要的群組 ( vi /etc/group );
    2. 將 /etc/group 與 /etc/gshadow 同步化 ( grpconv );
    3. 建立帳號的各個屬性 ( vi /etc/passwd );
    4. 將 /etc/passwd 與 /etc/shadow 同步化 ( pwconv );
    5. 建立該帳號的密碼 ( passwd accountname );
    6. 建立使用者家目錄 ( cp -a /etc/skel /home/accountname );
    7. 更改使用者家目錄的屬性 ( chown -R accountname.group /home/accountname )。
    夠簡單的咯吧!讓我們來玩一玩囉∼
    1. 建立群組 normalgroup ,假設 520 這個 GID 沒有被使用!並且同步化 gshadow
    [root@linux ~]# vi /etc/group
    # 在最後一行加入底下這一行!
    normalgroup:x:520:
    [root@linux ~]# grpconv
    [root@linux ~]# grep 'normalgroup' /etc/group /etc/gshadow
    /etc/group:normalgroup:x:520:
    /etc/gshadow:normalgroup:x::
    # 簡單!搞定群組囉! ^_^
    
    2. 建立 normaluser 這個帳號,假設 UID 700 沒被使用掉!
    [root@linux ~]# vi /etc/passwd
    # 在最後一行加入底下這一行!
    normaluser:x:700:520::/home/normaluser:/bin/bash
    
    3. 同步化密碼,並且建立該使用者的密碼
    [root@linux ~]# pwconv
    [root@linux ~]# grep 'normaluser' /etc/passwd /etc/shadow
    /etc/passwd:normaluser:x:700:520::/home/normaluser:/bin/bash
    /etc/shadow:normaluser:x:13030:0:99999:7:::
    # 呵呵!沒錯沒錯!已經建立妥當囉∼但是密碼還不對∼
    [root@linux ~]# passwd normaluser
    Changing password for user normaluser.
    New UNIX password:
    Retype new UNIX password:
    passwd: all authentication tokens updated successfully.
    
    4. 建立使用者家目錄,並且修訂權限!
    [root@linux ~]# cp -a /etc/skel /home/normaluser
    [root@linux ~]# chown -R normaluser:normalgroup /home/normaluser
    
    別懷疑!這樣就搞定了一個帳號的設定了! 從此以後,你可以建立任何名稱的帳號囉∼不過,還是不建議您設定一些很怪很怪的帳號名稱啦!


    不開放終端機登入的帳號 (ex>mail acccount)
    剛剛我們上面建立的這個帳號是『可以登入系統的帳號』,如果想要建立一個不能登入系統的帳號, 例如單純使用郵件收發信件而已的帳號,那麼又該如何設定呢?很簡單啦∼ 你可以這樣想: 也就是說,其實所有的步驟與剛剛上頭提到的動作都一樣,不過,少掉了很多與家目錄有關的設定行為就是了。 底下我假設我的系統裡面有個叫做 mail 的群組 (/etc/group) ,他的 GID 是 12 (以 FC4 為例), 另外,這個使用者的帳號為 popuser ,假設 UID 為 720 ,那麼該如何建立呢?
    1. 修改帳號屬性
    [root@linux ~]# vi /etc/passwd
    popuser:x:720:12::/home/popuser:/sbin/nologin
    
    2. 密碼同步,並且給予密碼!
    [root@linux ~]# pwconv
    [root@linux ~]# passwd popuser
    
    這樣就又 OK 了∼哇!真是太簡單了傑克∼....

    那麼又該如何刪除這些帳號呢?啊!還是建議利用 userdel 啦∼簡單∼乾脆又俐落∼ 如果想要暫時移除而已的話,那麼利用 passwd -l 及 passwd -u 吧! ^_^。 如果真的那麼想要手動來移除這個帳號的話,就這樣做:
    1. 先以 find / -user account 找出所有的帳號檔案,並將他刪除;
    2. 將 /etc/passwd 與 /etc/shadow 的相關資料刪除;
    3. 將 /etc/group 及 /etc/gshadow 相關資料刪除;
    4. 將 /home 底下關於該帳號的目錄刪除;
    5. 到 /var/spool/mail 以及 /var/spool/cron 裡面將相關的使用者檔案刪除。
    這樣就手動刪除啦∼


    一個大量建置帳號的範例
    不要懷疑,很多時候,我們都可能需要大量的建置帳號的, 舉例來說,學校要幫同學建立他們的帳號,那就很可能需要啦∼ 一般來說,建立帳號要進行的前製工作很多,包括要建立帳號名稱與該帳號的密碼對應表∼ 這個是最討厭的啦∼而且還要決定需要使用哪一個群組∼呼呼∼好討厭的感覺那∼

    目前很多網站都有提供大量建立帳號的工具,例如台南縣網中心的臥龍大師: 提供的好用的 cmpwd 程式, 不過,其實我們也可以利用簡單的 script 來幫我們達成喔!例如底下這支程式, 他的執行結果與臥龍大師提供的程式差不多啦∼ 但是因為我是直接以 useradd 來新增的, 所以,即使不瞭解 UID ,也是可以適用的啦∼

    整支程式的特色是: 執行方法也簡單的要命∼請自行參考的啦!不再多說∼ 使用時請注意,不要在公家使用的主機上面進行測試,因為..... 這支程式會大量建立帳號嘛!^_^
    #!/bin/bash
    #
    # 這支程式主要在幫您建立大量的帳號之用,
    # 更多的使用方法請參考:
    # http://linux.vbird.org/linux_basic/0410accountmanager.php#manual_amount
    #
    # 本程式為鳥哥自行開發,在 FC4 上使用沒有問題,
    # 但不保證絕不會發生錯誤!使用時,請自行負擔風險∼
    #
    # History:
    # 2005/09/05    VBird   剛剛才寫完,使用看看先∼
    PATH=/sbin:/usr/sbin:/bin:/usr/bin; export PATH
    accountfile="user.passwd"
    
    # 1. 進行帳號相關的輸入先!
    read -p "帳號開頭代碼 ( Input title name, ex> std )======> " username_start
    read -p "帳號層級或年級 ( Input degree, ex> 1 or enter )=> " username_degree
    read -p "起始號碼 ( Input start number, ex> 520 )========> " nu_start
    read -p "帳號數量 ( Input amount of users, ex> 100 )=====> " nu_amount
    read -p "密碼標準 1) 與帳號相同 2)亂數自訂 ==============> " pwm
    if [ "$username_start" == "" ]; then
            echo "沒有輸入開頭的代碼,不給你執行哩!" ; exit 1
    fi
    testing1=`echo $nu_amount | grep '[^0-9]' `
    testing2=`echo $nu_start  | grep '[^0-9]' `
    if [ "$testing1" != "" ] || [ "$testing2" != "" ]; then
            echo "輸入的號碼不對啦!有非為數字的內容!" ; exit 1
    fi
    if [ "$pwm" != "1" ]; then
            pwm="2"
    fi
    
    # 2. 開始輸出帳號與密碼檔案!
    [ -f "$accountfile" ] && mv $accountfile "$accountfile"`date +%Y%m%d`
    nu_end=$(($nu_start+$nu_amount-1))
    for (( i=$nu_start; i<=$nu_end; i++ ))
    do
            account=$username_start$username_degree$i
            if [ "$pwm" == "1" ]; then
                    password="$account"
            else
                    password=""
                    test_nu=0
                    until [ "$test_nu" == "8" ]
                    do
                            temp_nu=$(($RANDOM*50/32767+30))
                            until [ "$temp_nu" != "60" ]
                            do
                                    temp_nu=$(($RANDOM*50/32767+30))
                            done
                            test_nu=$(($test_nu+1))
                            temp_ch=`printf "\x$temp_nu"`
                            password=$password$temp_ch
                    done
            fi
            echo "$account":"$password" | tee -a "$accountfile"
    done
    
    # 3. 開始建立帳號與密碼!
            cat "$accountfile" | cut -d':' -f1 | xargs -n 1 useradd -m
            chpasswd < "$accountfile"
            pwconv
    	echo "OK!建立完成!"
    
    這支程式可以在底下連結下載:

    本章習題練習
    ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )

    2002/05/15:第一次完成
    2003/02/10:重新編排與加入 FAQ
    2005/08/25:加入一個大量建置帳號的實例,簡單說明一下而已!
    2005/08/29:將原本的舊文放置到 此處
    2005/08/31:因為 userconf 已經不再這麼好用了,使用指令模式比較簡單,所以,將他拿掉了∼
    2005/09/05:終於將大量建置帳號的那支程式寫完了∼真是高興啊!
    2006/03/02:更新使用者 UID 號碼,由 65535 升級到 2^32-1 這麼大!
    2007/04/15:原本寫的 /etc/pam.d/limits.conf 錯了!應該是 /etc/security/limits.conf 才對!
    2008/04/28:sudo 關於密碼重新輸入的部分寫錯了!已經更新,在這裡查閱看看。感謝網友 superpmo 的告知!
    hint:請加入 ACL ,並將篇名改為『Linux 帳號管理與進階權限設定』含 SELinux 與 ACL 的處理吧!