了解 FTP 服务器项目的"create a virtual filesystem which allows mapping of arbitrary directories"

Understanding "create a virtual filesystem which allows mapping of arbitrary directories" for FTP server project

本文关键字:allows which mapping of directories arbitrary filesystem 服务器 FTP 项目 了解      更新时间:2023-10-16

免责声明:这是作业;我不想要解决方案

此外,c/c++标准库之外没有可用的库。

我正在寻找一个正确方向的推动,以理解我分配的学期项目(创建一个虚拟FTP服务器)的这部分工作甚至要求我做什么:

服务器允许创建虚拟文件系统。通过虚拟文件系统,我们指的是服务目录到文件系统上真实目录的映射。例如,客户端树看起来像这样:/home/user1映射到/mnt/x/home/user1/www映射到/var/cache/www/home/user_list.txt映射到/var/ftpclient/user_list.txt用户将看到/home/user1目录和/www目录以及文件/home/user_list.txt

我接着向我的讲师提出了这个问题:

/home/user1 -> /mnt/x/home/user1/www -> /var/cache/www/var/cache/www/home/user_list.txt -> /var/ftpclient/user_list.txt是唯一需要支持的目录映射吗(因此每个用户将有2个目录和1个文件,如图所示自动为他们创建)?

得到以下回复:

这些映射只是示例设置。你的解决方案应该能够以类似的方式映射任何东西到任何东西

根据我目前的理解,我只需要允许我的FTP服务器的用户访问显式映射的目录和文件(通过配置文件指定)。这可能意味着像/home -> /home/users这样的映射(这样所有用户都会看到他们在ftp的伪根目录中,例如用户Bob看到/home/bob/)。

另外,我需要使用哪个API来支持FTP命令,如ls, cd等,这些命令与真正的底层文件系统一起工作?

您正在创建自己的FTP服务器(或至少其中的一部分)。它需要解决/home/bob转换为/home/users/bob的问题。我相信您要这样做的方式是,如果有人输入cd /home/bob,您只需将传入的file-location转换为一个函数,该函数将用户提供的部分(在本例中为/home/bob)转换为"真实"形式(/home/users/bob),然后再将其传递给实际更改目录的chdir函数。让pwdls显示正确的路径,你将需要"记住你在哪里"(记住有人想做cd ../joe, cd ../tom/.././mats/../joe,或cd ..; cd joe /home/joe,应该所有(模我的拼写错误)转化为/home/users/joe但显示/home/joe——换句话说,你cd需要了解当前目录.和父目录..移动),或者一个"反向翻译"/home/users/joe/home/joe出现。我目前的想法是后者更简单,但我还没有完全解决这个问题。

可能有几个你可以遵循的解决方案,但是"match start of string"和在绝对路径下工作是可行的,除非你想做非常复杂的事情,并且允许你不需要用户做非常复杂的事情,例如,如果我们有这样的映射:

/home -> /mnt/x/home     (e.g /home/bob becomes /mnt/x/home/bob)
/www  -> /var/cache/www    (e.g /www/index.html becomes /var/cache/www/index.html)

现在,如果用户要做:

cd /home/bob/../../www/    (could be worse with more . and .. mixed in)

那么你需要真正理解你在哪里,并翻译修复…/…Into/again。[当然,使用cd /home/bob然后cd ..cd www可能会产生类似的问题]。

我想澄清一下你的讲师是否真的要求这样做。

如果不需要,则匹配以/开头的任何内容(其他内容只需传递到chdir而不更改)

最后一个问题是最简单的:使用Boost Filesystem库,它有你需要的类型,比如文件路径。

对于第一个问题,思路是GET /home/user_list.txt返回/var/ftpclient/user_list.txt的内容。这意味着您首先需要将虚拟名称翻译为真实名称(这里可能有些花哨,但基本上您希望检查翻译表中是否出现了虚拟名称的前缀)。花哨包括处理找不到名字的情况)。其次,使用实际名称打开该文件,读取其内容,并将其返回给客户机。