web-dev-qa-db-fra.com

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

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, me rendre compte que je ne l'ai pas exécuté dans Sudo, crier pour moi-même, puis le forcer à quitter et l'ouvrir à nouveau 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?

49
and0rsk

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

  1. en lecture seule par vi. Si votre fichier a :set readonly vous pouvez
    • Utilisez :w! pour forcer l'écriture, ou
    • Émettez :set noreadonly et utilisez simplement :w normal
  2. A permission problème ( Sudo ): vous ne pouvez pas écrire mais vous disposez des droits Sudo.
    • Problème: :w !Sudo tee %. Cela écrira le tampon dans tee, une commande qui reçoit les informations canal et peut écrire dans des fichiers. Et comme tee est utilisé avec les pouvoirs de Sudo, tee peut modifier le fichier.
  3. Un permission problème ( no Sudo ): vous n’avez pas le droit d’écrire le fichier et vous n’avez pas d’accès administrateur.
    • Utilisez :w! ~/tempfile.ext pour é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. De Data Agaric

Raccourci

Comme c'est souvent le cas du problème n ° 2 ( permission problème, avec Sudo ), vous pouvez ajouter à votre /etc/vim/vimrc (ou ~/.vimrc) le raccourci suivant:

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

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

77
Dr Beco

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 façon suppose que quelqu'un d'autre est propriétaire du fichier 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.

Un moyen d’enregistrer la session d’édition actuelle en tant que script ed consiste à transmettre le nom de fichier original et le tampon vi édité comme entrée standard à l’utilitaire diff avec le commutateur de ligne de commande --ed, c’est-à-dire les différences d’affichage en tant que 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 voulons 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 inscriptible, 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 commande en 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 un moyen de sauvegarder le travail effectué dans vi dans un fichier qui appartenait à l’origine à une autre personne et utilisant vi, diff et ed.

4
Billy McCloskey

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

1
yatsa

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 .

0