欢迎各位兄弟 发布技术文章
这里的技术是共享的
# 获取当前登录的用户 #当前登录的用户 # Self Service 执行 和 策略自动触发执行 都可以这样获取
CURRENT_USER=$(stat -f %Su /dev/console)
# 获取该用户的桌面路径
USER_HOME=$(dscl . -read /Users/$CURRENT_USER NFSHomeDirectory | awk '{print $2}')
这两行详解
这两行代码用于获取当前登录的 macOS 用户及其家目录路径。我来详细解释每一部分:
bashCURRENT_USER=$(stat -f %Su /dev/console)
stat -f %Su /dev/console:
stat 是查看文件状态信息的命令
-f %Su 表示格式化输出,%Su 表示文件的所有者用户名
/dev/console 是系统控制台设备文件,代表当前活跃的控制台会话
这个命令会返回当前正在与图形界面交互的用户名
$(...):
这是命令替换语法,将命令的输出作为值赋给变量
bashUSER_HOME=$(dscl . -read /Users/$CURRENT_USER NFSHomeDirectory | awk '{print $2}')
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}' 提取第二列(即家目录路径)
这种方法的注意事项:
比直接使用 ~ 或 $HOME 更可靠,因为它在脚本中运行时可以规避环境变量可能被修改的问题
是 macOS 特有的方法,其他 Unix 系统可能使用不同的命令
需要适当的权限才能执行这些命令
替代方案:
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)。
输出可能是:
john staff
表示 /dev/console 的所有者是用户 john,所属组是 staff。
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)。
NFS(Network File System)
一种网络文件共享协议,允许远程挂载目录。
但在 macOS 中,NFSHomeDirectory 并不一定指真正的 NFS 挂载目录,而是 泛指用户的家目录路径。
在 macOS 目录服务中的用途
macOS 使用 Open Directory(基于 LDAP 的用户数据库)存储用户信息。
NFSHomeDirectory 是一个标准属性,记录用户的家目录路径(即使本地存储)。
例如:
plaintextNFSHomeDirectory: /Users/john
表示用户 john 的家目录是 /Users/john。
为什么叫 NFSHomeDirectory 而不是 HomeDirectory?
历史原因:早期的 Unix 系统(如 NeXTSTEP,macOS 的前身)广泛使用 NFS 挂载家目录。
尽管现在很多用户的家目录是本地存储(如 /Users/username),但该属性名仍沿用 NFSHomeDirectory。
NFSHomeDirectory?在 macOS 上,可以通过以下命令获取当前用户的家目录:
bashdscl . -read /Users/$USER NFSHomeDirectory | awk '{print $2}'
输出示例:
plaintext/Users/john
Linux(/etc/passwd):$HOME 或 ~。
Windows(AD 域):homeDirectory(类似的概念)。
NFSHomeDirectory = 用户的家目录路径(无论是否使用 NFS)。
在 macOS 中,它是目录服务(dscl)的标准属性,用于确定用户的 ~ 目录位置。
名称源于 Unix/NFS 历史,但实际使用不依赖 NFS。