欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

# 获取当前登录的用户 CURRENT_USER=$(stat -f %Su /dev/console) # 获取该用户的桌面路径 USER_HOME=$(dscl . -read /Users/$CURRENT_USER NFSHomeDirectory | awk '{print $2}') 这两行详解 AG chatgpt 有大用 有大大用

# 获取当前登录的用户  #当前登录的用户 # Self Service 执行 和 策略自动触发执行 都可以这样获取

CURRENT_USER=$(stat -f %Su /dev/console)


# 获取该用户的桌面路径

USER_HOME=$(dscl . -read /Users/$CURRENT_USER NFSHomeDirectory | awk '{print $2}')

这两行详解


这两行代码用于获取当前登录的 macOS 用户及其家目录路径。我来详细解释每一部分:

第一行:获取当前登录用户

bash
CURRENT_USER=$(stat -f %Su /dev/console)
  1. stat -f %Su /dev/console:

  • stat 是查看文件状态信息的命令

  • -f %Su 表示格式化输出,%Su 表示文件的所有者用户名

  • /dev/console 是系统控制台设备文件,代表当前活跃的控制台会话

  • 这个命令会返回当前正在与图形界面交互的用户名

  • $(...):

    • 这是命令替换语法,将命令的输出作为值赋给变量

    第二行:获取用户的家目录路径

    bash
    USER_HOME=$(dscl . -read /Users/$CURRENT_USER NFSHomeDirectory | awk '{print $2}')
    1. dscl . -read /Users/$CURRENT_USER NFSHomeDirectory:

    • dscl 是 macOS 目录服务命令行工具

    • . 表示本地目录服务(非网络目录)

    • -read 是读取操作

    • /Users/$CURRENT_USER 是要查询的用户节点

    • NFSHomeDirectory 是要查询的属性(用户的家目录)

  • | awk '{print $2}':

    • 管道将 dscl 的输出传递给 awk 处理

    • dscl 的输出格式类似:NFSHomeDirectory: /Users/username

    • awk '{print $2}' 提取第二列(即家目录路径)

    这种方法的注意事项:

    1. 比直接使用 ~ 或 $HOME 更可靠,因为它在脚本中运行时可以规避环境变量可能被修改的问题

    2. 是 macOS 特有的方法,其他 Unix 系统可能使用不同的命令

    3. 需要适当的权限才能执行这些命令

    替代方案:

    bash
    # 更简单的获取家目录的方法 USER_HOME="/Users/$CURRENT_USER"

    但这种方法假设用户目录都位于/Users下,不如dscl准确(特别是当用户目录位于其他位置时)。


    %S 是什么意思

    在 macOS 的 stat 命令中,-f %Su 的 %S 并不是独立的格式说明符,而是 %Su 作为一个整体使用的。这里的 %Su 表示 "显示文件所有者(user)的用户名"。

    具体分解:

    • -f:指定输出格式(format)。

    • %Su:格式说明符,其中:

      • %S 是 stat 内部的处理标识,表示后面跟着的是特定类型的格式化请求(此处是用户相关)。

      • u 表示 "username"(用户名),即文件所有者的名称。

    对比其他类似的格式符:

    • %g:显示文件所属组的组名(group name)。

    • %u:显示文件所有者的 UID(数字形式)。

    • %p:显示文件权限(如 0o755)。

    示例:

    # stat -f "%Su %Sg" /dev/console

    输出可能是:

    john staff
    

    表示 /dev/console 的所有者是用户 john,所属组是 staff


     stat -f  "%u %g"  /dev/console 

    501 20

    表示 /dev/console 的所有者是用户id 是 501  ,所属组id 是 20


    为什么不用 %u

    • %u 会返回 UID(数字,如 501),而 %Su 会返回用户名(如 john)。

    • /dev/console 的所有者通常是当前登录的图形界面用户,因此 %Su 可以直接获取其用户名。


    注意:不同系统的差异

    • 在 Linux 的 stat 中,语法不同(例如 -c "%U" 表示用户名)。

    • macOS 的 stat 是 BSD 风格,格式化选项与其他 Unix 系统可能不兼容。



    NFSHomeDirectory  是什么缩写

    NFSHomeDirectory 是 NFS Home Directory 的缩写,直译是 “NFS 家目录”,但在 macOS 的目录服务(Directory Services,即用户账户数据库)中,它指的是 用户的家目录路径,无论是否实际使用 NFS(Network File System)。


    详细解释

    1. NFS(Network File System)

    • 一种网络文件共享协议,允许远程挂载目录。

    • 但在 macOS 中,NFSHomeDirectory 并不一定指真正的 NFS 挂载目录,而是 泛指用户的家目录路径

  • 在 macOS 目录服务中的用途

    • macOS 使用 Open Directory(基于 LDAP 的用户数据库)存储用户信息。

    • NFSHomeDirectory 是一个标准属性,记录用户的家目录路径(即使本地存储)。

    • 例如:

      plaintext
      NFSHomeDirectory: /Users/john

      表示用户 john 的家目录是 /Users/john

  • 为什么叫 NFSHomeDirectory 而不是 HomeDirectory

    • 历史原因:早期的 Unix 系统(如 NeXTSTEP,macOS 的前身)广泛使用 NFS 挂载家目录。

    • 尽管现在很多用户的家目录是本地存储(如 /Users/username),但该属性名仍沿用 NFSHomeDirectory


    如何查询 NFSHomeDirectory

    在 macOS 上,可以通过以下命令获取当前用户的家目录:

    bash
    dscl . -read /Users/$USER NFSHomeDirectory | awk '{print $2}'

    输出示例:

    plaintext
    /Users/john

    替代属性(不同系统)

    • Linux(/etc/passwd):$HOME 或 ~

    • Windows(AD 域):homeDirectory(类似的概念)。


    总结

    • NFSHomeDirectory = 用户的家目录路径(无论是否使用 NFS)

    • 在 macOS 中,它是目录服务(dscl)的标准属性,用于确定用户的 ~ 目录位置。

    • 名称源于 Unix/NFS 历史,但实际使用不依赖 NFS。



    普通分类: