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.defs
中CREATE_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
newusers
chpasswd
groupmems
newgrp
su
sg
sudo
getent
homework
- 显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录
ls /etc/[^[:alpha:]][[:alpha:]]*
- [^[:alpha:]] 表示的是一个非字母字符, [[:alpha:]]表示的是一个字母,*表是任意长度个任意字符
- 复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
mkdir -p /tmp/mytest1; cp -r /etc/p*[^0-9] /tmp/mytest1
- 先创建此目录,然后将/etc目录下以p开头的,以非数字结尾的,中间无所谓的文件拷贝到我们创建的目录中
- 将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中
tr "a-z" "A-Z" < /etc/issue > /tmp/issue.out
- 使用输入重定向将数据发送给tr进程,再将处理之后的结果通过输出重定向写入到/tmp/issue.out文件中
- 请总结描述用户和组管理类命令的使用方法并完成以下练习
- 创建组distro,其GID为2019;
groupadd -g 2019 distro
- -g表示的是组的GID
- 创建用户mandriva, 其ID号为1005;基本组为distro;
useradd -u 1005 -g 2019 mandriva
useradd -u 1005 -g distro mandriva
- -u表示的UID,-g表示的是GID或者组名
- 创建用户mageia,其ID号为1100,家目录为/home/linux;
useradd -u 1100 -d /home/linux mageia
- -d表示的是用户家目录
- 给用户mageia添加密码,密码为mageedu,并设置用户密码7天后过期
echo mageedu | passwd --stdin mageia
echo mageia:mageedu | chpasswd
chage -E 7 mageia
usermod -e 8 mageia
- 使用两种方法实现
- 删除mandriva,但保留其家目录;
userdel mandriva
- 不加 -r选项,就不会删除其家目录
- 创建用户slackware,其ID号为2002,基本组为distro,附加组peguin;
groupadd peguin; useradd -u 2002 -g distro -G peguin slackware
- 先添加一个组,然后使用-G为用户设置附加组
- 修改slackware的默认shell为/bin/tcsh;
chsh -s /bin/tcsh slackware
- 使用-s选项修改用户的默认shell
- 为用户slackware新增附加组admins,并设置不可登陆。
groupadd admins; usermod -aG admins -s /bin/nologin slackware
- 先增加一个组,然后使用-aG 为用户新增一个附加组,并修改其shell 为 /bin/nologin
- 创建用户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
- 目录/data/test属主、属组为user1
-
chown user1.user1 /data/test
- 将/data/test 的属主属组都修改为 user1
- 在目录属主、属组不变的情况下,user2对文件有读写权限
-
setfacl -Rm user2:rw /data/test/*
- 使用acl为文件或目录添加更细粒度的权限访问规则
- 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属性,那么任何用户都不能对此文件进行修改或删除的操作
- 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
- 清理/data/test目录及其下所有文件的acl权限