Linux用户管理

  • Linux是支持多用户的,就像社会上的人一样,他们的存在有着不同的意义,我们也会给不同的linux用户不同的权限,让他们尽量分工明确,只做自己该做的工作,比如root用户,他在linux系统里有着至高无上的权力,用来管理linux中的其他用户或者任何资源;而其他用户也都有着各自的职责。为了更透彻的理解linux用户管理,由我来介绍一下linux用户管理的常见命令。

useradd

  • 主要功能是添加一个用户,或者修改添加用户时的配置信息
  • 该命令的用法是
    • useradd [options] USERNAME
    • useradd -D
    • useradd -D [options]
  • 配置文件:
    • /etc/default/useradd
    • /etc/ogin.defs
  • 其他相关文件:
    • /etc/passwd:存放用户信息
    • /etc/shadow:存放用户信息,主要由加密的密码和一些密码时间相关的
    • /etc/skel:存放用户初始化配置的目录
    • /etc/group:存放组的信息
    • /etc/gshadow:存放组密码相关
    • /etc/subgid:很少用
    • /etc/subuid:很少用
  • 当不带D选项时,会尝试使用给出的信息来创建一个新用户,并且会默认创建一个与用户名同名的组
  • 各种选项:
    • -b, --base-dir BASE_DIR
      • 用来存放所有用户默认家目录的位置(root用户除外),如果没有使用-d HOME_DIR选项的话,那么创建的用户的家目录将在BASE_DIR目录下,如果没有使用-b选项,那么将会使用在/etc/default/useradd 文件中定义的值,存在HOME变量中,默认HOME=/home,如果你想永久修改新创建的用户的家目录所在的目录,修改/etc/default/useradd 中 HOME变量的值即可
    • -c, --comment COMMENT
      • 可以为当前用户写的注释性的信息,方便以后能知道创建这个用户有什么用
    • -d, --home-dir HOME_DIR
      • 将会使用指定的目录作为用户的家目录,如果此目录不存在会自动创建:只能创建一级,如果指定的家目录的父目录不存在,将不会创建其家目录,不过用户仍然被创建出来,例如
        • useradd -d /test_dir/not_exist test_user,这样test_user是可以被创建出来的,不过他的家目录不会被创建,可以使用 getent passwd test_user进行查看
      • 如果我们不使用-d 选项,那么会将用户的家目录创建在/etc/default/useradd 中HOME定义的目录下,且用户的家目录与用户名同名,当然如果你使用了-b选项,那么命令行选项的优先级更高
    • -D, --defaults
      • 显示一些默认的设置,比如上边提到的用户的默认家目录所在地,即HOME
    • -e, --expiredate EXPIRE_DATE
      • 设置用户的失效日期,日期的格式为YYYY-MM-DD,比如:2021-11-24,这个值表现在/etc/shadow文件中的第列,会被转换成距离unix元年的天数。当 当前日期超过你指定的日期时,用户将无法登录,只能有root进行处理。若未使用-e选项,那么会读取 /etc/default/useradd 中定义的EXPIRE变量值,用此值来定义用户默认的过期时间,如果没写,说明永不过期
    • -f, --inactive INACTIVE
      • 宽限期,当密码超时未修改时,最多宽限用户几天时间修改密码,若用户超过此宽限期仍未修改密码,则账户将被锁定。若未使用-f选项,则会查找/etc/default/useradd 中定义的 INACTIVE变量的值来设置用户的宽限期,默认为-1,表示用户即使超时不修改也没事,只是每次登录都会告诉用户该修改密码了
    • -g, --gid GROUP
      • 可以给用户指定一个基本组(主组),可以是组名或者组ID,不过这个组必须事先存在。
      • 如果未使用-g选项,那么useradd 命令将会依/etc/login.defs定义的USERGROUPS_ENAB变量的值,如果此变量值为yes或者在命令行使用-U/--user-group选项,那么将会为用户创建一个与之同名的基本组,反之,此值被置为no或者在命令行使用-N/--no-user-group,那么将不会自动为用户创建基本组,其默认值在/etc/default/useradd 中有设置,不过目前useradd的很多设置都来自于/etc/login.defs文件,要注意自行判断(你脑子灵活点,不要死板)
    • -G, --groups GROUP1[,GROUP2,...[,GROUPN]]]
      • 用来指定用户都有哪些附加组,如果有多个组,用逗号隔开,如:useradd -G test_grp1,test_grp2,test_grp3 test,如果附加组不存在,则创建用户失败。默认用户的附加组就是其主组
    • -h, --help:显示帮助
    • -k, --skel SKEL_DIR
      • 将哪个目录下的文件拷贝到用户的家目录,主要是为了对用户的shell及一些其他的环境做一些初始化的设置。此选项只有配合-m选项使用时才会生效
      • 默认会读取 /etc/default/useradd中SKEL的值作为拷贝的来源
      • 如果在创建用户时,不希望在家目录有任何的初始化文件,可以使用useradd -k /dev/null mysql,这样,创建的用户的家目录就不会有任何的初始化文件了。
    • -K, --key KEY=VALUE,可以临时指定一些配置,这些配置来源自 /etc/login.defs文件中,不会修改 /etc/login.defs文件,只是临时修改某些配置并生效于即将创建的用户
    • -l, --no-log-init:几乎不用
    • -m, --create-home
      • 如果创建用户家目录,只能创建一级,即你指定的用户的家目录的父目录必须存在
      • 如果未指定此选项,将会查看/etc/login.defs文件中的CREATE_HOME变量值,如果此值为yes,则会创建家目录(非系统用户)
      • SELINUX相关,此处不多介绍
    • -M, --no-create-home
      • 不为用户创建家目录,即使/etc/login.defsCREATE_HOME为yes。在大多数情况下,命令行的配置优先级要高于配置文件的优先级
    • -N, --no-user-group
      • 不为用户创建一个同名的组
    • -o, --non-unique
      • 允许创建一个与当前用户UID相同的新用户
      • 只有与 -u选项一起使用才有效
    • -p, --password PASSWORD
      • 用来配置用户的密码
      • 极其不推荐使用,因为你的密码会暴露在进程列表,别人就能看见你密码是啥了,危险
    • -r, --system
      • 创建一个系统用户
      • 系统用户将不会有任何关于密码时间的配置,因为他们一般不会登录系统,其很多配置都在 /etc/login.defs
      • useradd命令默认不会给系统用户创建其家目录,如果需要创建家目录,需手动指定 -m选项。
    • -R, --root CHROOT_DIR
      • 几乎不用
    • -p几乎不用
    • -s, --shell SHELL:用户登录时使用的shell,如果未指定将会使用/etc/default/useradd 中 SHELL定义的值作为默认shell
    • -u, --uid UID:手动指定用户的UID,如果不加-o选项,则可能会与已存在的用户UID冲突
    • -U, --user-group:在创建用户时同时创建一个与用户同名的组
    • -Z, --selinux-user SEUSER:几乎不用

usermod

  • 用来修改用户的相关信息

userdel

  • 用来删除用户

groupadd

  • 用来添加一个组

groupmod

  • 用来修改组信息

groupdel

  • 用来删除一个组

passwd

  • 用来修改用户的密码

gpasswd

  • 用来修改组密码

chfn

  • 用来修改用户的相关信息

chage

  • 用来修改与密码相关的信息

chsh

  • 用来修改用户的shell

newusers

  • 用来批量创建或修改用户

chpasswd

  • 用来批量的修改用户的密码

groupmems

  • 用来管理用户的主组

newgrp

  • 临时切换主组

su

  • 临时切换用户

sg

  • 用不同的gid执行命令

sudo

  • 提权,来做一些管理性的操作

getent

  • 用来查看用户或组相关的信息

homework

  1. 显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录
    • ls /etc/[^[:alpha:]][[:alpha:]]*
    • [^[:alpha:]] 表示的是一个非字母字符, [[:alpha:]]表示的是一个字母,*表是任意长度个任意字符
  2. 复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
    • mkdir -p /tmp/mytest1; cp -r /etc/p*[^0-9] /tmp/mytest1
    • 先创建此目录,然后将/etc目录下以p开头的,以非数字结尾的,中间无所谓的文件拷贝到我们创建的目录中
  3. 将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中
    • tr "a-z" "A-Z" < /etc/issue > /tmp/issue.out
    • 使用输入重定向将数据发送给tr进程,再将处理之后的结果通过输出重定向写入到/tmp/issue.out文件中
  4. 请总结描述用户和组管理类命令的使用方法并完成以下练习
    1. 创建组distro,其GID为2019;
      • groupadd -g 2019 distro
      • -g表示的是组的GID
    2. 创建用户mandriva, 其ID号为1005;基本组为distro;
      • useradd -u 1005 -g 2019 mandriva
      • useradd -u 1005 -g distro mandriva
      • -u表示的UID,-g表示的是GID或者组名
    3. 创建用户mageia,其ID号为1100,家目录为/home/linux;
      • useradd -u 1100 -d /home/linux mageia
      • -d表示的是用户家目录
    4. 给用户mageia添加密码,密码为mageedu,并设置用户密码7天后过期
      • echo mageedu | passwd --stdin mageia
      • echo mageia:mageedu | chpasswd
      • chage -E 7 mageia
      • usermod -e 8 mageia
      • 使用两种方法实现
    5. 删除mandriva,但保留其家目录;
      • userdel mandriva
      • 不加 -r选项,就不会删除其家目录
    6. 创建用户slackware,其ID号为2002,基本组为distro,附加组peguin;
      • groupadd peguin; useradd -u 2002 -g distro -G peguin slackware
      • 先添加一个组,然后使用-G为用户设置附加组
    7. 修改slackware的默认shell为/bin/tcsh;
      • chsh -s /bin/tcsh slackware
      • 使用-s选项修改用户的默认shell
    8. 为用户slackware新增附加组admins,并设置不可登陆。
      • groupadd admins; usermod -aG admins -s /bin/nologin slackware
      • 先增加一个组,然后使用-aG 为用户新增一个附加组,并修改其shell 为 /bin/nologin
  5. 创建用户user1、user2、user3。在/data/下创建目录test
# 批量创建用户,具体细节 man newusers,并创建/data/test目录
newusers <<EOF
user1:::::/home/user1:/bin/bash
user2:::::/home/user2:/bin/bash
user3:::::/home/user3:/bin/bash
EOF
mkdir -p /data/test

  1. 目录/data/test属主、属组为user1 - chown user1.user1 /data/test - 将/data/test 的属主属组都修改为 user1
  2. 在目录属主、属组不变的情况下,user2对文件有读写权限 - setfacl -Rm user2:rw /data/test/* - 使用acl为文件或目录添加更细粒度的权限访问规则
  3. user1在/data/test目录下创建文件a1.sh, a2.sh, a3.sh, a4.sh,设置所有用户都不可删除1.sh,2.sh文件、除了user1及root之外,所有用户都不可删除a3.sh, a4.sh
    • cd /data/test
    • touch a{1..4}.sh
    • chattr +i a{3,4}.sh
    • 由于此目录的属主属组都是user1,所以默认user1对此目录下的文件有权限,比如删除,而root是系统管理员,本来就有很大的权限,删除也没啥问题
    • 现在要求属主甚至root都不能删除a3.sh,a4.sh,所以只能使用特殊属性,对文件加上 i属性,那么任何用户都不能对此文件进行修改或删除的操作
  4. user3增加附加组user1,同时要求user1不能访问/data/test目录及其下所有文件
    • usermod -aG user1 user3
    • chmod -R u-rx /data/test
    • 为用户user3增加一个附加组user1,并递归修改文件权限使得属主user1对/data/test目录无读、执行权限
    • 若用户对目录没有执行权限,则不能进入目录,比如 cd SOME/DIR
    • 若用户对目录无读权限,则不能查看目录下有多少文件,比如 ls SOME/DIR
  5. 清理/data/test目录及其下所有文件的acl权限
    • setfacl -b /data/test/*