目标是允许 TouchID 用于 sudo 命令而不是密码。这可以通过将行
auth sufficient pam_tid.so
添加到文件 /etc/pam.d/sudo
来实现。
问题是,MacOS 在每次更新后都会重置对此文件的任何更改,因此我决定使用 AppleScript 通过
Automator.app
自动执行此任务,然后在登录时运行创建的应用程序。
需要 Apple 脚本来允许管理员访问
/etc/pam.d/sudo
文件(如果您要手动编辑它,则必须使用 sudo vim
而不是 vim
)。
所以我的代码看起来像这样:
property SudoPath : "/etc/pam.d/sudo"
property TIDLine : "auth sufficient pam_tid.so"
property CustomPrompt : "Allow TouchID to authenticate you for sudo access"
if (do shell script ("grep -q pam_tid.so " & SudoPath & " && echo 'true' || echo 'false'")) is equal to "false" then
do shell script ("sudo sed -i '' '1i\\'$''\\n'" & TIDLine & "'" & SudoPath) with prompt CustomPrompt with administrator privileges
end if
它检查该行是否已经存在,如果不存在,则应该将该行插入到文件中。它应该位于包含
pam_smartcard.so
的行上方,但事实证明这太困难了,所以我选择将其插入到第一行。
我的脚本因错误
sed: 1: "1i\nauth sufficie ...": extra characters after \ at the end of i command
崩溃,我认为这与代码中的 \n
字符有关,但如果我删除第二个反斜杠,它会在编译过程中更改为不可见的行尾。而且我真的不知道哪些字符需要转义以及如何转义。
MacOS Monterey 似乎还存在一些进一步的问题,因为即使 sed 命令正确,脚本也会以错误结束
/bin/sh: /etc/pam.d/sudo: Operation not permitted
,而 Big Sur 中没有出现该错误。
感谢您的帮助。
更新:
因此,通过使用 gnu-sed(通过 Homebrew 安装)解决了终端问题,并尝试在首选项中允许 automator 和 gsed 命令进行完整磁盘访问。现在我得到了
语法错误:/usr/local/bin/gsed:无法打开临时文件 /etc/pam.d/sedNyxhvU:不允许操作
property GnuSedPath : "/usr/local/bin/gsed"
property SudoPath : "/etc/pam.d/sudo"
property TIDLine : "auth sufficient pam_tid.so"
property CustomPrompt : "Allow TouchID to authenticate you for sudo access"
if (do shell script ("grep -q pam_tid.so " & SudoPath & " && echo 'true' || echo 'false'")) is equal to "false" then
do shell script ("sudo " & GnuSedPath & " -i '2i " & TIDLine & "' " & SudoPath) with prompt CustomPrompt with administrator privileges
end if
类似的问题。我一直在使用
patch
作为将线条添加到 /etc/pam.d/sudo
的工具。升级到 macOS 12.4 后,我遇到了与您相同的错误 Operation not permitted
,因为 /etc/pam.d/sudo
不可写。
我在终端 (iTerm) 中运行 patch 命令。通过允许 iTerm“完全磁盘访问”解决了该问题。
也许您的问题可以通过允许 Automator“完整磁盘访问”(在系统偏好设置 -> 安全和隐私 -> (选项卡)完整性下)来解决?
它现在受到操作系统的支持(至少从索诺玛开始)。
确保
/etc/pam.d/sudo
包含行:
auth include sudo_local
然后将以下行放入
/etc/pam.d/sudo_local
:
auth sufficient pam_tid.so
操作系统永远不会重置对
sudo_local
的更改,因此从现在开始将启用 sudo 的 TouchID。