我用来pam_mount
解密(gocryptfs
)并挂载我的主目录:
# /etc/pam.d/system-login excerpt
# ...
session [success=2 default=ignore] pam_exec.so quiet /usr/bin/mountpoint -q "/home/$PAM_USER"
session [success=1 default=ignore] pam_succeed_if.so service = systemd-user quiet
session optional pam_mount.so
# ...
<!-- /etc/security/pam_mount.conf.xml excerpt -->
<!-- ...defaults... -->
<!-- Encrypted home -->
<volume user="%(USER)" fstype="fuse" options="nodev,nosuid,quiet,nonempty,allow_other"
path="/usr/bin/gocryptfs#/home/%(USER).cipher" mountpoint="/home/%(USER)"
/>
</pam_mount>
这对于单个 tty 来说效果很好。问题是,如果我打开另一个,尽管我的pam_exec
线路阻止它尝试重新安装,当我出口第二个tty,它仍然卸载。 (更糟糕的是,它甚至无法正确卸载,留下“传输端点未连接”,我必须手动卸载fusermount -uz "$HOME"
。我尝试添加<fuseumount>fusermount -uz %(MNTPT)</fuseumount>
到配置中,但没有更改。)
如何防止pam_mount
在最后一个会话退出之前卸载? (如果创建挂载的 tty1 在 tty2 之前退出,我希望它为 tty2 保留挂载状态,即使它本身跳过了挂载。)
事实上,<debug enable="1" />
它记录了:
May 03 15:19:39 hostname login[6607]: (pam_mount.c:441): pmvarrun says login count is 1
May 03 15:19:39 hostname login[6607]: (pam_mount.c:734): username seems to have other remaining open sessions
May 03 15:19:39 hostname login[6607]: (pam_mount.c:743): pam_mount execution complete
但接下来的事情就是抱怨“传输端点未连接”,并且果然我在第一个 tty 中没有主目录。
我也注意到如果我那么fusermount -uz $HOME
,它实际上结束了已安装,就好像pam_mount
第一次登录会话(我手动卸载它来修复错误,希望必须再次手动安装它)会自动重新安装它?
答案1
pam_mount
内置了对此的检测,并已尝试适当地处理它。该问题似乎是“已安装”检测中的错误,这意味着它不适用于 FUSE 文件系统或从server="..."
.
- 上游错误报告:https://sourceforge.net/p/pam-mount/bugs/117/
- Debian 错误报告:https://bugs.launchpad.net/debian/+source/libpam-mount/+bug/1908638
- 拱门错误报告:https://bugs.archlinux.org/task/70693
server
案例补丁仅有的:https://sourceforge.net/p/pam-mount/pam-mount/merge-requests/3/
我有它与以下工作修补:
diff --git a/src/mount.c b/src/mount.c
index 75c0a39..781ccd0 100644
--- a/src/mount.c
+++ b/src/mount.c
@@ -127,10 +127,19 @@ static bool pmt_utabent_matches(const struct vol *vpt, struct libmnt_fs *fs)
bool result = false;
xcmp = fstype2_icase(vpt->type) ? strcasecmp : strcmp;
- if (source != NULL)
- result = xcmp(vpt->combopath, source) == 0;
+ if (source != NULL) {
+ if (strcmp(vpt->fstype, "fuse") != 0)
+ result = xcmp(vpt->combopath, source) == 0;
+ else {
+ size_t len_combopath = strlen(vpt->combopath);
+ size_t len_source = strlen(source);
+ result = xcmp(vpt->combopath + len_combopath - len_source, source) == 0;
+ }
+ }
+
if (target != NULL)
result &= strcmp(vpt->mountpoint, target) == 0;
+
return result;
}
应用然后:
$ ./autogen.sh
$ ./configure
$ make
$ cp src/.libs/pam_mount.so /usr/lib/security/pam_mount_patched.so
然后暂时使用pam_mount_patched.so
代替我的 PAM 配置中适用的位置。 pam_mount.so
(不覆盖原始版本只是为了便于测试/恢复,并在新版本可用时检查上游。)