MacOS下.zshrc脚本终端启动不提示Bitwarden密码,手动source正常
问题原因
终端启动时自动执行.zshrc的上下文里,标准输入(stdin)并非交互式TTY设备,而bw unlock需要绑定到交互式终端才能弹出密码输入提示。手动执行source .zshrc时,当前shell处于交互式会话,stdin直接关联终端,所以能正常触发密码输入。MacOS系统更新后,终端初始化shell的stdin处理逻辑可能发生了变化,导致非交互式上下文的判断更严格。
解决方案
1. 强制bw unlock读取终端输入
修改bw unlock命令,强制它从终端设备(/dev/tty)读取密码,绕过当前stdin的限制:
if [[ -z "${MY_USER}" || -z "${MY_PASSWORD}" ]] then # 强制从终端读取密码输入 BW_SESSION=$(bw unlock --raw < /dev/tty) bw sync MY_USER=$(bw get username my-vault-item --session $BW_SESSION) MY_PASSWORD=$(bw get password my-vault-item --session $BW_SESSION) launchctl setenv MY_USER $MY_USER export MY_USER=$MY_USER launchctl setenv MY_PASSWORD $MY_PASSWORD export MY_PASSWORD=$MY_PASSWORD bw lock > /dev/null 2>&1 fi
2. 仅在交互式shell中执行解锁逻辑
先判断当前shell是否为交互式,避免在非交互式上下文(如终端启动初始化)中执行需要交互的命令:
# 仅在交互式shell中执行 if [[ -o interactive && (-z "${MY_USER}" || -z "${MY_PASSWORD}") ]] then BW_SESSION=$(bw unlock --raw) bw sync MY_USER=$(bw get username my-vault-item --session $BW_SESSION) MY_PASSWORD=$(bw get password my-vault-item --session $BW_SESSION) launchctl setenv MY_USER $MY_USER export MY_USER=$MY_USER launchctl setenv MY_PASSWORD $MY_PASSWORD export MY_PASSWORD=$MY_PASSWORD bw lock > /dev/null 2>&1 fi
3. 改用生物识别解锁(Bitwarden CLI 2.17+支持)
如果你的Bitwarden CLI版本足够新,可以用生物识别解锁替代密码输入,无需依赖交互式输入:
if [[ -z "${MY_USER}" || -z "${MY_PASSWORD}" ]] then BW_SESSION=$(bw unlock --raw --biometric) bw sync # 后续环境变量设置逻辑不变 MY_USER=$(bw get username my-vault-item --session $BW_SESSION) MY_PASSWORD=$(bw get password my-vault-item --session $BW_SESSION) launchctl setenv MY_USER $MY_USER export MY_USER=$MY_USER launchctl setenv MY_PASSWORD $MY_PASSWORD export MY_PASSWORD=$MY_PASSWORD bw lock > /dev/null 2>&1 fi
注意:首次使用--biometric需要先通过bw config biometricUnlock true开启配置。
内容的提问来源于stack exchange,提问作者VMX
相关产品推荐
相关产品推荐

