在 Linux 系統下管理使用者的身份與帳號!
本文資料主要針對 Fedora Core 4 的系統進行說明, Fedora Core 1 主要是由 Red Hat Linux 9 改版而來, 這個 Red Hat Linux 9 並不是當前大家聽到的 RHEL 喔!那是在 RHEL 出現之前的產品,基本上是在 2003 年以前的作品了!Fedora Core 4 則是在 2005 年 6 月份釋出,使用的核心是 2.6.11 版,當時是很紅的一個作品!只是生命週期太短,所以用這個 Fedora 系列來介紹 Server, 當時的決定確實有點莫名其妙了...
建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 Fedora Core 4 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!
要登入 Linux 系統一定要有帳號與密碼才行,否則怎麼登入,您說是吧?!不過, 不同的使用者應該要擁有不同的權限才行吧?我們還可以透過 user/group 的特殊權限設定, 來規範出不同的群組開發專案呢~在 Linux 的環境下,我們可以透過很多方式來限制使用者能夠使用的系統資源, 包括 bash shell 章節提到的 ulimit 限制、還有特殊權限限制,如 umask 等等。 透過這些舉動,我們可以規範出不同使用者的使用資源。另外,還記得系統管理員的帳號嗎?對! 就是 root 。請問一下,除了 root 之外,是否可以有其他的系統管理員帳號? 為什麼大家都要盡量避免使用數字型態的帳號?如何修改使用者相關的資訊呢?這些我們都得要瞭解瞭解的!
[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 裡面,將數字改回來喔!
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 這個系統管理員那一行好了, 你可以明顯的看出來,每一行使用『:』分隔開,共有七個咚咚,分別是:
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 號碼喔! |
root:$1$i9Ejldjfjio389u9sjl$jljsoi45QE/:12959:0:99999:7::: bin:*:12959:0:99999:7::: daemon:*:12959:0:99999:7::: adm:*:12959:0:99999:7:::基本上, shadow 同樣以『:』作為分隔符號,如果數一數,會發現共有九個欄位啊, 這九個欄位的用途是這樣的:
dmtsai:$1$8zdAKdfC$XDa8eSus2I7nQL7UjRsIy/:13025:5:60:7:2:13125:這表示什麼呢?要注意的是, 13025 是 2005/08/30 ,所以, dmtsai 這個使用者他的密碼相關意義是:
You must wait longer to change your password passwd: Authentication token manipulation error
Warning: your password will expire in 5 days
root:x:0:root bin:x:1:root,bin,daemon daemon:x:2:root,bin,daemon sys:x:3:root,bin,adm也是以冒號『:』作為欄位的分隔符號,共分為四欄,每一欄位的意義是:
[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 的第四個欄位寫入該帳號的!
[dmtsai@linux ~]$ groups
dmtsai users
在這個輸出的訊息中,我知道我同時屬於 dmtsai 及 users 這個兩個群組,而且,
第一個輸出的群組即為有效群組 (effective group) 了。
也就是說,我的有效群組為 dmtsai 啦~此時,如果我以 touch 去建立一個新檔,例如:
touch test ,那麼這個檔案的擁有者為 dmtsai ,而且群組也是 dmtsai 的啦。
這樣是否可以瞭解什麼是有效群組了?[dmtsai@linux ~]$ newgrp users [dmtsai@linux ~]$ groups users dmtsai此時,我的有效群組就成為 users 了。當然,要能夠順利切換有效群組的話,還需要 /etc/gshadow 的輔助才行~這個等一下我們會說明的。好了,那麼如果你開始在 /home/dmtsai 這個家目錄底下嘗試建立一個檔案,例如『 touch test2 』好了,會發生什麼狀態呢? 呵呵!那個檔案的群組竟然變成 users 了!這樣更清楚有效群組的意義了吧?!
root:::root bin:::root,bin,daemon daemon:::root,bin,daemon sys:::root,bin,adm同樣還是使用冒號『:』來作為欄位的分隔字元,而且你會發現,這個檔案幾乎與 /etc/group 一模一樣啊!是這樣沒錯~不過,要注意的大概就是第二個欄位吧~第二個欄位是密碼欄, 如果密碼欄上面是『!』時,表示該群組不能使用密碼來登入呢! 至於第四個欄位也就是支援的帳號名稱囉~
[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 差很多ㄟ!我的天吶!這個指令更動的檔案怎麼怎麼多啊?對啊!你才知道啊~ 這也是為啥我們說帳號管理是很複雜的啦~而且他參考的設定檔才更多哩! 這個指令至少可能會更動到的地方有:
GROUP=100 <==預設的群組 HOME=/home <==預設的家目錄所在目錄 INACTIVE=-1 <==在 /etc/shadow 內的第 7 欄 EXPIRE= <==在 /etc/shadow 內的第 8 欄 SHELL=/bin/bash <==預設的 shell SKEL=/etc/skel <==使用者家目錄的內容資料參考目錄
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 起跳囉~這樣瞭解嗎?!
[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@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 來微調使用者帳號的相關資料啦!
[root@linux ~]# userdel [-r] username 參數: -r :連同使用者的家目錄也一起刪除 範例: 範例一:刪除 vbird2 ,連同家目錄一起刪除 [root@linux ~]# userdel -r vbird2這個指令下達的時候要小心了!通常我們要移除一個帳號的時候,你可以手動的將 /etc/passwd 與 /etc/shadow 裡頭的該帳號取消即可!一般而言,如果該帳號只是『 暫時不啟用』的話,那麼將 /etc/shadow 裡頭最後倒數一個欄位設定為 0 就可以讓該帳號無法使用,但是所有跟該帳號相關的資料都會留下來! 使用 userdel 的時機通常是『 你真的確定不要讓該用戶在主機上面使用任何資料了!』
[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 啦!
[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 檔案,然後再來玩吧!底下這裡鳥哥還是先簡單的介紹一下就好了!
[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 的話,那就沒有問題的啦!可以操作的。
[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 指的是目前該使用者所屬的所有群組,但是您必須要瞭解什麼是『 初始群組與有效群組 』的差異喔!
[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 來登入的呢!
[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 ,容易造成系統資源的錯亂喔!
[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 』才行喔!所以,你可以:
關於系統管理員(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 囉~
[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 來強制讓一個使用者『暫時』無法使用該帳號, 很方便的啦! ^_^
[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 的使用方式上, 由於『是否讀入欲切換的身份者的環境參數檔案』的不同, 所以您必須要留意喔!
[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 變數吧!
[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 』代表的意義是:
例題:我想要建立一個可以幫忙系統管理員變更使用者密碼的群組,名稱為 ADMPW
( 注意,在 sudoers 內,這個別名的名稱一定要是大寫字元才行!)但是這個群組不能修改 root 的密碼喔!
且他們執行 sudo 時,不需要密碼驗證。 答:
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 的密碼囉! ^_^ |
例題:我的系統中有 DNS 服務,他的啟動指令在 /etc/init.d/named ,如果我想要建立一個 DNSMASTER
的群組來管理他時?如何是好? 答:
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 的設定檔啦!很簡單對吧! ^_^ |
This account is currently not available.嘿嘿!它說的是『這個帳號並不能被允許登入啦!』不過,這個帳號卻可以進行其他的工作喔! 舉例來說,各個系統帳號,列印工作由 lp 這個帳號在管理, WWW 服務由 apache 這個帳號在管理, 他們都可以進行系統程序的工作,但是『就是無法登入主機』而已啦!^_^
[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
基本上,在這個檔案內,每一行都是一個動作,而每個動作都分為四個欄位,分別是:
[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 , 就能夠發現你的一舉一動其實是有被紀錄下來的喔! ^_^
tty1 tty2 tty3 tty4 ...而沒有 pts/0 這類的網路登入的終端介面。這也就是說, root 僅能經由 tty1 這種終端機登入的啦!支援 login 程式的軟體有 telnet 服務與本機前面的 tty1~tty6 的 login, 這也是我們提到的,為何使用傳統的 telnet 連線主機連線到 Linux 時,預設無法使用 root 身份登入的主要原因囉。
[root@linux ~]# vi /etc/security/limits.conf # 新增這兩行 dmtsai hard fsize 10240 @users hard fsize 10240 # 注意到,帳號前面加上 @ 表示為『群組!』那麼下次 dmtsai 或者是屬於 users 的群組的使用者登入這個 Linux 主機時, 你可以利用 ulimit -a 去察看一下,嘿嘿!他們能用的資源就減小很多了! 更多的用法您可以自行參考一下該檔案內的說明啊! ^_^ (記得測試完畢要將資料改回來~否則....以後就麻煩了!)
[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** ....以下省略.....這樣就能夠知道每個帳號的最近登入的時間囉~ ^_^
[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 』即可!瞭呼?
[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 ,否則,嘿嘿!就能夠收到這個廣播訊息囉! ^_^[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) 寄給自己! 答:
|
[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 說~ |
[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 這個指令的啦!
[root@linux ~]# echo "dmtsai:abcdefg" | chpasswd
神奇吧!這樣就可以更新了呢!在預設的情況中, chpasswd 使用的是 DES 加密方法來加密,
我們可以使用 chpasswd -m 來使用 FC4 預設的 MD5 加密方法,不過,
FC4 似乎怪怪的,我老是無法使用 -m 來達成這個指令。無論如何,
還是可以直接使用 chpasswd 來應用 DES 加密喔!
使用 DES 方法加密後,在 /etc/shadow 的密碼欄內,他的密碼位數為 13 位,
瞭乎??
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別懷疑!這樣就搞定了一個帳號的設定了! 從此以後,你可以建立任何名稱的帳號囉~不過,還是不建議您設定一些很怪很怪的帳號名稱啦!
1. 修改帳號屬性 [root@linux ~]# vi /etc/passwd popuser:x:720:12::/home/popuser:/sbin/nologin 2. 密碼同步,並且給予密碼! [root@linux ~]# pwconv [root@linux ~]# passwd popuser這樣就又 OK 了~哇!真是太簡單了傑克~....
#!/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!建立完成!"這支程式可以在底下連結下載: