AppleScript中sudo命令失效,求助配置Touch ID适配方案
2023年9月27日 编辑:
若有人知晓如何为Gordon Davisson的解决方案配置Touch ID,即可彻底解决本问题。
2023年9月9日 原帖:
我使用数月的MacBook睡眠脚本突然失效,想了解原因,是否后台终端密码提示机制发生了变化?我通常禁用睡眠功能,以便合盖时不中断或锁定任何进程。此前脚本运行正常,如今执行时出现报错:
'sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
sudo: a password is required'
之前脚本可自行触发支持指纹授权的用户提示,只需激活脚本并触摸指纹传感器即可完成操作。
完整脚本如下:
do shell script "sudo pmset -a disablesleep 0" tell application "System Events" to sleep do shell script "sudo pmset -a disablesleep 1"
该脚本已打包为应用,存放于应用程序文件夹中。我尝试使用sudo -S pmset,但该选项似乎用于从其他位置管道输入密码或其他类型的提示,并非我想要的效果,我希望恢复此前通过终端弹出提示的功能。
原因分析
打包成应用的AppleScript在无终端交互的后台环境运行,sudo无法唤起常规的密码/Touch ID验证弹窗,因此触发报错。以下是几种可行的修复方式:
方法1:使用系统原生管理员授权弹窗(推荐)
直接修改AppleScript,添加with administrator privileges参数,这会触发系统自带的授权窗口,原生支持Touch ID验证,无需额外配置:
do shell script "pmset -a disablesleep 0" with administrator privileges tell application "System Events" to sleep do shell script "pmset -a disablesleep 1" with administrator privileges
替换原脚本内容后重新打包为应用即可,运行时会弹出系统授权提示,触摸指纹即可完成验证。
方法2:配置sudo免密码执行pmset
如果希望完全跳过验证步骤,可配置让你的用户无需密码就能执行pmset命令:
- 打开终端,执行
sudo visudo - 在文件末尾添加一行(替换
your_username为你的Mac实际用户名):your_username ALL=(ALL) NOPASSWD: /usr/bin/pmset - 按
Ctrl+O保存文件,Ctrl+X退出编辑器 - 原脚本无需修改,运行时会自动执行sudo命令而无验证提示
方法3:配置askpass助手实现Touch ID弹窗
通过第三方工具唤起支持Touch ID的验证窗口:
- 若已安装Homebrew,执行
brew install pinentry-mac安装工具 - 修改脚本,在sudo命令前指定askpass工具路径:
do shell script "SUDO_ASKPASS=/usr/local/bin/pinentry-mac sudo pmset -a disablesleep 0" tell application "System Events" to sleep do shell script "SUDO_ASKPASS=/usr/local/bin/pinentry-mac sudo pmset -a disablesleep 1" - 重新打包应用,运行时会弹出pinentry-mac的验证窗口,支持Touch ID操作
内容的提问来源于stack exchange,提问作者sockrabbtt

