三、用户管理
用户和用户组操作命令
ld
Finger
Pwck
检查/etc/passwd配置文件内的信息与实际主文件夹是否存在,还可比较/etc/passwd和/etc/shadow的信息是否一致,另外如果/etc/passwd中的数据字段错误也会提示。
Grpck
和pwck功能相近,这个是检查用户组的。
Groups
newgrp
useradd
usermod
usermod
用于修改用户的基本信息
补充说明
usermod命令 用于修改用户的基本信息。usermod 命令不允许你改变正在线上的使用者帐号名称。当 usermod 命令用来改变user id,必须确认这名user没在电脑上执行任何程序。你需手动更改使用者的 crontab 档。也需手动更改使用者的 at 工作档。采用 NIS server 须在server上更动相关的NIS设定。
语法
usermod(选项)(参数)
选项
-c<备注>:修改用户帐号的备注文字;
-d<登入目录>:修改用户登入时的目录,只是修改/etc/passwd中用户的家目录配置信息,不会自动创建新的家目录,通常和-m一起使用;
-m<移动用户家目录>:移动用户家目录到新的位置,不能单独使用,一般与-d一起使用。
-e<有效期限>:修改帐号的有效期限;
-f<缓冲天数>:修改在密码过期后多少天即关闭该帐号;
-g<群组>:修改用户所属的群组;
-G<群组>;修改用户所属的附加群组;
-l<帐号名称>:修改用户帐号名称;
-L:锁定用户密码,使密码无效;
-s
-u
-U:解除密码锁定。
参数
登录名:指定要修改信息的用户登录名。
实例
将 newuser2 添加到组 staff 中:
usermod -G staff newuser2
修改newuser的用户名为newuser1:
usermod -l newuser1 newuser
锁定账号newuser1:
usermod -L newuser1
解除对newuser1的锁定:
usermod -U newuser1
增加用户到用户组中:
apk add shadow # 安装 shadow 包, usermod 命令包含在 usermod 中
usermod -aG group user # 添加用户到用户组中
-a 参数表示附加,只和 -G 参数一同使用,表示将用户增加到组中。
修改用户家目录:
[root@node-1 ~]# useradd lutixiaya
[root@node-1 ~]# ls /home
lutixiaya
[root@node-1 ~]# usermod -md /data/new_home lutixiaya
[root@node-1 ~]# ls /home/
[root@node-1 ~]# ls /data/
new_home
userdel
用于删除给定的用户以及与用户相关的文件
补充说明
userdel命令 用于删除给定的用户,以及与用户相关的文件。若不加选项,则仅删除用户帐号,而不删除相关文件。
语法
userdel(选项)(参数)
选项
-f:强制删除用户,即使用户当前已登录;
-r:删除用户的同时,删除与用户相关的所有文件。
参数
用户名:要删除的用户名。
实例
userdel命令很简单,比如我们现在有个用户linuxde,其家目录位于/var目录中,现在我们来删除这个用户:
userdel linuxde # 删除用户linuxde,但不删除其家目录及文件;
userdel -r linuxde # 删除用户linuxde,其家目录及文件一并删除;
请不要轻易用-r选项;他会删除用户的同时删除用户所有的文件和目录,切记如果用户目录下有重要的文件,在删除前请备份。
其实也有最简单的办法,但这种办法有点不安全,也就是直接在/etc/passwd中删除您想要删除用户的记录;但最好不要这样做,/etc/passwd是极为重要的文件,可能您一不小心会操作失误。
groupadd
groupmod
groupdel 都是用来删除用户组的
groupmod
更改群组识别码或名称
补充说明
groupmod命令 更改群组识别码或名称。需要更改群组的识别码或名称时,可用groupmod指令来完成这项工作。
语法
groupmod(选项)(参数)
选项
-g<群组识别码>:设置欲使用的群组识别码;
-o:重复使用群组识别码;
-n<新群组名称>:设置欲使用的群组名称。
参数
组名:指定要修改的工作的组名
groupadd
用于创建一个新的工作组
补充说明
groupadd命令 用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。
语法
groupadd(选项)(参数)
选项
-g:指定新建工作组的id;
-r:创建系统工作组,系统工作组的组ID小于500;
-K:覆盖配置文件“/ect/login.defs”;
-o:允许添加组ID号不唯一的工作组。
参数
组名:指定新建工作组的组名。
实例
建立一个新组,并设置组ID加入系统:
groupadd -g 344 jsdigname
此时在/etc/passwd文件中产生一个组ID(GID)是344的项目。
groupdel
用于删除指定的工作组
补充说明
groupdel命令 用于删除指定的工作组,本命令要修改的系统文件包括/ect/group和/ect/gshadow。若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。
语法
groupdel(参数)
参数
组:要删除的工作组名。
实例
groupadd damon //创建damon工作组
groupdel damon //删除这个工作组
passwd
用于让用户可以更改自己的密码
补充说明
passwd命令 用于设置用户的认证信息,包括用户密码、密码过期时间等。系统管理者则能用它管理系统用户的密码。只有管理者可以指定用户名称,一般用户只能变更自己的密码。
语法
passwd(选项)(参数)
选项
-d:删除密码,仅有系统管理者才能使用;
-f:强制执行;
-k:设置只有在密码过期失效后,方能更新;
-l:锁住密码;
-s:列出密码的相关信息,仅有系统管理者才能使用;
-u:解开已上锁的帐号。
参数
用户名:需要设置密码的用户名。
知识扩展
与用户、组账户信息相关的文件
存放用户信息:
/etc/passwd
/etc/shadow
存放组信息:
/etc/group
/etc/gshadow
用户信息文件分析(每项用:隔开)
例如:jack:X:503:504:::/home/jack/:/bin/bash
jack # 用户名
X # 口令、密码
503 # 用户id(0代表root、普通新建用户从500开始)
504 # 所在组
: # 描述
/home/jack/ # 用户主目录
/bin/bash # 用户缺省Shell
组信息文件分析
例如:jack:$!$:???:13801:0:99999:7:::
jack # 组名
$!$ # 被加密的口令
13801 # 创建日期与今天相隔的天数
0 # 口令最短位数
99999 # 用户口令
7 # 到7天时提醒
* # 禁用天数
* # 过期天数
实例
如果是普通用户执行passwd只能修改自己的密码。如果新建用户后,要为新用户创建密码,则用passwd用户名,注意要以root用户的权限来创建。
[root@localhost ~]# passwd linuxde # 更改或创建linuxde用户的密码;
Changing password for user linuxde.
New UNIX password: # 请输入新密码;
Retype new UNIX password: # 再输入一次;
passwd: all authentication tokens updated successfully. # 成功;
普通用户如果想更改自己的密码,直接运行passwd即可,比如当前操作的用户是linuxde。
[linuxde@localhost ~]$ passwd
Changing password for user linuxde. # 更改linuxde用户的密码;
(current) UNIX password: # 请输入当前密码;
New UNIX password: # 请输入新密码;
Retype new UNIX password: # 确认新密码;
passwd: all authentication tokens updated successfully. # 更改成功;
比如我们让某个用户不能修改密码,可以用-l选项来锁定:
[root@localhost ~]# passwd -l linuxde # 锁定用户linuxde不能更改密码;
Locking password for user linuxde.
passwd: Success # 锁定成功;
[linuxde@localhost ~]# su linuxde # 通过su切换到linuxde用户;
[linuxde@localhost ~]$ passwd # linuxde来更改密码;
Changing password for user linuxde.
Changing password for linuxde
(current) UNIX password: # 输入linuxde的当前密码;
passwd: Authentication token manipulation error # 失败,不能更改密码;
再来一例:
[root@localhost ~]# passwd -d linuxde # 清除linuxde用户密码;
Removing password for user linuxde.
passwd: Success # 清除成功;
[root@localhost ~]# passwd -S linuxde # 查询linuxde用户密码状态;
Empty password. # 空密码,也就是没有密码;
注意:当我们清除一个用户的密码时,登录时就无需密码,这一点要加以注意。
Chage 修改用户密码有效期限的命令
修改帐号和密码的有效期限
补充说明
chage命令 是用来修改帐号和密码的有效期限。
语法
chage [选项] 用户名
选项
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w:用户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:上一次更改的日期。
-i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
实例
可以编辑/etc/login.defs来设定几个参数,以后设置口令默认就按照参数设定为准:
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
当然在/etc/default/useradd可以找到如下2个参数进行设置:
useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
通过修改配置文件,能对之后新建用户起作用,而目前系统已经存在的用户,则直接用chage来配置。
我的服务器root帐户密码策略信息如下:
[root@linuxde ~]# chage -l root
最近一次密码修改时间 : 3月 12, 2013
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期之前警告的天数 :7
我可以通过如下命令修改我的密码过期时间:
[root@linuxde ~]# chage -M 60 root
[root@linuxde ~]# chage -l root
最近一次密码修改时间 : 3月 12, 2013
密码过期时间 : 5月 11, 2013
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :60
在密码过期之前警告的天数 :9
然后通过如下命令设置密码失效时间:
[root@linuxde ~]# chage -I 5 root
[root@linuxde ~]# chage -l root
最近一次密码修改时间 : 3月 12, 2013
密码过期时间 : 5月 11, 2013
密码失效时间 : 5月 16, 2013
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :60
在密码过期之前警告的天数 :9
从上述命令可以看到,在密码过期后5天,密码自动失效,这个用户将无法登陆系统了。
id
打印真实以及有效的用户和所在组的信息
概要
id [OPTION]... [USER]...
主要用途
没有选项时,打印指定用户ID信息。
选项
-a 兼容性选项,没有实际作用。
-Z, --context 只打印进程的安全上下文。
-g, --group 只打印有效的组ID。
-G, --groups 打印全部组ID。
-u, --user 只打印有效的用户ID。
-z, --zero 使用空字符代替默认的空格来分隔条目。
--help 显示帮助信息并退出。
--version 显示版本信息并退出。
只有在使用 -u -g -G 选项中一到多个时,以下选项可以使用:
-n, --name 打印名称而不是数字。
-r, --real 打印真实ID而不是有效ID。
参数
user(可选):可以为一到多个,默认为当前用户。
返回值
返回0表示成功,返回非0值表示失败。
例子
[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
解释:用户root的UID号码 = 0,GID号码 = 0。用户root是下面组的成员:
root组GID号是:0
bin组GID号是:1
daemon组GID号是:2
sys组GID号是:3
adm组GID号是:4
disk组GID号是:6
wheel组GID号是:10
打印用户名、UID 和该用户所属的所有组,要这么做,我们可以使用 -a 选项:
[root@localhost ~]# id -a
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
输出所有不同的组ID ,有效的,真实的和补充的,我们可以使用 -G 选项来实现:
[root@localhost ~]# id -G
0 1 2 3 4 6 10
结果只会显示GID号。你可以和/etc/group文件比较。下面是/etc/group文件的示例内容:
只输出有效的组ID,通过使用 -g 选项来只输出有效组ID:
[root@localhost ~]# id -g
0
输出特定用户信息,我们可以输出特定的用户信息相关的UID和GID。只需要在id命令后跟上用户名:
[root@localhost ~]# id www
uid=500(www) gid=500(www) groups=500(www)
注意
该命令可以显示真实有效的用户ID(UID)和组ID(GID)。UID 是对一个用户的单一身份标识。组ID(GID)则对应多个UID;一些程序可能需要UID/GID来运行。id 使我们更加容易地找出用户的UID以及GID,而不必在 /etc/group 文件中搜寻。
该命令是GNU coreutils包中的命令,相关的帮助信息请查看man -s 1 id,info coreutils 'id invocation'。
finger
用于查找并显示用户信息
补充说明
finger命令 用于查找并显示用户信息。包括本地与远端主机的用户皆可,帐号名称没有大小写的差别。单独执行finger指令,它会显示本地主机现在所有的用户的登陆信息,包括帐号名称,真实姓名,登入终端机,闲置时间,登入时间以及地址和电话。
语法
finger(选项)(参数)
选项
-l:列出该用户的帐号名称,真实姓名,用户专属目录,登入所用的Shell,登入时间,转信地址,电子邮件状态,还有计划文件和方案文件内容;
-m:排除查找用户的真实姓名;
-s:列出该用户的帐号名称,真实姓名,登入终端机,闲置时间,登入时间以及地址和电话;
-p:列出该用户的帐号名称,真实姓名,用户专属目录,登入所用的Shell,登入时间,转信地址,电子邮件状态,但不显示该用户的计划文件和方案文件内容。
不指定finger的选项如果提供操作者的话,缺省设为-l输出风格,否则为-s风格,注意在两种格式中,如果信息不足,都有一些域可能丢失,如果没有指定参数finger会为当前登录的每个用户打印一个条目。
参数
用户名:指定要查询信息的用户。
实例
在计算机上使用finger:
[root@localhost root]# finger
login Name Tty Idle Login time Office Office Phone
root root tty1 2 Dec 18 13
root root pts/0 1 Dec 18 13
root root *pts/1 Dec 18 13
注意:如果没有安装,可以使用 sudo yum install finger -y 针对于老版本
如果要查询远程机上的用户信息,需要在用户名后面接@主机名,采用用户名@主机名的格式,不过要查询的网络主机需要运行finger守护进程的支持。
查询登录主机的用户工具:w 、who、users
Groups 用户所归属的用户组查询
groups
打印指定用户所在组的名称。
概要
groups [OPTION]... [username]...
主要用途
打印指定用户所在组的名称。
选项
--help 显示帮助信息并退出。
--version 显示版本信息并退出。
参数
username(可选):可以是一到多个,不提供时默认为当前用户。
返回值
返回0表示成功,返回非0值表示失败。
例子
显示linux用户所属的组
[root@localhost ~]# groups linux
linux : linux adm dialout cdrom plugdev lpadmin admin sambashare
注意
该命令等价于 id -Gn。
每个用户属于/etc/passwd中指定的一个组和在/etc/group中指定的其他组。
该命令是GNU coreutils包中的命令,相关的帮助信息请查看man -s 1 groups,info coreutils 'groups invocation'。
相关配置文件
/etc/passwd
/etc/shadow
/etc/gshadow
/etc/group
Linux 用户密码策略
在Linux系统中,用户密码策略主要涉及以下几个方面:
-
密码复杂度要求:
- 最小长度:通过修改
/etc/login.defs
文件中的PASS_MIN_LEN
参数设定密码的最小长度。 - 复杂性规则:可以使用PAM模块(如pam_cracklib)来强制执行密码复杂度策略,比如必须包含大写字母、小写字母、数字和特殊字符等。
- 最小长度:通过修改
-
密码过期策略:
- 密码有效期:通过编辑
/etc/login.defs
中的PASS_MAX_DAYS
和PASS_MIN_DAYS
参数设置密码的有效期范围,以及PASS_WARN_AGE
设置提前多少天提醒用户更改密码。 - 密码历史:使用PAM模块如 pam_unix.so 的
remember=N
选项限制用户不能重复使用最近N次的密码。
- 密码有效期:通过编辑
-
错误尝试锁定:
- 登录失败次数:通过配置
/etc/pam.d/system-auth
或其他与认证相关的PAM配置文件,启用pam_tally2
或pam_faillock
模块限制连续错误登录尝试次数,并在达到阈值后锁定账号一段时间。
- 登录失败次数:通过配置
-
自动解锁时间:
- 锁定账户后,可以通过配置相应的PAM模块设置自动解锁时间。
-
密码到期前警告:
- 系统可以根据需要在用户登录时显示密码即将过期的提示信息。
例如,在Red Hat Enterprise Linux (RHEL)系列系统中,可以在/etc/security/pwquality.conf
配置文件中调整密码质量控制,而在Ubuntu系统中,则通常在/etc/pam.d/common-password
等PAM配置文件中添加或修改行以启用密码策略模块。
具体配置命令示例可能包括:
# 在/etc/login.defs设置密码最小长度
echo "PASS_MIN_LEN 8" >> /etc/login.defs
# 使用pam_cracklib加强密码复杂度
sed -i '/password.*required/s/$/ pam_cracklib.so minlen=8 difok=3 retry=3/' /etc/pam.d/system-auth
# 设置密码有效期
echo "PASS_MAX_DAYS 90" >> /etc/login.defs
echo "PASS_MIN_DAYS 7" >> /etc/login.defs
echo "PASS_WARN_AGE 7" >> /etc/login.defs
# 使用pam_tally2限制登录尝试次数
auth required pam_tally2.so deny=5 onerr=fail unlock_time=604800
# 对于RHEL/CentOS 7及更高版本,使用pam_faillock模块进行账户锁定
auth [default=die] pam_faillock.so authfail deny=5 unlock_time=604800 even_deny_root root_unlock_time=300
account required pam_faillock.so
# 配置密码到期警告
chage -m 7 -W 7 username # 为指定用户设置最小和最大密码更改期限以及警告期
ACL权限设置
ACL是access control list 的缩写,主要用于在提供传统的owner、group 、others的read、write、execute权限之外进行细部权限设置。
启动ACL
让/目录支持ACL:
mount -o remount,acl /
Mount |grep / // 查看是否有挂载
开机启动ACL:
将要启动ACL的分区写入/etc/fstab中:
vi /etc/fstab
/dev/sda5 / ext3 default,acl 1 2
ACL相关命令
ACL(Access Control List)是Linux系统中用于设置文件或目录权限的一种机制,可以实现对不同用户或用户组设置不同的访问权限。与传统的UGO(User、Group、Others)权限管理相比,ACL提供了更细粒度的权限控制。
与ACL相关的命令主要有两个:setfacl和getfacl。
setfacl命令:用于设置ACL权限。其基本语法如下:
bash复制代码
setfacl [选项] 文件名
其中,常用的选项包括:
复制代码
* -m
:设置ACL权限。
* -x
:删除指定的ACL权限。
* -b
:删除所有的ACL权限。
* -d
:设置默认ACL权限。
* -k
:删除默认ACL权限。
* -R
:递归设置ACL权限。例如,要给文件file
的用户username
设置读、写、执行权限,可以使用以下命令:
bash复制代码
setfacl -m u:username:rwx file
getfacl命令:用于查看ACL权限。其基本语法如下:
bash复制代码
getfacl 文件名
执行该命令后,将显示指定文件或目录的ACL权限信息。例如,要查看文件file的ACL权限,可以执行以下命令:
bash复制代码
getfacl file
此外,需要注意的是,ACL权限的设置和查看都需要在支持ACL的文件系统上进行。在大多数Linux发行版中,ext4文件系统默认支持ACL。在使用ACL时,还需要注意mask值的作用。mask值用于指定最大有效权限,它决定了用户或用户组实际获得的权限。当用户或用户组被赋予ACL权限时,其实际权限将是ACL权限与mask值进行“与”运算的结果。这有助于防止给用户或用户组赋予过高的权限,提供了权限的双重保证。
su
用于切换当前用户身份到其他用户身份
补充说明
su命令 用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码。
语法
su(选项)(参数)
选项
-c<指令>或--command=<指令>:执行完指定的指令后,即恢复原来的身份;
-f或——fast:适用于csh与tsch,使shell不用去读取启动文件;
-l或——login:改变身份时,也同时变更工作目录,以及HOME,SHELL,USER,logname。此外,也会变更PATH变量;
-m,-p或--preserve-environment:变更身份时,不要变更环境变量;
-s
--help:显示帮助;
--version;显示版本信息。
参数
用户:指定要切换身份的目标用户。
实例
变更帐号为root并在执行ls指令后退出变回原使用者:
su -c ls root
变更帐号为root并传入-f选项给新执行的shell:
su root -f
变更帐号为test并改变工作目录至test的家目录:
su -test
实例二:
由于Ubuntu只能以普通用户登录,登录进去才可以使用su 切换为root
查询用户命令
W
可显示开机多久,当前登录的所有用户,平均负载
Who
显示当前登录的所有用户
Last
显示每个用户最后的登录时间
Lastlog
显示每个用户最后的登录时间