Linux帐号管理详解

一、前言

对于Linux管理者来说,“帐号管理”是再也普通不过的一个环节了,但每次都要去查一大本的手册实在是很浪费时间。我还是老老实实地花点心思把这些常用的功能都整理成一份文档,方便以后的使用和学习,以后也都会继续这样做下去。

本文的所有案例与说明都是基于Ubuntu 16.04.3 LTS 64位操作系统,如果你的操作系统与我的不一样,可能会出现不一样的结果。但Linux的原理都是通用的,善于使用man可以帮助你更好的管理你的操作系统。

二、相关的文件:

相关的文件

上图一共列出了9个相关文件,但这里我只重点讲解前三个文件,也即是 /etc/passwd、/etc/shadow 与 /etc/group。

1、/etc/passwd

User account information. --(明文的)用户账号信息

/etc/passwd文件

这个文件每一行都代表一个帐号,有几行就代表有几个帐号在你的系统中!不过需要特别注意的是,里面很多帐号本来就是系统正常运行所必须的,我们可以简称它为系统帐号。这些帐号都是你不能随便删除的!

通过查看passwd(5)手册可以查看/etc/passwd的文件结构:

man 5 passwd

passwd(5)

文件结构说明:

1)帐号名称

2)密码。这个字段的密码现在已经放到/etc/shadow中了,所以这里只会看到一个‘x’

3)UID,用户标志符

4)GID,用户组标志符

5)用户信息说明,相当于一个备注而已

6)主文件夹

7)用户登录的默认shell。注意,有一个shell可以用来替代成让用户无法取得shell环境的登录操作,它就是/sbin/nologin,这也可以用来制作纯pop邮件帐号者的数据。

“/etc/passwd” 第二项的内容说明

2、/etc/shadow

Secure user account information. -- 安全加密的用户账号信息

/etc/shadow 文件

通过查看shadow(5)手册也可以查看/etc/shadow的文件结构:

man 5 shadow

如shadow(5)中所述,这个文件中被 “:” 分隔的每项含义如下。

1)登录名

2)加密后的密码(下面会再详细说明)

3)最后一次修改密码的时间,其表示从 1970 年 1 月 1 日起的天数

4)允许用户再次修改密码的天数间隔(即密码不可被更动的天数,与第3 个字段相比)

5)用户必须修改密码的天数间隔(与第3 个字段相比)

6)密码失效前的天数,在此期间用户会被警告 (与第5 个字段相比)

7)密码失效后的天数,在次期间密码依旧会被接受 (与第5 个字段相比)

8)账号失效的时间,其表示从 1970 年 1 月 1 日起的天数(这个帐号在此字段规定的日期之后,将无法使用,无论你的密码是否过期,通常应用在收费服务中)

9)…(保留字段)

3、/etc/group

Group account information.  -- 组信息

通过查看group(5)手册也可以查看/etc/group的文件结构:

man 5 group

如group(5)中所述,这个文件中被“:”分隔的每项含义如下。

1)组名称

2)加密后的密码(不会被真正使用)

3)数字形式的组ID,即GID

4)使用“,”分隔的用户名列表

注意:

“/etc/gshadow” 为 “/etc/group” 提供了与 “/etc/shadow” 相似的功能,但没有被真正地使用。

4、/etc/gshadow

Secure group account information. -- 安全加密的组信息

5、/etc/default/useradd

Default values for account creation.  -- 创建用户时的默认设置

6、/etc/skel/

Directory containing default files.  -- 用户主目录的默认内容

7、/etc/subgid

Per user subordinate group IDs.

8、/etc/subuid

Per user subordinate user IDs.

9、/etc/login.defs

Shadow password suite configuration.

三、用户管理:

1、添加用户 -- useradd

useradd -- create a new user or update default new user information.

常用参数:

-m ,--create-home 强制!同时创建用户主文件夹(一般帐号默认值)

-s ,--shell 后面接一个shell,若没有指定,则使用/etc/default/useradd文件中默认设置的 shell

... ...

更多的使用方法请查看:man useradd

例1:最简单的例子

useradd nosee   # 默认生成一个nosee用户与nosee组。因为还没有设置密码,所以还不可登录。

例2:创建一个可以使用的帐号

useradd -m nosee

passwd nosee  # 根据提示输入再次相同的密码,设置密码后才可以正常登录。

例3:查看useradd默认设置

参考文件:/etc/default/useradd

GROUP=100        #默认的用户组 (实际上一般都不会是这个,具体原因这样就不说了)

HOME=/home        #默认的主文件夹所在目录

INACTIVE=-1        #密码失效日,在shadow文件的第7列

EXPIRE=        #帐号失效日,在shadow文件的第8列

SHELL=/bin/sh        #默认的shell

SKEL=/etc/skel        #用户主文件夹的,内容数据参考目录

CREATE_MAIL_SPOOL=no        #是否主动帮用户创建邮件信箱(mailbox)

使用useradd创建用户时还会参考文件/etc/login.defs的设置,比如UID/GID的指定数值、用户主文件夹设置值、用户删除与密码设置值等,这里也不做深入讨论了。

2、用户密码管理 -- passwd

passwd - change user password

常用参数:

-l ,--lock 会将/etc/shadow第二列最前面加上!使密码失效

-u ,--unlock 与-l相反

-S ,--status  列出密码相关参数,即shadow文件内的大部份信息。

更多的使用方法请查看:man passwd

3、用户密码管理 -- chage

chage - change user password expiry information

-l ,--list 列出该帐号的详细密码参数(Show account aging information.)

更多的使用方法请查看:man chage

4、用户信息修改 -- usermod

usermod - modify a user account

-c, --comment 后面接帐号的说明,即/etc/shadow第五列的内容。

-d, --home 后面接帐号的主文件夹,即/etc/shadow第六列的内容。(The user's new login directory)

-l, --login 后面接帐号名称,即修改帐号名称,/etc/passwd第一列的内容。

-g, --gid 后面接初始用户组,修改/etc/passwd的第四个字段,即GID

-G, --gid 后面接次要用户组,修改这个用户能够支持的用户组,修改的是/etc/group

更多的使用方法请查看:man usermod

当然,以上的修改你也可以通过手动修改相关的配置文件来达到一样的目的。

5、删除用户 -- userdel 

userdel - delete a user account and related files

-r, --remove 连同用户的主文件夹也一起删除( Files in the user's home directory will be removed along with the home directory itself and the user's mail spool. Files located in other file systems will have to be searched for and)

注意:

1)一般而言,该帐号如果只是暂时不启用的话,那么将/etc/shadow里面帐号失效日期(第八字段)设置为0就可以让该帐号无法登录,但所有相关的数据都会留下来。使用userdel的时候通常是你真的确定不要该用户在主机上面用任何数据了!

2)如果想要完整地将某个帐号删除,最好可以执行userdel -r username之前,先以“find / -user username”查出整个系统内属于username的文件,然后再进行删除。

四、用户组管理:

1、初始用户组(initial group)与有效用户组(effective group):

在/etc/passwd里面的第四列有一个所谓的GID,它就是“初始用户组”。也就是说,当用户登录系统,立刻就拥有这个用户组的相关权限的意思。

有效用户组:即帐号当前(实时)所使用的用户组。

次要用户组:次要用户组就是除了用户的初始用户组外的其它所属组,在/etc/group的最后一个字段中所设置,可以有多个(多个用逗号','隔开)。

使用usermod -g可以修改初始用户组,而使用usermod -G则可以修改次要用户组。

例1:修改用户次要用户组

usermod -G users nosee   # 也可以通过组管理员使用命令gpasswd来操作。

查看结果

例2:有效与支持用户组的查看

groups        #注意后面有s!

在这个输出的信息中,可知道nosee这个用户同时属于nosee及users这两个组,而且,第一个输出的即为“有效用户组”。也就是说,上面例子中的有效用户组为nosee。

2、有效用户组的切换 -- newgrp

newgrp users

上面例子中,nosee的有效用户组从nosee转变成了users。

现在我们来深入讨论下newgrp这个命令,这个命令可以更改目前用户的有效用户组,而且是另外以一个新的shell来提供这个功能。因此如果你想要回到原本的环境中,只需要输入exit即可。

3、新增用户组 -- groupadd

groupadd - create a new group

常用参数:

-g, --gid 设置用户组的ID值,即GID

-r, --system 新建系统用户组,与 /etc/login.defs内的GID_MIN有关

4、用户组参数修改 -- groupmod

groupmod - modify a group definition on the system

常用参数:

-g, --gid 修改GID

-n, --new-name  修改组名称

注意:不要随意改动GID,容易造成系统资源的错乱。

5、删除用户组 -- groupdel

groupdel - delete a group

注意,只有在/etc/passwd内没有任何用户使用该用户组的作为初始用户组的时候,才可以成功删除。

6、用户组管理员功能 -- gpasswd

gpasswd - administer /etc/group and /etc/gshadow

1)系统管理员(root)的常用参数

-A, --administrators

-M, --members

-r, --remove-password

-R, --restrict

# 语法:

gpasswd groupname        #没有任何参数,表示给予groupname一个密码(/etc/gshadow)

gpasswd [-A user1, ...] [-M user3, ...] groupname

gpasswd [-rR] groupname

2)用户组管理员(Group administrators)的常用参数

-a, --add        #将用户user加入到groupname这个用户组中

-d, --delete        #将用户user从用户组groupname中删除

语法:

gpasswd [-ad] user groupname

五、用户身份切换

1、su

su - change user ID or become superuser

su是最简单的身份切换命令了,它可以进行任何身份的切换。

常用参数:

-        #单纯使用-,如“su -”,代表使用login-shell的变量文件读取方式登录系统,若后面没有加上用户名,则代表将要切换到root的身份。

-l, --login        #与-类似,但后面需要加欲切换的用户帐号

-m, -p, --preserve-environment    #表示使用目前的环境设置,而不读取新用户的配置文件。

-c, --command        #仅进行一次命令,所以-c后面可以加上命令

#语法:

su [-lm] [-c "命令"] [username]

注意:

1)这个su的用法当中,有没有加上“-”差很多的,转为涉及login-shell与not-login shell的变量读取方法。即想要完整的切换到新用户的环境,可以利用“su - username”或“su -l username”。

2)使用root切换到任何用户时,都不需要输入密码

3)当从其它用户切换到root用户时都必须输入root的密码,这样root的密码就很容易流传出去,这是很不妥当的,所以才会有sudo这个命令的出现。

2、sudo

sudo, sudoedit — execute a command as another user

sudo的执行仅需要自己的密码,甚至可以设置不需要密码即可执行sudo。由于sudo可以让你以其他的用户身份执行命令(通常是root的身份),因此并不是所有人才能执行sudo,而是仅有/etc/sudoers内的用户才能够执行sodu这个命令。

/etc/sudoers文件内容如下:

/etc/sudoers文件内容

常用参数:

-p, --prompt        #将后续的命令让系统自行执行,而不与目前的shell产生影响

-u, --user        #后面可以接欲切换的用户,若无此项则代表切换用户为root。

# 语法(SYNOPSIS):

sudo -h | -K | -k | -V

sudo -v [-AknS] [-a type] [-g group] [-h host] [-p prompt] [-u user]

sudo -l [-AknS] [-a type] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]

sudo [-AbEHnPS] [-a type] [-C num] [-c class] [-g group] [-h host] [-p prompt] [-r role] [-t type] [-u user] [VAR=value] [-i | -s] [command]

sudoedit [-AknS] [-a type] [-C num] [-c class] [-g group] [-h host] [-p prompt] [-u user] file ...

例:使用nosee的身份在/home/nosee/目录下新建一个test文件

sudo -u nosee touch /home/nosee/test

sudo的执行流程:

1)当用户执行sudo时,系统于/etc/sudoers文件查找该用户是否有执行sudo的权限;

2)若用户具有可执行sudo的权限后,便让用户输入自己的密码来确认;

3)若密码输入成功,便开始进行sudo后续接的命令(但root执行sudo时不需要输入密码);

4)若欲切换的用户与执行者身份相同,那也不需要输入密码。

因为/etc/sudoers文件有一定的规则,所以我们一帮不直接用vi去编辑。一般,我们都是使用visudo来修改这个文件。

3、visudo

因为/etc/sudoers是有语法的,如果设置错误那会造成无法使用sudo的不良后果,因此才会使用visudo去修改。

一般来说,visudo的设置方式有几种简单的方法,正面我们以几个简单的例子来说明:

1)单一用户可以进行root的所有命令与sudoer文件语法

例:让用户nosee可以使用root的所有命令

visudo

2)利用用户组及免密功能处理visudo

例:让nosee用户组可以使用root的所有命令,并且不需要输入密码

注意:用户组的表示只需要在前面加一个百分号%即可,NOPASSWD则是免密的关键字。

3)有限制的命令操作

例:让user1用户仅能使用passwd这个命令帮root修改其他用户的密码

user1    ALL=(root)    /usr/bin/passwd

注意:最后一个参数一定要用绝对路径才行,否则visudo会出现语法错误。

但这里有个可怕的地方,就是用户user1竟然也可以去修改root的密码了,这是不应该允许发生的,为了避免上述的问题,应该使用下面的这种配置:

user1    ALL=(root)    !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

上面参数的意思是,用户user1可以执行“passwd 任意字符串”,但是“passwd”与“passwd root”两个命令除外。

4)通过别名设置visudo

User_Alias ADMPW = user1, user2, user3

Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

5)sudo的时间间隔问题

两次执行sudo的间隔时间在5分钟内,那么再次执行sudo时就不需要再次输入密码。

6)sudo搭配su的使用方式

很多时候我们需要大量执行很多root的工作,所以一直sudo觉得麻烦。这里有一个变身root用户的办法,而且还不会外泄root密码,前提是你要非常信任你将要为他们做此次设置的用户。

nosee    ALL=(root)    /bin/su -

六、其它:

1、查看用户当前所用的shell

1)实时查看当前进程中使用的shell种类:推荐

ps | grep $$ | awk '{print $4}'

2)最常用的查看shell的命令,但不能实时反映当前shell

$ echo $SHELL    # $ echo $0   这个更简洁,但并不是所有shell都支持

3)环境变量中shell的匹配查找

env | grep SHELL

4)口令文件中shell的匹配查找

cat /etc/passwd | grep muye

2、强制踢出已登录用户

fuser -k /dev/pts/1

或也可以给他发送一条信息。

echo "你被管理员踢出了" > /dev/pts/0 && fuser -k /dev/pts/1

3、adduser

adduser也可以用于用户的添加,感觉兴趣的同学可以自行去查阅相关的资料。

七、参考文献

1、《鸟哥的Linux私房菜基础学习篇》-- 鸟哥

2、 Debian官方参考手册


如发现有写得不对或不好的地方非常欢迎到评论区指出与交流,感谢阅读!    

——《完》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容