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

/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 ответа2

1

Хорошо, позвольте мне уточнить: вы не "монтировали 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

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

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

Решение:

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

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

fuse_get_context()-> UID;

fuse_get_context()-> GID;

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .