关于Linux账号管理详解
本文针对Linux系统单个用户管理操作以及群组的管理操作做了详细的分析以及需要注意的地方,一起学习下。
一、用户管理
1. 用户账号管理文件
要对Linux中的用户账号进行管理,首先当然应该了解用户账号在Linux系统中是怎么保存的,这涉及到两个文件——/etc/passwd与/etc/shadow,前者保存用户的UID和GID等基本信息,后者则主要保存与账号密码相关的一些信息。
先来看看/etc/passwd这个文件存的是啥(这里只取前三行):
在此文件中,每个用户账号信息存为一行,每一行有7个栏位,从左到右存放的信息分别为:
(1)账号名称。
(2)密码:早期Unix系统的密码是放在这里的,但由于/etc/passwd这个文件能被很多程序读取,不安全,后来密码资料已经放到文件/etc/shadow中,所以这里第二个栏位都是“x”。
(3)UID:0代表账号为系统管理员,1-999代表系统账号,1000-6000则是一般使用者。
(4)GID:用户初始群组的GID。
(5)用户名全称或账号意义说明。
(6)家目录:默认为/home/账号名称。
(7)Shell:该账号登入系统之后取得的shell。
再来看看/etc/shadow这个文件存的又是啥(这里只取前三行):
同样的,在这个文件中也是每个账号存为一行,共有9个栏位,从左到右存放的信息分别为:
(1)账号名称。
(2)密码:加密之后的密码。若以“!”开头则表示密码失效,账号封锁,暂时无法登录。
(3)最近修改密码的日期:这个栏位上的数字表示的是最近修改密码的日期是在1970年1月1日的多少天之后。
(4)密码不可修改的天数:表示上一次修改密码之后,几天之后才能再次修改密码。
(5)密码需要再次修改的天数(密码过期日):表示上一次修改密码之后,几天之内需要再次修改密码。
(6)在密码过期日前几天开始发出警告。
(7)密码过期之后的账号宽限天数(密码失效日):密码过期后几天之内账号密码还是可以使用,但是登入系统之后,系统会强制让用户修改密码。若这几天还是没修改密码,则过了这个时间密码就失效了,无法再使用该账号密码登入系统。
(8)账号失效日期:1970年1月1日的多少天之后账号失效,无论密码是否过期,账号都无法再使用。
(9)暂时没存信息,保留给新功能使用。
2. 用户账号管理操作
了解了Linux账号和密码在系统中的保存方式之后,我们还需要知道怎么去添加账号、修改账号信息,以及如何修改密码等用户管理操作,以下便一一作出说明。
(1)用户账号添加:
useradd [-u UID] [-g 初始群組] [-G 次要群組] [-m/M] [-c 账号意义说明] [-d 家目绝对路径] [-s shell] [-r] [-e 账号失效日期,格式为YYYY-MM-DD] [-f 密码是否会失效,0立刻失效,-1永不失效] 账号名称
这里列出useradd命令常用的一些选项,可根据需要添加,其中-M表示强制不建立家目录,-m表示强制建立家目录,-r表示创建系统账号,更多选项需要自己使用man命令在系统中查看了。不过一般来说,我们创建用户账号的时候只要指定账号名称即可:useradd账号名称,这样账号的其他信息都会使用系统为我们设置的默认值。在CentOS中,系统默认会帮我们做的事情如下:
<1>在/etc/passwd建立一行与账号相关的资料。
<2>在/etc/shadow建立一行与此账号密码相关的数据,但是尚未有密码。
<3>在/etc/group建立一行此账号的初始群组信息,群组名称与账号名称一致。
<4>在/etc/gshadow建立一行此账号初始群组的密码信息,但是没有密码。
<4>在/home中建立此账号家目录,目录名称与账号名称一致,权限为700。
那么useradd命令的这些默认值是在哪里存放的呢?首先可以使用useradd -D查看部分默认值(这里注解了各个参数的意义说明):
(最后一个参数为:是否建立邮件信箱)
这些参数实际上就保存在文件/etc/default/useradd中!
关于初始群组,有两种机制:公共群组机制和私有群组机制。公共群组机制会使用这里的“GROUP=100”这个参数值作为新建账号的初始群组,每个账号都将属于users这个群组,账号之间可以分享家目录中的资料,SuSE使用的就是这种机制。私有群组机制则不使用这个参数,每个账号都有各自的群组和家目录,而且只有自己可以进入自己的家目录,使用这个机制的有RHEL,Fedora,CentOS等。
“SKEL=/etc/skel”指定了创建账号家目录的内容参考目录,即新建账号的家目录中的内容是从/etc/skel这个目录中直接拷贝过去的!“CREATE_MAIL_SPOOL=yes”指定了系统会自动帮新建账号建立邮件信箱,即会创建“/var/spool/mail/账号名称”这个文件。
然而/etc/default/useradd这个文件只是设置了一些账号的基本信息默认值,更多参数默认值可在/etc/login.defs文件中查看,里面设置了用户UID、GID等更多参数默认值与规范。
所以,总结起来,使用useradd命令创建账号时会参考的文件有:/etc/default/useradd、/etc/login.defs、/etc/skel/*。
(2)用户账号修改:
修改用户账号可使用usermod命令,该命令的选项参数大都与useradd类似,这里不再赘述,只是有个特别的功能需要说明一下,那就是usermod可以使用-L和-U这两个选项参数分别对账号进行冻结和解冻,冻结其实就是在/etc/shadow第二栏的密码前面添加“!”,使得账号密码无法正常登录,解冻则将其去除,恢复账号登录。
(3)用户账号删除:
用户账号删除使用命令:userdel 用户账号,若加上-r选项则会连同使用者的家目录也一起删除。注意,userdel命令会将与指定账号相关的东西统统删除!
(4)账号密码修改:
使用useradd创建账号之后,新建账号还是无法登入系统的,还需要使用passwd命令设置密码才行:
除了修改密码,passwd命令还有以下用途:
<1>修改密码属性:passwd [-n 密码不可修改的天数] [-x 密码需要再次修改的天数] [-w 在密码过期日前几天开始发出警告] [-i 密码过期之后的账号失效宽限天数] 账号名称
<2>冻结密码:passwd -l 账号名称,修改/etc/passwd,在密码前加“!!”。(类似usermod -L)
<3>解冻密码:passwd -u 账号名称。(类似usermod -U)
<4>查看密码信息:passwd -S 账号名称。
除了passwd,还有一个命令可用于修改账号密码的信息,那就是chage:
chage [-d 最近修改密码日期,格式为YYYY-MM-DD] [-m 密码不可修改的天数] [-M 密码需要再次修改的天数] [-W 在密码过期日前几天开始发出警告] [-I 密码过期之后的账号失效宽限天数] [-E 账号失效日期,格式为YYYY-MM-DD]
此外,chage也可以用于查看账号密码信息,信息展示的格式比passwd -S指令更容易查看:
还可以通过“chage -d 0 账号名称”强制要求用户在下一次登入系统时修改密码!
3. 使用者功能
以上介绍的账号管理操作,除了使用passwd修改自己密码和部分信息查看操作,其他的都是只有系统管理员才能执行的,下面介绍一下一般用户能查看与修改信息的命令操作。
<1>id 账号名称:查看用户UID和GID。
<2>finger:查询当前登入系统的所有用户信息。
finger 账号名称:查询某个账号相关属性。
<3>chfn:修改finger中展示的一些信息。
可以看到,实际上修改的信息都保存在/etc/passwd文件的第五栏中。(修改自己信息直接执行“chfn”即可)
<4>chsh -l:查看当前系统上所有可用的shell,即是/etc/shells中的内容。
chsh -s:修改自己的shell。
二、群组管理
1. 群组管理文件
与用户管理类似,想要了解群组管理,亦需要先来看看群组信息在Linux系统中是怎么保存的,群组信息涉及两个文件——/etc/group和/etc/gshadow,前者保存群组基本信息,后者保存群组密码信息。
先来看看/etc/group文件:
在此文件中,每个群组信息存为一行,每行4个栏位,从左到右存放信息分别为:
(1)群组名称。
(2)群组密码:已转移到/etc/gshadow中存储,所以这里存“x”。
(3)GID。
(4)此群组中的所有用户账号成员列表。
再来看看/etc/gshadow文件:
在此文件中,每个群组信息存为一行,每行4个栏位,从左到右存放信息分别为:
(1)群组名称。
(2)群组密码:通常是给群组管理员使用的,少有设置。
(3)群组管理员的账号。
(4)此群组中的所有用户账号成员列表。
2. 群组管理操作
(1)群组添加:
groupadd [-g gid] 群组名称
(若是创建系统群组需加上-r选项)
(2)群组修改:
groupmod [-g gid] [-n 群组新名称] 群组名称
(注意,不要随意改动GID,很容易造成系统资源的错乱)
(3)群组删除:
groupdel 群组名称
(若群组是某个用户账号的初始群组则会报错,无法删除)
(4)初始群组与有效群组:
用户的初始群组是用户登入系统之后就获取到并拥有其相关权限的群组,也就是/etc/passwd文件第四个栏位上的GID对应的群组。用户在系统中可加入多个群组,而且可以使用所属所有群组的权限与功能,但是创建文件或者目录的时候,新建文件或目录的群组则只能是当前用户当前的有效群组。
可以使用命令“groups”查看当前用户加入的所有群组,列表中第一个群组即是当前有效群组,可以使用命令“newgrp 群组名称”切换有效群组,但是只能在当前用户加入的所有群组中切换。切换有效群组之后会进入一个新的shell环境,可以使用“exit”命令来退出,回到原来有效群组和shell环境。
(5)用户加入群组:
用户想要加入某个群组有两种方法,第一种方法是让系统管理员root使用usermod命令进行操作(-a选项组合-G选项):
(将用户jet加入群组jet2)
第二种方法则是让对应群组的管理员使用gpasswd命令进行操作。
首先需要系统管理员root指定这个群组的管理员,也是使用gpasswd命令操作。先来看看root操作:
<1>修改群组密码:gpasswd 群组名称
<2>设置群组管理员、用户成员:gpasswd [-A 群组管理员账号列表] [-M 用户成员账号列表] 群组名称
<3>移除群组密码:gpasswd -r 群组名称
<4>使群组密码失效:gpasswd -R 群组名称
然后由群组管理员对群组用户成员进行管理:
三、使用者身份切换
1. su:
用户登入Linux系统之后可以通过su命令切换到不同账号,通过exit命令退出,恢复到原来账号。
(1)su 账号名称:以non-login shell方式切换身份,很多环境变量包括PATH都还是目前用户的。
(2)su -/-l 账号名称:以login shell方式切换身份,所有环境变量都变成新账号的。
(3)su - -c "指令" 账号名称:利用新身份执行一条指令,执行后身份恢复为当前用户。
(若不加上账号名称则表示切换到root身份)
2. sudo:
使用su命令切换身份是需要输入新切换账号的密码的(只有root不需要),也就是说,若要使用su切换身份,就必须要知道新切换账号的密码才行。另一个命令sudo也可以切换身份执行命令操作,而且只需要输入当前账号密码即可,无需知道新切换账号的密码,只是切换身份执行命令之后会自动恢复到原来账号身份。指令格式如下:
sudo -u 账号名称 指令
(若是没有指定账号名称则默认是使用root身份执行指令)
然而并不是所有的用户账号都能使用sudo命令并能随意切换任何账号的,需要在/etc/sudoers文件中配置相关信息才可以。此文件有规定语法,需要使用visudo指令来进行编辑。通过/etc/sudoers文件可设置哪些用户或群组可在哪些主机登入系统时切换到哪些账号执行哪些指令,还可以设置执行sudo指令时无需输入密码。该文件部分内容截图如下:
如果我们上述给大家讲解的你还没有理解透,大家可以在下面的相关文章获取更多相关的文章。