Понимание создания виртуальной файловой системы, которая позволяет отображать произвольные каталоги для проекта FTP-сервера

Отказ от ответственности: это домашнее задание; Мне не нужно решение.

Кроме того, нет доступных библиотек за пределами стандартных библиотек 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, например, пользователь Боб видит /home/bob/.

Кроме того, с каким API мне нужно работать для поддержки FTP-команд, таких как ls, cd и т. д., которые работают с настоящей безотказной файловой системой?


person ironicaldiction    schedule 11.06.2014    source источник


Ответы (2)


Вы создаете свой собственный FTP-сервер (или хотя бы его часть). Нужно будет решить проблему /home/bob транслируется в /home/users/bob. Я считаю, что способ, которым вы должны это сделать, заключается в том, что если кто-то вводит cd /home/bob, вы просто переводите переданное местоположение файла в функцию, которая переводит предоставленный пользователем патч (в данном случае /home/bob) в его "настоящую" форму (/home/users/bob) до того, как он будет передан функции chdir, которая фактически изменяет каталог. Чтобы такие вещи, как pwd и ls, показывали правильный путь, вам нужно либо «запомнить, где вы находитесь» (учитывая, что кто-то может захотеть сделать cd ../joe, cd ../tom/.././mats/../joe или cd ..; 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/bob, затем cd .. и cd www могут создавать аналогичные проблемы].

Я хотел бы уточнить, действительно ли этого требует ваш лектор.

Если не требуется, то совпадать с началом всего, начинающегося с / (все остальное, просто переходить на chdir без изменений)

person Mats Petersson    schedule 11.06.2014

Последний вопрос самый простой: используйте библиотеку Boost Filesystem, в ней есть нужные вам типы, такие как пути к файлам.

Для первого вопроса идея состоит в том, что GET /home/user_list.txt возвращает содержимое /var/ftpclient/user_list.txt. Это означает, что вам сначала нужно перевести виртуальное имя в настоящее имя (здесь возможна некоторая фантазия, но в основном вы хотите проверить, появляется ли какой-либо префикс виртуального имени в таблице перевода. фантазия включает в себя работу с ненайденными именами). ). Во-вторых, с настоящим именем вы хотите открыть этот файл, прочитать его содержимое и вернуть его клиенту.

person MSalters    schedule 11.06.2014