【小技巧】macOS 下用 dscl 命令行管理用户

大家好,我是 @tobrainto

Command-line interface to Directory Services。

在 linux 系统中我们习惯了使用 useradd,userdel,usermod 等指令进行用户管理,使用 groupadd,groupdel,groupmod 等指令进行用户组管理。

但是在 macOS 下这些指令是没有的。

所以今天分享的主题是在 macOS 下如何在命令行里进行用户组、用户管理?

macOS 下有什么命令行工具可以用来进行用户组、用户管理的呢,它就是今天的主角 dscl 。

一、dscl 简介

dscl 是一个目录服务的命令行,用来创建、读取和管理目录服务数据。它还提供了基本的编辑器命令,如列表、搜索、创建、读取、追加、合并、更改和删除。

我们可以认为它是存储访问OS X用户授权数据的工具。

在没有任何命令的情况下调用,dscl 将以交互模式运行,从标准输入读取命令。

进入 dscl

在终端内输入dscl . 即可进入本机的 dscl 。

$ dscl .
> 

退出 dscl

进入 dscl 后输入 q 或者 exit 即可退出 dscl 。

$ dscl .
 > q
Goodbye
$ dscl .
 > exit
Goodbye

dscl 所支持的指令集

$ 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 中所有的数据目录

$ 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

二、管理用户

获取所有用户列表

$ dscl .
# 进入用户的数据目录
> cd Users/
/Users >ls
...
yeah
nobody
root
...

也可以直接使用下面的指令

$ dscl . -ls /Users

ls 前的"-"是可以省去的,同样其他指令也是一样的,下面的演示中,将不会在给出具体指令前的"-"。

创建一个用户

使用 dscl/Users 数据目录下,创建一个用户的实例,我们可以设置它的 uid、 gid、 shell、realname、home 目录。

创建一个名为 yeah 的用户并设置用户的 uid 为 8888。

# sudo dscl . create /Users/yeah UniqueID 8888
$ sudo dscl . create /Users/yeah uid 8888

gid该字段必须设置,如果不设置在更改文件宿主为该用户时会报 illegal user name 错误。

因此你需要先跳到『管理用户组』的部分,参考用户组创建的命令先创建一个用户组,这里我们已经提前创建好了一个 gid 为 6666 名称同样也为 yeah 的用户组。

准备好用户组之后我们来设置用户的 gid。

# sudo dscl . create /Users/yeah PrimaryGroupID 6666
$ sudo dscl . create /Users/yeah gid 6666

创建并设置用户所使用的 shell,如果 shell 不进行设置则用户在终端中将会无法使用。

# sudo dscl . create /Users/yeah UserShell  /bin/bash
$ sudo dscl . create /Users/yeah shell /bin/bash

创建并设置用户的 realname

$ sudo dscl . create /Users/yeah realname "coding yeah"

设置用户的初始密码为空

# '*' 表示空密码
# sudo dscl . create /Groups/yeah passwd \*
$ sudo dscl . create /Groups/yeah passwd '*'

修改用户的密码

$ sudo passwd yeah
Changing password for yeah.
New password: ********
Retype new password: ********

创建或者指定用户的 home 目录

dscl在创建用户的时候并不会自动为用户创建 home 目录,因此需要我们为用户创建 home 目录。

$ sudo  mkdir /Users/yeah

在用户 yeah 已经有所属的用户组的前提下,使用 chown 指令设定 /Users/yeah 目录以及其子目录的宿主为用户 yeah

$ sudo chown -R yeah:yeah /Users/yeah

这样新目录 /Users/yeah 的以及其目录的宿主就变成了用户 yeah

声明用户的 home 目录

# sudo dscl . create /Users/yeah NFSHomeDirectory /Users/yeah
$ sudo dscl . create /Users/yeah home /Users/yeah

这样用户 yeah 就可以以 /Users/yeah 为 home 目录进行工作了。

授予用户管理员权限

为了授予用户管理员权限,我们只需要把用户加入到 admin(/Groups/admin) 用户组即可,这样用户就具有了 sudo 权限。

$ sudo dscl . merge /Groups/admin users yeah

修改用户

我们可以使用 dsclcreate指令来添加或者修改用户的属性。

$ sudo dscl . create /Users/yeah shell /bin/zsh

比如我们可以用上面的指令来修改用户的 shell 为 zsh。

获取用户的指定属性

# 查看用户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

删除用户

我们可以使用 dscldelete指令来删除用户。

$ sudo dscl . delete /Users/yeah

上面的指令可以删除用户 yeah 的所有属性。但是需要说明的是用户的 home 目录需要手动删除,用户所属的组也需要额外删除。

三、管理用户组

获取所有用户组列表

使用 dscl 进入 /Groups 数据目录并列出所有用户组。

$ dscl .
> cd /Groups/
/Groups > ls
_amavisd
_appowner
_appserveradm
_appserverusr
...

也可以直接使用下面的指令

$ dscl . ls /Groups

创建用户组

使用 dscl 创建用户组,我们需要在dscl/Groups目录下创建一个目录,同时设置它的 gid 属性。

# sudo dscl . create /Groups/yeah PrimaryGroupID 6666
$ sudo dscl . create /Groups/yeah gid 6666

创建用户组 yeah 并设置用户组 yeah 的用户组 ID 为6666,上面的三种方式是等效的。

给用户组添加用户

# 多次执行会被添加多次
# sudo dscl . append /Groups/yeah GroupMembership yeah
# 多次执行会被添加多次
$ sudo dscl . merge /Groups/yeah users yeah

删除指定组内的指定用户

从 yeah 用户组内删除用户 yeah

sudo dscl . delete /Groups/yeah GroupMembership yeah

删除用户组

$ sudo dscl . delete /Groups/yeah

使用上面的指令将在dscl中删除/Groups/yeah目录下的所有信息,我们要谨慎使用。

获取用户组的指定属性

# 查看用户组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 如何基于命令行进行用户以及用户组的管理的知识,希望对你有帮助。

如果你没时间详细的了解,那么你只需要看下下面的这些就可以了。

创建用户资源

# 创建组
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

查看用户信息

$ 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

清除用户资源

# 清除用户
$ sudo dscl . delete /Groups/yeah
# 清除用户组
$ sudo dscl . delete /Users/yeah
# 删除用户home目录
$ sudo rm -rf /Users/yeah

另外 dscl 同样支持对远程机器上的用户以及用户组的管理,但是我们基本上用不到,所以这里就不做介绍,感兴趣的同学可以自己去尝试一下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容