最近在做基于 Docker-OSX 的 macOS 自动化工作。

macOS 系统镜像固化之后再使用,系统密码是固定的,感觉不是很安全,希望能做成动态生成的。自动化需要系统能够自动登录,所以修改密码后也需要同步更新自动登录设置。

⚠️ 以下内容只在 Ventura 上验证过。

命令行改密码

用到 dscl 这个命令。

甚至不需要 sudo 就可以改掉。

dscl . passwd /Users/<username> old_password new_password

命令行设置自动登录

改自动登录涉及两部分,自动登录的用户和密码。在系统设置图形界面里修改的话,先选择要自动登录的用户,然后输入系统密码验证权限,最后输入要自动登录的用户的密码。这两个字段在系统里是分开存的。

自动登录用户名比较简单,明文存储的,可以直接修改。

defaults write /Library/Preferences/com.apple.loginwindow autoLoginUser <username>

自动登录密码加密存储在 /private/etc/kcpassword,如果要修改就要用同样的加密算法进行加密。

找到这个开源库 xfreebird/kcpassword 可以进行加密操作:加密传入的字符串,写入到 kcpassword 文件。这个库提供的 enable_autologin 命令把上面修改 autoLoginUser 也做了,可以直接用。

自动化

但因为 enable_autologin 里面调用了 sudo,而自动化没法交互式输入密码。所以我还是拆开调用:

sudo -S python3 ./kcpassword.py <new_password> <<< "<SUDOER_PASSWORD>"

让 sudo 从 stdin 读取密码,这样就不需要交互式输入密码了。


Bonus

命令行授予 App 麦克风/摄像头等权限的方法

ref: https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive

auth.sh

sudo zsh auth.sh ./Xxxxx.app kTCCServiceMicrophone
sudo zsh auth.sh ./Xxxxx.app kTCCServiceCamera

以上方法在 BigSur - Ventura 之间可用。

Catalina 上 TCC.db access表字段不一样,据我测试即使修改脚本识别字段后仍无法跳过权限弹窗。