Linux 命令 | 运维必学,用户和组管理命令实践集锦

1e85b6909f4098064e01af93fe43b6c2.jpeg

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]

大家好,我是一个正在向全栈工程师(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系统中针对用户和组的实践操作命令,希望对大家有所帮助!

4dcf06d2a52195a0096c364568048e44.jpeg


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

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

134b6b75d843b9c0c73e0a271e07b30f.png

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

17b38071a7d93467a0a279ec1b5a34dd.png

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.defsPASS_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 该命令用于新增使用者帐号或更新预设的使用者资料, 实际上 adduseruseradd 指令为同一指令(经由符号连结 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 &

1534a94db56dceb6823cfbec517ae9ee.png

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,除了笔记同时还可进行问题答疑和时常远程技术支持,希望大家多多支持,收获定大于付出!

1c8954fc3af99b57f88b3bb9cf3ad90e.png

至此完毕,更多技术文章,请持续关注公众号并添加星标,获取及时文章推送!


如果此篇文章对你有帮助,请你将它分享给更多的人! 

70a45a96076e7986c4274d5d7887b49a.gif

8cf604af95bf0064c26abf12c81f021a.png 学习推荐 往期文章 59dd7cac05abc57c6062ffbd3dadc3a9.png

80bb38f46141449f8485e3f360716d2d.gif

关注回复【加群】邀你加入学习交流群,目前已经有许多志同道合的IT行业的朋友!

1bb87857010cd6f06c58858d4a8fcfee.gif

8816ec6b4d311a9cd2acecc626868836.gif

此文,为作者原创文章,希望大家多多支持,若对看友您有帮助请帮忙转发,点👍、在看,若有疑问的小伙伴,可在文末留言哟!

 

  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈工程师修炼指南

原创不易,赞赏鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值