Linux账号管理相关命令

新增和删除用户

我们知道,当登录系统时需要输入帐号与密码,那么创建一个可用的帐号同样的也需要这两个数据。Linux中用useradd 来新建使用者,用passwd创建密码

创建用户:useradd

[root@study ~]# useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM]\ > [-c 说明栏] [-d 主文件夹绝对路径] [-s shell] 使用者帐号名 
选项与参数 含义
-u 指定账号特定的 UID
-g 指定用户的GID
-G 后面接的群组名称则是这个帐号还可以加入的群组。会修改 /etc/group 内的相关数据
-M 强制,不要创建使用者主文件夹。(系统帐号默认值)
-m 强制,要创建使用者主文件夹。(一般帐号默认值)
-d 指定用户的家目录,而不要使用默认值。务必使用绝对路径
-r 创建一个系统帐号
-s 后面接一个shell。没有指定则默认是 /bin/bash
-e 后面接一个日期,格式为“YYYY-MM-DD”此项目可写入 shadow 第八字段,帐号失效日期的设置项目
-f 后面接 shadow 的第七字段项目,指定密码是否会失效。0为立刻失效, -1 为永远不失效(密码只会过期而强制于登录时重新设置而已。)

不知道/etc/shadow内容结构的可以看下用户和用户组-UID和GID,里面有对/etc/shadow结构的详细介绍

范例1:参考默认值创建一个使用者 vbird1

[root@study ~]# useradd vbird1 

创建的过程看似只是新增了一个用户,其实对于系统来说,完成这个命令在后台执行很多对用户来说毫无感知的行为

  1. 首先,系统需要将用户信息记录在 /etc/passwd 和 /etc/shadow 末尾追加一条记录,同时分配给用户一个UID。
  2. 然后在/home下给用户自动创建一个目录名和用户名一样的家目录。比如上面的例子中,创建的目录将是/home/vbird1
[root@study ~]# ll -d
/home/vbird1 drwx------. 3 vbird1 vbird1 74 Jul 20 21:50 /home/vbird1 
# 默认会创建使用者主文件夹,且权限为700。 
  1. 接着,复制/etc/ske(含创建用户时默认配置的文件)下所有的文件至/home/vbird1。用ls -al可查看全部文件(包括隐藏文件)
  2. 最后新建一个与该用户名一样的用户组。即在创建了用户vbird1的时候,也创建了一个vbird1的用户组,用户vbird1默认属于用户组vbird1
[root@study ~]# grep vbird1 /etc/passwd /etc/shadow /etc/group 
/etc/passwd:vbird1:x:1003:1004::/home/vbird1:/bin/bash
/etc/shadow:vbird1:!!:16636:0:99999:7::: 
/etc/group:vbird1:x:1004: 

范例2:假设我已知道我的系统当中有个群组名称为 users ,且UID1500 并不存在,请用 users 为初始群组,以及 uid 为 1500 来创建一个名为 vbird2 的帐号

[root@study ~]# useradd -u 1500 -g users vbird2
[root@study ~]# ll -d /home/vbird2
drwx------. 4 vbird2 users 4096 Feb 25 09:59 /home/vbird2
[root@study ~]# grep vbird2 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird2:x:1500:100::/home/vbird2:/bin/bash
/etc/shadow:vbird2:!!:14300:0:99999:7:::

看一下,UID 与 initial group 确实改变成我们需要的了。

范例3:创建一个系统帐号,名称为 vbird3

[root@study ~]# useradd -r vbird3
[root@study ~]# ll -d /home/vbird3
ls: cannot access /home/vbird3: No such file or directorya 

可以看到,不会主动创建主文件夹

[root@study ~]# grep vbird3 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird3:x:100:103::/home/vbird3:/bin/bash
/etc/shadow:vbird3:!!:14300::::::
/etc/group:vbird3:x:103:

系统账号默认不会主动建立家目录。

其实 useradd 的默认值可以使用下面的方法调用出来:

[root@study ~]# useradd -D
GROUP=100   <-- 默认的群组
HOME=/home <-- 默认的主文件夹所在目录
INACTIVE=-1 <-- 密码失效日,在shadow 内的第7栏
EXPIRE=  <-- 帐号失效日,在shadow 内的第8栏
SHELL=/bin/bash <-- 默认的 shell
SKEL=/etc/skel <-- 使用者主文件夹的内容数据参考目录
CREATE_MAIL_SPOOL=yes <-- 是否主动帮使用者创建邮件信箱(mailbox)

说明:

  • INACTIVE=-1:如果是 0 代表密码过期立刻失效, 如果是 -1 则是代表密码永远不会失效,如果是数字,如 30 ,则代表过期 30 天后才失效

修改密码:passwd

选项与参数 含义
–stdin 可以通过来自前一个管线的数据,作为密码输入,对 shell script 有帮助
-l 是 Lock 的意思,会将 /etc/shadow 第二栏最前面加上,使密码失效
-u 与 -l 相对,是 Unlock 的意思
-S 列出密码相关参数,亦即 shadow 文件内的大部分信息
-n 后面接天数,设置多久不可修改密码天数,shadow 的第 4 字段
-x 后面接天数,设置多久内必须要更动密码,shadow 的第 5 字段
-w 后面接天数,设置密码过期前的警告天数,shadow 的第 6 字段
-i 后面接“日期”,设置密码失效日期,shadow 的第 7 字段

如果不知道/etc/shadow内容结构的可以看下用户和用户组-UID和GID,里面有对/etc/shadow内容的详细介绍

范例1: 以root身份给 vbird2设置密码

[root@study ~]# passwd vbird2
Changing password for user vbird2.
New UNIX password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new UNIX password: 
passwd: all authentication tokens updated successfully. 

创建用户后实际上该用户还没有登录系统的权限,因为在不设置密码的情况下,在/etc/shadow中该用户记录中以冒号分割的第二列将显示为两个感叹号“!!”,这说明不允许该用户登录系统。因此需要同时设置密码。

普通用户也可以使用passwd来修改自己的密码,但是需要提供当前用户的密码(旧密码),并且密码不能太多简单,因为系统会拒绝普通用户设置过于简单的密码;并且用户在运行这个命令式,后面不能跟参数,哪怕是自己用户名都不行。

范例2:用 vbird2 登陆后,修改 vbird2 自己的密码

[vbird2@study ~]$ passwd

范例3:使用 standard input 创建用户的密码

[root@study ~]# echo "abc543CC" | passwd --stdin vbird2
Changing password for user vbird2.
passwd: all authentication tokens updated successfully

如果想要让 vbird2 的密码具有相当的规则,比如说让 vbird2 每 60 天需要变更密码, 密码过期后 10 天未使用就宣告帐号失效,那该如何处理?

范例4:管理 vbird2 的密码使具有 60 天变更、密码过期 10 天后帐号失效的设置

先查看vbirds2的密码信息

[root@study ~]# passwd -S vbird2
vbird2 PS 2015-07-20 0 99999 7 -1 (Password set, SHA512 crypt.#上面说明,密码创建时间:(2015-07-20);0:最小天数;99999:变更天数;7:警告日数;-1:密码不会失效

[root@study ~]# passwd -x 60 -i 10 vbird2
[root@study ~]# passwd -S vbird2
vbird2 PS 2015-07-20 0 60 7 10 (Password set, SHA512 crypt.

范例5:让 vbird2 的帐号失效,观察完毕后再让她失效

[root@study ~]# passwd -l vbird2
[root@study ~]# passwd -S vbird2
vbird2 LK 2015-07-20 0 60 7 10 (Password locked.

可以看到vbird2账号得状态变成“ LK, Lock ”了,无法登陆了。

[root@study ~]# grep vbird2 /etc/shadow
vbird2:!!$6$iWWO6T46$uYStdkB7QjcUpJaCLB.OOp...:16636:0:60:7:10::

密码字段加上了 !! 。

[root@study ~]# passwd -u vbird2
[root@study ~]# grep vbird2 /etc/shadow
vbird2:$6$iWWO6T46$uYStdkB7QjcUpJaCLB.OOp...:16636:0:60:7:10::

密码字段恢复正常

查阅密码参数:chage

除了使用 passwd -S 之外,还可以用chage显示更详细的密码参数显示功能。
语法:

[root@study ~]# chage [-ldEImMW] 帐号名
选项与参数 含义
-l 列出该帐号的详细密码参数;
-d 后面接日期,修改 shadow 第三字段(最近一次更改密码的日期),格式 YYYY-MM-DD
-E 后面接日期,修改 shadow 第八字段(帐号失效日),格式 YYYY-MM-DD
-I 后面接天数,修改 shadow 第七字段(密码失效日期)
-m 后面接天数,修改 shadow 第四字段(密码最短保留天数)
-M 后面接天数,修改 shadow 第五字段(密码多久需要进行变更)
-W 后面接天数,修改 shadow 第六字段(密码过期前警告日期)

范例1:列出 vbird2 的详细密码参数

[root@study ~]# chage -l vbird2
Last password change : Jul 20, 2015
Password expires : Sep 18, 2015
Password inactive : Sep 28, 2015
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 60
Number of days of warning before password expires : 7

范例2:创建一个名为 agetest 的帐号,该帐号第一次登陆后使用默认密码,但必须要更改过密码后,使用新密码才能够登陆系统使用 bash 环境

[root@study ~]# useradd agetest
[root@study ~]# echo "agetest" | passwd --stdin agetest
[root@study ~]# chage -d 0 agetest
[root@study ~]# chage -l agetest | head -n 3
Last password change : password must be changed
Password expires : password must be changed
Password inactive : password must be changed

此时此帐号的密码创建时间会被改为 1970/1/1 ,所以会有问题。

尝试以 agetest 登录,账号被强制必须要改密码

You are required to change your password immediately (root enforced)
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user agetest.
Changing password for agetest
(current) UNIX password: <==这个帐号被强制要求必须要改密

修改用户:usermod

语法:

[root@study ~]# usermod [-cdegGlsuLU] username
选项与参数 含义
-c 后面接帐号的说明,即 /etc/passwd 第五栏的说明栏,可以加入一些帐号的说明
-d 后面接帐号的主文件夹,即修改 /etc/passwd 的第6字段
-e 后面接日期,格式是 YYYY-MM-DD,账号失效日期,/etc/shadow 的第8个字段
-f 后面接天数,为密码失效宽限天数,/etc/shadow的第7字段
-g 后面接初始群组,修改GID ,/etc/passwd 的第4个字段
-G 后面接次要群组,修改这个使用者能够支持的群组,修改的是 /etc/group
-a 与 -G 合用,可“增加次要群组的支持”而非“设置”
-l 后面接帐号名称。修改帐号名称, /etc/passwd 的第1字段
-s 后面接 Shell 的实际文件,例如 /bin/bash 或 /bin/csh 等等
-u 后面接 UID 数字啦!即 /etc/passwd 第3个字段
-L 暂时将使用者的密码冻结,让他无法登陆。其实仅改 /etc/shadow 的密码栏
-U 解冻账号,拿掉/etc/shadow 密码栏的“!!”

仔细的比对,会发现 usermod 的选项与 useradd 非常类似, 这是因为usermod 也是用来微调 useradd 增加的使用者参数,不过 usermod 还是有新增的选项, 那就是 -L-U,不过这两个选项其实与 passwd 的 -l, -u 是相同的。

范例1:修改使用者 vbird2 的说明栏,加上“VBird’s test”的说明。

[root@study ~]# usermod -c "VBird's test" vbird2
[root@study ~]# grep vbird2 /etc/passwd
vbird2:x:1500:100:VBird's test:/home/vbird2:/bin/bash

范例2:使用者 vbird2 这个帐号在 2015/12/31 失效。

[root@study ~]# usermod -e "2015-12-31" vbird2
[root@study ~]# chage -l vbird2 | grep 'Account expires'
Account expires : Dec 31, 2015

由于系统账号默认是没有家目录的,所以前面我们创建的系统账号 vbird3默认也是没有家目录

范例3:为vbird3创建家目录

[root@study ~]# ll -d ~vbird3
ls: cannot access /home/vbird3: No such file or directory <==确认一下,确实没有主文件夹的存在。
[root@study ~]# cp -a /etc/skel /home/vbird3
[root@study ~]# chown -R vbird3:vbird3 /home/vbird3
[root@study ~]# chmod 700 /home/vbird3
[root@study ~]# ll -a ~vbird3
drwx------. 3 vbird3 vbird3 74 May 4 17:51 . <==使用者主文件夹权限
drwxr-xr-x. 10 root root 4096 Jul 20 22:51 ..
-rw-r--r--. 1 vbird3 vbird3 18 Mar 6 06:06 .bash_logout
-rw-r--r--. 1 vbird3 vbird3 193 Mar 6 06:06 .bash_profile
-rw-r--r--. 1 vbird3 vbird3 231 Mar 6 06:06 .bashrc
drwxr-xr-x. 4 vbird3 vbird3 37 May 4 17:51 .mozilla

使用 chown -R 是为了连同主文件夹下面的使用者/群组属性都一起变更的意思;
使用 chmod 没有 -R,是因为我们仅要修改目录的权限而非内部文件的权限。

删除用户:userdel

[root@study ~]# userdel [-r] username

选项与参数:

  • -r :连同使用者的主文件夹也一起删除

范例1:删除 vbird2 ,连同主文件夹一起删除

root@study ~]# userdel -r vbird2

新增和删除用户组

群组的内容都与这两个文件有关:/etc/group, /etc/gshadow。

增加用户组:groupadd

[root@study ~]# groupadd [-g gid] [-r] 群组名称 
选项与参数 含义
-g 后面接某个特定的 GID,用来直接给予某个 GID
-r 创建系统群组,与 /etc/login.defs 内的 GID_MIN 有关。

范例1:新建一个群组,名称为 group1

[root@study ~]# groupadd group1 
[root@study ~]# grep group1 /etc/group /etc/gshadow 
/etc/group:group1:x:1503: 
/etc/gshadow:group1:!:: 

群组的 GID 也是会由 1000 以上最大 GID+1 来决定。

修改群组:groupmod

选项与参数 含义
-g 修改既有的 GID 数字
-n 修改既有的群组名称

范例1:将刚刚上个指令创建的 group1 名称改为 mygroup , GID为201

 [root@study ~]# groupmod -g 201 -n mygroup group1 
 [root@study ~]# grep mygroup /etc/group /etc/gshadow 
 /etc/group:mygroup:x:201: 
 /etc/gshadow:mygroup:!::

删除用户组:groupdel

[root@study ~]# groupdel [groupname] 

范例1:将刚刚的 mygroup 删除

[root@study ~]# groupdel mygroup 

如果有已有用户属于我们想要删除的组,该操作会失败。如范例2

范例2:删除 vbird1 这个群组

[root@study ~]# groupdel vbird1 
groupdel: cannot remove the primary group of user 'vbird1'

如果要删除,可以采用一下1种方法
1、修改 vbird1 的 GID;
2、删除 vbird1 这个使用者。

检查用户信息

查看用户:users、who、w

使用命令users可以查看当前系统有哪些用户。如在当前系统中运行users,就会发现有两个root在当前机器上登录。实际上,Linux会把所有来自不同终端的活动定义为一个会话users命令只能查看当前系统登录用户。要查看更多信息可以通过whow 来查询。

[root@study ~]# users
root root

[root@study ~]# who 
dmtsai tty2 2015-07-07 23:07 
dmtsai pts/0 2015-07-22 00:18 (192.168.1.100)

who命令显示的结果有3列,分别代表登录用户名、用户登录的终端、用户登录的时间。
如果用户从远程网络登录,则显示远程主机名或IP地址。

[root@study ~]# w 
01:49:18 up 25 days, 3:34, 3 users, load average: 0.00, 0.01, 0.05 
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT 
dmtsai tty2 07Jul15 12days 0.03s 0.03s -bash 
dmtsai pts/0 172.16.200.254 00:18 6.00s 0.31s 0.11s sshd: dmtsai [priv] 
  • 第一行显示当前时间、系统运行时间,已登录的用户数量和系统负载。
  • 第二行是各个项目的说明
    • 第一列:登录用户的用户名
    • 第二列:用户登录的终端
    • 第三列:如果用户从网络登录,则显示远程主机名或IP地址
    • 第四列:用户登录时间
    • 第五列:用户闲置时间
    • 第六列:与终端相关的当前所有运行进程消耗的CPU时间总量
    • 第七列:当前WHAT列所对应的进程所消耗的CPU时间总量
    • 第八列:用户当前运行的进程
  • 第三行以后,每行代表一个使用者。如上所示,dmtsai 从终端名为 tty2登录。

调查用户:finger

Linux系统默认未安装finger,先使用yum -y install finger完成安装

选项与参数 含义
-s 仅列出使用者的帐号、全名、终端机代号与登录时间等
-m 列出与后面接的帐号相同者,而不是利用部分比对 (包括全名部分)

范例1:观察 vbird1 的使用者相关帐号属性

[root@study ~]# finger vbird1 
 Login: vbird1  			Name: 
 Directory: /home/vbird1 	Shell: /bin/bash 
 Never logged in. 
 No mail.
 No Plan.

finger会将使用者的相关属性列出来。其实列出来的几乎都是 /etc/passwd 文件里面的信息。列出的信息说明如下:

  • Login:为使用者帐号,亦即 /etc/passwd 内的第一字段;
  • Name:为全名,亦即 /etc/passwd 内的第五字段(或称为注解);
  • Directory:就是主文件夹了;
  • Shell:就是使用的 Shell 文件所在;
  • Never logged in.:figner 还会调查使用者登陆主机的情况喔!
  • No mail.:调查 /var/spool/mail 当中的信箱数据;
  • No Plan.:调查 ~vbird1/.plan 文件,并将该文件取出来说明

范例2:找出目前在系统上面登录的使用者与登录时间

[vbird1@study ~]$ finger 
Login Name Tty Idle Login Time Office Office Phone Host 
dmtsai dmtsai tty2 11d Jul 7 23:07 
dmtsai dmtsai pts/0 Jul 20 17:59

《鸟哥Linux私房菜-基础版》.pdf
《Linux系统命令及Shell脚本实践指南》.pdf

猜你喜欢

转载自blog.csdn.net/weixin_41948075/article/details/123579734