Могу ли я записать файл только с разрешением на чтение? [дубликат]

На этот вопрос уже есть ответ здесь:

Я просто установил разрешение только на чтение для файла используя chmod 400 filename.txt , после этого я открываю файл через редактор vi, редактирую и пытаюсь сохранить, используя: w, тогда он говорит E45: установлена ​​опция 'readonly' (добавьте!, чтобы переопределить) , поэтому я использую : w! . Затем он сохраняет отредактированный файл с разрешением только для чтения? Как это может быть возможно?

Есть ли различия между Ubuntu и Fedora, которые влияют на права доступа?

1
задан 9 August 2014 в 11:51

2 ответа

Если файл принадлежит Вам, можно всегда изменять полномочия на файле путем вызова chmod. Я предполагаю, что редактор просто изменяет неявные полномочия, сохраняет и возвращается полномочия. Для реального запрещения записи необходимо изменить владельца файла также.

1
ответ дан 10 November 2019 в 18:08

Я работал vim использование strace. Я создал файл в/tmp, названном "abc" с содержанием "нечто", установил его только для чтения (chmod 400 abc), открыл его в vim (strace -o vim.log vim abc) и сохранил его использование ": wq!".

Вот эти strace журнал:

...
getcwd("/tmp", 4096)                    = 5
write(1, "\33[?25l\"abc\"", 11)         = 11
stat("abc", {st_mode=S_IFREG|0400, st_size=4, ...}) = 0
getxattr("abc", "system.posix_acl_access", 0x7fff5725fd60, 132) = -1 ENODATA (No data available)
stat("abc", {st_mode=S_IFREG|0400, st_size=4, ...}) = 0
getuid()                                = 1000
chmod("abc", 0100600)                   = 0
open("abc", O_WRONLY|O_CREAT|O_TRUNC, 0600) = 9
write(9, "foo\n", 4)                    = 4
fsync(9)                                = 0
close(9)                                = 0
chmod("abc", 0100400)                   = 0
setxattr("abc", "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x04\x00\xff\xff\xff\xff\x04\x00\x00\x00\xff\xff\xff\xff \x00\x00\x00\xff\xff\xff\xff", 28, 0) = 0
...

Мы видим, что vim вызовы stat для получения текущего разрешения, тогда эквивалент chmod(u+w), тогда запись, тогда это восстанавливает исходные полномочия (в этом случае, chmod(400)).

6
ответ дан 10 November 2019 в 18:08

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

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