Файловая система 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.
Всегда есть возможности для улучшения. Пожалуйста, поправьте меня, если я не прав.
Спасибо, Диркт, за ваше объяснение.