我刚刚发现,当以 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。当你退出时,它似乎会询问你是否要保存修改后的缓冲区和提示输入要保存的文件,即使该文件是可写的。至少在默认模式下,我认为意外破坏文件是困难的。我想如果您为“专家”使用设置一些选项会更容易。