最近在看 Authorized 这块, 发现一篇文章不错, 其中的例子简单明了, 就拿来分析了一下, 这对 pam 和 dbus 的原理和实现有入门的帮助.
原文: 参考文章[1] http://www.joachim-breitner.de/blog/archives/299-pam-dbus-authentication-by-bubbles.html
ps: 很羡慕国外开发人 hacked it. In the end I got, well, just what I wanted.
因为这个例子是08年写的, 现在运行需要做一些修改, 因此我直接上传修改后的源码包.
使用方法
--------------
bash bootstrap.sh
make
sudo make install
-------------
install_file_list.txt 是 make install 安装的文件列表..
根据 README 来配置
主要修改
"UsePAM yes" IN /etc/ssh/sshd_config
auth required pam_dbus.so IN /etc/pam.d/sshd
添加 dbus 服务,或者直接运行服务
/usr/local/share/pam_dbus/pam-dbus-notify
handlers/auth-dummy (测试程序,总是通过认证)
如果想要添加 dbus 自启动服务
cat /usr/share/dbus-1/system-services/de.nomeata.pam_dbus.service
[D-BUS Service] Name=de.nomeata.pam_dbus Exec=/usr/local/share/pam_dbus/pam-dbus-notify User=root
那么如果 pam_dbus 通过 dbus 调用 de.nomeata.pam_dbus 时 dbus 会自动启动该服务.
截图:
---------------------
原作者说在 python 的垃圾回收机制上花费了一些时间.
他的方法是将每一个 notify 添加到全局的 ns 列表中. 这样保证 notify 会被变量引用, 从而避免垃圾回收机制将未完成调用的 notify 回收. 每一个 notify 完成回调后就从全局 ns 列表中 remove 掉这个 notify 让 python 自动回收... 将回调函数参数列表中的 pam_cb 指向 None 也是为了使该函数被回收.
参考文章:
[1] http://www.joachim-breitner.de/blog/archives/299-pam-dbus-authentication-by-bubbles.html
[2] http://linux.chinaitlab.com/tool/530218.html
[3] http://www.cnblogs.com/joe2k8/archive/2009/05/24/1488074.html
[4] http://zhgw01.blog.163.com/blog/static/1041481220094721735205/