Linux账号管理

一、用户标识符: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的名称一定要使用大写。


原文地址:https://www.cnblogs.com/javawebsoa/p/3041080.html