我试图使用pam_mount每个用户login时,通过sshfs挂载每个用户的家庭文件夹。我遇到的问题是,当pam_mount调用mount.fuse和mount.fuse使用ssh挂载sshfs文件夹时,它会创build“把〜/ .ssh”。 这意味着该用户的〜/的挂载点将变为非空,并且挂载失败。 在这一点上,你可能会指出,有一个选项叫nonempty,我可以打开这将允许安装到一个非空的安装点。 我已经打开了,但它不起作用。 也许这只是在我的版本的sshfs打破? 也许我误解了这个选项的含义?
你可能会问,我怎么知道挂载是由于非空目录失败。 我testing了我的理论。 我将挂载点改为“〜/ foobar”。 因此,不是直接挂载到主目录,而是挂载到主目录中名为foobar的文件夹。 当我以普通用户身份login时,挂载成功,用户主目录被挂载到〜/ foobar。 所以我注销,共享被卸载。 所以现在我在foobar目录中创build一个空白文件,这样foobar目录就是非空的。 我以普通用户身份重新login,挂载失败。
编辑:从/etc/security/pam_mount.conf.xml中添加信息(服务器IP被删除的隐私)
<fusemount>mount.fuse %(VOLUME) %(MNTPT) -o %(OPTIONS)</fusemount> <volume fstype="fuse" path="sshfs#%(USER)@<ssh server ip>:/data/home/%(USER)" mountpoint="/home/%(USER)" options="nonempty" ssh="1"/>
编辑:(在ssh /文件服务器端audit.log的输出)
type=CRED_DISP msg=audit(1314290438.255:1490): user pid=5817 uid=0 auid=16777308 ses=203 subj=unconfined_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=PAM:setcred acct="<ssh username>" exe="/usr/sbin/sshd" hostname=<client ip> addr=<client ip> terminal=ssh res=success'
编辑:我只是想我会提到,我试图做基本相同的命令,pam_mountconfiguration为在一个空目录,然后是一个非空目录。 当目录非空时它似乎工作。 所以现在我的理论是,pam_mount没有正确传递non_empty选项或其他事情正在发生…虽然我不认为它的身份validation问题在服务器端身份validation报告为成功。 我所说的命令是:
mount.fuse sshfs#<ssh user>@<ssh/file server ip>:/data/home/<ssh user> <mount point> -o "nonempty"
好的,我明白了这一点。 如果没有在pam_mount.conf.xml中指定如何安装像sshfs这样的fuse文件系统,那么它应该像这样configuration。
<fusemount>mount.fuse %(VOLUME) %(MNTPT) -o %(OPTIONS)</fusemount>
所以我没有明确地设置任何东西,直到我开始改变这个默认设置来做一些事情,比如删除挂载点中的任何文件,或者欺骗ssh以为home位于不同的位置,所以它不会在家里创build.ssh文件夹。 这两个失败的原因是其他原因。 最后,我将其设置回默认值,然后用bash脚本replacemount.fuse可执行文件,以logging其执行的所有参数和环境variables。 当我这样做时,我发现了这个问题。 -o和non-empty之间没有空格。 所以结果是–ononempty这可能导致挂载失败或至less非空选项不被应用。 因此,默认情况下,如果你不指定任何东西必须是这样的:
<fusemount>mount.fuse %(VOLUME) %(MNTPT) -o%(OPTIONS)</fusemount>
所以我最后明确地指定了默认的应该是什么,见上文。 它的工作! 也许这是pam_mount中的一个错误。 我在Centos6上运行pam_mount-2.5-1.fc12.x86_64。 希望其他人发现这个信息有用。 感谢每一位评论。