useradd
passwd
chage
usermod
userdel
finger
chfn
chsh
id
groupadd
groupmod
groupdel
gpasswd
useradd
完全參考默認值創建一個用戶,名稱為 vbird1
[root@www ~]# useradd vbird1 [root@www ~]# ll -d /home/vbird1 drwx------ 4 vbird1 vbird1 4096 Feb 25 09:38 /home/vbird1 # 默認會創建用戶家目錄,且權限為 700 !這是重點!
[root@www ~]# grep vbird1 /etc/passwd /etc/shadow /etc/group /etc/passwd:vbird1:x:504:505::/home/vbird1:/bin/bash /etc/shadow:vbird1:!!:14300:0:99999:7::: /etc/group:vbird1:x:505: <==默認會創建一個與賬號一模一樣的群組名
由於在 /etc/shadow 內僅會有口令參數而不會有加密過的口令數據,因此我們在創建使用者賬號時, 還需要使用『 passwd 賬號 』來給予口令才算是完成了用戶創建的流程。
假設我已知道我的系統當中有個組名為 users ,且 UID 700 並不存在,請用 users 為初始群組,以及 uid 為 700 來創建一個名為 vbird2 的賬號
[root@www ~]# useradd -u 700 -g users vbird2 [root@www ~]# ll -d /home/vbird2 drwx------ 4 vbird2 users 4096 Feb 25 09:59 /home/vbird2 [root@www ~]# grep vbird2 /etc/passwd /etc/shadow /etc/group /etc/passwd:vbird2:x:700:100::/home/vbird2:/bin/bash /etc/shadow:vbird2:!!:14300:0:99999:7::: # 看一下,UID 與 initial group 確實改變成我們需要的了!
在這個范例中,我們創建的是指定一個已經存在的群組作為使用者的初始群組,因為群組已經存在, 所以在 /etc/group 里面就不會主動的創建與賬號同名的群組了! 此外,我們也指定了特殊的 UID 來作為使用者的專屬 UID 喔!
創建一個系統賬號,名稱為 vbird3
[root@www ~]# useradd -r vbird3 [root@www ~]# ll -d /home/vbird3 ls: /home/vbird3: No such file or directory <==不會主動創建家目錄 [root@www ~]# grep vbird3 /etc/passwd /etc/shadow /etc/group /etc/passwd:vbird3:x:100:103::/home/vbird3:/bin/bash /etc/shadow:vbird3:!!:14300:::::: /etc/group:vbird3:x:103:
我們在談到 UID 的時候曾經說過一般賬號應該是 500 號以后,那用戶自己創建的系統賬號則一般是由 100 號以后起算的。 所以在這里我們加上 -r 這個選項以后,系統就會主動將賬號與賬號同名群組的 UID/GID 都指定小於 500 以下, 在本案例中則是使用 100(UID) 與 103(GID) 啰!此外,由於系統賬號主要是用來進行運行系統所需服務的權限配置, 所以系統賬號默認都不會主動創建家目錄的!
useradd 的默認值
[root@www ~]# useradd -D GROUP=100 <==默認的群組 HOME=/home <==默認的家目錄所在目錄 INACTIVE=-1 <==口令失效日,在 shadow 內的第 7 欄 EXPIRE= <==賬號失效日,在 shadow 內的第 8 欄 SHELL=/bin/bash <==默認的 shell SKEL=/etc/skel <==用戶家目錄的內容數據參考目錄 CREATE_MAIL_SPOOL=yes <==是否主動幫使用者創建郵件信箱(mailbox)
passwd
使用 useradd 創建了賬號之后,在默認的情況下,該賬號是暫時被封鎖的, 也就是說,該賬號是無法登陸的,配置口令就使用 passwd
請 root 給予 vbird2 口令
[root@www ~]# passwd vbird2 Changing password for user vbird2. New UNIX password: <==這里直接輸入新的口令,屏幕不會有任何反應 BAD PASSWORD: it is WAY too short <==口令太簡單或過短的錯誤! Retype new UNIX password: <==再輸入一次同樣的口令 passwd: all authentication tokens updated successfully. <==竟然還是成功修改了!
用 vbird2 登陸后,修改 vbird2 自己的口令
[vbird2@www ~]$ passwd <==后面沒有加賬號,就是改自己的口令! Changing password for user vbird2. Changing password for vbird2 (current) UNIX password: <==這里輸入『原有的舊口令』 New UNIX password: <==這里輸入新口令 BAD PASSWORD: it is based on a dictionary word <==口令檢驗不通過,請再想個新口令 New UNIX password: <==這里再想個來輸入吧 Retype new UNIX password: <==通過口令驗證!所以重復這個口令的輸入 passwd: all authentication tokens updated successfully. <==有無成功看關鍵詞
與 root 不同的是,一般賬號在更改口令時需要先輸入自己的舊口令 (亦即 current 那一行),然后再輸入新口令 (New 那一行)。 要注意的是,口令的規范是非常嚴格的,尤其新的 distributions 大多使用 PAM 模塊來進行口令的檢驗,包括太短、 口令與賬號相同、口令為字典常見字符串等,都會被 PAM 模塊檢查出來而拒絕修改口令,此時會再重復出現『 New 』這個關鍵詞! 那時請再想個新口令!若出現『 Retype 』才是你的口令被接受了!重復輸入新口令並且看到『 successfully 』這個關鍵詞時才是修改口令成功喔!
使用 standard input 創建用戶的口令
[root@www ~]# echo "abc543CC" | passwd --stdin vbird2 Changing password for user vbird2. passwd: all authentication tokens updated successfully.
這個動作會直接升級用戶的口令而不用再次的手動輸入!好處是方便處理,缺點是這個口令會保留在命令中, 未來若系統被攻破,人家可以在 /root/.bash_history 找到這個口令呢!所以這個動作通常僅用在 shell script 的大量創建使用者賬號當中!
管理 vbird2 的口令使具有 60 天變更、10 天口令失效的配置
[root@www ~]# passwd -S vbird2 vbird2 PS 2009-02-26 0 99999 7 -1 (Password set, MD5 crypt.) # 上面說明口令創建時間 (2009-02-26)、0 最小天數、99999 變更天數、7 警告日數 # 與口令不會失效 (-1) 。 [root@www ~]# passwd -x 60 -i 10 vbird2 [root@www ~]# passwd -S vbird2 vbird2 PS 2009-02-26 0 60 7 10 (Password set, MD5 crypt.)
讓 vbird2 的賬號失效,觀察完畢后再讓她激活
[root@www ~]# passwd -l vbird2 [root@www ~]# passwd -S vbird2 vbird2 LK 2009-02-26 0 60 7 10 (Password locked.) # 嘿嘿!狀態變成『 LK, Lock 』了啦!無法登陸喔! [root@www ~]# grep vbird2 /etc/shadow vbird2:!!$1$50MnwNFq$oChX.0TPanCq7ecE4HYEi.:14301:0:60:7:10:: # 其實只是在這里加上 !! 而已! [root@www ~]# passwd -u vbird2 [root@www ~]# grep vbird2 /etc/shadow vbird2:$1$50MnwNFq$oChX.0TPanCq7ecE4HYEi.:14301:0:60:7:10:: # 口令字段恢復正常!
chage
除了使用 passwd -S 之外,有沒有更詳細的口令參數顯示功能呢?有的!那就是 chage 了!
列出 vbird2 的詳細口令參數
[root@www ~]# chage -l vbird2 Last password change : Feb 26, 2009 Password expires : Apr 27, 2009 Password inactive : May 07, 2009 Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 60 Number of days of warning before password expires : 7
chage 有一個功能很不錯喔!如果你想要讓『使用者在第一次登陸時, 強制她們一定要更改口令后才能夠使用系統資源』,可以利用如下的方法來處理的!
創建一個名為 agetest 的賬號,該賬號第一次登陸后使用默認口令,但必須要更改過口令后,使用新口令才能夠登陸系統使用 bash 環境
[root@www ~]# useradd agetest [root@www ~]# echo "agetest" | passwd --stdin agetest [root@www ~]# chage -d 0 agetest # 此時此賬號的口令創建時間會被改為 1970/1/1 ,所以會有問題!
嘗試以 agetest 登陸的情況
You are required to change your password immediately (root enforced) WARNING: Your password has expired. You must change your password now and login again! Changing password for user agetest. Changing password for agetest (current) UNIX password: <==這個賬號被強制要求必須要改口令!
非常有趣吧!你會發現 agetest 這個賬號在第一次登陸時可以使用與賬號同名的口令登陸, 但登陸時就會被要求立刻更改口令,更改口令完成后就會被踢出系統。再次登陸時就能夠使用新口令登陸了!
usermod
在 useradd 的時候加入了錯誤的配置數據。或者是,在使用 useradd 后,發現某些地方還可以進行細部修改。 此時,當然我們可以直接到 /etc/passwd 或 /etc/shadow 去修改相對應字段的數據, 不過,Linux 也有提供相關的命令讓大家來進行賬號相關數據的微調呢~那就是 usermod 啰~
usermod 的選項與 useradd 非常類似! 這是因為 usermod 也是用來微調 useradd 添加的使用者參數嘛!不過 usermod 還是有新增的選項, 那就是 -L 與 -U ,不過這兩個選項其實與 passwd 的 -l, -u 是相同的!
修改使用者 vbird2 的說明欄,加上『VBird's test』的說明。
[root@www ~]# usermod -c "VBird's test" vbird2 [root@www ~]# grep vbird2 /etc/passwd vbird2:x:700:100:VBird's test:/home/vbird2:/bin/bash
用戶 vbird2 口令在 2009/12/31 失效。
[root@www ~]# usermod -e "2009-12-31" vbird2 [root@www ~]# grep vbird2 /etc/shadow vbird2:$1$50MnwNFq$oChX.0TPanCq7ecE4HYEi.:14301:0:60:7:10:14609:
我們創建 vbird3 這個系統賬號時並沒有給予家目錄,請創建他的家目錄
[root@www ~]# ll -d ~vbird3 ls: /home/vbird3: No such file or directory <==確認一下,確實沒有家目錄的存在! [root@www ~]# cp -a /etc/skel /home/vbird3 [root@www ~]# chown -R vbird3:vbird3 /home/vbird3 [root@www ~]# chmod 700 /home/vbird3 [root@www ~]# ll -a ~vbird3 drwx------ 4 vbird3 vbird3 4096 Sep 4 18:15 . <==用戶家目錄權限 drwxr-xr-x 11 root root 4096 Feb 26 11:45 .. -rw-r--r-- 1 vbird3 vbird3 33 May 25 2008 .bash_logout -rw-r--r-- 1 vbird3 vbird3 176 May 25 2008 .bash_profile -rw-r--r-- 1 vbird3 vbird3 124 May 25 2008 .bashrc drwxr-xr-x 3 vbird3 vbird3 4096 Sep 4 18:11 .kde drwxr-xr-x 4 vbird3 vbird3 4096 Sep 4 18:15 .mozilla # 使用 chown -R 是為了連同家目錄底下的用戶/群組屬性都一起變更的意思; # 使用 chmod 沒有 -R ,是因為我們僅要修改目錄的權限而非內部文件的權限!
userdel
這個功能就太簡單了,目的在刪除用戶的相關數據,而用戶的數據有:
- 用戶賬號/口令相關參數:/etc/passwd, /etc/shadow
- 使用者群組相關參數:/etc/group, /etc/gshadow
- 用戶個人文件數據: /home/username, /var/spool/mail/username..
整個命令的語法非常簡單:
[root@www ~]# userdel [-r] username 選項與參數: -r :連同用戶的家目錄也一起刪除 刪除 vbird2 ,連同家目錄一起刪除 [root@www ~]# userdel -r vbird2
這個命令下達的時候要小心了!通常我們要移除一個賬號的時候,你可以手動的將 /etc/passwd 與 /etc/shadow 里頭的該賬號取消即可!一般而言,如果該賬號只是『暫時不激活』的話,那么將 /etc/shadow 里頭賬號失效日期 (第八字段) 配置為 0 就可以讓該賬號無法使用,但是所有跟該賬號相關的數據都會留下來! 使用 userdel 的時機通常是『你真的確定不要讓該用戶在主機上面使用任何數據了!』
另外,其實用戶如果在系統上面操作過一陣子了,那么該用戶其實在系統內可能會含有其他文件的。 舉例來說,他的郵件信箱 (mailbox) 或者是crontab 之類的文件。 所以,如果想要完整的將某個賬號完整的移除,最好可以在下達 userdel -r username 之前, 先以『 find / -user username 』查出整個系統內屬於 username 的文件,然后再加以刪除吧!
finger
finger 可以查閱很多用戶相關的信息喔! 大部分都是在 /etc/passwd 這個文件里面的信息啦!我們就先來檢查檢查用戶信息吧!
觀察 vbird1 的用戶相關賬號屬性
[root@www ~]# finger vbird1 Login: vbird1 Name: (null) Directory: /home/vbird1 Shell: /bin/bash Never logged in. No mail. No Plan.
由於 finger 類似指紋的功能,他會將用戶的相關屬性列出來!如上表所示,其實他列出來的幾乎都是 /etc/passwd 文件里面的東西。列出的信息說明如下:
- Login:為使用者賬號,亦即 /etc/passwd 內的第一字段;
- Name:為全名,亦即 /etc/passwd 內的第五字段(或稱為批注);
- Directory:就是家目錄了;
- Shell:就是使用的 Shell 文件所在;
- Never logged in.:figner 還會調查用戶登陸主機的情況喔!
- No mail.:調查 /var/spool/mail 當中的信箱數據;
- No Plan.:調查 ~vbird1/.plan 文件,並將該文件取出來說明!
不過是否能夠查閱到 Mail 與 Plan 則與權限有關了!因為 Mail / Plan 都是與使用者自己的權限配置有關, root 當然可以查閱到用戶的這些信息,但是 vbird1 就不見得能夠查到 vbird3 的信息, 因為 /var/spool/mail/vbird3 與 /home/vbird3/ 的權限分別是 660, 700 ,那 vbird1 當然就無法查閱的到! 這樣解釋可以理解吧?此外,我們可以創建自己想要運行的預定計划,當然,最多是給自己看的!可以這樣做:
利用 vbird1 創建自己的計划檔
[vbird1@www ~]$ echo "I will study Linux during this year." > ~/.plan [vbird1@www ~]$ finger vbird1 Login: vbird1 Name: (null) Directory: /home/vbird1 Shell: /bin/bash Never logged in. No mail. Plan: I will study Linux during this year.
找出目前在系統上面登陸的用戶與登陸時間
[vbird1@www ~]$ finger Login Name Tty Idle Login Time Office Office Phone root root tty1 Feb 26 09:53 vbird1 tty2 Feb 26 15:21
chfn
chfn 是: change finger 的意思!
[root@www ~]# chfn [-foph] [賬號名] vbird1 自己更改一下自己的相關信息! [vbird1@www ~]$ chfn Changing finger information for vbird1. Password: <==確認身份,所以輸入自己的口令 Name []: VBird Tsai test <==輸入你想要呈現的全名 Office []: Dic in Ksu. Tainan <==辦公室號碼 Office Phone []: 06-2727175#356 <==辦公室電話 Home Phone []: 06-1234567 <==家里電話號碼 Finger information changed. [vbird1@www ~]$ grep vbird1 /etc/passwd vbird1:x:504:505:VBird Tsai test,Dic in Ksu. Tainan,06-2727175#356,06-1234567: /home/vbird1:/bin/bash # 其實就是改到第五個字段,該字段里面用多個『 , 』分隔就是了! [vbird1@www ~]$ finger vbird1 Login: vbird1 Name: VBird Tsai test Directory: /home/vbird1 Shell: /bin/bash Office: Dic in Ksu. Tainan Office Phone: 06-2727175#356 Home Phone: 06-1234567 On since Thu Feb 26 15:21 (CST) on tty2 No mail. Plan: I will study Linux during this year. # 就是上面特殊字體呈現的那些地方是由 chfn 所修改出來的!
這個命令說實在的,除非是你的主機有很多的用戶,否則倒真是用不着這個程序!這就有點像是 bbs 里頭更改你『個人屬性』的那一個數據啦!不過還是可以自己玩一玩!尤其是用來提醒自己相關數據啦! ^_^
chsh
這就是 change shell 的簡寫!使用方法就更簡單了!
用 vbird1 的身份列出系統上所有合法的 shell,並且指定 csh 為自己的 shell
[vbird1@www ~]$ chsh -l /bin/sh /bin/bash /sbin/nologin <==所謂:合法不可登陸的 Shell 就是這玩意! /bin/tcsh /bin/csh <==這就是 C shell 啦! /bin/ksh # 其實上面的信息就是我們在 bash 中談到的 /etc/shells 啦! [vbird1@www ~]$ chsh -s /bin/csh; grep vbird1 /etc/passwd Changing shell for vbird1. Password: <==確認身份,請輸入 vbird1 的口令 Shell changed. vbird1:x:504:505:VBird Tsai test,Dic in Ksu. Tainan,06-2727175#356,06-1234567: /home/vbird1:/bin/csh [vbird1@www ~]$ chsh -s /bin/bash # 測試完畢后,立刻改回來! [vbird1@www ~]$ ll $(which chsh) -rws--x--x 1 root root 19128 May 25 2008 /usr/bin/chsh
不論是 chfn 與 chsh ,都是能夠讓一般用戶修改 /etc/passwd 這個系統文件的!所以你猜猜,這兩個文件的權限是什么? 一定是 SUID 的功能啦!
id
id 這個命令則可以查詢某人或自己的相關 UID/GID 等等的信息,他的參數也不少,不過, 都不需要記~反正使用 id 就全部都列出啰
查閱 root 自己的相關 ID 信息!
[root@www ~]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk), 10(wheel) context=root:system_r:unconfined_t:SystemLow-SystemHigh # 上面信息其實是同一行的數據!包括會顯示 UID/GID 以及支持的所有群組! # 至於后面那個 context=... 則是 SELinux 的內容,先不要理會他!
查閱一下 vbird1 吧~
[root@www ~]# id vbird1 uid=504(vbird1) gid=505(vbird1) groups=505(vbird1) context=root:system_r: unconfined_t:SystemLow-SystemHigh [root@www ~]# id vbird100 id: vbird100: No such user <== id 這個命令也可以用來判斷系統上面有無某賬號!
groupadd
新建一個群組,名稱為 group1
[root@www ~]# groupadd group1 [root@www ~]# grep group1 /etc/group /etc/gshadow /etc/group:group1:x:702: /etc/gshadow:group1:!:: # 群組的 GID 也是會由 500 以上最大 GID+1 來決定!
groupmod
跟 usermod 類似的,這個命令僅是在進行 group 相關參數的修改而已。
將剛剛上個命令創建的 group1 名稱改為 mygroup , GID 為 201
[root@www ~]# groupmod -g 201 -n mygroup group1 [root@www ~]# grep mygroup /etc/group /etc/gshadow /etc/group:mygroup:x:201: /etc/gshadow:mygroup:!::
不過,還是那句老話,不要隨意的更動 GID ,容易造成系統資源的錯亂喔!
groupdel
將剛剛的 mygroup 刪除!
[root@www ~]# groupdel mygroup
若要刪除 vbird1 這個群組的話?
[root@www ~]# groupdel vbird1 groupdel: cannot remove user's primary group.
為什么 mygroup 可以刪除,但是 vbird1 就不能刪除呢?原因很簡單,『有某個賬號 (/etc/passwd) 的 initial group 使用該群組!』 如果查閱一下,你會發現在 /etc/passwd 內的 vbird1 第四欄的 GID 就是 /etc/group 內的 vbird1 那個群組的 GID ,所以啰,當然無法刪除~否則 vbird1 這個用戶登陸系統后, 就會找不到 GID ,那可是會造成很大的困擾的!那么如果硬要刪除 vbird1 這個群組呢? 你『必須要確認 /etc/passwd 內的賬號沒有任何人使用該群組作為 initial group 』才行喔!所以,你可以:
- 修改 vbird1 的 GID ,或者是:
- 刪除 vbird1 這個使用者。
gpasswd
如果系統管理員太忙碌了,導致某些賬號想要加入某個項目時找不到人幫忙!這個時候可以創建『群組管理員』喔! 什么是群組管理員呢?就是讓某個群組具有一個管理員,這個群組管理員可以管理哪些賬號可以加入/移出該群組! 那要如何『創建一個群組管理員』呢?就得要透過 gpasswd 啰!
創建一個新群組,名稱為 testgroup 且群組交由 vbird1 管理:
[root@www ~]# groupadd testgroup <==先創建群組 [root@www ~]# gpasswd testgroup <==給這個群組一個口令吧! Changing the password for group testgroup New Password: Re-enter new password: # 輸入兩次口令就對了! [root@www ~]# gpasswd -A vbird1 testgroup <==加入群組管理員為 vbird1 [root@www ~]# grep testgroup /etc/group /etc/gshadow /etc/group:testgroup:x:702: /etc/gshadow:testgroup:$1$I5ukIY1.$o5fmW.cOsc8.K.FHAFLWg0:vbird1: # 很有趣吧!此時 vbird1 則擁有 testgroup 的主控權喔!身份有點像板主啦!
以 vbird1 登陸系統,並且讓他加入 vbird1, vbird3 成為 testgroup 成員
[vbird1@www ~]$ id uid=504(vbird1) gid=505(vbird1) groups=505(vbird1) .... # 看得出來,vbird1 尚未加入 testgroup 群組喔! [vbird1@www ~]$ gpasswd -a vbird1 testgroup [vbird1@www ~]$ gpasswd -a vbird3 testgroup [vbird1@www ~]$ grep testgroup /etc/group testgroup:x:702:vbird1,vbird3
我們可以讓 testgroup 成為一個可以公開的群組,然后創建起群組管理員, 群組管理員可以有多個。在這個案例中,我將 vbird1 配置為 testgroup 的群組管理員,所以 vbird1 就可以自行添加群組成員啰~呼呼!然后,該群組成員就能夠使用 newgrp 啰