一、用户标识符:UID与GID
每个登录用户至少都会取得两个ID,一个是用户ID(UserID,UID),一个是用户组ID(GroupID,GID)。
每个文件都会有所有者ID与用户组ID,当显示文件属性时,系统会依据/etc/passwd与/etc/group的内容,找到UID和GID对应的账号与组名显示出来。UID与账号是一一对应的。
二、用户账号
跟用户账号有关的两个文件包括/etc/passwd和/etc/shadow,具体如下:
1./etc/passwd文件结构:此文件每一行代表一个账号
查看/etc/passwd文件的属性,文件的权限为root用户可以读写,其它用户为只读:
[root@hs-uf21 ~]# ll /etc/passwd
-rw-r--r-- 1 root root 2767 Apr 21 21:00 /etc/passwd
查看/etc/passwd文件内容,共有7个字段,每个字段使用分号“:”隔开,分别是:
[root@hs-uf21 ~]# head /etc/passwd
root : x : 0 : 0 : root : /root : /bin/bash
[ 1 ] [2] [3] [4] [ 5 ] [ 6 ] [ 7 ]
......
[1]:账号名称
[2]:密码
[3]:UID
[4]:GID
[5]:用户信息说明
[6]:主文件夹
[7]:Shell
2./etc/shadow文件结构:
查看/etc/shadow文件的属性,文件的权限为root使用只读:
[root@hs-uf21 ~]# ll /etc/shadow
-r-------- 1 root root 1684 Apr 10 21:28 /etc/shadow
查看/etc/shadow文件的内容,共有9个字段,每个字段使用分号“:”隔开,分别是:
[root@hs-uf21 ~]# head /etc/shadow
root:$1$yI2Xb6os$9C5hnN3POy6sdl0TY8FZv.:15805:0:99999:7:::
......
[1]:账号名称
[2]:密码
[3]:最近更新密码的日期
[4]:密码不可以被更改的天数
[5]:密码需要重新更改的天数
[6]:密码需要更改期限前的警告天数
[7]:密码过期后的账号宽限时间(密码失效日)
[8]:账号失效日期
[9]:系统保留
三、用户组
跟用户组相关的两文件包括/etc/group和/etc/gshadow,具体如下:
1./etc/group的文件结构:
查看/etc/group文件的内容:共4个字段,每个字段使用分号“:”隔开,分别是:
[root@hs-uf21 etc]# head -n 2 group
root:x:0:root
bin:x:1:root,bin,daemon
[1]:用户组名
[2]:用户组密码
[3]:GID
[4]:此用户组支持的账号,可以有多个账号同属于一个组
查看oracle用户信息与用户组信息
[root@hs-uf21 ~]# grep oracle /etc/passwd /etc/group/etc/gshadow
/etc/passwd:oracle:x:501:502::/home/oracle:/bin/bash
/etc/group:dba:x:501:oracle
有效用户组与初始用户组
使用groups命令查看oracle用户支持的用户组,第一个显示的用户组为有效用户组:
[oracle@hs-uf21 ~]$ groups
oinstall dba
改变oracle用户的有效用户组,使用newgrp命令:
[oracle@hs-uf21 ~]$ newgrpdba
[oracle@hs-uf21 ~]$ groups
dba oinstall
用户新创建文件的所属组名为当前有效用户组:
[oracle@hs-uf21 ~]$ touch test.txt
[oracle@hs-uf21 ~]$ ll
-rw-r--r-- 1oracle dba 0 Apr 21 21:40 test.txt
2./etc/gshadow的文件结构:
查看/etc/gshadow的内容:共4个字段,每个字段使用分号“:”隔开,分别是:
[root@hs-uf21 etc]# head -n 2 gshadow
root:::root
bin:::root,bin,daemon
[1]:用户组名
[2]:用户组密码
[3]:用户组管理员有账号
[4]:该用户组的所属账号(与/etc/group相同)
四、账号管理
1.新增用户useradd:
语法:useradd [-u UID] [-g 初始用户组] [-G 次要用户组] [-mM][-c 用户说明] [-d 用户主文件夹(绝对路径)] [-s shell] 用户账号
参数:
[-u]:后面接UID,是一组数字,直接指定一个待定的UID给这个账号
[-g]:后面接用户初始用户组名initialgroup
[-G]:后面接次要组名,即此账号还可以加入的组名
[-m]:强制!要创建用户主文件夹(普通账号默认)
[-M]:强制!不要创建用户主文件夹(系统账号默认)
[-c]:
[-d]:指定某个目录为用户的主文件夹,而不使用默认值,必需使用绝对路径
[-r]:创建一个系统账号,这个账号的UID会有限制(参考/etc/login.defs)
[-s]:后面接shell,若没有指定刚默认是/bin/bash
[-e]:后面接一个日期,设置此账号的失效日,格式为“YYYY-MM-DD”此项会写入shadow的第八个字段
[-f]:后面接shadow的第七个字段,指定密码是否会失效,0为立刻失效,-1为永远不失效
[-D]:查看useradd命令的默认值
查看useradd命令的默认值:
[root@hs-uf21 etc]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
新用户user1(使用系统默认参数):
[root@hs-uf21 etc]# useradd user1
[root@hs-uf21 etc]# grep user1 passwd shadow groupgshadow
passwd:user1:x:502:503::/home/user1:/bin/bash
shadow:user1:!!:15817:0:99999:7:::
group:user1:x:503:
gshadow:user1:!::
给用户user1设置密码:
[root@hs-uf21 etc]# passwd user1
Changing password for user user1.
New UNIX password:
BAD PASSWORD: it is too short
Retype new UNIX password:
passwd: all authentication tokens updatedsuccessfully.
查看user1用户的主文件夹:默认权限是700
[root@hs-uf21 etc]# ll -d /home/user1
drwx------ 4user1 user1 4096 Apr 22 21:27 /home/user1
注意:使用root用户设置其它用户的密码
说明:创建普通用户时,UID默认是大于500的,并且会新建一个跟用户名相同的用户组做为此用户的初始用户组
新用户user2,并指定UID为114,指定初始用户组为users,强制不创建主文件夹:
[root@hs-uf21 etc]# useradd -u 114 -g users -M user2
[root@hs-uf21 etc]# ll -d /home/user2
ls: /home/user2: No such file or directory
[root@hs-uf21 etc]# grep user2 passwd shadow group
passwd:user2:x:114:100::/home/user2:/bin/bash
shadow:user2:!!:15817:0:99999:7:::
注意:指定初始用户组后,group文件中没有user2的相关信息
使用-r参数创建一个系统账号:
[root@hs-uf21 etc]# useradd -r user3
[root@hs-uf21 etc]# ll -d /home/user3
ls: /home/user3: No such file or directory
[root@hs-uf21 etc]# grep user3 passwd shadow group
passwd:user3:x:115:115::/home/user3:/bin/bash
shadow:user3:!!:15817::::::
group:user3:x:115:
注意:默认创建系统账号的UID是小于500的,并且没有创建用户主文件夹,同时新创建跟用户同名的用户组做为此用户的初始用户组
创建新用户涉及的文件:
用户账号与密码参数方面的文件:/etc/passwd、/etc/shadow
用户组相关方面的文件:/etc/group 、/etc/gshadow
用户主文件夹:/home/账号名称
useradd参考文件:/etc/default/useradd(也可以使用命令useradd -D查看)
[root@hs-uf21 etc]# cat /etc/default/useradd
# useradd defaults file
GROUP=100 <<==默认用户组
HOME=/home <<==默认主文件夹所有目录
INACTIVE=-1 <<==密码失效日
EXPIRE= <<==账号失效日
SHELL=/bin/bash <<==默认shell
SKEL=/etc/skel <<==指定用户主文件夹的参考基准目录
UID/GID及密码参数的参考文件:/etc/login.defs
[root@hs-uf21 etc]# cat /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 <<==密码最短的字符长度,已经被pam模式替代,失去效用
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时,是否主动创建用户主文件夹
2.用户设置密码:passwd/chage
passwd:
语法:passwd[--stdin][-l][-u][-S][-n 日数][-x 日数][-w日数][-i 日期] 账号
参数:
[--stdin]:
[-l]:Lock的意思,会将/etc/shadow第二列最前面加上“!”使用密码失效
[-u]:与-l是相对的,Unlock的意思
[-S]:列出密码的相关参数,即shadow文件内的大部分信息
[-n]:后面接天数,修改shadow文件的第4列,多久不可以修改密码的天数
[-x]:后面接天数,修改shadow文件的第5列,多久必需要改动密码的天数
[-w]:后面接天数,修改shadow文件的第6列,密码过期前的警告天数
[-i]:后面接日期,修改shadow文件的第7列,密码失效日期
修改oracle用户的密码:
[root@hs-uf21 ~]# passwdoracle
Changing password for user oracle.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updatedsuccessfully.
注意:要修改其它用户的密码,需要使用“passwd 账号”的格式,passwd后面不接用户表示修改自己的密码。但一般用户修改自己的密码时,需要先输入自己的原密码,而root用户不用。Linux使用pam模式来管理密码,这个管理的机制写在/etc/pam.d/passwd当中。
使用标准输入修改用户的密码:
[root@hs-uf21 ~]# echo "oracle" | passwd --stdin oracle
Changing password for user oracle.
passwd: all authentication tokens updated successfully.
注意:使用--stdin修改用户密码时,不需要再次输入密码。但是修改信息会被记录到history中。
chage:change user password expiry information
语法:chage [-ldEImMW] 账号
参数:
[-l]:列出该账号的详细密码参数。
[-d]:后面接日期,修改shadow文件的第3列(最近一次更改密码的日期),格式“YYYY-MM-DD”。
[-E]:后面接日期,修改shadow文件的第8列(账号失效日期),格式“YYYY-MM-DD”。
[-I]:后面接天数,修改shadow文件的第7列,密码失效日期
[-m]:后面接天数,修改shadow文件的第4列,多久不可以修改密码的天数
[-M]:后面接天数,修改shadow文件的第5列,多久必需要改动密码的天数
[-W]:后面接天数,修改shadow文件的第6列,密码过期前的警告天数
查看oracle用户的密码信息:
[root@hs-uf21 ~]# chage -l oracle
Minimum: 0
Maximum: 99999
Warning: 7
Inactive: -1
Last Change: Apr 24, 2013
Password Expires: Never
Password Inactive: Never
Account Expires: Never
3.usermod:
语法:usermod[-cdegGlsuLu] username
说明:usermod的参数基本要useradd相同。
4.userdel:
语法:userdel[-r] username
参数:
[-r]:连同用户的主文件夹也删除
删除user3用户及其主文件夹:
[root@hs-uf21 ~]# userdel -r user3
userdel: error removing directory /home/user3
[root@hs-uf21 ~]# ll -a /home/user3
ls: /home/user3: No such file or directory
5.id命令:查看用户的或者自己相关的UID/GID等信息
语法:id[username]
查看oracle用户的UID/GID等信息:
[root@hs-uf21 ~]# id oracle
uid=501(oracle) gid=502(oinstall)groups=502(oinstall),501(dba)
查看当前用户的UID/GID等信息:
[root@hs-uf21 ~]# id
uid=0(root) gid=0(root)groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
You have new mail in /var/spool/mail/root
五、用户身份切换
1.su命令
语法:su [-lm] [-c 命令] [username]
参数:
[- ]:单纯使用- 表示使用login-shell的变量文件读取式来登录系统,如果没有用户名,则表示切换为root身份。
[-l]:与 - 类似,但后面需要接欲切换的用户账号,也是login-shell的方式
[-m]:表示使用目前的环境设置,而不读取新用户的配置文件
[-c]:仅进行一次命令,后面接需要执行的命令
注意:若要完整地切换到新用户的变量,必须使用“us - username”或者“su -l username”的方式,并且使用root切换成为任何用户时,并不需要输入新用户名。
2.sudo命令
sudo可以以其它用户的身份执行命令(通常是使用root的身份来执行命令),但并非所有人都能够执行sudo,仅有/etc/sudoers内的用户才能执行sudo命令。
语法:sudo [-b] [-u 新用户账号]
参数:
[-b]:将后面的命令让系统自行执行,而不与目前的shell产生影响
[-u]:后面可以接欲切换的用户,若无此项则代表切换身份为root
root用户使用sudo命令以user1的身份在/home/user1/下面创建的test.txt文件所属用户为user1:
[root@hs-uf21 ~]# sudo -u user1 touch/home/user1/test.txt
[root@hs-uf21 ~]# ll -a /home/user1/test.txt
-rw-r--r-- 1 user1 user1 0 Apr 23 22:29 /home/user1/test.txt
3.visudo与/etc/sudoers
若想要除了root之外的其他账号使用sudo命令执行属于root的权限命令,则root需要先使用visudo去修改/etc/sudoers文件,让该账号能够使用全部或部分的root的命令功能。也可以直接使用vi或者vim编辑,但sudoers文件有自己的语法结构,如果设置错误会导致sudo命令无法使用。
系统默认只有root用户才可以执行sudo命令:
[oracle@hs-uf21 ~]$ sudo -u user1 touch/home/user1/test.txt
Password:
oracle is not in the sudoers file. This incident will be reported.
使用visudo命令修改/etc/sudoers文件,使oracle使用可以使用sudo执行root用户的全部命令:
[root@hs-uf21 ~]# visudo
# sudoers file.
root ALL=(ALL) ALL
oracle ALL=(ALL) ALL <<==增加此行
[root@hs-uf21 ~]# su - oracle
[oracle@hs-uf21 ~]$ sudo -u user1 touch/home/user1/test2.txt
[oracle@hs-uf21 ~]$ sudo ls -al /home/user1/test2.txt
-rw-r--r-- 1 user1 user1 0 Apr 23 22:43 /home/user1/test2.txt
说明:
root ALL=(ALL) ALL
[用户账号][登录者的来源主机名][(可切换的身份)][可执行的命令]
[用户账号]:系统的那个账号可以使用sudo命令,默认账号只有root。
[登录者的来源主机名]:这个账号由那台主机连接到本Linux主机,默认root可以来自任何一台网络主机。
[(可切换的身份)]:这个账号可以切换成什么身份来执行后续的命令,默认root可以切换成使用用户。
[可执行的命令]:这个命令必须使用绝对路径,默认root可以切换任何身份,且执行任何命令。
用oracle用户查看/etc/shadow文件会提示没有权限,但使用sudo可以查看:
[oracle@hs-uf21 ~]$ head -n 10 /etc/shadow
head: cannot open `/etc/shadow' for reading:Permission denied
[oracle@hs-uf21 ~]$ sudo head -n 10 /etc/shadow
Password:
root:$1$yI2Xb6os$9C5hnN3POy6sdl0TY8FZv.:15805:0:99999:7:::
.........
利用用户组以及免密码的功能处理visudo:
[root@hs-uf21 ~]# visudo
# sudoers file.
# %wheel ALL=(ALL) ALL
%user1 ALL=(ALL) ALL <<==增加此行,使用用户组可以使用用户组user1下面的用户可以使用sudo命令
[user1@hs-uf21 ~]$ head /etc/shadow
head: cannot open `/etc/shadow' for reading:Permission denied
[user1@hs-uf21 ~]$ sudo head /etc/shadow
Password:
root:$1$yI2Xb6os$9C5hnN3POy6sdl0TY8FZv.:15805:0:99999:7:::
bin:*:15805:0:99999:7:::
使用visudo编辑/etc/sudoers文件,可以让用户免输出密码执行sudo命令:
[root@hs-uf21 ~]# visudo
# sudoers file.
# %wheel ALL=(ALL) NOPASSWD: ALL
%user1 ALL=(ALL) NOPASSWD: ALL
[root@hs-uf21 ~]# su user1
[user1@hs-uf21 root]$ sudo head /etc/shadow
root:$1$yI2Xb6os$9C5hnN3POy6sdl0TY8FZv.:15805:0:99999:7:::
注意:本次使用sudo执行命令没有输入密码。
有限制的操作命令:
[root@hs-uf21 ~]# visudo
# User privilege specification
root ALL=(ALL) ALL
oracle ALL=(ALL) ALL
adminpwd ALL=(root) /usr/bin/passwd
[adminpwd@hs-uf21 ~]$ sudo passwd user1
Changing password for user user1.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updatedsuccessfully.
只执行sudopasswd时提示更改root用户的密码:
[adminpwd@hs-uf21 ~]$ sudo passwd
Changing password for user root.
New UNIX password:
使用visudo命令修改/etc/sudoers文件,全adminpwd用户只能使用除了root的之外的其它用户的密码:
[root@hs-uf21 ~]# visudo
# User privilege specification
root ALL=(ALL) ALL
oracle ALL=(ALL) ALL
#adminpwd ALL=(root) /usr/bin/passwd <<==此行更改为下面的写法
adminpwd ALL=(root) !/usr/bin/passwd,!/usr/bin/passwdroot,/usr/bin/passwd [A-Za-z]*
[root@hs-uf21 ~]# su - adminpwd
[adminpwd@hs-uf21 ~]$ sudo passwd
Sorry, user adminpwd is not allowed to execute'/usr/bin/passwd' as root on hs-uf21.
通过别名设置visudo:
[root@hs-uf21 ~]# visudo
# sudoers file.
# User alias specification
User_Alias ADMINPWD = oracle, adminpwd,user1
# Cmnd alias specification
Cmnd_Alias ADMINCMD =!/usr/bin/passwd,!/usr/bin/passwd root,/usr/bin/passwd [A-Za-z]*
# User privilege specification
root ALL=(ALL) ALL
#oracle ALL=(ALL) ALL
#adminpwd ALL=(root) !/usr/bin/passwd,!/usr/bin/passwdroot,/usr/bin/passwd [A-Za-z]*
ADMINPWD ALL=(root) ADMINCMD
[root@hs-uf21 ~]# su oracle
[oracle@hs-uf21 root]$ sudo head /etc/shadow
Password:
Sorry, user oracle is not allowed to execute'/usr/bin/head /etc/shadow' as root on hs-uf21.
[oracle@hs-uf21 root]$ sudo passwd
Sorry, user oracle is not allowed to execute'/usr/bin/passwd' as root on hs-uf21.
[oracle@hs-uf21 root]$ sudo passwd user3
Changing password for user user3.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updatedsuccessfully.
注意:User_Alias,Cmnd_Alias,Host_Alias的名称一定要使用大写。