Como fazer com que os editores de texto respeitem as permissões de arquivos somente leitura como root?

2

Acabei de descobrir que o nano, o KWrite e o Kate substituem silenciosamente os arquivos somente leitura ao editar como root - mesmo que as permissões do arquivo sejam 400 (-r --------). Também não importa se o root é o proprietário ou não.

Esse comportamento é configurável em algum lugar? (Eu não vejo isso mencionado no manual nano aqui , por exemplo, mas espero que haja uma maneira de corrigir isso no nível do sistema.) Além disso, o comportamento não se limita a apenas um editor específico, como mostram meus testes com nano, Kate e KWrite.

Como alternativa, quais são minhas outras opções? Existe um conjunto diferente de permissões (linux padrão) que mudariam esse comportamento? Eu sei que o root pode excluir quaisquer arquivos, mas eu estava esperando pelo menos um aviso ao editar / alterar um arquivo somente leitura.

Estou executando o Kubuntu 12.04 com permissões regulares de arquivo linux (ou seja, sem SELinux ou ACLs). Também usando o btrfs, se isso importa.

    
por MountainX 26.03.2012 / 22:40

2 respostas

2

Sim, há um conjunto diferente de atributos do Linux que impediria que o arquivo fosse modificado. Configure o arquivo como imutável com o comando chattr +i filename .

Por favor, veja link para detalhes.

    
por 20.12.2013 / 00:17
4

Depende do editor.

É perfeitamente possível que um editor de texto verifique as permissões do arquivo e se recuse a escrevê-lo se ele não tiver permissões de gravação para proprietário, grupo ou outros. Só porque pode gravar em um arquivo (porque está sendo executado como root), isso não significa que seja necessário.

Eu apenas tentei isso com o vim 7.3 no Ubuntu, e ele realmente faz isso. Se eu editar um arquivo como root, ele o definirá no modo somente leitura. (Eu ainda posso escrever para ele usando :w! em vez de :w .) O GNU Emacs 23.2.1 se comporta de maneira semelhante.

nano, como você observa, não faz isso; Eu não tentei outros editores. Mas nano -v edita um arquivo no modo "view" (somente leitura). Não deve ser muito difícil escrever um wrapper que verifique as permissões em um arquivo e invoque nano ou nano -v , dependendo se deve ser gravável. (Observe que você precisaria usar algo diferente de [ -w filename ] test; se você for root, ele retornará verdadeiro para um arquivo com 400 permissões.)

EDITAR:

Aqui está um wrapper nano que acabei de usar em Perl. Ele não aceita nenhum outro argumento além de um único nome de arquivo, que é obrigatório (e o arquivo já deve existir).

#!/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;

Em vez de verificar se o arquivo é gravável, ele recupera seus bits de modo e verifica diretamente se algum dos bits de gravação está configurado. Parece funcionar com o muito teste superficial que fiz. Use isso a seu próprio risco. Deve ser fácil adaptar-se a outros editores.

BTW, eu nunca uso nano pessoalmente. Parece que quando você sai, ele pergunta se você deseja salvar o buffer modificado e solicita que o arquivo seja salvo, mesmo se o arquivo for gravável. Pelo menos em seu modo padrão, parece-me que seria difícil acidentalmente destruir um arquivo. Acho que é mais fácil se você definir algumas opções para uso "especializado".

    
por 26.03.2012 / 23:01