[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]
大家好,我是一个正在向全栈工程师(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 命令来修改用户的主要组。
![ef3360e020d2b4740a699951456ad6ff.png](https://img-blog.csdnimg.cn/img_convert/ef3360e020d2b4740a699951456ad6ff.png)
weiyigeek.top-主要组和附属组
语法参数
# 用法:
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
weiyigeek.top-gpasswd命令使用示例
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
weiyigeek.top-chpasswd命令使用示例图
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 &
weiyigeek.top-su命令使用示例
newgrp 命令 - 登录到一个新组
描述: newgrp 类似于 login,当它是以相同的帐号,另一个群组名称,再次登入系统。 注意: 切换用户组时,这个命令的前提是你现在登录在WeiyiGeek下!需要用户自己执行!
语法参数: newgrp [-] [组]
使用示例:
# 1.切换master组,此时可能需要你输入Master的组密码(如果存在的话)
$ newgrp Master
# 2.将当前用户加入到docker组之后切换当前会话到新 group 或者重启 X 会话
# 则因为 groups 命令获取到的是缓存的组信息,刚添加的组信息未能生效,所以 docker images 执行时同样有错。
$ newgrp - docker
温馨提示:作者最近正在整理自己10年的工作学习笔记(涉及网络、安全、运维、开发),同时全栈系列从门到实践教程将会逐步持续同步到公众号内,若需要作者学习实践笔记的看友,可添加作者[WeiyiGeeker],当前价格¥168,除了笔记同时还可进行问题答疑和时常远程技术支持,希望大家多多支持,收获定大于付出!
至此完毕,更多技术文章,请持续关注公众号并添加星标,获取及时文章推送!
如果此篇文章对你有帮助,请你将它分享给更多的人!
学习推荐 往期文章
关注回复【加群】邀你加入学习交流群,目前已经有许多志同道合的IT行业的朋友!
此文,为作者原创文章,希望大家多多支持,若对看友您有帮助请帮忙转发,点👍、在看,若有疑问的小伙伴,可在文末留言哟!