一、前言
对于Linux管理者来说,“帐号管理”是再也普通不过的一个环节了,但每次都要去查一大本的手册实在是很浪费时间。我还是老老实实地花点心思把这些常用的功能都整理成一份文档,方便以后的使用和学习,以后也都会继续这样做下去。
本文的所有案例与说明都是基于Ubuntu 16.04.3 LTS 64位操作系统,如果你的操作系统与我的不一样,可能会出现不一样的结果。但Linux的原理都是通用的,善于使用man可以帮助你更好的管理你的操作系统。
二、相关的文件:
上图一共列出了9个相关文件,但这里我只重点讲解前三个文件,也即是 /etc/passwd、/etc/shadow 与 /etc/group。
1、/etc/passwd
User account information. --(明文的)用户账号信息
这个文件每一行都代表一个帐号,有几行就代表有几个帐号在你的系统中!不过需要特别注意的是,里面很多帐号本来就是系统正常运行所必须的,我们可以简称它为系统帐号。这些帐号都是你不能随便删除的!
通过查看passwd(5)手册可以查看/etc/passwd的文件结构:
man 5 passwd
文件结构说明:
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. -- 安全加密的用户账号信息
通过查看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默认设置
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文件内容如下:
常用参数:
-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官方参考手册
如发现有写得不对或不好的地方非常欢迎到评论区指出与交流,感谢阅读!
——《完》