42 votes

Pourquoi puis-je modifier un fichier en lecture seule ?

Question courte :

Pourquoi pouvons-nous manipuler un fichier en lecture seule dans Vim en utilisant : + w + q + ! même sans être administrateur ?

Question longue :

J'ai un fichier texte (monFichier.txt) qui est en lecture seule pour tout le monde :

navid@navid-ThinkPad-T530:~/ubuntuTest$ ls -l myFile.txt 
-r--r--r-- 1 navid navid 26 Aug 22 21:21 myFile.txt

Je peux l'ouvrir avec Vim sans avoir de privilèges d'administration :

navid@navid-ThinkPad-T530:~/ubuntuTest$ vi myFile.txt 

Je le modifie et presse : Esc + : + w + q + Entrée et je vois ce message d'erreur :

E45: l'option 'readonly' est activée (ajoutez ! pour outrepasser)

Jusque là, tout est logique. Mais quand je presse : Esc + : + w + q + ! + Entrée, Vim enregistre les modifications.

Je suis sous Ubuntu 16.04 et j'utilise VIM 7.4.

58voto

Stewart Points 1385

Comme @Rob l'a déjà mentionné, vous ne pouvez le faire que si vous avez accès en écriture au répertoire contenant le fichier. Tenter de faire la même chose à un fichier dans, par exemple, /etc échouera.

Quant à comment vim fait cela, il supprime le fichier et le recrée. Pour tester cela, j'ai créé un fichier appartenant à root:

echo foo | sudo tee fff

Et j'ai ensuite modifié le fichier avec vim de la manière que vous décrivez, mais en attachant le processus à strace pour voir ce qui se passe :

strace vim fff 2> strace.out

J'ai ensuite vérifié strace.out et trouvé :

unlink("fff")                           = 0
open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
write(4, "foasdasdao\n", 11)            = 11

Ainsi, le fichier a d'abord été supprimé (unlink("fff")), puis un nouveau fichier du même nom a été créé (open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644)) et les modifications que j'avais apportées y ont été écrites (write(4, "foasdasdao\n", 11)). Si vous essayez ceci chez vous, vous verrez qu'après l'avoir modifié avec vim, le fichier appartiendra désormais à vous et non plus à root.

Donc, pour être précis, vim n'édite pas strictement un fichier auquel vous n'avez pas accès en écriture. Il supprime un fichier d'un répertoire auquel vous avez accès en écriture, puis crée un nouveau fichier auquel, une fois de plus, vous avez accès en écriture.

15voto

Hedley Phillips Points 369

Tant que vous possédez le répertoire parent, vous pouvez supprimer, ou remplacer un fichier peu importe les autorisations car vous pouvez changer le contenu du répertoire :).

Essayez avec une autre commande comme rm, il vous demandera confirmation mais vous pouvez toujours le faire. Rendez le répertoire non inscriptible et cela devrait l'arrêter.

Ajout :

Je viens d'essayer mais tant que je possède le fichier, je peux toujours le modifier, même avec le répertoire en lecture seule. Cependant, lorsque je change la propriété en root:root, il ne peut pas ouvrir le fichier en écriture. Donc résout le problème de modification de fichiers appartenant à root (ou à quelqu'un d'autre).

15voto

Ravexina Points 50599

En utilisant w!, vous supprimez le fichier d'origine (ce que vous avez le droit de faire) et écrivez à la place votre version.

Lorsque vous avez un accès en écriture à un répertoire, vous pouvez : créer, déplacer ou supprimer des fichiers à l'intérieur de ce répertoire.

$ mkdir foo
$ echo hi > foo/file
$ chmod 777 foo
$ chmod 700 foo/file
$ ls -l foo/file 
-rwx------ 1 ravexina ravexina 7 Août 31 03:19 foo/file

Maintenant laissez-moi changer mon utilisateur et modifier le fichier

$ sudo -u user2 -s
$ vi foo/a # enregistrez en utilisant w! (j'ai écrit bye dans le fichier)
$ ls -l foo/a
-rwx------ 1 user2 user2 7 Août 31 03:20 foo/file

Maintenant voyez ce qu'il y a à l'intérieur :

$ cat foo/file
bye

9voto

muru Points 180007

Voir :help write-readonly:

                                                        write-readonly
Lorsque l'option 'cpoptions' contient 'W', Vim refusera d'écraser un
fichier en lecture seule. Lorsque 'W' n'est pas présent, ":w!" écrasera un fichier en lecture seule,
si le système le permet (le répertoire doit être accessible en écriture).

Étant donné que vous avez les permissions d'écriture sur le répertoire (ce qui signifie que vous pouvez créer, supprimer ou renommer des fichiers), le système le permet.


La valeur par défaut de cpoptions ne contient pas W:

                                                'cpoptions' 'cpo' cpo
'cpoptions' 'cpo'       chaîne  (par défaut Vim: "aABceFs",
                                 par défaut Vi: tous les indicateurs)
                        global

2voto

Roman Czyborra Points 130

À la fois votre processus d'édition vim et votre fichier portent votre

 getpwnam("navid")->pw_uid

propriété afin que vous puissiez également lancer un shell

 :!chmod +w %

et vous pourriez deviner qu'autrefois le plus simple encore

 :!rm %

(ne nécessitant que la permission de suppression +w,u-t sur . et même pas la propriété) est devenu trop fréquent pour que quelqu'un le tape, de sorte que vim a été reprogrammé pour offrir automatiquement et, sur demande, effectuer automatiquement une telle opération.

Essayez d'écraser le fichier de configuration de votre grande sœur

 /home/whoopi/.profile

comme simple navid et gage que votre vim vous donne votre refus désiré.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X