3 Linux用户实战
3.1 查询用户
3.1.1 用户信息查询
执行 :
[root@localhost ~]# cat /etc/passwd
是的,没有错,不要怀疑,这个就是查看用户信息的文件 叫 passwd
内容如下
内容说明 :
/etc/passwd中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
用户名:
是代表用户账号的字符串。通常长度不超过8个字符,并且由大小写字母和/或数字组成。
口令:
一些系统中,存放着加密后的用户口令字。虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux系统都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”。
用户标识号:UID
用户标识号(User ID),是一个整数,系统内部用它来标识用户。
0是系统管理员账号,1-999是系统保留账号,1000+即一般账号。useradd 命名默认生成UID=1000。
组标识号:GID
GID:用户组标识号(Group ID),是一个整数,系统内部用它来标识用户组。
注释性描述:
字段记录着用户的一些个人情况,例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。
主目录:
也就是用户的起始工作目录,它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。
登录Shell:
用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。Shell是用户与Linux系统之间的接口。
3.1.2 用户密码查询
[root@localhost ~]# cat /etc/shadow
用户(user)影子口令文件,存放账户密码相关信息。该文件的权限必须设置为:400 或者600,即:Linux /etc/shadow文件是只有系统管理员才有权利进行查看和修改的文件。
每行内容按:分隔。
登录名:加密口令:后一次修改时间:小时间间隔:大时间间隔:警告时间:不活动时间:失效时间:标志
登录名:
是与/etc/passwd文件中的登录名相一致的用户账号
口令:
存放的是加密后的用户口令字,如果为空,则对应用户没有口令,登录时不需要口令;
星号代表帐号被锁定;
双叹号表示这个密码已经过期了。
$6$开头的,表明是用SHA-512加密的,
$1$ 表明是用MD5加密的
$2$ 是用Blowfish加密的
$5$ 是用 SHA-256加密的。
后一次修改时间:
表示的是从某个时刻起,到用户后一次修改口令时的天数。时间起点对不同的系统可能不一样。
小时间间隔:
指的是两次修改口令之间所需的小天数。
大时间间隔:
指的是口令保持有效的大天数。
警告时间:
字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。
不活动时间:
表示的是用户没有登录活动但账号仍能保持有效的大天数。
失效时间:
字段给出的是一个的天数(1970年到现在的天数),如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。
3.2 创建用户
useradd
命令格式:
useradd [选项] 使用者账号名
命令功能:
用来建立用户帐号和创建用户的起始目录,使用权限是超级用户。
选项和参数:
-u UID: 直接指定一个特定的 UID 给这个账号;
-g 初始群组名:该群组的 GID 会被放置到 /etc/passwd 的第四个字段内。
-G 附加群组名:后面接的组名则是这个账号还可以加入的附加群组。这个选项与参数会修改 /etc/group 内的相关资料。
-M :强制!不要建立用户家目录!(系统账号默认值)
-m :强制!要建立用户家目录!(一般账号默认值)
-c 描述性字符串:注释性描述,这个就是 /etc/passwd 的第五栏的说明内容
-d 目录:指定某个目录成为家目录,而不要使用默认值。务必使用路径!一般情况下linux除了执行shell脚本之外 很少使用相对路径
-r :建立一个系统的账号,系统账号不建立家目录;
-s shell:后面接一个 shell ,若没有指定则预设是 /bin/bash
*实例*
1)创建一个普通的账号(用户名 user1 用户描述 这个一个普通账户)
[root@localhost ~]# useradd -c 这是一个普通的账户 user1
[root@localhost ~]# cat /etc/passwd | grep user1
user1:x:1000:1005:这是一个普通的账户:/home/user1:/bin/bash
此处我们需要关心的问题是 ,普通账户的UID起始是1000,那UID后面的 1005 的 GID是哪个组呢?我们查询一下
[root@localhost ~]# cat /etc/group | grep 1005
user1:x:1005:
通过观察我们发现创建普通用户的时候还会创建一个按用户名命名的组,并且把该用户添加到了这个同名的组里面
如果是这样的话,我们想在创建用户的时候指定组该怎么办呢?此时可以用 -G 和 -g 参数
2)创建一个账户归属 GID=1000 的用户组
[root@localhost ~]# useradd -g 1000 user2
[root@localhost ~]# useradd -g group1 user3
[root@localhost ~]# cat /etc/passwd | grep user*
user1:x:1000:1005:这是一个普通的账户:/home/user1:/bin/bash
user2:x:1001:1000::/home/user2:/bin/bash
user3:x:1002:1000::/home/user3:/bin/bash
上面的代码我们可以用-g 来初始化用户的组 -g 后面加需要归属的 组的 ID 和 名称 都可以
那么既然已经设置了基础组还会创建用户同名组么?
[root@localhost ~]# cat /etc/group | grep user*
users:x:100:
user1:x:1005:
*3)创建一个账户归属自己同名组并归属 GID为1000的组*
[root@localhost ~]# useradd -G 1000 user4
[root@localhost ~]# useradd -G group1 user5
[root@localhost ~]# cat /etc/passwd | grep user*
user1:x:1000:1005:这是一个普通的账户:/home/user1:/bin/bash
user2:x:1001:1000::/home/user2:/bin/bash
user3:x:1002:1000::/home/user3:/bin/bash
user4:x:1003:1006::/home/user4:/bin/bash
user5:x:1004:1007::/home/user5:/bin/bash
通过观察我们可以发现上面的user4 和 user5 有两个不同的GID为 1006 和 1007
那么它归属 GID=1000的组了么?我们查查看
[root@localhost ~]# cat /etc/group | grep -E '1000|1006|1007'
group1:x:1000:user4,user5
user4:x:1006:
user5:x:1007:
通过观察我们发现 group1 GID=1000 这个组里添加了user4和user5两个用户
并且系统也帮助我们创建了以user4和user5命名的组
这个就是附加! -G
*4)创建一个系统账户*
[root@nn1 ~]# useradd -r sysuser1
[root@localhost ~]# cat /etc/passwd | grep sysuser1
sysuser1:x:997:995::/home/sysuser1:/bin/bash
此处我们可以发现 UID是 997(1000以下) GID 995
[root@localhost ~]# cat /etc/group | grep 995
sysuser1:x:995:
*5)创建一个不能使用shell 并且要设置用户的家目录到其他位置*
[root@localhost ~]# useradd -s /sbin/nologin -d /userhome/user1 -c 一个特殊的普通用户 nologinuser1
useradd:无法创建目录 /userhome/user1
[root@localhost ~]# mkdir -p /userhome/user1 创建这个目录
[root@localhost ~]# useradd -s /sbin/nologin -d /userhome/user1 -c 一个特殊的普通用户 nologinuser1
useradd:用户“nologinuser1”已存在
[root@localhost ~]# useradd -s /sbin/nologin -d /userhome/user1 -c 一个特殊的普通用户 nologinuser2
useradd:警告:此主目录已经存在。
不从 skel 目录里向其中复制任何文件。
[root@localhost ~]# useradd -s /sbin/nologin -d /userhome/user3 -c 一个特殊的普通用户 nologinuser3
[root@localhost ~]# ll /userhome/
总用量 0
drwxr-xr-x. 2 root root 6 5月 30 16:47 user1
drwx------. 2 nologinuser3 nologinuser3 62 5月 30 16:47 user3
[root@localhost ~]# cat /etc/passwd | grep nologinuser*
nologinuser1:x:1005:1008:一个特殊的普通用户:/userhome/user1:/sbin/nologin
nologinuser2:x:1006:1009:一个特殊的普通用户:/userhome/user1:/sbin/nologin
nologinuser3:x:1007:1010:一个特殊的普通用户:/userhome/user3:/sbin/nologin
此处需要注意 : 用户的默认家目录在 /home/用户名 这个目录里
举个例子 : 我创建了一个user 叫user1
那么这个用户的家目录 对应应该就是 /home/user1
那么问题来了 --> 什么是家目录呢?
家目录 和 windows中用户的我的文档类似 用户登陆成功进入的个目录就是自己得家目录;
家目录对于用户来说 用户具有大的管理权限 所以家目录对于用户来说 是 700 权限的;
那啥是700权限呢? 不着急我们一会再说,此处我们主要还是针对用户操作;
3.3 修改用户
usermod
命令格式:
usermod [选项] 使用者账号名
命令功能:
usermod命令用于修改用户的基本信息。usermod命令不允许你改变正在线上的使用者帐号名称。
选项和参数:
-c 备注:修改用户帐号的备注文字;
-d 家目录:修改用户登入时的主目录,前提:已存在要修改的家目录;
-g 初始群组:修改用户所属的群组;
-G 附加群组;修改用户所属的附加群组;
-h:显示帮助信息;
-l 帐号名称 :修改用户帐号名称;
-s shell:修改用户登入后所使用的shell;
-u UID:修改用户ID;
实例:
*1)将现有用户添加到现有组中*
[root@localhost ~]# cat /etc/passwd | grep user1
user1:x:1000:1005:这是一个普通的账户:/home/user1:/bin/bash
sysuser1:x:997:995::/home/sysuser1:/bin/bash
nologinuser1:x:1005:1008:一个特殊的普通用户:/userhome/user1:/sbin/nologin
nologinuser2:x:1006:1009:一个特殊的普通用户:/userhome/user1:/sbin/nologin
[root@localhost ~]# cat /etc/group | grep 1005
user1:x:1005:
[root@localhost ~]# usermod -g group1 user1
[root@localhost ~]# cat /etc/passwd | grep user1
user1:x:1000:1000:这是一个普通的账户:/home/user1:/bin/bash
sysuser1:x:997:995::/home/sysuser1:/bin/bash
nologinuser1:x:1005:1008:一个特殊的普通用户:/userhome/user1:/sbin/nologin
nologinuser2:x:1006:1009:一个特殊的普通用户:/userhome/user1:/sbin/nologin
上面的操作可以观察到之前user1的GID 是1005 修改了之后变成了 1000
*2)修改用户名*
[root@localhost ~]# usermod -l userop1 -c 'web管理员' user1
[root@localhost ~]# cat /etc/passwd | grep user*
user2:x:1001:1000::/home/user2:/bin/bash
user3:x:1002:1000::/home/user3:/bin/bash
user4:x:1003:1006::/home/user4:/bin/bash
user5:x:1004:1007::/home/user5:/bin/bash
sysuser1:x:997:995::/home/sysuser1:/bin/bash
nologinuser1:x:1005:1008:一个特殊的普通用户:/userhome/user1:/sbin/nologin
nologinuser2:x:1006:1009:一个特殊的普通用户:/userhome/user1:/sbin/nologin
nologinuser3:x:1007:1010:一个特殊的普通用户:/userhome/user3:/sbin/nologin
userop1:x:1000:1000:web管理员:/home/user1:/bin/bash
**修改了用户名 顺便也修改了备注信息****
**3)修改用户的家目录位置** **
[root@localhost ~]# cat /etc/passwd | grep userop1
userop1:x:1000:1000:web管理员:/home/user1:/bin/bash
[root@localhost ~]# usermod -d /userhome/user4 userop1
[root@localhost ~]# cat /etc/passwd | grep userop1
userop1:x:1000:1000:web管理员:/userhome/user4:/bin/bash
修改完用户名及家目录之后,不能正常的登录,需要拷贝正常家目录下的三个文件,命令如下:
cp ./.bash* /home/新用户的家目录
3.4 删除用户
userdel命令格式:
userdel [选项] 使用者账号名
命令功能:
userdel删除一个用户账号和相关的文件。 userdel命令修改系统账号文件/etc/passwd,删除所有条目有关用户登录名。该用户名必须存在。
选项和参数:
-f,--force 该选项强制删除用户账号,即使该用户仍在登录。
-r, --remove 在用户家目录里面的文件将被删除并且家目录本身和用户的邮件池也会被删除。文件位于其他文件系统的必须手动搜索和删除。
建议不要用 -r 直接删除,用普通删除,家目录先保留一段时间,然后在手动删除,以免家目录内的文件找不回来。实例:删除指定的用户
[root@localhost ~]# cat /etc/passwd | grep user
user2:x:1001:1000::/home/user2:/bin/bash
user3:x:1002:1000::/home/user3:/bin/bash
user4:x:1003:1006::/home/user4:/bin/bash
user5:x:1004:1007::/home/user5:/bin/bash
sysuser1:x:997:995::/home/sysuser1:/bin/bash
nologinuser1:x:1005:1008:一个特殊的普通用户:/userhome/user1:/sbin/nologin
nologinuser2:x:1006:1009:一个特殊的普通用户:/userhome/user1:/sbin/nologin
nologinuser3:x:1007:1010:一个特殊的普通用户:/userhome/user3:/sbin/nologin
userop1:x:1000:1000:web管理员:/userhome/user4:/bin/bash
[root@localhost ~]# userdel userop1
userdel: user userop1 is currently used by process 9251
上面提示userop1 正在使用不能删除;那么要是就想删呢?
[root@localhost ~]# userdel -rf userop1
userdel: user userop1 is currently used by process 9251
userdel:未找到 userop1 的主目录“/userhome/user4”
[root@localhost ~]# cat /etc/passwd | grep user
user2:x:1001:1000::/home/user2:/bin/bash
user3:x:1002:1000::/home/user3:/bin/bash
user4:x:1003:1006::/home/user4:/bin/bash
user5:x:1004:1007::/home/user5:/bin/bash
sysuser1:x:997:995::/home/sysuser1:/bin/bash
nologinuser1:x:1005:1008:一个特殊的普通用户:/userhome/user1:/sbin/nologin
nologinuser2:x:1006:1009:一个特殊的普通用户:/userhome/user1:/sbin/nologin
nologinuser3:x:1007:1010:一个特殊的普通用户:/userhome/user3:/sbin/nologin
强制删除了userop1注意 : linux没有回退功能,所以删除了就是删除了,就再也找不回来了!
3.5 修改用户的登录密码
passwd
命令格式:
passwd [选项] [使用者账号名]
命令功能:
passwd命令用于设置用户的认证信息,包括用户密码、密码过期时间等。系统管理者则能用它管理系统用户的密码。只有管理者可以指定用户名称,一般用户只能变更自己的密码。
root用户可以设置及修改其他用户的密码,普通修改自己的密码。
选项:
-d:删除密码,仅有系统管理者才能使用;
-f :强制执行;
实例:
因为useradd的用户并没密码可以通过此命令进行设置
1) 修改管理员密码
[root@localhost ~]# passwd
更改用户 root 的密码 。
新的 密码:
的密码: 密码是一个回文
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
passwd 如果不带参数就是修改当前用户的,所以root身份登录修改的也是root的密码,此处需要注意当你在输入密码的时候是不会显示密码的
2) 修改其他用户密码
[root@localhost ~]# passwd userop1
更改用户 userop1 的密码 。
新的 密码:
的密码: 密码是一个回文
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# passwd -f userop1
更改用户 userop1 的密码 。
新的 密码:
的密码: 密码是一个回文
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
切换验证
[root@localhost ~]# su - userop1
su: 警告:无法更改到 /userhome/user4 目录: 没有那个文件或目录
-bash-4.2$ ll
ls: 无法打开目录.: 权限不够
-bash-4.2$ cd /
-bash-4.2$ ll
总用量 16
lrwxrwxrwx. 1 root root 7 5月 30 12:25 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 5月 30 12:28 boot
drwxr-xr-x. 20 root root 3220 5月 30 12:29 dev
drwxr-xr-x. 74 root root 8192 5月 30 17:14 etc
drwxr-xr-x. 7 root root 71 5月 30 16:36 home
lrwxrwxrwx. 1 root root 7 5月 30 12:25 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 5月 30 12:25 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 4月 11 2018 media
drwxr-xr-x. 2 root root 6 4月 11 2018 mnt
drwxr-xr-x. 2 root root 6 4月 11 2018 opt
dr-xr-xr-x. 112 root root 0 5月 30 12:29 proc
dr-xr-x---. 2 root root 114 5月 30 12:28 root
drwxr-xr-x. 23 root root 720 5月 30 12:29 run
lrwxrwxrwx. 1 root root 8 5月 30 12:25 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 4月 11 2018 srv
dr-xr-xr-x. 13 root root 0 5月 30 12:29 sys
drwxrwxrwt. 8 root root 211 5月 30 14:05 tmp
drwxr-xr-x. 4 root root 32 5月 30 16:47 userhome
drwxr-xr-x. 13 root root 155 5月 30 12:25 usr
drwxr-xr-x. 19 root root 267 5月 30 12:29 var
-bash-4.2$ su - root
密码:
上一次登录:四 5月 30 12:31:03 CST 2019从 192.168.92.1pts/0 上
用户自己改密码
-bash-4.2$ passwd
更改用户 userop1 的密码 。
为 userop1 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
抱歉,密码不匹配。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
用户自己修改密码的时候必须遵守密码修改原则
\1. 先输入当前密码验证
\2. 新密码要求由数字和字母组成长度要大于8位
\3. 密码中要包含大小写字母
所以自己修改密码的时候还是要花费一定经历的
3.6 查看用户信息
id
命令格式:
id [选项][用户名称]
命令功能:
id命令可以显示真实有效的用户ID(UID)和组ID(GID)。UID 是对一个用户的单一身份标识。组ID(GID)则对应多个UID。
id命令已经默认预装在大多数Linux系统中。要使用它,只需要在你的控制台输入id。不带选项输入id会显示如下。结果会使用活跃用户。
选项:
-g 显示用户所属群组的ID。
-G 显示用户所属,附加群组的ID。
--help 显示帮助。
实例:
1)查看当前信息
[user4@localhost ~]$ id
uid=1003(user4) gid=1006(user4) 组=1006(user4),1000(group1) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
2) 查看其他用户
[root@localhost ~]# id user2
uid=1001(user2) gid=1000(group1) 组=1000(group1),1003(group3)
[root@localhost ~]# id -g user2
1000
[root@localhost ~]# id -G user2
1000 1003
3.7 用户切换
su
命令格式:
su [-] [要切换的用户名称]
命令功能:
su命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码。
选项:
- :切换用户后,环境变量也切换成用户的环境变量;
不加- :切换用户,不切换环境变量
实例:
1)切换到目标用户
su - 会随着用户的切换环境变量
su 不会随着用户的切换环境变量
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# su - user4
上一次登录:四 5月 30 17:33:47 CST 2019pts/0 上
[user4@localhost ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user4/.local/bin:/home/user4/bin
[user4@localhost ~]$ su root
密码:
[root@localhost user4]# echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user4/.local/bin:/home/user4/bin
[root@localhost user4]# su - root
上一次登录:四 5月 30 17:49:57 CST 2019pts/0 上
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin