macOS 命令行 修改系统密码 和 设置 自动登录(autoLogin) 的方法
最近在做基于 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
sudo zsh auth.sh ./Xxxxx.app kTCCServiceMicrophone
sudo zsh auth.sh ./Xxxxx.app kTCCServiceCamera
以上方法在 BigSur - Ventura 之间可用。
Catalina 上 TCC.db access表字段不一样,据我测试即使修改脚本识别字段后仍无法跳过权限弹窗。