2014-09-08 4 views
1

У меня есть fuse fs с параметрами allow_other и umask 0. Это дает мне набор файлов с разрешениями, установленными на 777. Хотя, когда я пытаюсь установить ls -l в каталог, содержащий файлы, я получаю следующий результат:ls: Операция не разрешена

ls: name: Operation not permitted 
ls: tags: Operation not permitted 
ls: location: Operation not permitted 
ls: ext: Operation not permitted 
ls: experiment_id: Operation not permitted 
ls: file_path: Operation not permitted 

Может ли кто-нибудь сказать мне, почему, несмотря на наличие глобальных разрешений (777), я все еще получаю операцию, не разрешенную?

При управлении Трассированием, я получаю следующие следы:

lstat("tags", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0 
lgetxattr("tags", "security.selinux", 0x112ae80, 255) = -1 EPERM (Operation not  permitted) 
write(2, "ls: ", 4ls:)      = 4 
write(2, "tags", 4tags)      = 4 
write(2, ": Operation not permitted", 25: Operation not permitted) = 25 
write(2, "\n", 1 
)      = 1 
lstat("location", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0 
lgetxattr("location", "security.selinux", 0x112aea0, 255) = -1 EPERM (Operation not  permitted) 
write(2, "ls: ", 4ls:)      = 4 
write(2, "location", 8location)     = 8 
write(2, ": Operation not permitted", 25: Operation not permitted) = 25 
write(2, "\n", 1)      = 1 
lstat("ext", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0 
lgetxattr("ext", "security.selinux", 0x112aec0, 255) = -1 EPERM (Operation not permitted) 
write(2, "ls: ", 4ls:)      = 4 
write(2, "ext", 3ext)      = 3 
write(2, ": Operation not permitted", 25: Operation not permitted) = 25 
write(2, "\n", 1)      = 1 
lstat("experiment_id", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0 
lgetxattr("experiment_id", "security.selinux", 0x112aee0, 255) = -1 EPERM (Operation not permitted) 
write(2, "ls: ", 4ls:)      = 4 
write(2, "experiment_id", 13experiment_id)   = 13 
write(2, ": Operation not permitted", 25: Operation not permitted) = 25 
write(2, "\n", 1)      = 1 
lstat("file_path", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0 
lgetxattr("file_path", "security.selinux", 0x112af00, 255) = -1 EPERM (Operation not permitted) 
write(2, "ls: ", 4ls:)      = 4 
write(2, "file_path", 9file_path)    = 9 
write(2, ": Operation not permitted", 25: Operation not permitted) = 25 
write(2, "\n", 1)      = 1 

Так от трассы, она выглядит, как ее пытается получить атрибут SELinux, даже если его отключить на моей системе.

cat /etc//sysconfig/selinux 
SELINUX=disabled 
SELINUXTYPE=targeted 
+0

Установка '777' разрешения почти всегда плохая идея; он позволяет любому пользователю в системе изменять соответствующий файл или каталог. '755' или, самое большее,' 775' более разумно. –

+0

Я могу установить его на 755. Я установил его на 777, чтобы проверить различные сценарии отладки. Сейчас меня больше интересует, как это исправить. –

ответ

1

Проблема была в моей реализации getxattr. Я возвращал -1 по ошибке, которая была переведена на EPERM, вместо этого я должен был бы вернуть ENODATA, что является более правильной ошибкой для моей логики. Это также фиксировало эти ошибки.

https://gowalker.org/github.com/hanwen/go-fuse/fuse

1

Использование strace(1) по крайней мере,

strace ls -l 

это покажет вам все системные вызовы сделанные ls и вы бы распознать, какой FUSE файловую систему, связанную syscalls(2) терпят неудачу.

Возможно, stat(2) не работает в отдельных каталогах, таких как tags и т. Д.??

Возможно, вы, вероятно, забываете выполнить некоторые операции в своем FUSE.

+0

Обновлен вопрос с выходом strace. Кажется, что проблема связана с извлечением атрибута selinux. –

2

Установите разрешения для каталога , который содержит файлы.

+0

Это каталог, а не папка. –

+0

@BasileStarynkevitch ты прав. Спасибо. – alfasin

Смежные вопросы