Pourquoi puis-je modifier un fichier en lecture seule?

41

Petite question:

Pourquoi peut-on manipuler un fichier en lecture seule dans vim en utilisant : + w + q + même sans être administrateur?

Longue question:

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

[email protected]:~/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 les privilèges d’administrateur:

[email protected]:~/ubuntuTest$ vi myFile.txt 

I modifier et appuyez sur: Esc + : + w + q + Entrée et je vois ce message d'erreur:

E45: 'readonly' option is set (add ! to override)

Jusqu'à présent, tout a du sens. Mais quand je presse: Esc + : + w + q + + Entrez , Vim enregistre les modifications.

J'utilise Ubuntu 16.04 et VIM 7.4.

    
posée Navid Vafaei 23.08.2016 - 17:06
la source

7 réponses

57

Comme @Rob 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 avec 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

Ensuite, nous avons édité 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 été supprimé pour la première fois ( 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 lui ont été écrites ( write(4, "foasdasdao\n", 11) ). Si vous essayez ceci à la maison, vous verrez qu'après l'avoir édité avec vim , le fichier vous appartiendra maintenant et non pas root.

Donc, à proprement parler, vim n'édite pas un fichier auquel vous n'avez pas accès en écriture. Il supprime un fichier d'un répertoire auquel vous avez un accès en écriture, puis crée un nouveau fichier auquel vous avez à nouveau accès en écriture.

    
réponse donnée terdon 23.08.2016 - 17:40
la source
15

Tant que vous possédez le répertoire parent, vous pouvez supprimer ou remplacer un fichier, quelle que soit l’autorisation, car vous pouvez modifier le contenu du répertoire:).

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

Ajout:

Juste essayé, mais tant que je possède le fichier, je peux toujours le modifier, même avec le dossier en lecture seule. Cependant, lorsque je change de propriétaire en root: root, il ne peut plus ouvrir le fichier en écriture. Donc, résout les fichiers de modification appartenant à la racine (ou à quelqu'un d'autre)

    
réponse donnée Rob 23.08.2016 - 17:34
la source
15

En utilisant w! , vous supprimez le fichier original ( que vous êtes autorisé à faire ) et vous écrivez plutôt votre version.

Lorsque vous avez accès en écriture à un répertoire, vous pouvez: créer, déplacer ou supprimer des fichiers dans 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 Aug 31 03:19 foo/file

Permettez-moi maintenant de changer d'utilisateur et de modifier le fichier

$ sudo -u user2 -s
$ vi foo/a # save using w! (I wrote into the file bye)
$ ls -l foo/a
-rwx------ 1 user2 user2 7 Aug 31 03:20 foo/file

Maintenant, voyez ce qu'il y a dedans:

$ cat foo/file
bye
    
réponse donnée Ravexina 31.08.2017 - 04:48
la source
9

Voir :help write-readonly :

                                                        write-readonly
When the 'cpoptions' option contains 'W', Vim will refuse to overwrite a
readonly file.  When 'W' is not present, ":w!" will overwrite a readonly file,
if the system allows it (the directory must be writable).

Comme vous avez des droits d’écriture sur le répertoire (ce qui signifie que vous pouvez créer, supprimer ou renommer des fichiers), le système l’autorise.

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

                                                'cpoptions' 'cpo' cpo
'cpoptions' 'cpo'       string  (Vim default: "aABceFs",
                                 Vi default:  all flags)
                        global
    
réponse donnée muru 31.08.2017 - 04:57
la source
2

Ceci est un avertissement de VIM qui peut être relativement important compte tenu du fonctionnement des autorisations sous UNIX. Le manque de intuitivité apparent est dû au fait que les systèmes de fichiers UNIX ont des autorisations pour les fichiers stockés dans i-node du fichier. La structure des répertoires est en quelque sorte séparée et ne fait que relier ces i-nodes. Les répertoires disposent également de leurs autorisations pour indiquer si vous pouvez y associer / dissocier des fichiers ou les lire ou les parcourir dans des sous-répertoires. Cette conception permet que le même fichier puisse apparaître à plusieurs endroits différents de la structure de répertoires (via des liens durs). En disant "add! To override", VIM essaie de vous avertir que le fichier original sera dissocié (il restera donc intact) et le nouveau fichier sera créé et lié à l'emplacement d'origine dans la structure du répertoire. Si le nombre de liens du fichier d'origine est réduit à zéro, le fichier d'origine sera libéré, mais sinon, vous clonez effectivement le fichier. L'ouverture du fichier est également considérée comme un lien. Par conséquent, si un programme a ouvert le fichier et que vous acceptez "d'ajouter! Pour remplacer", le programme ne verra pas les modifications apportées au fichier avec VIM. Le fichier est uniquement dissocié du répertoire par VIM et après la fermeture du fichier par un autre programme, le fichier sera libéré, sauf s'il était lié ailleurs.

Veuillez noter que dans Windows, les autorisations pour les fichiers sont stockées dans le répertoire, donc du point de vue du paradigme des autorisations Windows, ce comportement de vim peut en effet sembler étrange. Pour écrire dans le fichier, Windows peut aussi, logiquement, vérifier certaines autorisations de répertoire, même les autorisations de super-répertoire. Comme indiqué ci-dessus, sous UNIX, les autorisations de répertoire ne sont pas pertinentes pour la manipulation du fichier, dans la mesure où vous avez été en mesure de le lister et de l'ouvrir (c'est-à-dire qu'il y avait x pour tous les super-répertoires). Le fichier ouvert sous UNIX peut même ne plus avoir de nom de fichier s'il était dissocié de tous les répertoires après son ouverture.

Par exemple, vous avez le fichier / home / user1 / foo et il s'agit du même fichier que (c.-à-d. lié) / home / user2 / foo et le fichier n'est accessible en écriture que par le programme P (lecture ouverte) -write par programme démarré par root). Si user1 l'ouvre avec vim et écrase, il crée sa propre copie et ne voit plus le fichier original. Si par la suite, user2 ouvre son lien avec vim et y écrit, il sera de nouveau dissocié et il créera une autre copie. Le programme P verra toujours le fichier original et pourra librement y lire ou écrire. Dès que le programme ferme le fichier, le fichier disparaîtra (libéré par le système de fichiers).

    
réponse donnée ludvik02 25.08.2016 - 12:18
la source
2

Votre éditeur vim et votre fichier portent tous les deux votre

 getpwnam("navid")->pw_uid

propriété pour que vous puissiez également bombarder

 :!chmod +w %

et vous pourriez deviner qu’il était une fois le plus simple

 :!rm %

(ne nécessitant que la permission + w, pas de dissociation sur et pas même la propriété) est devenu trop fréquent pour que quelqu'un puisse le taper de sorte que vim a été reprogrammé pour automatiquement proposer une telle opération.

Essayez de remplacer vos grandes soeurs

 /home/whoopi/.profile
En tant que simple navid et paris, votre vim vous donne le refus désiré.

    
réponse donnée Roman Czyborra 24.08.2016 - 21:43
la source
1

Ce n’est pas exactement une réponse, mais si vous voulez vraiment définir un fichier pour que personne ne puisse le modifier ou le supprimer, vous pouvez le rendre immuable.

Normalement, même si un fichier appartient à root, vous pouvez toujours supprimer le fichier si vous avez des droits en écriture sur le dossier. Mais lorsque vous rendez le fichier immuable, même root ne peut pas le modifier ou le supprimer.

Pour rendre un fichier immuable (vous avez besoin de sudo ):

sudo chattr +i myFile.txt

Vous pouvez voir ceci avec lsattr (la lettre i dans le résultat):

$ lsattr myFile.txt
----i--------e-- myFile.txt

Pour que le fichier redevienne normal:

sudo chattr -i myFile.txt

Pour clarifier: lorsqu'un fichier est immuable, il ne peut pas être supprimé, renommé, modifié ou même lié en dur.

Cela vaut la peine de lire man chattr , car les fichiers peuvent avoir plusieurs attributs utiles.

Vous pouvez également trouver "suppression restreinte" utile. Si elle est placée dans un dossier (pas un fichier), cela signifie que quiconque crée un fichier dans le dossier est autorisé à modifier ou à supprimer ce fichier, mais que personne d'autre n'est (à l'exception de root). Le dossier /tmp a cet indicateur défini. Vous pouvez le voir avec l'indicateur t sur /tmp :

$ ls -l --directory /tmp
drwxrwxrwt 10 root root 4096 Sep  6 09:00 /tmp

Pour définir ou supprimer l’indicateur de suppression restreinte dans un dossier:

chmod +t myFolder      # Add the restricted deletion flag.
chmod -t myFolder      # Remove the restricted deletion flag.
    
réponse donnée Paddy Landau 06.09.2017 - 10:11
la source

Lire d'autres questions sur les étiquettes