Pergunta curta:
Por que podemos manipular um arquivo somente leitura no Vim usando :+ w+ q+ !mesmo sem ser um administrador?
Pergunta longa:
Eu tenho um arquivo de texto (myFile.txt) que é somente leitura para todos:
navid@navid-ThinkPad-T530:~/ubuntuTest$ ls -l myFile.txt
-r--r--r-- 1 navid navid 26 Aug 22 21:21 myFile.txt
Eu posso abri-lo com o Vim sem ter privilégios de administrador:
navid@navid-ThinkPad-T530:~/ubuntuTest$ vi myFile.txt
Modifico e pressiono: Esc+ :+ w+ q+ Entere vejo esta mensagem de erro:
E45: 'readonly' option is set (add ! to override)
Até agora, tudo faz sentido. Mas quando eu pressiono: Esc+ :+ w+ q+ !+ Enter, o Vim salva as alterações.
Estou usando o Ubuntu 16.04 e VIM 7.4.
command-line
permissions
vim
chmod
read-only
Navid Vafaei
fonte
fonte
Modifying a file and replacing a file are two different things
Respostas:
Como o @Rob já mencionado , você só pode fazer isso se tiver acesso de gravação ao diretório que contém o arquivo. Tentar fazer o mesmo com um arquivo, por exemplo,
/etc
falhará.Quanto a como isso
vim
é feito, ele exclui o arquivo e o recria. Para testar isso, criei um arquivo de propriedade root:E, em seguida, continue editando o arquivo
vim
da maneira que você descreve, mas anexando o processostrace
para ver o que está acontecendo:Eu então verifiquei
strace.out
e encontrei:Portanto, o arquivo foi excluído primeiro (
unlink("fff")
), então um novo arquivo com o mesmo nome foi criado (open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644)
) e as modificações que eu fiz foram gravadas nele (write(4, "foasdasdao\n", 11)
). Se você tentar fazer isso em casa, verá que, depois de editá-lovim
, o arquivo agora pertence a você e não é root.Portanto, estritamente falando,
vim
não está editando um arquivo ao qual você não tem acesso de gravação. Ele está excluindo um arquivo de um diretório ao qual você tem acesso de gravação e, em seguida, criando um novo arquivo ao qual, novamente, você tem acesso de gravação.fonte
rename(2)
-lo para substituir o arquivo antigo. Então não há janela de tempo em que seus dados não existam no disco.Desde que você possua o diretório pai, poderá remover ou substituir um arquivo, independentemente da permissão, pois é possível alterar o conteúdo do diretório :).
Experimente com outro comando como rm, ele solicitará, mas você ainda poderá fazê-lo. Torne o diretório não gravável e isso deve pará-lo.
Adição:
Apenas tentei, mas enquanto eu possuir o arquivo, ainda posso modificá-lo, mesmo com a pasta somente leitura. No entanto, quando altero a propriedade para root: root, ele não pode abrir o arquivo para gravação. Então, resolve os arquivos modificadores pertencentes ao root (ou a outra pessoa)
fonte
Usando
w!
você, você está removendo o arquivo original ( que você tem permissão para fazer ) e escrevendo sua versão.Quando você tem acesso de gravação a um diretório, pode: criar, mover ou excluir arquivos nesse diretório.
Agora, deixe-me mudar de usuário e alterar o arquivo
Agora veja o que está lá:
fonte
Veja
:help write-readonly
:Como você possui permissões de gravação no diretório (o que significa que você pode criar, excluir ou renomear arquivos nele), o sistema permite isso.
O valor padrão de
cpoptions
não contémW
:fonte
Este é o aviso do VIM para você que pode ser relativamente importante, considerando como as permissões funcionam no UNIX. A aparente falta de intuitividade disso ocorre porque os sistemas de arquivos UNIX têm permissões para o arquivo armazenado no nó i do arquivo. A estrutura de diretórios é de alguma forma separada e está vinculando apenas esses nós-i. Os diretórios também têm suas permissões que indicam se você pode vincular / desvincular arquivos nele ou lê-lo ou passar para subdiretórios. Esse design permite que o mesmo arquivo possa aparecer em vários locais diferentes na estrutura de diretórios (por meio de links físicos). Ao dizer "adicionar! Para substituir", o VIM está tentando avisá-lo de que o arquivo original será desvinculado (portanto, permanecerá intocado em todos os outros lugares) e o novo arquivo será criado e vinculado ao local original na estrutura de diretórios. Caso a contagem de links do arquivo original diminua para zero, o arquivo original será liberado, mas, se não, você estará efetivamente clonando o arquivo. A abertura do arquivo também conta como link, por isso, se algum programa abriu o arquivo e você concorda em "adicionar! Substituir", o programa não verá as alterações feitas no arquivo por você com o VIM. O arquivo só é desvinculado do diretório pelo VIM e, após fechar o arquivo por outro programa, o arquivo será liberado, a menos que tenha sido vinculado a outro lugar.
Observe que no Windows, as permissões para arquivos são armazenadas no diretório, portanto, do ponto de vista do paradigma de permissões do Windows, esse comportamento do vim pode realmente parecer estranho. Para gravar no arquivo, o Windows logicamente também pode verificar algumas permissões de diretório, mesmo permissões de superdiretório. Como dito acima, no UNIX, as permissões de diretório são irrelevantes para a manipulação do arquivo na medida em que você foi capaz de listá-lo e abri-lo (ou seja, havia x para todos os super-diretórios). O arquivo aberto no UNIX pode não ter mais o nome do arquivo se ele tiver sido desvinculado de todos os diretórios após a abertura.
Por exemplo, você possui file / home / user1 / foo e é o mesmo arquivo (por exemplo, com link direto para) / home / user2 / foo, e o arquivo não pode ser gravado por ninguém e, atualmente, é aberto pelo programa P (leitura / gravação aberta por programa iniciado pela raiz). Se o usuário1 o abrir com o vim e sobrescrever, ele fará sua própria cópia e não verá mais o arquivo original. Se subseqüentemente o usuário2 abrir seu link com o vim e gravar nele, ele será desvinculado novamente e ele criará outra cópia. O programa P ainda verá o arquivo original e pode ler ou gravar livremente nele. Assim que o programa fechar o arquivo, o arquivo desaparecerá (será liberado pelo sistema de arquivos).
fonte
O processo do seu editor vim e seu arquivo carregam seu
propriedade para que você também possa desembolsar
e você pode adivinhar que era uma vez o mais simples
(exigindo apenas + w, sem permissão para desvincular. e nem mesmo propriedade) tornou-se muito frequente para alguém digitar, para que o vim fosse reprogramado para oferecer automaticamente e, mediante solicitação, executar automaticamente tal operação.
Tente substituir o de sua irmã mais velha
como mero navid e apostas, seu vim lhe dá a recusa desejada.
fonte
Esta não é exatamente uma resposta, mas se você realmente deseja definir um arquivo para que ninguém possa alterá-lo ou excluí-lo, você pode torná-lo imutável.
Normalmente, mesmo quando um arquivo pertence à raiz, você ainda pode excluí-lo se tiver permissões de gravação na pasta. Mas quando você torna o arquivo imutável, mesmo o root não pode modificá-lo ou excluí-lo.
Para tornar um arquivo imutável (você precisa
sudo
):Você pode ver isso com
lsattr
(a letrai
no resultado):Para tornar o arquivo normal novamente:
Para esclarecer: Quando um arquivo é imutável, ele não pode ser excluído, renomeado, modificado ou vinculado diretamente.
Vale a pena ler
man chattr
, porque os arquivos podem ter vários atributos úteis.Você também pode achar útil "exclusão restrita". Se colocado em uma pasta (não em um arquivo), isso significa que quem cria um arquivo dentro da pasta tem permissão para modificar ou excluir esse arquivo, mas ninguém mais é (exceto raiz). A pasta
/tmp
tem este sinalizador definido. Você pode ver isso com at
bandeira em/tmp
:Para definir ou remover o sinalizador de exclusão restrita em uma pasta:
fonte