[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]
大家好,我是一个正在向全栈工程师(SecDevOps)前进的计算机技术爱好者
作者微信:WeiyiGeeker
公众号/星球:全栈工程师修炼指南
主页博客: https://weiyigeek.top - 为者常成,行者常至
前言简述
描述:在Linux系统中用户和组是相当重要的,使得多任务Linux环境变得更容易管理,以及系统资源分配和系统文件访问安全等等;
那什么是用户和用户组?
用户(
user
):使用操作系统的人。用户组(
user group
):操作系统中具有相同系统权限的一组用户。
用户组信息主要文件及其内容说明?
/etc/passwd : 存储当前系统中所有用户的信息
$ head -n 2 /etc/passwd
root:$6$1LOC3PZIKa9zhTt6$TkJ/jEzJ7yHgdFpRnJv04zRtXNvVFm.gqYl6Sl9.lMWuLS0azrAn5jsFSCyKVXpuEE2DXgrAU/jXQ1qFDecc51:0:0:root:/root:/bin/sh
bin:*:1:1:bin:/bin:/sbin/nologin
# 基本格式 a:b:c:d:e:f:g
用户名:密码占位符($6表示SHA512密码$SALT$HASH):用户编号:用户组编号:用户注释信息:用户主目录:shell类型
/etc/shadow :存储当前系统中所有用户的密码信息
$ head -n 2 /etc/shadow
root:$6$1LOC3PZIKa9zhTt6$TkJ/jEzJ7yHgdFpRnJv04zRtXNvVFm.gqYl6Sl9.lMWuLS0azrAn5jsFSCyKVXpuEE2DXgrAU/jXQ1qFDecc51:19875:0:99999:7:::
bin:*:19875:0:99999:7:::
# 基本格式 a:b:c:d:e:f:g:
:a 是用户名
:b 是用户登录密码单向加密分为三个部分,第一部分是表示使用哪种哈希算法(`$1表示MD5 ; $6 表示SHA-512 ; $5 SHA-256`);第二部分是用于加密哈希的salt;第三部分是已加密的哈希;
:c 上次更改密码的日期(从1970-1-1开始)
:d 最短密码期限(按天计算,0 = 无最短期限)
:e 最长密码期限(按天计算)
:f 密码警告期限(按天计算,0 = 未指定警告)
:g 密码非活动期限(按天计算)
:h 账号到期时间(从1970-1-1开始)
:i 保留域
/etc/group :存储当前系统中所有用户组信息
$ head -n 2 /etc/group
root:x:0:
bin:x:1:
# 基本格式 a:b:c:d
组名称;组密码占位符;组编号;组中用户名列表,为空不代表没有用户,当这个组内只要一个用户,且用户名和组名相同时是可以省略的
温馨提示:不同的发行版本可能uid和gid的起始值不同,例如:
在CentOS6及以前组号1-499是预留给系统软件和服务的,如安装了MySQL,会自动创建一个MySQL用户组,越早安装的软件和服务,系统组号越小,用户手动创建的用户组编号是从500开始的。
在CentOS7及以后组号1-999是预留给系统软件和服务的即系统组,而 1000~60000 预留给用户的称为用户组,用户手动创建的用户组编号是从1000开始的。
温馨提示:主密码占位符无一例外全都是用x来表示的,这与系统安全演变有关,了解即可。
/etc/gshadow :存储当前系统中用户组的密码信息 Tips:原先只有group和passwd两个文件,但后来考虑到安全性问题就又演变出shadow和gshadow两个文件
$ head -n 2 /etc/gshadow
root:::
bin:::
# 基本格式 a:b:c:d
组名称:组密码:组管理者:组中用户名列表
前面简单了解了一下用户和组,下面就跟随UP主一起学习Linux系统中针对用户和组的实践操作命令,希望对大家有所帮助!
0x00 用户和组配置命令
vipw , vigr 命令- 编辑密码、组、影子密码或影子组文件。
语法参数:
vipw [选项]
vigr [选项]
# 参数
-p, --passwd 编辑 passwd 数据库。
-g, --group 编辑 group 数据库。
-s, --shadow 编辑 shadow 或 gshadow 数据库。
-R, --root CHROOT_DIR 在CHROOT_DIR目录中应用更改,并使用CHROOT-DIR目录中的配置文件。
-q, --quiet 安静模式。
# 环境变量
VISUAL 要使用的编辑器。
EDITOR Editor to be used if VISUAL is not set.
示例演示:
# 缺省,编辑 passwd 数据库
vipw
# 编辑 group 数据库
vipw --group
# 缺省,编辑 shadow 数据库
vigr
# 编辑 gshadow 数据库
vipw --group
pwck, grpck 命令 - 检查用户。组密码文件的完整性
语法参数:
pwck [选项] [passwd [ shadow ]]
grpck [选项] [group [ shadow ]]
# 参数
--badname 允许使用不符合标准的名称。
-q, --quiet 只报告错误,不显示那些不需要用户操作的警告。
-r, --read-only 以只读模式执行pwck命令。
-s, --sort 按UID、GID对/etc/[g]passwd和/etc/[g]shadow中的条目进行排序, 与 -r 互斥
-R, --root CHROOT_DIR 在CHROOT_DIR目录中应用更改,并使用CHROOT-DIR目录中的配置文件。
# 退出值
0 success
1 invalid command syntax
2 one or more bad password entries
3 can't open password files
4 can't lock password files
5 can't update password files
6 can't sort password files
getent 命令 - 从名称服务数据库获取条目
描述:用来查看系统的数据库中的相关记录,支持的数据库有 ahosts ahostsv4 ahostsv6 aliases ethers group gshadow hosts initgroups netgroup networks passwd protocols rpc services shadow
等文件中的记录。
语法参数:
# 用法:
getent [选项...] 数据库 [键 ...]
# 参数:
-A, --no-addrconfig do not filter out unsupported IPv4/IPv6 addresses
(with ahosts*)
-i, --no-idn 停用 IDN 编码
-s, --service=配置 要使用的服务配置
使用示例:
# 1.查看所有账户与指定账户,等同于执行 cat /etc/passwd
getent passwd root
# root:x:0:0:root:/root:/bin/sh
# 2.查看所有用户组
getent group
# root:x:0:0:root:/root:/bin/bash
# ...
# apache:x:1002:
# weiyigeek:x:1003:
# 3.查询用户密码与组密码文件
getent shadow
# root:$6$1LOC3PZIKa9zhTt6$TkJ/jEzJ7yHgdFpRnJv04zRtXNvVFm.gqYl6Sl9.lMWuLS0azrAn5jsFSCyKVXpuEE2DXgrAU/jXQ1qFDecc51::0:99999:7:::
getent gshadow
# 4.查询用户别名
getent aliases
# mailer-daemon: postmaster
# postmaster: root
# bin: root
# 5.查询端口与服务等同于 cat /etc/services
getent services | more
# 6.查询指定服务的缺省端口信息。
getent services ftp
# ftp 21/tcp
# 7.查看协议数据库
getent protocols tcp udp
# tcp 6 TCP
# udp 17 UDP
# 8.使用getent命令与||结合,判断可以创建组
getent group 'mail' >/dev/null || groupadd -r 'mail'
pwconv 命令- 转换用户密码文件
描述:相关命令有 pwconv, pwunconv, grpconv, grpunconv ,可在影子密码和组以及其它直接转换,分别针对/etc/passwd、/etc/group、/etc/shadow和/etc/gshadow 四个文件进行操作。
相关命令
The
pwconv
command creates shadow from passwd and an optionally existing shadow.The
pwunconv
command creates passwd from passwd and shadow and then removes shadow.The
grpconv
command creates gshadow from group and an optionally existing gshadow.The
grpunconv
command creates group from group and gshadow and then removes gshadow
使用示例:
# 1.pwunconv 与 pwconv 使用
$ getent passwd | wc -l && getent shadow | wc -l
38
# 首先,在执行pwconv后,创建一个jacker用户。
$ pwunconv
$ useradd jacker
$ getent passwd | wc -l
39
# 区别点:此时shadow没有jacker用户信息
$ getent shadow | wc -l
0
# 然后,执行pwconv命令后,将jacker用户配置信息吸入到shadow中
$ pwconv
$ getent shadow | wc -l # 区别点:此时shadow中有jacker用户信息
30
温馨提示:上述四个命令简单了解即可,实际工作中,我们很少会用到,并且作者没有遇到需要使用上面命令的场景,若有同学知道,望周知。
0x01 用户和组操作命令
useradd 命令 - 创建用户
描述:创建用户及用户配置文件修改。
语法参数:
用法:useradd [选项] 登录名
useradd -D
useradd -D [选项]
# 选项:
--badname do not check for bad names
-b, --base-dir BASE_DIR 新账户的主目录的基目录
--btrfs-subvolume-home use BTRFS subvolume for home directory
-c, --comment COMMENT 新账户的 GECOS 字段
-d, --home-dir HOME_DIR 新账户的主目录
-D, --defaults 显示或更改默认的 useradd 配置
-e, --expiredate EXPIRE_DATE 新账户的过期日期
-f, --inactive INACTIVE 新账户的密码不活动期
-g, --gid GROUP 新账户主组的名称或 ID
-G, --groups GROUPS 新账户的附加组列表
-h, --help 显示此帮助信息并退出
-k, --skel SKEL_DIR 使用此目录作为骨架目录
-K, --key KEY=VALUE 不使用 /etc/login.defs 中的默认值
-l, --no-log-init 不要将此用户添加到最近登录和登录失败数据库
-m, --create-home 创建用户的主目录
-M, --no-create-home 不创建用户的主目录
-N, --no-user-group 不创建同名的组
-o, --non-unique 允许使用重复的 UID 创建用户
-p, --password PASSWORD 加密后的新账户密码
-r, --system 创建一个系统账户
-R, --root CHROOT_DIR chroot 到的目录
-P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files
-s, --shell SHELL 新账户的登录 shell
-u, --uid UID 新账户的用户 ID
-U, --user-group 创建与用户同名的组
-Z, --selinux-user SEUSER 为 SELinux 用户映射使用指定 SEUSER
使用示例:
# 1.创建weiyigeek用户
useradd weiyigeek
# 2.为新添加的用户指定一个uid
useradd -u 1024 weiyigeek
# 3.将weiyigeek用户添加到hadoop组里
useradd -g hadoop weiyigeek
# 4.在/home下创建一个和用户名同名的目录
useradd -d /home/Jeff -m Jeff
# 5.直接设置用户的主组-g 合设置 用户附属用户组
useradd -g group1 -G group2,group3 Jeff
# 6.创建相应用户,及指定(修改)执行shell
useradd -s /sbin/nologin nobody
# 7.创建UID为888的postpre用户主组为app组,登录shell为/sbin/nologin,并且不创建家目录
useradd -r -u '888' -g 'app' -s '/sbin/nologin' -M -c '系统组postpre服务' 'postpre'
# 8.创建UID为889的apache用户主组为apache组,附加组为app组,登录shell为/sbin/nologin,并且创建家目录 /var/www
groupadd apache
useradd -r -u 889 -g apache -G app -s /sbin/nologin -d /var/www -m -c "系统组apache服务" apache
# 9.创建UID为1002的weiyigeek用户主组为weiyigeek组,附加组为ops组,登录shell为/bin/bash,并且创建家目录 /home/weiyigeek,并在创建用户时设置密码。
USERPASS="$(openssl passwd -6 weiyigeek.top)"
groupadd weiyigeek
useradd -u 1002 -g weiyigeek -G ops -u 1002 -m -s /bin/bash -c "用户组weiyigeek用户" -p ${USERPASS} weiyigeek
# 密码:weiyigeek.top
# SHA512: $6$aNoIbDy5HgsiobVS$87PxqnMYQrUX5Fj2Aiv7hSWAkkvTTXLGtaey8TSmNKzvawypwSQ25bEIqKhps2MUdDx6AyjFS.vxYvVuPvDLM/
温馨提示:useradd 命令默认值设定是由 /etc/default/useradd
文件来决定的,我们可以使用useradd -D
命令参数来显示或更改默认设置。
$ cat /etc/default/useradd
# 或者
$ useradd -D
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
# 使用 -s 、-b 、-g 参数来更改SHELL、HOME、GROUP的默认值
useradd -D -s /bin/csh
useradd -D -b /usr/local/home
useradd -D -g 1000
usermod 命令 - 修改用户
描述:主要用于修改用户配置信息。
语法参数:
用法:usermod [选项] 登录名
选项:
-b, --badname allow bad names
-c, --comment COMMENT GECOS 字段的新值
-d, --home HOME_DIR 用户的新主目录
-e, --expiredate EXPIRE_DATE 设定帐户过期的日期为 yyyy-MM-DD
-f, --inactive INACTIVE 过期 INACTIVE 天数后,设定密码为失效状态
-g, --gid GROUP 强制使用 GROUP 为新主组
-G, --groups GROUPS 新的附加组列表 GROUPS
-a, --append GROUP 将用户追加至上边 -G 中提到的附加组中,并不从其它组中删除此用户
-l, --login NEW_LOGIN 新的登录名称
-L, --lock 锁定用户帐号
-m, --move-home 将家目录内容移至新位置 (仅于 -d 一起使用)
-o, --non-unique 允许使用重复的(非唯一的) UID
-p, --password PASSWORD 将加密过的密码 (PASSWORD) 设为新密码
-R, --root CHROOT_DIR chroot 到的目录
-P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files
-s, --shell SHELL 该用户帐号的新登录 shell
-u, --uid UID 用户帐号的新 UID
-U, --unlock 解锁用户帐号
-v, --add-subuids FIRST-LAST 添加子 UID 范围
-V, --del-subuids FIRST-LAST 移除子 UID 范围
-w, --add-subgids FIRST-LAST 添加子 GID 范围
-W, --del-subgids FIRST-LAST 移除子 GID 范围
-Z, --selinux-user SEUSER 用户的新的 SELinux 用户映射
使用示例:
# 1.修改用户主组以及附属组
usermod -g app -G ops weiyigeek
# 2.修改用户的默认SHELL
usermod -s /bin/csh weiyigeek
# 3.锁定与解锁用户
usermod -L weiyigeek
usermod -U weiyigeek
# 4.指定用户账号过期时间
usermod -e 2024-12-31 weiyigeek
# 5.更改user1用户名称为hacker
$ usermod -l hacker user1
$ getent passwd hacker
hacker:x:1006:1006:User One:/home/user1:/bin/bash
# 6.更改用户密码
usermod -p $(openssl passwd -6 "password.weiyigeek.top") weiyigeek
# 7.更改用户所在的用户组(主组)/附属组
usermod -g Master -G slave Jeff
usermod -aG root $USER
# 8.将weiyigeek家目录移动到指定位置
usermod -m -d /usr/local/home/weiyigeek weiyigeek
# 9.阻止特定用户以交互方式登录:
usermod -s /usr/sbin/nologin weiyigeek
userdel 命令 - 删除用户
描述:用于删除Linux系统上指定的用户及其家目录。
语法参数:
用法:userdel [选项] 登录名
选项:
-f, --force 强制删除用户即使用户在登录中。
-r, --remove 删除主目录和信件池
-R, --root CHROOT_DIR chroot 到的目录
-P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files
-Z, --selinux-user 为用户删除所有的 SELinux 用户映射
使用示例:
# 1.只删除用户,用户的家目录将会被保留。
userdel weiyigeek
# 2.完全删除,包含用户的家目录(生产环境慎用)
userdel -r weiyigeek
# 3.强制删除即使用户正则使用中。
userdel -rf weiyigeek
groupadd 命令 - 创建用户组
描述:此用法用于用户组的创建。
语法参数:
# 用法:
groupadd [选项] 组
# 选项:
-f, --force 如果组已经存在则成功退出 并且如果 GID 已被使用则取消 -g
-g, --gid GID 为新组使用 GID
-K, --key KEY=VALUE 不使用 /etc/login.defs 中的默认值
-o, --non-unique 允许创建有重复 GID 的组
-p, --password PASSWORD 为新组使用此加密过的密码
-r, --system 创建一个系统账户
-R, --root CHROOT_DIR chroot 到的目录
-P, --prefix PREFIX_DI directory prefix
-U, --users USERS list of user members of this group
使用示例:
# 1.创建ops系统组
groupadd ops
# 2.创建指定GID为888的app系统组
groupadd -g 888 -r app
# 3.强制创建指定GID为89的postfix邮件系统组
groupadd -f -g '89' -r 'postfix'
# 4.创建用户组并设置密码
GROUPSPASS="$(openssl passwd -6 weiyigeek.top)"
groupadd -p ${GROUPSPASS} weiyigeek
groupmod 命令 - 修改用户组
描述:用于更改用户组信息与配置。
前面说到,用户可添加到主要组以及附属组,用户可以同时加入多个用户组(部门),但必须有一个主要组,可以使用前面usermod 命令,或者 groupmod 命令来修改用户的主要组。
语法参数
# 用法:
groupmod [选项] 组
# 选项:
-a, --append append the users mentioned by -U option to the group without removing existing user members
-g, --gid GID 将组 ID 改为 GID
-n, --new-name NEW_GROUP 改名为 NEW_GROUP
-o, --non-unique 允许使用重复的 GID
-p, --password PASSWORD 将密码更改为(加密过的) PASSWORD
-R, --root CHROOT_DIR chroot 到的目录
-P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files
-U, --users USERS list of user members of this group
使用示例
# 1.更改 ops 组的 gid 为 886
$ getent group ops
# ops:x:1001:weiyigeek
$ groupmod -g 886 ops
$ getent group ops
# ops:x:886:weiyigeek
# 2.更改 ops 组的名称为 operation
$ groupmod -n operation ops
$ getent group operation
# operation:x:886:weiyigeek
groupmems 命令 - 更改附加组成员。
描述:用于进行管理附加组成员信息。
语法参数:
用法:groupmems [选项] [动作]
# 选项:
-g, --group groupname 更改组 groupname,而不是用户的组(仅限 root)
-R, --root CHROOT_DIR chroot 到的目录
# 动作:
-a, --add username 将用户 username 添加到组成员中
-d, --delete username 从组的成员中删除用户 username
-p, --purge 从组中移除所有成员
-l, --list 列出组中的所有成员
示例演示:
# 1.添加用户 weiyigeek 到 app 附加组
groupmems -g app -a weiyigeek
# 2.查看 app 组中的成员
groupmems -g app -l
# weiyigeek
# 3.删除用户 weiyigeek 从 app 附加组
groupmems -g app -d weiyigeek
# 4.从app组中移除所有成员
groupmems -g app -p
groupdel 命令 - 删除用户组
描述:用于删除用户组。
语法参数:
用法:groupdel [选项] 组
# 选项:
-R, --root CHROOT_DIR chroot 到的目录
-P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files
-f, --force 即便是用户的主组也继续删除
使用示例:
# 1.删除用户组
groupdel apache
# 2.强制删除用户组,无论是否为主组。
$ id postpre
用户id=888(postpre) 组id=888(app) 组=888(app)
$ groupdel app
groupdel:不能移除用户“postpre”的主组
$ groupdel -f app
$ id postpre
用户id=888(postpre) 组id=888 组=888 # 此时只有 组id 并没有组名
passwd 命令 - 创建修改用户密码
描述:从字面意义上很好理解,即password密码,在Linux中用于更改用户密码。
语法参数:
# 用法:
passwd [选项...] <帐号名称>
# 参数:
-k, --keep-tokens 保持身份验证令牌不过期
-d, --delete 删除命名帐户的密码(仅限 root用户);也删除密码锁(如果有)
-l, --lock 锁定指名帐户的密码(仅限 root 用户)
-u, --unlock 解锁指名帐户的密码(仅限 root 用户)
-e, --expire 终止指名帐户的密码(仅限 root 用户)
-f, --force 强制执行操作
-x, --maximum=DAYS 密码的最长有效时限(只有 root 用户才能进行此操作)
-n, --minimum=DAYS 密码的最短有效时限(只有 root用户才能进行此操作)
-w, --warning=DAYS 在密码过期前多少天开始提醒用户(只有 root用户才能进行此操作)
-i, --inactive=DAYS 当密码过期后经过多少天该帐号会被禁用(只有 root 用户才能进行此操作)
-S, --status 报告已命名帐号的密码状态(只有 root用户才能进行此操作)
--stdin 从标准输入读取令牌(只有 root 用户才能进行此操作)
使用示例:
# 1.以交互设置 root、weiyigeek 用户密码
$ passwd root
$ passwd weiyigeek
$ passwd weiyigeek <<EOF
blog.weiyigeek.top
blog.weiyigeek.top
EOF
# 2.无密码登录(清除密码)
passwd -d weiyigeek
# 3.以管道方式设置用户密码
# RHEL系列、CentOS系列、Rocky系列
echo 'blog.weiyigeek.top' | passwd --stdin weiyigeek
echo "$(echo ${RANDOM}`date +%s%S`| md5sum |cut -c 2-13)" | passwd --stdin 用户名 # 小写+数字
echo "$(echo ${RANDOM}`date +%s%S`| base64 |cut -c 2-13)" | passwd --stdin 用户名 # 大小写+数字
# Changing password for user Weiyegeek.
# passwd: all authentication tokens updated successfully.
# 通用,Debian系列、Ubuntu系列
echo -e 'blog.weiyigeek.top\nblog.weiyigeek.top' | passwd weiyigeek
# 改用户 weiyigeek 的密码 。
# passwd:所有的身份验证令牌已经成功更新。
# 其他方式
echo weiyigeek:blog.weiyigeek.top | chpasswd
# 4.强制用户下次登录必须修改密码。
passwd -e weiyigeek
# 5.锁定和解锁用户
passwd -l weiyigeek
passwd -u weiyigeek
# 6.查看指定用户密码策略配置
passwd -S root
# root PS 1969-12-31 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
扩展知识:
首先,来看看随机密码的生成以及Linux系统用户密码加密后的样子。
# 1.随机密码生成
$ tr -dc [:alnum:][:print:] < /dev/urandom | head -c 12
FKo!cnQ*!-@|
$ openssl rand -base64 9
rbMzil00N343
$ yum install -y expect
$ mkpasswd -l 8 -c 2 -C 2 -d 2 -s 2 | tee passwd.txt # 生成8位密码包含大小写字母数字特殊字符各两位
# 2.SHA512密码生成
# CentOS8、Rocky8、9、10 密码生成SHA512加密,其中 -6 参数表示加密算法为SHA512,每次生成的加密字符串都不一样。
openssl passwd -6 "blog.weiyigeek.top"
# 格式:$加密算法$slat$hash
# $6$PuwtSBzI0K2LN57C$jLjjitKx9JhLRXfL8E3ObA4qNHWTGkGU4VQ9QLnpm/3oaEV1aYgCWWprWz.QoekjK0lwqIyQB65IGL/npHfMW.
# CentOS7,使用 python2、python3 生成
python2 -c 'import crypt,getpass;pw="blog.weiyigeek.top";print crypt.crypt(pw)'
python3 -c 'import crypt,getpass;pw="blog.weiyigeek.top";print(crypt.crypt(pw))'
# 可知,同样密码由于salt不同,加密结果也不一样。
# $6$30aCoGutuPce.Szv$IqafuKFE7f43JHQFbiVA6qORQp.4YtJL6FiZqMOL.UJyYqvDE3eNGlC043o7uLL0wFwiL6WE9o5iQ8ranscgL1
# CentOS6,使用 grub-crypt 生成
grup-crypt --sha-512
gpasswd 命令 - 创建修改组密码
描述:用于向指定组添加会移除用户,以及删除组密码。
语法参数:
用法:gpasswd [选项] 组
# 选项:
-a, --add USER 向组 GROUP 中添加用户 USER
-d, --delete USER 从组 GROUP 中添加或删除用户
-Q, --root CHROOT_DIR 要 chroot 进的目录
-r, --delete-password 删除组 GROUP 的密码
-R, --restrict 向其成员限制访问组 GROUP
-M, --members USER,... 设置组 GROUP 的成员列表
-A, --administrators ADMIN,... 设置组的管理员列表
# 除非使用 -A 或 -M 选项,不能结合使用这些选项。
使用示例
# 1.以交互方式修改组密码(常规运维情况下不会对组设置密码)
$ gpasswd app
# 正在修改 app 组的密码
# 新密码:
# 2.为用户添加多个附加组,但用户创建文件等操作都默认属于他的主用户组,
gpasswd -a WeiyiGeek master,slave
# 3.从master用户组中删掉用户,即将用户的某个附属组去掉.
gpasswd -d WeiyiGeek master
# 4.将管理员用户从root组中删除
sudo gpasswd -d $USER root
# 5.禁止某一sudo组中的用户,从而通过sudo -i登陆到root权限。
$ gpasswd -d app sudo
Removing user app from group sudo
$ sudo -i # 此时 app 通过 此命令切换到root终端就不行了。
# 6.删除app组密码
gpasswd -r app
newusers 命令 - 批量创建用户
描述:用于批量创建普通用户和系统用户。
语法参数:
用法:newusers [选项]
# 选项:
-b, --badname allow bad names
-c, --crypt-method METHOD 加密方法(NONE DES MD5 SHA256 SHA512 中的一个)
-r, --system 创建系统帐号
-R, --root CHROOT_DIR chroot 到的目录
-s, --sha-rounds number of rounds for the SHA, BCRYPT or YESCRYPT crypt algorithms
使用实例:
# 首先,创建一个文本文件,比如叫做users.txt,包含要创建的用户信息,格式如下:
tee /tmp/newuser.txt << EOF
user1:x:1006:1006:User One:/home/user1:/bin/bash
user2:x:1007:1007:User Two:/home/user2:/bin/bash
user3:x:1008:1008:User Three:/home/user3:/bin/bash
EOF
# 然后,使用newusers命令读取该文件并创建用户以及其家目录:
newusers < /tmp/newuser.txt
chpasswd 命令 - 批量修改用户密码
描述:此命令用于修改单个或多个用户密码,在 ubuntu 中适用,是把一个文件内容重新定向添加到/etc/shadow中。
语法参数:
用法: chpasswd [options]
# 常用参数
-c, --crypt-method METHOD :加密方法(无DES MD5、SHA256、SHA512中的一种)
-e:输入的密码是加密后的密文;
-m:当被支持的密码未被加密时,使用MD5加密代替DES加密。
-R, --root CHROOT_DIR :chroot 到的目录。
使用示例
# 1. 先创建用户密码对应文件,格式为username:password,如abc:abc123,
# 必须以这种格式来书写,并且不能有空行,保存成文本文件user.txt,然后执行chpasswd命令:
echo "weiyigeek:zU2OTE2NjEwN" > user.txt
chpasswd < user.txt
# 2.或者采用此种方式以上是运用chpasswd命令来批量修改密码,是linux系统管理中的捷径。
echo "root:wgr1TDs2Mnx0XuAv" | chpasswd
# 3.随机密码并指定加密方式(值得学习借鉴)
USER_PASS="$(echo ${RANDOM}`date +%s%S`| base64 |cut -c 2-13)"
echo "weiyigeek:${USER_PASS}" | chpasswd -c SHA512
# 4.批量修改用户密码
# 首先,创建一个文本文件,比如叫做passwords.txt,包含要修改密码的用户信息,格式如下:
tee userpass.txt << EOF
user1:password
user2:password
user3:password
EOF
# 然后,使用chpasswd命令读取该文件并修改密码:
chapasswd < userpass.txt
chage 命令 - 修改用户密码过期策略
描述:此命令是用来修改帐号和密码的有效期限,密码失效是通过此命令来管理的。
语法参数:
chage [选项] 用户名
# 常用参数
-d:上一次更改的日期。
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w:用户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
-I, --inactive INACTIVE : 密码到期后不能登陆
实际案例:
# 1.以交互式更改weiyigeek用户策略。
$ chage weiyigeek
# 正在为 weiyigeek 修改年龄信息
# 请输入新值,或直接敲回车键以使用默认值
# 最小密码年龄 [0]: 7
# 最大密码年龄 [99999]: 90
# 最近一次密码修改时间 (YYYY-MM-DD) [2024-06-01]: 2024-06-02
# 密码过期警告 [7]:
# 密码失效 [1]: 10
# 帐户过期时间 (YYYY-MM-DD) [-1]:
# 2.列出指定用户(weiyigeek)密码设置
$ chage -l weiyigeek
# Last password change : Jun 02, 2024
# Password expires : Aug 31, 2024
# Password inactive : Sep 10, 2024
# Account expires : never
# Minimum number of days between password change : 7
# Maximum number of days between password change : 90
# Number of days of warning before password expires : 7
# 用户shadow密码文件也同步更改成为设定的。
$ getent shadow weiyigeek
weiyigeek:$6$0CvuFbJO4luaaCZ2$XZWe3vYTKC/xazkU4aVJ7GYC/uux.Gik1i.SVkMosOX18/9JsEgBWAKZ.c1wDDX60/BbK5.a9powu0ebY2GIA1:19876:7:90:7:10::
# 3.参数设置用户密码过期策略
$ chage -M 60 root #修改我的密码过期时间为60天
$ chage -I 5 root #命令设置密码失效时间5天 #在密码过期后5天,密码自动失效,这个用户将无法登陆系统
# 4.强制用户登陆时修改口令
$ chage -d 0 username(linux)
$ passwd -f username(solaris)
# 5.现在要设置用户的密码过期时间,通过将日期指定为零 (0) 来运行以下命令,表示自上述日期以来密码未更改(即 January 1st, 1970),因此密码实际上已经过期,需要在用户再次访问系统之前立即更改。
chage --lastday 0 rumenz
chage --lastday 1970-01-01 rumenz
# 6.强制用户下次登陆时修改密码,并且设置密码最低有效期0和最高有限期90,提前15天发警报提示
$ chage -d 0 -m 0 -M 90 -W 15 root(linux)
$ passwd -f -n 0 -x 90 -w 15 root(solaris)
Tips : Linux下对于新添加的用户,用户密码过期时间是从 /etc/login.defs
中 PASS_MAX_DAYS
提取的,普通系统默认就是99999,而有些安全操作系统是90(等保要求三个月更换一次密码)
#采用正则表达式进行匹配
$ sed -i.bak -e 's/^\(PASS_MAX_DAYS\).*/\1 90/' /etc/login.defs #以PASS开头 -i 备份
$ cat /etc/login.defs |grep "PASS_M";
#可以编辑/etc/login.defs来设定几个参数,以后设置口令默认就按照参数设定为准:
PASS_MAX_DAYS 90
PASS_MIN_DAYS 1
PASS_MIN_LEN 12
PASS_WARN_AGE 15
#当然在/etc/default/useradd可以找到如下2个参数进行设置
#通过修改配置文件,能对之后新建用户起作用,而目前系统已经存在的用户,则直接用chage来配置。:
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
# 对于已存在的用户进行设置失效时期。
chage -d 0 -m 1 -M 90 -W 15 root && passwd --expire root
chfn 命令 - 更改您的 finger 信息
描述:此命令用于更改用户信息,包括用户全名、办公地点和电话号码等。
语法参数:
用法:
chfn [选项] [<用户名>]
选项:
-f, --full-name <全名> 真实姓名
-o, --office <办公> 办公号码
-p, --office-phone <电话> 办公电话
-h, --home-phone <电话> 住宅电话
使用示例:
# 交互方式
chfn root
# Changing the user information for root
# Enter the new value, or press ENTER for the default
# Full Name [root]:
# Room Number [02372799999]:
# Work Phone [02372788888]: 8618488889999
# Home Phone [18466668888]: 8618588889999
# Other [全栈工程师修炼指南]: administrator
# 命令行方式
chfn -f 全栈工程师修炼指南 -o 02372799999 -p 02372788888 -h 18466668888 weiyigeek
# 正在更改 weiyigeek 的 finger 信息。
# Finger 信息已更改。
finger 命令 - 显示用户的资料
描述:finger 命令用于显示用户信息,包括用户全名、办公地点和电话号码等。
安装命令:
# debian 系
sudo apt install finger
# RHEL 系
sudo yum install finger
使用示例:
$ finger root
# Login: root Name: root
# Directory: /root Shell: /bin/bash
# Office: 02372799999, 8618488889999 Home Phone: 8618588889999
# Last login Thu Jun 16 13:24 2022 (CST) on tty1
# No mail.
# No Plan.
adduser 命令 - 添加用户和组(alpine)
描述: adduser 来自英语 add user
该命令用于新增使用者帐号或更新预设的使用者资料, 实际上 adduser
与 useradd
指令为同一指令(经由符号连结 symbolic link)。
语法参数:
$ adduser -help
BusyBox v1.32.1 () multi-call binary.
Usage: adduser [OPTIONS] USER [GROUP]
Create new user, or add USER to GROUP
-h DIR Home directory
-g GECOS GECOS field
-s SHELL Login shell
-G GRP Group
-S Create a system user
-D Don't assign a password
-H Don't create home directory
-u UID User id
-k SKEL Skeleton directory (/etc/skel)
# 常用参数
-c 加上备注文件,备注文字会存储在 passwd 的备注参数中
-d 指定用户登录时的起始目录
-D 变更默认值
-e 设定此帐号的使用期限(格式为 YYYY-MM-DD),预设值为永久有效
-f <缓冲天数> 指定在密码过期后多少天即关闭该帐号
-g <群组> 指定用户所属的群组
-G <群组> 指定用户所属的附加群组
-m 自动建立用户的登入目录
-M 不要自动建立用户的登入目录
-n 取消建立以用户名称为名的群组
-r 建立系统帐号
-s <shell> 指定用户登入后所使用的shell
-u <uid> 指定用户ID
简单示例:
# (1) 常用用户组与用户添加
USERNAME=weiyigeek
addgroup -g 1000 -S ${USERNAME} \
&& adduser ${USERNAME} -D -g ${USERNAME} -G ${USERNAME} -u 1000 -s /bin/sh
# (2) 建立名为linuxcool的用户账号并指定有效期为2014年1月2日, 以及指定相应的用户组和家目录
adduser -e 1/2/14 -g root -d /home/weiyigeek weiyigeek
0x02 用户和组查询切换命令
whoami 命令 - 显示当前用户名
描述:显示当前shell中运行的用户,与id -un
命令效果相同,不论是Linux上,还是Windows上都支持该命令;
使用案例:
# Linux - 显示当前登录用户名
$ whoami
# 或者使用变量获取当前用户名
$ echo $USER
root
# 补充:Windows - 显示当前计算机所有的用户
whoami /all
# 同样在 windows 下采用系统变量也能看见
echo %username%
id 命令 - 显示指定用户和组信息
描述: 输出指定<用户>的用户和用户组信息或(当没有指定用户信息时)默认使用当前用户信息 。
语法参数:
id [选项]... [用户]...
# 参数
-a 忽略,仅为与其他版本相兼容而设计
-Z, --context 仅显示当前用户的安全上下文
-g, --group 仅显示有效用户组ID
-G, --groups 显示所有组ID
-n, --name 显示组名称而非数字,与 -ugG 一起使用
-r, --real 显示真实ID 而非有效ID,与 -ugG 一起使用
-u, --user 仅显示有效用户ID
-z, --zero 使用 NUL 字符而非空格来分隔各个条目,在默认格式下不可使用
使用示例
# 1.显示当前用户信息
$ id
用户id=0(root) 组id=0(root) 组=0(root) 上下文=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
# 2.只显示当前用户名称
$ id -nu
root
# 3.显示指定用户 uid、gid 和组信息
$ id root
uid=0(root) gid=0(root) groups=0(root)
$ id weiyigeek
用户id=1002(weiyigeek) 组id=1003(weiyigeek) 组=1003(weiyigeek)
# 4.显示指定用户所有组信息
$ id -G -n postfix
postfix mail
groups 命令 - 显示用户的组信息
描述:显示每个输入的用户名所在的全部组,如果没有指定用户名则默认为当前进程用户(当用户组数据库发生变更时可能导致差异)。
语法参数:
用法:groups [选项]... [用户名]..
使用示例:
# 1.显示 app 用户的主组和附属组
$ groups app
app : app adm cdrom sudo dip plugdev docker
# 2.显示 weiyigee k用户所属的组
$ groups admin
admin : admin jacker
su 命令 - 切换用户身份
描述:su (Switch User)命令,用于切换用户的身份,例如低权限用户使用su root
切换到超级管理员权限时必须使用root用户密码进行验证,当前用户身份完全切换到root账户时,便可无所顾忌的切换到其他用户,例如切换到普通用户su weiyigeek
,最后在操作完毕后,执行exit命令退出切换。
语法参数:
格式:su [选项] [-] [用户名] [命令]
# 常用参数:
-l, --login 切换到新用户后,会读取用户配置文件及更改当前工作目录为目标用户的家目录,等同于 su - 用户
-c, --command 指定要执行的命令。
示例演示:
0.使用 su 与 su - 命令切换用户的区别
# 1.以非登录模式切换用户,不会读取用户配置文件及更改当前工作目录(不完全切换)
su weiyigeek # 切换后不能采用logout退出用户 (相当于是root当前shell的子线程)
# 2.以登录式切换,会读取用户配置文件及更改当前工作目录为目标用户家目录(完全切换)
su - weiyiggek # 切换后可以采用logout退出用户
# 其次,su 切换到新用户后,可以使用 exit 命令退出当前用户,回到上一个用户,无需使用su切换回上一用户。
$ exit
$ id
# 用户id=0(root) 组id=0(root) 组=0(root) 上下文=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
1.使用 su 命令切换用户身份,并执行命令
$ site=blog.weiyigeek.top
$ su weiyigeek -c 'echo ${site}' # weiyigeek 用户没有site变量所以为空
$ su weiyigeek -c 'echo ${HOSTNAME}' # weiyigeek 用户存在变量所以不为空
mail.weiyigeek.top
$ su weiyigeek -c 'echo $(id)'
用户id=1002(weiyigeek) 组id=1003(weiyigeek) 组=1003(weiyigeek),1001(ops) 上下文=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
# 注意:“ 将会解析当前shell中的变量,并传递给子shell,而不会影响当前shell中的变量。
$ su weiyigeek -c "echo ${site}"
blog.weiyigeek.top
2.使用 su 命令切换用户身份以及shell,执行命令
$ su -s /bin/sh weiyigeek -c 'echo ${SHELL}'
/bin/sh
$ su -s /bin/sh weiyigeek -c '${SHELL}'
sh: 无法设定终端进程组(-1): 对设备不适当的 ioctl 操作
sh: 此 shell 中无任务控制
sh-5.1$ id
用户id=1002(weiyigeek) 组id=1003(weiyigeek) 组=1003(weiyigeek),1001(ops) 上下文=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
sh-5.1$
会话已终止,正在杀死 shell... ...已杀死。
3.使用
su -
命令切换用户身份,并在其家目录创建 ai-study.log 文件。
$ su - weiyigeek -c 'touch ai-study.log'
$ ls ~weiyigeek/
ai-study.log
# 还可使用 su - -s 命令指定没有bash的用户使用指定bash
[root@mail ~ 192.168.228.128 02:03]# getent passwd postfix
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@mail ~ 192.168.228.128 02:03]# su - -s /bin/bash postfix
[postfix@mail ~ 192.168.228.128 02:04]$ who
root pts/0 2024-05-26 16:06 (10.10.17.103)
4.使用
sudo
命令切换用户身份,并执行命令
$ sudo whoami
root
$ sudo -u weiyigeek "id"
用户id=1002(weiyigeek) 组id=1003(weiyigeek) 组=1003(weiyigeek),1001(ops) 上下文=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
5.补充示例
# 使用 weiyigeek 用户执行nohup命令,让作业在后台运行,并输出日志到当前目录下的system.log文件
su - weiyigeek -c nohup -c "$CASSANDRA_DIR/bin/cassandra" >> $CASSANDRA_DIR/logs/system.log 2>&1 &
newgrp 命令 - 登录到一个新组
描述: newgrp 类似于 login,当它是以相同的帐号,另一个群组名称,再次登入系统。 注意: 切换用户组时,这个命令的前提是你现在登录在WeiyiGeek下!需要用户自己执行!
语法参数: newgrp [-] [组]
使用示例:
# 1.切换master组,此时可能需要你输入Master的组密码(如果存在的话)
$ newgrp Master
# 2.将当前用户加入到docker组之后切换当前会话到新 group 或者重启 X 会话
# 则因为 groups 命令获取到的是缓存的组信息,刚添加的组信息未能生效,所以 docker images 执行时同样有错。
$ newgrp - docker
温馨提示:作者最近正在整理自己10年的工作学习笔记(涉及网络、安全、运维、开发),同时全栈系列从门到实践教程将会逐步持续同步到公众号内,若需要作者学习实践笔记的看友,可添加作者[WeiyiGeeker],当前价格¥168,除了笔记同时还可进行问题答疑和时常远程技术支持,希望大家多多支持,收获定大于付出!
至此完毕,更多技术文章,请持续关注公众号并添加星标,获取及时文章推送!
如果此篇文章对你有帮助,请你将它分享给更多的人!
学习推荐 往期文章
🔥【最新】运维Tips | 如何迁移更换LVM动态卷中数据到新PV卷?
学习资料 | 良心推荐,由 Google 团队撰写 Web 设计与开发关键知识点!
🔥【必备】网络安全攻击防护及等级保护(过保)落地实践
🚀【实战】企业云原生实践 Kubernetes 系列学习实践
🚀【实战】企业持续化集成交付 Jenkins 系列学习实践
🚀【实战】企业资源系统监控预警 Prometheus 系列学习实践
🌟【学习】运维工程师学习之路指南(从业必备)
🌟【学习】前端开发学习之路指南(从业必备)
📔【书籍】计算机科学导论学习笔记(基础知识)
关注回复【加群】邀你加入学习交流群,目前已经有许多志同道合的IT行业的朋友!
此文,为作者原创文章,希望大家多多支持,若对看友您有帮助请帮忙转发,点👍、在看,若有疑问的小伙伴,可在文末留言哟!