Linux常用命令--用户管理

摘要

  • 文本介绍linux中用户的维护及其相关命令

  • 本文基于CentOS8(x86_64)

一.配置文件说明

  • 1./etc/passwd :用户信息文件
    vipw :编辑/etc/passwd文件
    pwck :检查/etc/passwd内容是否有效,比如宿主目录是否存在等等

1
2
3
4
5
6
7
8
9
10
11
12
13
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

格式:用户名:密码位:UID:GID:注释:宿主目录:shell

UID说明:
root: UID=0
伪用户: UID 1-499,比如ftp,sshd,mail,shutdown等等
普通用户: UID 500-60000,新增用户

shell说明:
/bin/bash :登录后默认的shell
/sbin/nologin :该用户禁止登录
  • 2./etc/shadow :密码文件

1
2
3
4
5
6
7
8
9
10
11
12
13
root:!!:18755:0:99999:7:::
bin:*:18394:0:99999:7:::
nginx:$6$VJ6lIEAtIoLpbMmA$GSIZfx5Ous2ih/KHjZTuTT7hSk6PBd/3c/nanwtXh5BKFOtEQdRvp6hS2usZ.rle.InjoKW0tp6UNQrhRscUG/:19468:0:99999:7:::

格式:用户名:密码:最后一次修改密码的天数:两次修改密码的最小天数间隔:密码保持有效的最多天数:密码失效前提前警告的天数:账号闲置时间:密码已经失效的天数:标志(一般不用)

密码说明:
!! :该用户不能通过密码登录
* :禁止登录
*,! 和 !! 的全部都是无效的哈希,均表示不可以通过密码登录
上面nginx的密码就是一个有效的哈希值,如果对nginx用户设置了禁用,
比如: `usermod -L nginx`
此时就会在密码前面增加一个 `!`,使其变为无效的哈希值,这样就不能通过密码登录了
  • 3./etc/group :用户组文件
    vigr :编辑/etc/group文件
    grpck :检查/etc/group内容是否有效

1
2
3
4
root:x:0:
bin:x:1:

格式:组名:组密码位:GID:组内用户列表(逗号分隔)
  • 4./etc/gshadow :组密码文件

1
2
3
4
5
6
7
8
9
10
root:::
bin:::
nginx:$6$G0GIKwWPuT/RMftY$JYqudvqgbUw5jJFqqaNBggs1lHpu.BXfqaHRCy2fNklc5zYG0yjh4HZ5t2r4mkeLGU9McigZa4FsBBDV9IcCR1::
redis:!:redis:redis,centos

格式:组名:组密码:组管理员:组内用户列表(逗号分隔)

# 说明:
1.一般情况下没必要设置组密码
2.组管理员可以将用户添加到组或从组里删除用户
  • 5./etc/skel/* :新用户环境变量文件

  • 6./etc/login.defs :使用useradd默认创建用户时的缺省配置,比如UID范围,GID范围,密码有效期,密码长度限制,是否自动创建Home目录,密码加密方式等等

  • 7./etc/default/useradd :使用useradd默认创建用户时的缺省配置,比如Home目录位置,默认shell,默认使用的新用户环境变量文件位置(/etc/skel),等等

二.添加、删除用户

  • 1.通过useradd命令创建用户,并使用passwd设置用户密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# root创建用户
useradd 用户名
-u:指定UID
-g:指定所属用户初始组GID或组名称,用户创建文件时的默认组,可以通过 `newgrp 组名` 切换初始组
-G:指定所属多个附加组名称,逗号分隔,用户同时拥有这些组的权限
-d:宿主目录,会自动创建,如果目录已经存在,则不会将环境变量文件拷贝到该目录,需要手工拷贝
-s:命令解释器shell,如/sbin/nologin,/bin/bash
-c:描述信息
-e:指定失效时间
-M:不创建宿主目录

# 例子:
useradd utest -u 600 -g 0 -G sys,adm -d /home/utest -s /bin/bash -c "this is a testuser"

# 不创建宿主目录,并且不允许用户登录
useradd utest -M -s /sbin/nologin -c "this is a testuser"

# 注意:
useradd <==> adduser

# root为用户设置密码
passwd 用户名

# 非root用户修改自己的密码
passwd
  • 2.通过编辑配置文件创建

    • 1)分别在/etc/passwd、/etc/group和/etc/shadow中增加一行记录
      密码设置:echo 123456 | sha512sum
    • 2)创建宿主目录
    • 3)拷贝默认的配置文件到宿主目录: cp -rf /etc/skel/* dir
    • 4)设置用户初始密码
  • 3.删除用户

1
2
userdel -r 用户名
-r:删除用户宿主目录
  • 4.修改用户

1
2
3
4
5
6
7
8
# 将用户添加到附加组中,这个命令会将用户从原来的所有组中移除,并将其添加到指定的组中。也就是说,用户将只属于指定的组。
usermod -G 组名称 用户名
# 这个命令会将用户添加到指定的组中,而不会影响其原来所属的其他组,-a:含义是append,追加,并不会改变原先的设置
usermod -aG 组名称 用户名
# 将用户的名改为新用户名,并且指定初始组,同时修改宿主目录
usermod -l 新用户名 -d dir -g 组名称 用户名

# 说明,usermod仅root用户可以使用

三.添加、删除组

  • 1.创建组

1
2
groupadd 组名
-g:指定GID
  • 2.删除组

1
groupdel 组名
  • 3.修改组名称

1
groupmod -n newname oldname
  • 4.设置组密码

1
设置密码:gpasswd 组名
  • 5.其它组命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 将用户加入组
gpasswd -a 用户名 组名

# 从组中删除用户
gpasswd -d 用户名 组名

# 删除组密码
gpasswd -r 组名

# 让群组的密码失效
gpasswd -R 组名

# 设置组管理员
gpasswd -A 用户名 组名

四.用户管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
whoami :显示当前用户名称
id :查看当前用的UID,GID和组信息
who :显示用户登录时间和来源IP
last :显示所有用户的登录时间和来源IP历史记录
su - 用户名 :切换用户,带环境变量,exit退出

passwd -S 用户名 :查看用户密码状态
chage -l 用户名:查看用户密码配置信息
vipw :编辑/etc/passwd文件

groups 用户名 :查看用户隶属于哪些组
chgrp 组名 file/dir :修改文件所属组 目录加 -R
chown 用户名 file/dir :修改文件所属用户 目录加 -R
chown -R 用户名.组名 file/dir
vigr :编辑/etc/group文件
newgrp 组名 :临时切换当前用户的初始组。newgrp 命令每一次切换用户的初始组,该用户都会以另外一个 shell(新进程,也可以说是子进程)登陆,只不过在新 shell 上登陆的该用户,其初始组改变了而已。exit退出。

pwck :检查/etc/passwd内容是否有效,比如宿主目录是否存在等等
grpck :检查/etc/group内容是否有效

五.用户禁用与恢复

  • 禁用:锁定用户,不能登录

1
2
3
4
5
usermod -L 用户名  :/etc/shadow中对应的密码前面增加一个`!`
# 或者
passwd -l 用户名 :/etc/shadow中对应的密码前面增加两个`!`

# 锁定的原理就是使密码变为无效的哈希值
  • 恢复:解锁

1
2
usermod -U 用户名
passwd -u 用户名

六.sudo

  • 配置文件/etc/sudoers

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
格式: A B = (C) D E
且C与D是可以省略的
A代表授权使用sudo的用户或者组
B代表允许授权用户在哪些主机上使用这些权利,ALL表示任意主机
C代表允许被授权用户提权到什么用户什么组级别的权限,ALL代表允许提权到任意用户级别,如果省略就表示提权到root级别
D代表当被授权用户是否需要输入自身密码来使用特权,若省略则代表需要输入自身的密码,如果为NOPASSWD:则表示不需要
E代表允许执行的命令,如果是ALL就代表允许执行所有命令,多个命令之间逗号分隔,必须为绝对路径

# 例子:
# A B = (C) E
root ALL=(ALL) ALL
# NOPASSWD: ALL 可以免密码以root身份执行所有命令
# A B = (C) D E
centos ALL=(ALL) NOPASSWD: ALL
# A B = E
wap ALL=/bin/chown,/usr/sbin/useradd

# %wheel 表示 wheel 这个组下的所有用户
%wheel ALL=(ALL) ALL
  • visudo :编辑/etc/sudoers,需要root权限

  • sudo command :执行命令,需要输入当前用户密码(配置了NOPASSWD就可以不需要输入密码了)

  • sudo -l :查看当前用户可以使用sudo执行哪些命令

  • sudo su :切换到root用户,当前用户需要拥有sudo权限

  • sudo -i :(推荐)切换到root用户,当前用户需要拥有sudo权限

sudo susudo -i的区别

sudo susudo -i都是用于以root用户身份执行命令的sudo命令的变体,但它们之间有一些区别:

  • 环境变量的加载:

    • sudo su: 使用sudo su切换到root用户时,当前用户的环境变量不会被改变,因此可能导致一些环境变量丢失或不正确。默认情况下,sudo su不会执行root用户的登录脚本(例如/root/.bashrc或/root/.profile,以及/etc/profile)。
    • sudo -i: 使用sudo -i时,会模拟一个完整的登录过程,包括执行root用户的登录脚本。这意味着环境变量会被正确加载,并且会像在一个新的登录会话中一样。
  • 工作目录的切换:

    • sudo su: 使用sudo su切换到root用户时,当前工作目录不会改变,您将保持在当前目录下。
    • sudo -i: 使用sudo -i时,会切换到root用户的家目录(/root),因此当前工作目录会改变为root用户的家目录。
  • shell的选择:

    • sudo su: 使用sudo su默认会使用root用户的默认shell,通常是/bin/bash。
    • sudo -i: 使用sudo -i时,会使用root用户的默认登录shell,通常是/bin/bash或/bin/sh。
      综上所述,如果您需要以root用户身份执行命令,并且希望加载完整的root用户环境(包括环境变量和登录脚本),建议使用sudo -i

如何快速配置普通用户拥有sudo权限

  • 默认情况下,在许多Linux发行版中,包括CentOS,任何具有sudo权限的用户都可以使用sudo susudo -i来切换到root用户。这是通过/etc/sudoers文件中的配置来实现的。

  • 在/etc/sudoers文件中,通常会有一行类似于以下的条目:

1
%wheel  ALL=(ALL)       ALL
  • 这表示用户组wheel中的成员可以使用sudo执行任何命令。默认情况下,CentOS中第一个创建的用户通常会被添加到wheel组中。

  • 如果要允许其他用户也能切换到root用户,您可以将这些用户添加到wheel组中,或者直接修改/etc/sudoers文件以允许特定用户执行sudo susudo -i。但请务必小心修改/etc/sudoers文件,因为格式错误可能会导致系统无法使用sudo。

  • 要将用户添加到wheel组中,可以使用以下命令(假设要添加的用户名为username):

1
sudo usermod -aG wheel username
  • 这会将用户添加到wheel组中,使其具有sudo权限。然后该用户就可以使用sudo su或sudo -i切换到root用户。

  • 请注意,对/etc/sudoers文件的修改应该通过visudo命令进行,这样可以避免格式错误,并且可以在编辑期间进行验证。

七.批量添加用户,适用于少量添加,大量可以编写个脚步

1
2
3
4
5
6
1.编辑一个用户信息文件,比如user.info,格式与/etc/passwd相同
2.newusers < user.info :写入/etc/passwd,会自动创建宿主目录
3.pwunconv :关闭shadow passwd功能
4.创建一个密码文件,比如passwd.info,格式与/etc/shadow相同,但密码是明文
5.chpasswd < passwd.info :写入/etc/shadow
6.pwconv :开启shadow passwd功能,写入password密文

八.查看当前登录的用户

1
2
3
4
5
6
7
8
# 列出当前session
$ loginctl list-sessions

# 列出当前登录用户
$ loginctl list-users

# 列出显示指定用户的信息
$ loginctl show-user root