Linux 賬號管理(轉)


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 啰


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM