如何让文本编辑器以 root 身份尊重只读文件权限?

如何让文本编辑器以 root 身份尊重只读文件权限?

我刚刚发现,当以 root 身份编辑时,nano、KWrite 和 Kate 都会默默覆盖只读文件——即使文件权限为 400 (-r--------)。root 是否是所有者也无关紧要。

这种行为可以在某处配置吗?(我没有在 nano 手册中看到提到它这里,但我希望有一种方法可以在系统级别修复此问题。)此外,这种行为不仅限于特定的编辑器,正如我对 nano、Kate 和 KWrite 的测试所显示的那样。

或者,我还有其他选择吗?是否有一组不同的(标准 Linux)权限可以改变此行为?我知道 root 可以删除任何文件,但我期望在编辑/更改只读文件时至少会出现警告。

我正在运行 Kubuntu 12.04,具有常规 Linux 文件权限(即没有 SELinux 或 ACL)。如果有必要,也可以使用 btrfs。

答案1

是的,有一组不同的 Linux 属性可以防止文件被修改。将文件设置为不可变的使用命令chattr +i filename

请参见http://www.aboutlinux.info/2005/11/make-your-files-immutable-which-even.html了解详情。

答案2

这取决于编辑。

文本编辑器完全可以检查文件的权限,如果所有者、组或其他人没有写入权限,则拒绝写入。仅仅因为它写入文件(因为它以 root 身份运行),但这并不意味着它必须这样做。

我刚刚在 Ubuntu 上尝试使用 vim 7.3,它确实做到了这一点。如果我以 root 身份编辑文件,它会将其设置为只读模式。(我仍然可以使用:w!而不是 来写入它:w。)GNU Emacs 23.2.1 的行为类似。

正如您所看到的,nano 不会这样做;我还没有尝试过其他编辑器。但是,它nano -v会在“查看”(只读)模式下编辑文件。编写一个包装器来检查文件的权限并调用 或 (nano取决于nano -v它是否应该可写)应该不太难。(请注意,您需要使用除测试之外的其他方法[ -w filename ];如果您是 root,它会对具有 400 个权限的文件返回 true。)

编辑 :

这是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;

它不检查文件是否可写,而是检索其模式位并直接检查是否设置了任何写入位。它似乎与非常我做了粗略的测试。使用时请自担风险。它应该很容易适应其他编辑器。

顺便说一句,我自己从来不用 nano。当你退出时,它似乎会询问你是否要保存修改后的缓冲区提示输入要保存的文件,即使该文件是可写的。至少在默认模式下,我认为意外破坏文件是困难的。我想如果您为“专家”使用设置一些选项会更容易。

相关内容