早期Linux系統設計為了能夠實現多用戶、多進程高效的利用服務器資源,在此種情況下,為了能夠保證用戶與用戶之間的文件不被隨意的訪問及修改、刪除等操作,用戶、組的管理能在某種程序上實現管理用戶或批量管理用戶。由於Linux的設計哲學思想『一切皆文件』,用戶對設備的訪問就是對文件的訪問。
Linux下有三類用戶
1.超級用戶: root 具有操作系統的一切權限 UID 值為0
2.普通用戶:
普通用戶具有操作系統有限的權限, UID值 500+
3.偽用戶:
是為了方便系統管理, 滿足相應的系統進程文件屬主的要求, 偽用戶不能登錄系統,CentOS6 UID值 1 -- 499,CentOS7 UID值為1 -- 999.
當一個用戶發起一個進程時,此進程將繼承用戶的屬主、屬組的權限,再以進程繼承的權限來控制文件的訪問權限。
例如:
[root@localhost~]# /bin/cat FILE ##取決於root用戶對FILE文件擁有的權限 [young@localhost~]$ /bin/cat FILE ##取決於young用戶對於FILE文件的擁有權限
用戶的主要組(主組): 用戶必須屬於一個且只有一個主組 組名同用戶名,且僅包含一個用戶:私有組
用戶的附加組(輔助組): 一個用戶可以屬於零個或多個輔助組
1.Linux用戶和組的主要配置文件
/etc/passwd:用戶及其屬性信息(名稱、 UID、主組ID等),可使用vipw命令編輯,使用pwck命令校驗格式,無效用戶等
/etc/group:組及其屬性信息,可使用vigr命令編輯,可使用grpck校驗格式,無效組等
/etc/shadow:用戶密碼及其相關屬性,可使用pwck命令校驗格式無效用戶等
/etc/gshadow:組密碼及其相關屬性,可使用grpck校驗合適,無效組等
2.配置文件格式說明
/etc/passwd
root:x:0:0:root:/root:/bin/bash 用戶名:密碼:UID:GID:用戶注釋信息:用戶家目錄:Shell定義
用戶名: 用戶的名稱 密碼: X表示占位符,也可以是密碼 UID: 用戶識別代碼 GID: 用戶所屬組的GID(基本組) 用戶注釋信息:Comment,可以完善用戶的基本信息 用戶家目錄: 系統登錄用戶後的工作目錄 shell: 定義用戶登錄系統所使用的shell,指定的shell需要在/etc/shells中出現
/etc/shadow
root:$6$YqkEsOcfKPptyhnS$YD0ym4BZ52pzcCnU....:16781:0:99999:7::: 用戶名:密碼:上一次修改密碼的時間:密碼最小使用期限:最長使用期限:警告時間:帳戶過期時間:保留字段
用戶名: 用戶的名稱,對應/etc/passwd文件中 密碼: Centos6中使用MD5加密算法,Centos7中使用sha1的算法,第一個$後面加密算法類型,第二個$後面表示salt,第三個$後面表示密碼的提取碼(參照加密類型) 上一次修改密碼的時間: 指用戶上次修改密碼的時間,計算方法:從Linux元年1970年01月01日0點0分到目錄所經過的秒數 密碼最小使用期限: 指用戶修改密碼後,需要到多少天後方可更改密碼,0表示禁用 密碼最長使用期限: 指用戶的密碼到多少天後需要修改密碼 警告時間: 指用戶密碼到期前多少天提示用戶修改密碼,0和空字段表示禁用此功能 帳戶過期時間: 批帳戶在密碼過期後多少天還未修改密碼,將被停用
/etc/group
root:x:0: 組名:密碼:GID:User_list
組名:組的名稱,默認同名用戶名 密碼: 組的密碼占位符,用於用戶臨時切換至需要的組以獲取相應權限,可以使用newgrp GROUP_NAME切換 GID:組的全局識別號 User_list:隸屬此組的用戶,多個用戶使用","隔開
/etc/gshadow
root:$6$PLRAi/Z/svr$PRelPtvLuGJqvFG3D8fbjYHDho2RQUe93glO.:: 組名:密碼:組管理者:User_list
組名:組的名稱,同步/etc/group文件中 密碼:第一個$後面表示加密算法,第二個$後面表示加密的密碼 組管理者:可以對此組成員有操作權限,如果有多個,可以用逗號隔開 User_list: 用戶的列表,如果有多個,可以使用逗號隔開
1.用戶管理命令
a、useradd
useradd - create a new user or update default new user information synopsis: useradd [options] LOGIN useradd -D [options] options: -u : 指定用戶的UID -g : 指明用戶所屬基本組,可為組名,也可以GID,組或者GID必須存在 -c : 指定注釋信息,如果有空格,需要使用" "包含 -d : 指定用戶家目錄,創建用戶時,會自動將/etc/skel中的文件復制到用戶家目錄下,如果指定的文件存在將不會復制文件,如果父目錄不存在,創建也將會失敗 -s : 指定用戶shell -r : 指定創建一個系統用戶 -M :不創建用戶家目錄 -G : 指定附加組,多個使用逗號隔開 -D :修改創建用戶的配置信息,文件位於/etc/default/useradd 注:創建用戶時的諸多默認設定配置文件為/etc/login.defs
實例一:
[root@localhost ~]# useradd -u 1003 -c "TestUser" -d /home/geek -s /bin/sh geek [root@localhost ~]# getent passwd geek geek:x:1003:1003:TestUser:/home/geek:/bin/sh
實例二:
[root@localhost ~]# useradd sys -r -M -g 1001 -G root [root@localhost ~]# getent passwd sys sys:x:498:1001::/home/sys:/bin/bash [root@localhost ~]# id sys uid=498(sys) gid=1001(young) groups=1001(young),0(root)
注:useradd命令加參數-D參看系統的默認值:
# useradd -D GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
解釋: 1)新用戶添加到GID為100的公共組 2)新用戶的HOME目錄將會位於/homoe/username 3)新用戶賬戶密碼在過期後不會被禁用 4)新用戶賬戶未被設置為某個日期後就過期 5)新用戶賬戶將bash shell作為默認shell 6)系統會將/etc/skel目錄下的內容復制到用戶的HOME目錄下 7)系統為該用戶賬戶在mail目錄下創建一個用於接收郵件的文件 修改: useradd –D -s SHELL useradd –D –b BASE_DIR useradd –D –g GROUP
如 #useradd -D -s /bin/tsch
,修改默認的shell為/bin/tsch。
倒數第2個值很有意思。useradd命令允許管理員創建一個默認的HOME目錄配置,然後把它作為創建新用戶HOME目錄的模板。這樣,就能自動在每個新用戶的HOME目錄裡放置默認的系統文件。在Ubuntu Linux系統上,/etc/skel目錄下有下列文件:
[root@localhost ~]# ls -A /etc/skel .bash_logout .bash_profile .bashrc
此上文件不復制進去用戶命令提示符等會缺失。
/etc/login.defs文件也是新建用戶屬性的配置文件。
b、newusers與chpasswd
newusers命令用來批量創建用戶
chpasswd用來批量修改密碼
批量創建用戶並修改密碼
A、創建用戶列表user.txt(文件格式與/etc/passwd相同)
[root@localhost ~]# vim users.txt user1:x:600:600::/home/user1:/bin/bash user2:x:601:601::/home/user2:/bin/bash user3:x:602:602::/home/user3:/bin/bash
B、批量創建用戶
[root@localhost ~]# newusers users.txt [root@localhost ~]# tail -3 /etc/passwd user1:x:600:600::/home/user1:/bin/bash user2:x:601:601::/home/user2:/bin/bash user3:x:602:602::/home/user3:/bin/bash
C、復制/etc/skel下文件到用戶家目錄
[root@localhost ~]# cp /etc/skel/.[^.]* /home/user1 [root@localhost ~]# cp /etc/skel/.[^.]* /home/user2 [root@localhost ~]# cp /etc/skel/.[^.]* /home/user3
D、創建密碼文件passwd.txt(格式===> 用戶名:密碼)
[root@localhost ~]# vim passwd.txt user1:young user2:young user3:young
E、批量修改密碼
[root@localhost ~]# cat passwd.txt | chpasswd
查看:
[root@localhost ~]# tail -3 /etc/shadow user1:$6$9w3Hm/gYw$fVQMOyaJxzR9yBSbmPlZY8DKHb2BLGPAVxmFqJsN4rTGYao5B4TRZW/i7z1UgWF/mNI6jJ45bbD4vZtJhIYu50:17166:0:99999:7::: user2:$6$9pXcj/.LREq/OK$M8tY6gpxKliOgnKG/N7H0oiuD88RAbB7BM/94UlDWlefXsTqyYReYk96FK6mofd2quYHXA7mID3q5nBgqYHjL0:17166:0:99999:7::: user3:$6$lxmzw4KcEA/hfm6$nrc9rLSwM4JXfLOm7p2a1CqWB8Y5fgioU3DctpvfIw1.A6iqDy0aADGkReT1FVJhOubRC3l2iUUq8PwnJx9HK0:17166:0:99999:7:::
測試:
[root@localhost ~]# su - user1 [user1@localhost ~]$ su - user2 Password: [user2@localhost ~]$
c、usermod
usermod命令可實現用戶屬性修改。
usermod - modify a user account synopsis: usermod [options] LOGIN options: -u : 修改用戶UID -g : 修改用戶GID -c : 修改用戶的注釋信息 -d : 修改用戶家目錄,需要配合使用-m選項才會自動復制用戶家目錄下的文件到新的家目錄 -m : move-home to new directory -s : 修改用戶的shell -l : 修改用戶的登陸名,即login名稱 -G : 修改用戶的附加組信息,需要配合-a(append)一起使用,如果不使用-a將刪除原來的附加組 -a : --append,連接多個附加組的參數 -L : 鎖定用戶,即lock,在/etcpasswd文件中,密碼前面加!(一個) -U : 解鎖用戶,即unlock,在/etc/passwd文件中,取消密碼前面的!號
實例:
[root@localhost ~]# getent passwd user1 user1:x:600:600::/home/user1:/bin/bash [root@localhost ~]# id user1 uid=600(user1) gid=600(user1) groups=600(user1) [root@localhost ~]# usermod -u 700 -g user2 -aG bin,root -c 'linux' -d /none/user1 -s /bin/tsh -l linux user1 [root@localhost ~]# getent passwd linux linux:x:700:601:linux:/none/user1:/bin/tsh [root@localhost ~]# id linux uid=700(linux) gid=601(user2) groups=601(user2),0(root),1(bin)
d、userdel
userdel命令用來刪除已經存在的用戶。
userdel - delete a user account and related files synopsis: userdel [options] LOGIN options: -r : 刪除用戶的同時刪除用戶的家目錄,即--remove參數
實例:
[root@localhost ~]# userdel -r user3
e、id
id命令查看用戶相關信息。
id [OPTION]... [USER] -u: UID -g: GID -G: Groups -n: Name (與-u連用可現實名稱)
實例:
[root@localhost ~]# id geek uid=1003(geek) gid=1003(geek) groups=1003(geek) [root@localhost ~]# id uid=0(root) gid=0(root) groups=0(root) [root@localhost ~]# id -G 0 [root@localhost ~]# id -un root
f、su
su命令用來切換當前用戶身份。
su[options…] [-] [user [args…]] 切換用戶的方式:
su UserName:非登錄式切換,即不會讀取目標用戶的配置文件,不改變當前工作目錄
su – UserName:登錄式切換,會讀取目標用戶的配置文件,切換至家目錄,完全切換
su -l UserName相當於su – UserName
root su至其他用戶無須密碼;非root用戶切換時需要密碼
su [-] UserName -c 'COMMAND' :撤換至指定用戶身份執行命令,命令執行結束後即退出
-c : 不用登陸用戶即可以以指定用戶執行命令 su - geek -c 'id -u'
[root@localhost ~]# su - geek -c 'id' uid=1003(geek) gid=1003(geek) groups=1003(geek)
g、passwd
passwd命令用來進行用戶密碼管理。
passwd - passwd - update user's authentication tokens synopsis:passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username] 1、passwd (修改自己的密碼) 2、passwd USERNAME(修改其他用戶的密碼,root權限 ) options: -l : 鎖定用戶,在/etc/passwd的密碼前面加!!, -u : 解鎖用戶,在/etcpasswd的密碼前!!取消 -d : --delete,刪除用戶密碼 -e DATE : --expire,設定過期時間 -i DAYS : 非活動時間 -n days : 最短使用期限 -x days : 最長使用期限 -w days : 警告期限 --stdin : echo "PASSWD" | passwd --stdin root
實例:
[root@localhost ~]# echo young | passwd --stdin geek Changing password for user geek. passwd: all authentication tokens updated successfully.
h、chage
chage命令用來修改用戶密碼策略。
chage [OPTION]… LOGIN -d:修改用戶最近一次修改密碼的日期 -E:修改賬戶的過期日期 -I:密碼禁用期 -m:密碼的最小使用期限 -M:密碼的最大使用期限 -W:密碼的警告時間 –l:顯示密碼策略
A、查看mysql用戶以及密碼的有效期
[root@DB-Server ~]# chage -l mysql Last password change : Mar 26, 2015 Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : -1 Maximum number of days between password change : -1 Number of days of warning before password expires : -1 [root@DB-Server ~]#
B、設置mysql用戶60天後密碼過期,至少7天後才能修改密碼,密碼過期前7天開始收到告警信息。
[root@DB-Server ~]# chage -M 60 -m 7 -W 7 mysql You have new mail in /var/spool/mail/root [root@DB-Server ~]# chage -l mysql Last password change : Mar 26, 2015 Password expires : May 25, 2015 Password inactive : never Account expires : never Minimum number of days between password change : 7 Maximum number of days between password change : 60 Number of days of warning before password expires : 7 [root@DB-Server ~]# clip_image001
C、強制新建用戶第一次登陸時修改密碼
[root@DB-Server home]# useradd test [root@DB-Server home]# passwd test Changing password for user test. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully. [root@DB-Server home]# chage -d 0 test You have new mail in /var/spool/mail/root [root@DB-Server home]# chage -l test Last password change : password must be changed Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7
i、chsh
chsh命令用來更改當前用戶的shell類型。
使用權限:所有使用者 命令:chsh 用法:shell>> chsh 說明:更改使用者 shell 設定 范例:
shell>> chsh Changing fihanging shell for user1 Password: [del] New shell [/bin/tcsh]: ### [是目前使用的 shell] [del] shell>> chsh -l ### 展示 /etc/shells 檔案內容 /bin/bash /bin/sh /bin/ash /bin/bsh /bin/tcsh /bin/csh
1 我想知道我機器安裝了哪些shell? 兩種方法可以查看: 第一種: [[email protected] ~]$ chsh -l /bin/sh /bin/bash /sbin/nologin /bin/zsh 第二種: [[email protected] ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/zsh 其實chsh -l也是來查看這個文件。
2 我想知道我當前正在使用的shell是哪個阿?
[[email protected] ~]$ echo $SHELL /bin/bash
注意SHELL一定要是大寫。可以看到,我目前使用的shell是/bin/bash
3 執行了zsh之後,我查看當前shell類型仍然是/bin/bash呢? 請注意,我們雖然執行了zsh,但是所謂“當前的shell”是一個大環境的概念,是針對一個已登錄的用戶而言的。而我們執行zsh只是啟動了一個zsh的解釋器程序而已,並沒有改變大環境。如果想改變“當前的shell”,那麼還是要使用chsh才可以。
4 我想把我的shell改成zsh!
[[email protected] ~]$ chsh -s /bin/zsh Changing shell for rocrocket. Password: Shell changed. [[email protected] ~]$
使用chsh加選項-s就可以修改登錄的shell了! 你會發現你現在執行echo $SHELL後仍然輸出為/bin/bash,這是因為你需要重啟你的shell才完全投入到zsh懷抱中去。
5 chsh -s到底是修改了哪裡? 秘密告訴你吧。chsh -s其實修改的就是/etc/passwd文件裡和你的用戶名 相對應的那一行。現在我來查看下:
[[email protected] ~]$ cat /etc/passwd|grep ^rocrocket rocrocket:x:500:500:rocrocket,China:/rocrocket/PSB/home:/bin/zsh
看!你可以發現輸出內容的最後部分已經變成了/bin/zsh了!下次你重啟的時候,linux就會讀取這一命令來啟動你的shell了! 好了,我要恢復正常工作,把shell修改會我熟悉的/bin/bash了!
[[email protected] ~]$ chsh -s /bin/bash Changing shell for rocrocket. Password: Shell changed.
j、chfn與finger
chfn命令用於指定個人信息,finger用來查看個人信息。
chfn命令格式:
Usage: chfn [ -f full-name ] [ -o office ] [ -p office-phone ] [ -h home-phone ] [ --help ] [ --version ] [root@localhost ~]# chfn Changing finger information for root. Name [root]: young Office []: geek Office Phone []: 010110110 Home Phone []: 0101101101 Finger information changed. [root@localhost ~]# finger root Login: root Name: young Directory: /root Shell: /bin/bash Office: geek, 010110110 Home Phone: 010-110-1101 On since Sun Jan 1 02:39 (CST) on pts/0 from 192.168.1.116 No mail. No Plan.