2

Я только что обнаружил, что nano, KWrite и Kate молча перезаписывают файлы, доступные только для чтения, при редактировании с правами root - даже если права доступа к файлам равны 400 (-r --------). Также не имеет значения, является ли root владельцем или нет.

Это поведение где-то настраивается? (Я не вижу в нем упоминается в руководстве нано здесь, к примеру, но я надеюсь , что есть способ , чтобы исправить это на системном уровне.) Кроме того, поведение не ограничивается только конкретным редактором, как показывают мои тесты с nano, Kate и KWrite.

Кроме того, каковы мои другие варианты? Существует ли другой набор (стандартных linux) разрешений, которые могли бы изменить это поведение? Я знаю, что root может удалять любые файлы, но я ожидал, по крайней мере, предупреждение при редактировании / изменении файла только для чтения.

Я использую Kubuntu 12.04 с обычными правами доступа к файлам linux (т.е. без SELinux или ACL). Также, используя btrfs, если это имеет значение.

2 ответа2

4

Это зависит от редактора.

Для текстового редактора вполне возможно проверить разрешения для файла и отказаться от записи в него, если у него нет прав на запись ни для владельца, ни для группы, ни для других. Просто потому, что он может записывать в файл (потому что он работает от имени root), это не значит, что он должен это делать.

Я только что попробовал это с vim 7.3 на Ubuntu, и он действительно делает это. Если я редактирую файл как root, он переводит его в режим только для чтения. (Я все еще могу написать ему, используя :w! а не :w .) GNU Emacs 23.2.1 ведет себя аналогично.

Нано, как вы заметили, не делает этого; Я не пробовал других редакторов. Но nano -v редактирует файл в режиме "просмотра" (только для чтения). Не должно быть слишком сложно написать оболочку, которая проверяет права доступа к файлу и вызывает либо nano либо nano -v , в зависимости от того, должен ли он быть доступен для записи. (Обратите внимание, что вам нужно использовать что-то кроме теста [ -w filename ] ; если вы root, он возвращает true для файла с 400 правами доступа.)

РЕДАКТИРОВАТЬ :

Вот nano оболочка, которую я только что скинул в Perl. Он не принимает никаких аргументов, кроме одного имени файла, которое является обязательным (и файл должен уже существовать).

#!/usr/bin/perl

use strict;
use warnings;

die "Usage: $0 file\n" if scalar @ARGV != 1;
my $file = $ARGV[0];
die "$file does not exist\n" if not -e $file;

my @stat = stat $file;
die "stat $file: $!\n" if not @stat;

my $mode = $stat[2];

my @command = qw(nano);
if (($mode & 0222) == 0) {
    push @command, '-v';
}
push @command, $file;

# print "\$ @command\n";
exec @command;

Вместо того, чтобы проверять, доступен ли файл для записи, он извлекает свои биты режима и непосредственно проверяет, установлены ли какие-либо биты записи. Кажется, это работает с очень беглым тестированием, которое я сделал. Используйте это на свой страх и риск. Это должно быть легко адаптироваться к другим редакторам.

Кстати, я никогда не использую нано. Кажется, что когда вы выходите, он спрашивает, хотите ли вы сохранить измененный буфер, и запрашивает файл для его сохранения, даже если файл доступен для записи. По крайней мере, в режиме по умолчанию мне кажется, что было бы трудно случайно заглушить файл. Я полагаю, это проще, если вы установите некоторые параметры для "экспертного" использования.

2

Да, существует другой набор атрибутов linux, которые не позволяют изменять файл. Установите файл как неизменяемый с помощью команды chattr +i filename .

Пожалуйста, смотрите http://www.aboutlinux.info/2005/11/make-your-files-immutable-which-even.html для деталей.

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