美文网首页
【小技巧】macOS 下用 dscl 命令行管理用户

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

作者: tobrainto | 来源:发表于2021-06-16 09:20 被阅读0次

    大家好,我是 uwoerla 。

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

    相关文章

      网友评论

          本文标题:【小技巧】macOS 下用 dscl 命令行管理用户

          本文链接:https://www.haomeiwen.com/subject/rzatyltx.html