Файловая система Fuse с опцией «разрешение по умолчанию»

2063
kayle

Я новичок в плавке. Я установил предохранитель по следующей команде.

/home/bin/fusexmp /mnt/fuse -o default_permissions -o allow_other -o nonempty -o hard_remove -d 

Теперь, если я войду как «тестовый» пользователь и попробую создать файл с именем «testfile».

test@11540302:/registration> touch testfile touch: setting times of `testfile': Permission denied 

Выход Strace:

uname() = 0 brk(0) = 0x8055000 brk(0x8076000) = 0x8076000 open("testfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_LARGEFILE, 0666) = 3 dup2(3, 0) = 0 close(3) = 0 utimensat(0, NULL, NULL, 0) = -1 EACCES (Permission denied) close(0) = 0 

Но создание "testfile" успешно с владельцем как пользователь root ,

-rw-r--r-- 1 root trusted 0 Jan 19 13:51 testfile 

Я могу понять, что приложение fuse работает на уровне root, создание файла происходило с владельцем как root. Из-за этого тестовый пользователь не может выполнять какие-либо операции с «testfile».

Мой вопрос:

1. Так как я указал «allow_other» во время монтирования, почему тестовый пользователь не может иметь привилегии для доступа к «testfile»?

2. После регистрации в качестве «тестового» пользователя и попытки создать «тестовый файл», почему он назначает «root» в качестве владельца файла вместо «test». Это наблюдается даже после предоставления «default_permission» во время монтирования.

Пожалуйста, поправьте меня, если мое понимание неверно.

0
FUSE расшифровывается как «файловая система в пространстве пользователя», так что это собирательное имя для файловых систем, которые представлены программами пространства пользователя. Их довольно много, поэтому вы не можете «смонтировать fuse», вам всегда нужно использовать определенную файловую систему (которая реализуется через fuse). `/ mnt / fuse` не является командой. `/ mnt` и его подкаталоги - это обычные места для монтирования файловых систем. Так что я не уверен * что * ты смонтировал (если вообще что-то), и я не понимаю, чего ты хочешь достичь в первую очередь. dirkt 7 лет назад 0
Спасибо за ответ. Я установил предохранитель с пользователем root. Если я захожу с другим пользователем и создаю файл, он создается с владельцем как пользователь root. С этим вопросом, пожалуйста, проверьте мои вопросы. Надеюсь, у меня все ясно с моим вопросом. kayle 7 лет назад 0

2 ответа на вопрос

1
dirkt

Хорошо, позвольте мне уточнить: вы не «монтировали fuse», вы использовали программу-пример fusexmp, которая является очень простой программой fuse, которая просто передает все операции стандартным вызовам библиотеки Linux. Это просто пример программы, и очень скучная.

Вы не сказали, под каким пользователем вы выполняли эту операцию монтирования, но я предполагаю, что вы сделали это как root(потому что иначе allow_otherне сработало бы и не создало бы testfileс владельцем root). Обратите внимание, что в принципе вы можете монтировать файловые системы FUSE как любой пользователь.

Поэтому, когда testпользователь выполнил touch, сначала он открыл файл в файловой системе, смонтированной на предохранителе. Поскольку вы использовали default_permissions, система проверила test, разрешено ли пользователю создавать файлы в этом конкретном каталоге (что, по-видимому, успешно), и затем позволила fusexmpсоздать файл. Как fusexmpработает root, этот файл был создан как root.

Далее touchхотел установить дату. Поскольку вы использовали default_permissions, система проверила test, разрешено ли пользователю устанавливать дату для этого конкретного файла. Это не так, поэтому система прервалась с ошибкой разрешения, независимо от того, сможет ли программа на fusexmpсамом деле установить дату (которую она будет выполнять от имени пользователя root).

Я до сих пор не уверен в том, в чём смысл этого упражнения: вы использовали необычную программу примера, а затем поинтересовались результатами. Если вы дадите default_permissions, то вам также следует убедиться, что ваша пользовательская программа создает файлы с правильным владельцем и т. Д. ( fusexmpЧто не так).

Если вы хотите понять файловые системы fuse с точки зрения пользователя, я предлагаю вам поэкспериментировать с реальными примерами, такими как sshfs . Или напишите свою собственную программу-предохранитель и самостоятельно обрабатывайте разрешения и т. Д.

0
kayle

Я получил решение этой проблемы.

Подробное объяснение этой проблемы.

Решение:

Как сказал @dirkt, нам нужно обрабатывать разрешения самостоятельно.

Код для получения идентификатора и номера вызывающего абонента:

fuse_get_context () -> UID;

fuse_get_context () -> GID;

Получите идентификатор пользователя вызывающей стороны и идентификатор группы и установите владельца файла / каталога при создании с помощью API-интерфейсов fuse.

Всегда есть возможности для улучшения. Пожалуйста, поправьте меня, если я не прав.

Спасибо, Диркт, за ваше объяснение.

Дело в том, что это может или не может быть необходимо обрабатывать разрешения * на всех *. Это полностью зависит от того, что вы пытаетесь представить как файловую систему FUSE, и для какой цели. Если у меня есть, скажем, дискимаж для какого-то ретро компьютера, просто позвольте пользователю смонтировать его как файловую систему FUSE, и, поскольку у дискимажа нет ничего эквивалентного uid и gid Linux, замените uid и gid пользователя, который установил это. Конечно, нет смысла добавлять обработку прав в демо `fusexmp`. dirkt 7 лет назад 0

Похожие вопросы