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

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

/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({sys="Linux", node="11540302", ...}) = 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" во время монтирования.

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

2 ответа

Ok, let me clarify: You didn't "mount fuse", you used the example program fusexmp, which is a very simple fuse program that just passes on all operations to the standard Linux library calls. This is just an example program, and a very boring one.

You didn't say as which user you did this mount operation, but I assume you did this as root (because otherwise allow_other wouldn't have worked, and it wouldn't have created testfile с владельцем root). Note that you can in principle mount FUSE filesystems as any user.

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

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

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

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

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

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

Решение:

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

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

fuse_get_context () -> UID;

fuse_get_context () -> GID;

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

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

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

Другие вопросы по тегам