新款的MacBook提供了TouchID这么一个靠谱的玩意。当系统中很多需要授权输入密码时,只需要手指一按即可完成密码输入。不过这一功能在 终端 中通过 sudo 执行命令时却不可用。

网上查了一圈的资料,最后发现要实现 终端sudo 命令授权时,可以轻触一下 TouchID 进行授权,其实很容易。办法就是修改 /etc/pam.d/sudo 文件,在文件的开头加上下面这一行即可:

auth       sufficient     pam_tid.so

提醒下,这个文件默认是不可写的。修改前记得先通过 chmod 修改文件的权限,写完再改回去。当然,如果你是使用的 vim 的话,可以直接通过 :w! 而不是 :w 进行保存。

熟悉Linux的同学应该大致猜得出其中的机制。

简单的说(猜测), sudo 命令本身不对用户进行权限判断,而是直接调用 PAMPluggable_authentication_module)服务获取权限判定的结果。PAM作为一个通用的框架,也只是定义了通用的鉴权接口。具体的业务逻辑,需要通过注册到PAM的各个 模块 自行实现。注册的方式就是像上面这样,将模块添加到PAM的配置文件中。

MacOS内置了一个为 pam_tid.so 的模块,将 TouchID 的功能封装为PAM模块。从而实现了对用户的识别逻辑。因此,只需要将这个模块通过上面的方式,配置给PAM即可。

需要注意的是,由于PAM模块是支持多个渠道或服务的。不同服务或渠道按照配置文件的先后顺序依次生效。任何一个渠道鉴定通过则直接返回,如果鉴定不通过,才会尝试下一个。

因此,如果你希望执行 sudo 命令时首先唤起 TouchID 进行认证,就需要把上面的配置内容放到 /etc/pam.d/sudo 文件最前面。

类似的,如果你有其他的鉴权机制,也可以以PAM模块的形式提供到系统中。

举个例子,我以前运营过一个付费共享主机系统。每个用户可以在WEB后台注册和续费。只要在付费有效期的用户,都可以使用用户名SSH登陆到服务器中。实现的方式,就是实现了一个PAM模块,并注册到操作系统的PAM模块中。当有用户登陆SSH时,会将用户名等信息传递到这个模块。在模块内部,则访问数据库,获取用户的有效性,最后给PAM返回用户是有效还是无效的结果即可。