0

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

此外,没有可用的 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 命令lscd这些命令适用于真正的底层文件系统?

4

2 回答 2

1

您正在创建自己的 FTP 服务器(或至少其中的一部分)。它将需要解决/home/bob转换为/home/users/bob. 我相信您这样做的方式是,如果有人键入cd /home/bob,您只需将传入的文件位置转换为一个函数,该函数将用户提供的 pat(在这种情况下/home/bob)转换为它的“真实”形式(/home/users/bob)在它之前传递给chdir实际更改目录的函数。为了做出类似的事情pwd并显示ls正确的路径,您要么需要“记住你在哪里”(记住有人可能想要做cd ../joe,cd ../tom/.././mats/../joecd ..; cd joe移动到/home/joe,这应该所有[模我的错别字] 转换为/home/users/joe作为/home/joe- 换句话说,你的cd将需要了解当前目录.和父目录..才能移动),或者有一个“反向翻译”,需要/home/users/joe并提出/home/joe. 我目前的想法是后者更简单,但我还没有完全解决这个问题。

您可能可以遵循几种解决方案,但是“字符串匹配开始”和在绝对路径中工作会起作用,除非您想做非常复杂的事情并且允许您不需要用户做非常复杂的事情,例如,如果我们有这个映射:

/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)

那么你需要真正了解你在哪里,并将 fix up ../.. 再次翻译成 /。[当然,类似的问题使用cd /home/bobthencd ..并且cd www可能会造成类似的问题]。

我会澄清您的讲师是否确实需要这样做。

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

于 2014-06-11T20:49:27.747 回答
0

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

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

于 2014-06-11T20:58:09.297 回答