Utilisation de vim pour forcer la modification d'un fichier lorsque vous l'ouvrez sans autorisations

51

J'utilise vim pour éditer un fichier. Parfois, j'oublie d'avoir les autorisations appropriées. Je lance vim et le fichier en tant que fichier en lecture seule. Je peux apporter des modifications, mais je ne peux pas écrire les modifications. De temps en temps, je finis par ouvrir un fichier et y apporter des modifications, en me rendant compte que je ne l'ai pas exécuté sous sudo, en hurlant, puis en forçant l'arrêt et en le rouvrant en tant qu'utilisateur root.

Y at-il une solution de contournement pour cela? Puis-je forcer les modifications dans le fichier malgré le statut en lecture seule du fichier? Puis-je au moins enregistrer les modifications, exécuter un diff et fusionner les fichiers ensemble?

Andor Kesselman
la source
3
Cette question semble avoir déjà répondu ici: stackoverflow.com/questions/1005/...
Autumnal
Mes excuses. Je n'ai pas trouvé cette réponse. Je vous remercie.
Andor Kesselman
3
Utilisez l'astuce [Vim write with sudo]] [1]: w! Sudo tee% [1]: stackoverflow.com/questions/2600783/…
Mattias Åslund

Réponses:

81

Il semble y avoir différentes approches, selon votre problème actuel:

  1. En lecture seule par vi. Si votre dossier a :set readonlyvous pouvez
    • Utiliser :w!pour forcer l'écriture, ou
    • Émettre :set noreadonlyet ensuite juste utiliser normal:w
  2. Un problème de permission ( sudo ): vous ne pouvez pas écrire mais vous avez des droits sudo.
    • Problème: :w !sudo tee %. Cela écrira le tampon dans tee, une commande qui reçoit des informations de canal et peut écrire dans des fichiers. Et comme tee est exécuté avec des pouvoirs sudo, tee peut modifier le fichier.
  3. Un problème d' autorisation ( pas de sudo ): vous n'avez pas le droit d'écrire le fichier et vous n'avez pas d'accès administrateur.
    • Utilisez :w! ~/tempfile.extpour écrire vos modifications dans un fichier temporaire, puis prenez des mesures pour déplacer le fichier temporaire dans le répertoire (envoyez le fichier temporaire au répertoire propriétaire / admin).

Vous pouvez en lire plus à ce sujet ici:

  1. De StackOverflow
  2. De Geekyboy
  3. À partir de Data Agaric

Raccourci

Comme c'est souvent le cas du problème n ° 2 ( problème d' autorisation , avec sudo ), vous pouvez utiliser votre /etc/vim/vimrc(ou ~/.vimrc) raccourci suivant:

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

Ensuite, vous pouvez simplement taper :w!!pour enregistrer avec les pouvoirs sudo . Je ne l'expliquerai pas ici, mais les références ci-dessus couvrent de nombreux raccourcis.

Dr Beco
la source
1
Et avec votre anonyme comme je viens de gagner le badge de nécromancien! Merci! J'ai envie de défendre le Mordor maintenant. ;)
Dr Beco
5

Je peux penser à deux façons de le faire.

La première façon suppose que vous possédez le fichier, mais le fichier est READONLY.

Utilisez simplement le suffixe du point d'exclamation de vi pour la commande write (: w!) Pour forcer le remplacement de votre propre fichier READONLY. Bien entendu, cela suppose que vous ayez l'autorisation d'écrire et de vous exécuter dans le dossier en cours.

:w!

vi écrasera le fichier READONLY original.

La deuxième méthode suppose que le fichier est détenu par une autre personne et que vous souhaitez enregistrer vos modifications dans ce fichier.

Un moyen d'y parvenir consiste à enregistrer les modifications apportées au fichier d'origine en tant que script ed à partir de vi. Ce script ed peut être appliqué au fichier d'origine (ou à d'autres fichiers similaires) ultérieurement en dehors de vi avec l'éditeur de lignes ed.

Une façon de sauvegarder la session d'édition en cours en tant que script ed consiste à transmettre le nom de fichier d'origine et le tampon vi édité comme entrée standard à l'utilitaire diff avec le commutateur de ligne de commande --ed, c'est-à-dire d'afficher les différences sous forme de script ed.

Donc, en supposant un tampon vi édité, procédez comme suit

:.,$!diff --ed [original_file] -

Ceci remplace toutes les lignes du tampon courant (., $!) Par le script éd généré par diff (diff --ed [fichier_original] -) nécessaire pour convertir le fichier original en contenu du tampon courant. Nous souhaitons ensuite enregistrer ce script ed dans un endroit sûr et l'appliquer à une version du fichier d'origine vers lequel nous pouvons écrire. Enregistrez donc le script dans un emplacement accessible en écriture, par exemple votre dossier de connexion:

:w ~/my_ed_script

Maintenant quittez vi et utilisez ce script ed pour obtenir le fichier édité qui n’a pas pu être sauvegardé. Voici comment accomplir cela à partir de l'invite de la ligne de commande bash, '$':

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

Ce que cette séquence de commande fait en mots, c’est caténer le script que nous avons généré avec diff et faire écho à la commande d’écriture ed, 'w', sur l’entrée standard de ed. Ed applique ensuite ce script à la copie inscriptible du fichier d'origine et enregistre les modifications de tampon modifiées dans le fichier.

C’est donc une façon de sauvegarder le travail effectué dans vi dans un fichier qui appartenait à l’origine à une autre personne et utilisant vi, diff et ed.

Billy McCloskey
la source
1

Je veux juste couvrir le cas où il n'y a aucune autorisation d'écriture de fichier.

:!chmod +w %
:w!

Dans l'intervalle, vim se plaindra des modifications apportées au fichier (à cause des changements d'indicateurs) - il est évidemment prudent de les ignorer

Yatsa
la source
0

Une autre possibilité, dans le cas où vous ne possédez pas de privilèges sudo, consiste à utiliser :w /somewhere/where/i/have/permissions/foo.txt, puis à traiter le problème des autorisations ultérieurement, selon Ryan Fox .

Jonathan Ben-Avraham
la source