我正在构建一个 SFTP 服务器,必须让用户访问不同驱动器上的各个目录。
我不能使用符号链接,因为这允许他们访问所有内容并导致导航混乱。
我不能使用 cp -r,因为它花费的时间太长并且占用了太多空间。
我不能使用 cp -al,因为它无法跨不同设备链接。但如果只有一个设备,它就很好用。
目前,我正在使用“mount --bind”将不同驱动器中的目录挂载到 ftp 上的用户主目录。我编写了一个脚本,用于删除不再需要的旧挂载,并在重新启动后恢复挂载,而无需使用 fstab。
不过,这似乎是一个草率的解决方案,最终我将拥有数百甚至数千个挂载。有没有更好的方法,或者这可以接受吗?我一次可以运行的 mount --bind 数量有限制吗?
答案1
在这种情况下,如何使用 ACL(访问控制列表)?所有现代文件系统都支持 ACL,使用它们,您可以比使用传统 Unix 权限更精细地授予对单个目录/文件的访问权限。
对于初学者,请尝试一下man setfacl
。它列出了几个示例。
答案2
另一个答案似乎是另一个问题的解决方案(对已经存在的目录设置权限)。不过,你的问题听起来像我的问题……你有主目录,其中 / 是 ftp 主目录,而不是真实文件系统,并且你希望真实文件系统的某些部分位于多个 ftp 主目录中。
我遇到过类似的事情……那简直是一场噩梦。我想它有几千个挂载点。脚本有缺陷,所以当它停止工作时需要进行修改。这不是什么大问题,但卸载数千个挂载点并重新挂载需要 15 分钟。所以我用 unionfs 重做了一遍。现在它使用了大约 260 个。
这是用几个 4 磁盘 USB 盒(我们称之为“穷人的 DAS”)完成的。另一个问题是磁盘会随机断开连接并需要重新安装。这意味着所有相关的安装也需要重新进行。当发生这种情况时,Unionfs 会自动将它们重新加入到安装中,这样就解决了问题。自从我将其切换到 unionfs 后,我就不必修复脚本的错误了。如果我再次使用 USB 磁盘做类似的事情,我可能会使用 unionfs 组合到一个空目录树,即使它只是一个磁盘,这样我就可以依靠它重新连接。
在我的例子中,所有文件都是只读的,许多磁盘一起安装在多个 ftp home 中,只有 3 种不同类型的用户可以看到不同的目录,磁盘是相同的数据集,但文件类型和日期不同,位于相同的目录结构中。所以我基本上只在每个 ftp home 上安装了 3 个东西。
unionfs 挂载如下所示:
sudo unionfs-fuse /data/some/local/directory=ro:/mnt/disk1=ro:/mnt/disk2=ro:/mnt/disk3=ro:[...] /mnt/alldisks -o allow_other