相关命令

本文最后更新于:2023年12月5日 晚上

getent

用来察看系统的数据库中的相关记录,系统数据库包括:ahosts、ahostsv4、ahostsv6、aliases、ethers、group、gshadow、hosts、initgroups、netgroup、networks、passwd、protocols、rpc、services、shadow

getent 通过 key 查询整条数据,当然,一条数据并非只能对应一个 key,例如 passwd,一条数据的 key 可以是用户名, 也可以是 UID

getent database [key ...]
# 查询passwd
[root@centos7 ~]# getent passwd lujinkai
lujinkai:x:1000:1000:lujinkai:/home/lujinkai:/bin/bash
[root@centos7 ~]# getent passwd 1000
lujinkai:x:1000:1000:lujinkai:/home/lujinkai:/bin/bash
# 查询shadow
[root@centos7 ~]# getent shadow lujinkai
lujinkai:$6$Kmenu.bK$sIXTEMYHCL9QJ9ZLEmkeybfF6NV3p6l2m3G1SLFSgomaDOPArKcbZuUHgIunOXjMqfJ48KYbW76YvEgg1hcXs0:18475:0:99999:7:::

vipw \ vigr \ pwck \ grpck

尽量不要直接修改/etc/passwd/etc/group/etc/shadow/etc/gshadow 这四个文件

vipw 可以用来编辑/etc/passwdvigr可以用来编辑/etc/group,它俩都有语法检查功能

pwck用来验证/etc/passwd/etc/shadow的内容和格式的完整性,grpck用于验证组文件的完整性

虽然用这四个命令会比直接使用 vim 修改这四个文件更安全,但是也不推荐使用,了解即可

推荐使用:useradd、groupadd、chage 等命令,当然本质还是修改这四个文件

useradd

用户创建,useradd 等于 adduser

useradd [options] LOGIN
-u, --uid UID                              # 指定uid, 不过不加-o参数, 指定的uid必须是唯一非负整数
-o, --non-unique                           # 配合-u选项, 不检查UID的唯一性
-g, --gid GROUP                            # 指定用户所属基本组, 可以是组名, 也可以是GID
-c, --comment COMMENT                      # 用户的的注释, 要简短一些
-s, --shell SHELL                          # 指定用户的默认shell, 可从/etc/shells中选择, 如果是给服务用, 指定/sbin/nologin
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]] # 指定用户的附加组, 组须是已存在的
-N, --no-user-group                        # 不创建私用组作为主组, 使用users组做主组
-r, --system                               # 创建系统用户 centos6之前: UID < 500, centos7之后: UID < 1000,使用这个参数, 不会自动创建家目录和邮件目录
-d, --home-dir HOME_DIR                    # 指定用户的家目录
-m, --create-home                          # 创建家目录, 用于系统用户
-M, --no-create-home                       # 不创建家目录, 用于非系统用户
-p, --password PASSWORD                    # 指定密码, 必须是加密过后的

创建用户相关文件

/etc/default/useradd
/etc/skel/
/etc/login.defs

useradd 命令默认值设置在 /etc/default/useradd

# useradd defaults file
GROUP=100   # 如果useradd没有指定组,并且/etc/login.defs中的USERGROUPS_ENAB为no或者useradd使用了-N选项时,此时该参数生效。
HOME=/home  # 家目录放在此目录下
INACTIVE=-1 # 对应/etc/shadow文件第7列, 即用户密码过期的宽限期, -1表示不过期
EXPIRE=     # 对应/etc/shadow文件第8列,即用户账号的有效期, 不设置表示不启用
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

/etc/skel/ 是模板目录,骨架目录。每新建一个用户的家目录,就会把/etc/skel/下的文件拷贝一份到家目录下。

[root@centos7 skel]# ls -lia /etc/skel/
total 24
134321114 drwxr-xr-x.  2 root root   62 Jul 29 17:08 .
134320193 drwxr-xr-x. 73 root root 8192 Aug  1 17:49 ..
134360296 -rw-r--r--.  1 root root   18 Apr  1 10:17 .bash_logout
134360297 -rw-r--r--.  1 root root  193 Apr  1 10:17 .bash_profile
134360298 -rw-r--r--.  1 root root  231 Apr  1 10:17 .bashrc

/etc/login.defs 配合 /etc/passwd/etc/shadow 来对用户进行一些限制 但是优先级低于 /etc/passwd/etc/shadow

如果有冲突的地方,系统会以 /etc/passwd/etc/shadow 为准

[root@centos7 skel]# egrep -v '^[ ]*$|^#' /etc/login.defs
MAIL_DIR        /var/spool/mail
PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7
UID_MIN                  1000
UID_MAX                 60000
SYS_UID_MIN               201
SYS_UID_MAX               999
GID_MIN                  1000
GID_MAX                 60000
SYS_GID_MIN               201
SYS_GID_MAX               999
CREATE_HOME     yes
UMASK           077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512

newusers

批量创建用户

newusers passwd 用户文件

用户文件:指定包含用户信息的文本文件,文件格式要与 /etc/passwd 相同

chpasswd

批量修改用户密码

echo username:passwd | chpasswd

生成密码:

  • CentOS 6

    # grub-crypt 是centos6中的命令, 可以对口令进行加密, 默认加密方式是 sha-512
    [root@centos6 ~]# grub-crypt --help
    Usage: grub-crypt [OPTION]...
    Encrypt a password.
    
      -h, --help              Print this message and exit
      -v, --version           Print the version information and exit
      --md5                   Use MD5 to encrypt the password
      --sha-256               Use SHA-256 to encrypt the password
      --sha-512               Use SHA-512 to encrypt the password (default)
    
    Report bugs to <bug-grub@gnu.org>.
    EOF
    [root@centos6 ~]# grub-crypt
    Password:
    Retype password:
    $6$O4ufCj1vTKW/7Ko7$p9rV3m0dsEsr0ebCyOVN.togh1fVhQCCDBsoc.RkelfWnRrIm3W5vVPuB86oOKo1Yei0QKxO2MRMoX2qzHV7M1
    [root@centos6 ~]# useradd -p '$6$O4ufCj1vTKW/7Ko7$p9rV3m0dsEsr0ebCyOVN.togh1fVhQCCDBsoc.RkelfWnRrIm3W5vVPuB86oOKo1Yei0QKxO2MRMoX2qzHV7M1' test
    [root@centos6 ~]# getent shadow test
    test:$6$O4ufCj1vTKW/7Ko7$p9rV3m0dsEsr0ebCyOVN.togh1fVhQCCDBsoc.RkelfWnRrIm3W5vVPuB86oOKo1Yei0QKxO2MRMoX2qzHV7M1:18475:0:99999:7:::
  • CentOS 7

    # CentOS 7中没有直接命令能加密sha-512口令, 可以使用python
    [root@centos7 ~]#python -c 'import
    crypt,getpass;pw="magedu";print(crypt.crypt(pw))'
    $6$pt0SFMf6YqKea3mh$.7Hkslg17uI.Wu7BcMJStVVtkzrwktXrOC8DxcMFC4JO1igrqR7VAi87H5PH
    OuLTUEjl7eJqKUhMT1e9ixojn1
  • CentOS 8

    # -6 表示sha-512加密方式, CentOS7中只有-1(md5)加密方式
    [root@centos8 ~]# whatis passwd
    openssl-passwd (1ssl) - compute password hashes
    passwd (1)           - update user's authentication tokens
    passwd (5)           - password file
    [root@centos8 ~]# man openssl-passwd
    [root@centos8 ~]# openssl passwd -6 123456
    $6$vQQo/2Ie/NqmeTqp$o6kCsDtZwNtW7rLh/LEk8yA26sYW4Kmja7uk/pLp..cNe77btZf3tRxeqtSwgoGKzc5GgXJT9NIpXNShQ9L7r0
  • Ubuntu

    [root@ubuntu1804 ~]#echo wang:centos |chpasswd
    [root@ubuntu1804 ~]#passwd wang <<EOF
    > centos
    > centos
    > EOF
    Enter new UNIX password: Retype new UNIX password: passwd: password updated
    successfully
    [root@ubuntu1804 ~]#echo -e 'magedu\nmagedu' | passwd wang
    Enter new UNIX password: Retype new UNIX password: passwd: password updated
    successfully

usermod

修改用户属性,不过用户一旦创建完了,很少会再修改,所以这个命令几乎不用

usermod [OPTION] login

-u UID                        # 新UID
-g GID                        # 新主组
-G GROUP1[,GROUP2,...[,GROUPN]]] # 新附加组,原来的附加组将会被覆盖;若保留原有,则要同时使用-a选项
-s SHELL                      # 新的默认SHELL
-c 'COMMENT'                  # 新的注释信息
-d HOME                       # 新家目录不会自动创建,若要创建新家目录并移动原家数据,同时使用-m选项
-l login_name                 # 新的名字
-L                            # lock指定用户,在/etc/shadow 密码栏的增加 !
-U                            # unlock指定用户,将 /etc/shadow 密码栏的 ! 拿掉
-e YYYY-MM-DD                 # 指明用户账号过期日期
-f INACTIVE                   # 设定非活动期限,即宽限期

userdel

删除用户

userdel [OPTIONS]... Login

-f --force    # 强制
-r --remove   # 删除用户家目录和邮箱

id

查看用户相关 ID 信息

id [OPTION]... [USER]

-u   #
-g   #
-G   #

# 示例
[root@centos8 ~]# id -u
0
[root@centos8 ~]# id -u lujinkai
1000

su

su:switch user,切换用户

两种切换的方式:

  • su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换
  • su - UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换

注意:su 切换新用户后,使用 exit 退回至旧的用户,而不要再用 su 切换至旧用户,否则会生成很多的 bash 子进程,环境可能会混乱

passwd

修改用户密码

passwd [OPTIONS] UserName
-d:删除指定用户密码
-l:锁定指定用户
-u:解锁指定用户
-e:强制用户下次登录修改密码
-f:强制操作
-n mindays:指定最短使用期限
-x maxdays:最大使用期限
-w warndays:提前多少天开始警告
-i inactivedays:非活动期限
--stdin:从标准输入接收用户密码,Ubuntu无此选项

chage

修改用户密码策略

chage [OPTION]... LOGIN
-d LAST_DAY #更改密码的时间
-m --mindays MIN_DAYS
-M --maxdays MAX_DAYS
-W --warndays WARN_DAYS
-I --inactive INACTIVE #密码过期后的宽限期
-E --expiredate EXPIRE_DATE #用户的有效期
-l 显示密码策略

其他命令

  • chfn 指定个人信息,这个命令修改的是/etc/passwd 的第 5 个字段
  • chsh 指定 shell,相当于 usermod -s
  • flnger 可以查看用户个人信息

这几个命令用的不多,了解即可,flnger 命令在 CentOS8 中已经没有了

groupadd

创建组,groupadd 等于 addgroup

groupadd [OPTIONS]... group_name
  • -g GID : 指明 GID
  • -r : 创建系统组, CentOS 6 之前: ID<500,CentOS 7 以后: ID<1000

范例: groupadd -g 48 -r apache

groupmod

修改组

groupmod 修改组的属性, 用的不多

groupmod [OPTIONS]... group
  • -n group_name : 新名字
  • -g GID : 新 GID

groupdel

删除组

groupdel [options] GROUP

只有当组下没有用户后, 才能删除成功

gpasswd

gpasswd 命令,可以更改组密码,也可以添加删除附加组成员

gpasswd [OPTIONS] GROUP
-a user                    # 将user添加到指定组中
-d user                    # 从指定附加组中移除用户user
-M user1,user2,user3...    # 设置组成员列表, 会覆盖已有的组成员列表
-A user1, user2, user3 ... # 设置有组管理员列表

# 设置管理员的之前, 这些用户必须已经在组内了, 管理员有权限往组内添加用户

newgrp

临时切换主组,把用户的主组临时切换到附加组

这个命令用的不多,了解一下就行

groupmems

更改和查看组成员,管理附加组的成员关系(只有 root 用户可以执行这个命令)

groupmems [options] [action]

-g, --group groupname #更改为指定组 (只有root)
-a, --add username    #指定用户加入组
-d, --delete username #从组中删除用户
-p, --purge           #从组中清除所有成员
-l, --list            #显示组成员列表

示例:

[root@centos7 ~]# getent group lujinkai
lujinkai:x:1000:lujinkai
[root@centos7 ~]# groupmems -g lujinkai -a test
[root@centos7 ~]# getent group lujinkai
lujinkai:x:1000:lujinkai,test
[root@centos7 ~]# groupmems -g lujinkai -l
lujinkai  test
[root@centos7 ~]# groupmems -g lujinkai -d test
[root@centos7 ~]# getent group lujinkai
lujinkai:x:1000:lujinkai
[root@centos7 ~]# groupmems -g lujinkai -p
[root@centos7 ~]# getent group lujinkai
lujinkai:x:1000:

groups

查看用户所属组的列表

# test用户所属的组有两个 test 和 lujinkai, test是主组 lujinkai是附加组
[root@centos7 ~]# groups test
test : test lujinkai

练习

1.创建用户 gentoo,附加组为 bin 和 root,默认 shell 为/bin/csh,注释信息为”Gentoo Distribution”

[root@centos7 ~]# useradd gentoo -G bin,root -s /bin/csh -c "Gentoo Distribution"
[root@centos7 ~]# getent passwd gentoo
gentoo:x:1003:1003:Gentoo Distribution:/home/gentoo:/bin/csh
[root@centos7 ~]# groups gentoo
gentoo : gentoo root bin

2.创建下面的用户、组和组成员关系:
名字为 webs 的组
用户 nginx,使用 webs 作为附加组
用户 varnish,使用 webs 作为附加组
用户 mysql,不可交互登录系统,且不是 webs 的成员,nginx,varnish,mysql 密码都是 magedu


相关命令
http://blog.lujinkai.cn/运维/基础/用户和组/相关命令/
作者
像方便面一样的男子
发布于
2021年2月4日
更新于
2023年12月5日
许可协议