macOS 下使用命令行进行用户(组)管理,就是这么简单! dscl 你很有必要了解一下!!

大家好,我是@小猿来也...
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
修改用户
我们可以使用 dscl 的 create指令来添加或者修改用户的属性。
$ 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
删除用户
我们可以使用 dscl 的 delete指令来删除用户。
$ 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/jenkins PrimaryGroupID GroupMembership
GroupMembership: jenkins
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 同样支持对远程机器上的用户以及用户组的管理,但是我们基本上用不到,所以这里就不做介绍,感兴趣的同学可以自己去尝试一下。
macOS 下使用命令行进行用户(组)管理,就是这么简单! dscl 你很有必要了解一下!!的更多相关文章
- 使用MySQL命令行新建用户并授予权限的方法
MySQL命令行能否实现新建用户呢?答案无疑是肯定的.而且在使用使用MySQL命令行新建用户后,还可以为用户授予权限. 首先要声明一下:一般情况下,修改MySQL密码,授权,是需要有mysql里的ro ...
- 深蓝词库转换2.5发布——支持微软五笔,支持Linux和macOS和更多命令行功能
最近利用晚上的时间,对很久没有新版本发布的深蓝词库转换进行了版本升级.本次升级主要包含的功能包括: 一.支持Win10自带的微软五笔输入法用户自定义短语的导入导出. 1.在转换输入法词库列表中选择“W ...
- PLSQL命令行创建用户 以及 JDBC简单操作
目录 PLSQL Developer命令行创建用户以及表 课堂要点 JDBC 主外键约束 踩坑之路 设置ORACLE_HOME环境变量 PLSQL Developer命令行创建用户以及表 打开Co ...
- 在Linux下使用命令行打印文件
近期需要将数学笔记打印出来复习,才发现Linux KDE环境下的默认PDF软件Okular根本无法将我在GoodNotes B5大小的页面写下的内容自适应地放大到A4纸上,只能以页面的原始尺寸打印.然 ...
- [Java] 实现一个基于命令行的用户管理
实现基于一个命令行的用户管理,控制台操作 控制类 /* * 文 件 名: mvc.my.test.UserInterface.java * 版 权: XXX Technologies Co., Ltd ...
- windows下cmd命令行显示UTF8字符设置(CHCP命令)
本文由 www.169it.com 收集整理 在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容.在默认情况下 ...
- Tools - Windows系统下的命令行工具Cmder
cmder简介 官网:http://cmder.net/ GitHub:https://github.com/cmderdev/cmder Cmder是一个windows下的命令行工具,用来替代win ...
- Linux下useradd命令创建的用户不能登录的问题
Linux下useradd命令创建的用户不能登录的问题 问题: 用useradd命令新创建一个用户tester 密码pwdtest mkdir -p /home/tester(创建文件夹) user ...
- CentOS 6.5 下利用命令行截图及设置快捷键截图
CentOS 6.5 下利用命令行截图及设置快捷键截图 1.利用命令模式 捕获整个屏幕 : $ gnome-screenshot 截完屏之后我们可以设置自定义图片存储位置,如图: 捕获当前终端Term ...
随机推荐
- Day008 下标越界及小结
数组的四个基本特点 其长度是确定的.数组一旦被创建,它的大小就是不可以改变的. 其元素必须是相同类型,不允许出现混合类型. 数组中的元素可以是任何数据类型,包括基本类型和引用类型. 数组变量属于引用类 ...
- java之泛型的使用
在java中,普通的类和方法只能用具体的类型,这对代码的限制很大,代码的可重用性大大降低. 那么如何才能让同一个类和方法使用不同类型的对象呢?在接触泛型之前我们可能会想到通过类型转换的方法来实现. p ...
- 【ECharts】报表联动,动态数据设计
说明: 数据没有拉取后台数据,仅仅前端模拟数据,Copy即可有效果.联动后台时,使用异步获取数据即可.鼠标点击,动态展示点击项的数据.有关更多实例,请移步到echarts官网查看. 成果展示: 相关代 ...
- ConcurrentHashMap源码解读二
接下来就讲解put里面的三个方法,分别是 1.数组初始化方法initTable() 2.线程协助扩容方法helpTransfer() 3.计数方法addCount() 首先是数组初始化,再将源码之前, ...
- springboot国际化与@valid国际化支持
springboot国际化 springboot对国际化的支持还是很好的,要实现国际化还简单.主要流程是通过配置springboot的LocaleResolver解析器,当请求打到springboot ...
- @Aspect 注解使用详解
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点, ...
- Linux下script命令录制、回放和共享终端操作script -t 2> timing.log -a output.session # 开始录制
Linux下script命令录制.回放和共享终端操作 [日期:2018-09-04] 来源:cnblogs.com/f-ck-need-u 作者:骏马金龙 [字体:大 中 小] 另一篇终端会话共 ...
- tuple必须加上逗号
tuple支持 空 元组 不加逗号 >>> tup4 = () tuple非空的元组必须加上逗号>>> tup4 = (55,)>>> tup4 ...
- linux动态链接库和静态链接库
Linux下静态链接库与动态链接库的区别 引言 通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件 (object file)与牵涉到的函数库(librar ...
- 技术干货 | 如何在 Library 中使用/依赖 mPaaS?
使用场景 在使用 mPaaS 框架过程中,有时需要复用模块.复用时需要按照使用 Module 依赖的方式添加模块.本文以将复用 mPaaS 扫码组件的 Module 为例进行说明. 前提条件 已按照原 ...