在 linux 系统中我们习惯了使用 useradd,userdel,usermod 等指令进行用户管理,使用 groupadd,groupdel,groupmod 等指令进行用户组管理。
但是在 macOS 下这些指令是没有的。
所以今天分享的主题是在 macOS 下如何在命令行里进行用户组、用户管理?
macOS 下有什么命令行工具可以用来进行用户组、用户管理的呢,它就是今天的主角 dscl 。
一、dscl 简介
dscl 是一个目录服务的命令行,用来创建、读取和管理目录服务数据。它还提供了基本的编辑器命令,如列表、搜索、创建、读取、追加、合并、更改和删除。
我们可以认为它是存储访问OS X用户授权数据的工具。
在没有任何命令的情况下调用,dscl 将以交互模式运行,从标准输入读取命令。
进入 dscl
在终端内输入dscl .
即可进入本机的 dscl 。
退出 dscl
进入 dscl 后输入 q 或者 exit 即可退出 dscl 。
1 2 3 4 5 6
| $ dscl . > q Goodbye $ dscl . > exit Goodbye
|
dscl 所支持的指令集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| $ dscl . > help dscl (v11.2) usage: dscl [options] [<datasource> [<command>]] datasource: localhost (default) or localonly (activates a DirectoryService daemon process with Local node only - daemon quits after use <hostname> (requires DS proxy support, >= DS-158) or <nodename> (Directory Service style node name) or <domainname> (NetInfo style domain name) options: -u <user> authenticate as user (required when using DS Proxy) -P <password> authentication password -p prompt for password -f <filepath> targeted file path for DS daemon running in localonly mode (example: /Volumes/Build100/var/db/dslocal/nodes/Default) (NOTE: Nodename to use is fixed at /Local/Target) -raw don't strip off prefix from DS constants -plist print out record(s) or attribute(s) in XML plist format -url print record attribute values in URL-style encoding -q quiet - no interactive prompt commands: -read <path> [<key>...] -readall <path> [<key>...] -readpl <path> <key> <plist path> -readpli <path> <key> <value index> <plist path> -create <record path> [<key> [<val>...]] -createpl <record path> <key> <plist path> <val1> [<val2>...] -createpli <record path> <key> <value index> <plist path> <val1> [<val2>...] -delete <path> [<key> [<val>...]] -deletepl <record path> <key> <plist path> [<val>...] -deletepli <record path> <key> <value index> <plist path> [<val>...] -list <path> [<key>] -append <record path> <key> <val>... -merge <record path> <key> <val>... -change <record path> <key> <old value> <new value> -changei <record path> <key> <value index> <new value> -diff <first path> <second path> -search <path> <key> <val> -auth [<user> [<password>]] -authonly [<user> [<password>]] -passwd <user path> [<new password> | <old password> <new password>]
MCX Extensions: -mcxread <record path> [optArgs] [<appDomain> [<keyName>]] -mcxset <record path> [optArgs] <appDomain> <keyName> [<mcxDomain> [<keyValue>]] -mcxedit <record path> [optArgs] <appDomain> <keyPath> [<keyValue>] -mcxdelete <record path> [optArgs] [<appDomain> [<keyName>]] -mcxdeleteall <record path> [optArgs] [<appDomain> [<keyName>]] -mcxexport <record path> [optArgs] [<appDomain> [<keyName>]] -mcximport <record path> [optArgs] <file path> -mcxhelp >
|
列出 dscl 中所有的数据目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| $ dscl . > ls AFPUserAliases Aliases Automount AutomountMap ComputerGroups ComputerLists Computers Config Ethernets Groups Hosts Mounts NetGroups Networks People PresetComputerGroups PresetComputerLists PresetComputers PresetGroups PresetUsers Protocols Services SharePoints Users
|
二、管理用户
获取所有用户列表
1 2 3 4 5 6 7 8 9
| $ dscl . # 进入用户的数据目录 > cd Users/ /Users >ls ... yeah nobody root ...
|
也可以直接使用下面的指令
ls
*前的”-“是可以省去的,同样其他指令也是一样的,下面的演示中,将不会在给出具体指令前的”-“。*
创建一个用户
使用 dscl
在 /Users
数据目录下,创建一个用户的实例,我们可以设置它的 uid、 gid、 shell、realname、home 目录。
创建一个名为 yeah 的用户并设置用户的的 uid 为 8888。
1 2
| # sudo dscl . create /Users/yeah UniqueID 8888 $ sudo dscl . create /Users/yeah uid 8888
|
gid该字段必须设置,如果不设置在更改文件宿主为该用户时会报 illegal user name
错误。
因此你需要先跳到『管理用户组』的部分,参考用户组创建的命令先创建一个用户组,这里我们已经提前创建好了一个 gid 为 6666 名称同样也为 yeah 的用户组。
准备好用户组之后我们来设置用户的 gid。
1 2
| # sudo dscl . create /Users/yeah PrimaryGroupID 6666 $ sudo dscl . create /Users/yeah gid 6666
|
创建并设置用户所使用的 shell,如果 shell 不进行设置则用户在终端中将会无法使用。
1 2
| # sudo dscl . create /Users/yeah UserShell /bin/bash $ sudo dscl . create /Users/yeah shell /bin/bash
|
创建并设置用户的 realname
1
| $ sudo dscl . create /Users/yeah realname "coding yeah"
|
设置用户的初始密码为空
1 2 3
| # '*' 表示空密码 # sudo dscl . create /Groups/yeah passwd \* $ sudo dscl . create /Groups/yeah passwd '*'
|
修改用户的密码
1 2 3 4
| $ sudo passwd yeah Changing password for yeah. New password: ******** Retype new password: ********
|
创建或者指定用户的 home 目录
dscl
在创建用户的时候并不会自动为用户创建 home 目录,因此需要我们为用户创建 home 目录。
1
| $ sudo mkdir /Users/yeah
|
在用户 yeah 已经有所属的用户组的前提下,使用 chown
指令设定 /Users/yeah
目录以及其子目录的宿主为用户 yeah
1
| $ sudo chown -R yeah:yeah /Users/yeah
|
这样新目录 /Users/yeah
的以及其目录的宿主就变成了用户 yeah
声明用户的 home 目录
1 2
| # sudo dscl . create /Users/yeah NFSHomeDirectory /Users/yeah $ sudo dscl . create /Users/yeah home /Users/yeah
|
这样用户 yeah 就可以以 /Users/yeah
为 home 目录进行工作了。
授予用户管理员权限
为了授予用户管理员权限,我们只需要把用户加入到 admin(/Groups/admin)
用户组即可,这样用户就具有了 sudo 权限。
1
| $ sudo dscl . merge /Groups/admin users yeah
|
修改用户
我们可以使用 dscl
的 create
指令来添加或者修改用户的属性。
1
| $ sudo dscl . create /Users/yeah shell /bin/zsh
|
比如我们可以用上面的指令来修改用户的 shell 为 zsh。
获取用户的指定属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| # 查看用户yeah的所有属性 $ dscl . read /Users/yeah ... NFSHomeDirectory: /Users/yeah Password: ******** PrimaryGroupID: 6666 RealName: coding yeah RecordName: yeah RecordType: dsRecTypeStandard:Users UniqueID: 8888 UserShell: /bin/zsh
# 查看用户yeah的组ID和用户ID $ dscl . read /Users/yeah PrimaryGroupID UniqueID PrimaryGroupID: 6666 UniqueID: 8888
# 列出所有用户的的组ID $ dscl . list /Users PrimaryGroupID # 列出所有用户的ID $ dscl . list /Users UniqueID
|
删除用户
我们可以使用 dscl
的 delete
指令来删除用户。
1
| $ sudo dscl . delete /Users/yeah
|
上面的指令可以删除用户 yeah 的所有属性。但是需要说明的是用户的 home 目录需要手动删除,用户所属的组也需要额外删除。
三、管理用户组
获取所有用户组列表
使用 dscl
进入 /Groups
数据目录并列出所有用户组。
1 2 3 4 5 6 7 8
| $ dscl . > cd /Groups/ /Groups > ls _amavisd _appowner _appserveradm _appserverusr ...
|
也可以直接使用下面的指令
创建用户组
使用 dscl
创建用户组,我们需要在dscl
的/Groups
目录下创建一个目录,同时设置它的 gid 属性。
1 2
| # sudo dscl . create /Groups/yeah PrimaryGroupID 6666 $ sudo dscl . create /Groups/yeah gid 6666
|
创建用户组 yeah 并设置用户组 yeah 的用户组 ID 为6666,上面的三种方式是等效的。
给用户组添加用户
1 2 3 4
| # 多次执行会被添加多次 # sudo dscl . append /Groups/yeah GroupMembership yeah # 多次执行会被添加多次 $ sudo dscl . merge /Groups/yeah users yeah
|
删除指定组内的指定用户
从 yeah 用户组内删除用户 yeah
1
| sudo dscl . delete /Groups/yeah GroupMembership yeah
|
删除用户组
1
| $ sudo dscl . delete /Groups/yeah
|
使用上面的指令将在dscl
中删除/Groups/yeah
目录下的所有信息,我们要谨慎使用。
获取用户组的指定属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| # 查看用户组yeah的所有属性 $ dscl . read /Groups/yeah AppleMetaNodeLocation: /Local/Default GroupMembership: yeah PrimaryGroupID: 6666 RecordName: yeah RecordType: dsRecTypeStandard:Groups
# 查看用户yeah的组ID和组内用户 $ dscl . read /Groups/yeah PrimaryGroupID GroupMembership GroupMembership: yeah PrimaryGroupID: 6666
# 列出所有用组的组ID $ dscl . list /Groups PrimaryGroupID # 列出所有用组的组内用户 $ dscl . list /Groups GroupMembership
|
四、总结
好了今天的分享就到这里啦,主要是分享 macOS 如何基于命令行进行用户以及用户组的管理的知识,希望对你有帮助。
如果你没时间详细的了解,那么你只需要了解下面的这些就可以了。
创建用户资源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| # 创建组 sudo dscl . create /Groups/yeah gid 6666 # 创建用户 sudo dscl . create /Users/yeah uid 8888 sudo dscl . create /Users/yeah gid 6666 sudo dscl . create /Users/yeah shell /bin/bash # 修改用户的密码 sudo passwd yeah # 创建用户的home目录 sudo mkdir /Users/yeah # 用户的home目录宿主 sudo chown -R yeah:yeah /Users/yeah # 声明用户的home目录 sudo dscl . create /Users/yeah home /Users/yeah # 把用户添加到用户组内 sudo dscl . merge /Groups/admin users yeah
|
查看用户信息
1 2 3 4 5 6 7 8 9 10 11
| $ dscl . read /Users/yeah ... AppleMetaNodeLocation: /Local/Default GeneratedUID: xxxxxx NFSHomeDirectory: /Users/yeah Password: ******** PrimaryGroupID: 6666 RecordName: yeah RecordType: dsRecTypeStandard:Users UniqueID: 8888 UserShell: /bin/bash
|
清除用户资源
1 2 3 4 5 6
| # 清除用户 $ sudo dscl . delete /Groups/yeah # 清除用户组 $ sudo dscl . delete /Users/yeah # 删除用户home目录 $ sudo rm -rf /Users/yeah
|
以上如果你看了觉得对你有帮助,就给
@tobrainto
点个赞,分享给你身边的人,让我们之间的”猿粪”传递下去,这样 @tobrainto 也有更新下去的动力。
另外 dscl 同样支持对远程机器上的用户以及用户组的管理,但是我们基本上用不到,所以这里就不做介绍,感兴趣的同学可以自己去尝试一下。