75 votes

Utiliser vim pour forcer l'édition d'un fichier ouvert sans permissions

J'utilise vim pour éditer un fichier. Parfois, j'oublie d'avoir les permissions appropriées. J'exécute vim et le fichier comme un fichier en lecture seule. Je peux faire des modifications, mais je ne peux pas réellement écrire les modifications. De temps en temps, je finis par ouvrir un fichier et y apporter des modifications, je me rends compte que je ne l'ai pas exécuté en sudo, je me crie dessus, puis je quitte de force et je l'ouvre à nouveau en tant qu'utilisateur root.

Existe-t-il une solution de contournement pour cela ? Puis-je forcer les changements dans le fichier malgré le statut de lecture seule du fichier ? Puis-je au moins enregistrer les modifications, lancer une comparaison et fusionner les fichiers ensemble ?

125voto

DrBeco Points 1675

Il semble y avoir différentes approches, en fonction de votre problème actuel :

  1. En lecture seule par vi. Si votre fichier a :set readonly vous pouvez
    • 使用方法 :w! pour forcer l'écriture, ou
    • Numéro :set noreadonly et ensuite, utilisez simplement les :w
  2. A autorisation problème ( sudo ) : vous ne pouvez pas écrire mais vous avez les droits sudo.
    • Question : :w !sudo tee % . Ceci va écrire la mémoire tampon dans tee une commande qui reçoit tuyau et peut écrire dans des fichiers. Et comme tee est exécuté avec les pouvoirs sudo, tee peut modifier le fichier.
  3. A autorisation problème ( pas de sudo ) : vous n'avez pas le droit d'écrire dans le fichier et vous n'avez pas d'accès administrateur.
    • 使用方法 :w! ~/tempfile.ext pour écrire vos modifications dans un fichier temporaire et ensuite prendre des mesures pour déplacer le fichier temporaire dans le répertoire (envoyer le fichier temporaire au propriétaire/admin du répertoire).

Vous pouvez en savoir plus à ce sujet ici :

  1. De StackOverflow
  2. De Geekyboy
  3. De Data Agaric

Raccourci

Comme c'est souvent le cas, le problème n°2 ( autorisation problème, avec sudo ), vous pouvez accéder à 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!! à sauver avec sudo pouvoirs. Je ne vais pas l'expliquer ici mais les références ci-dessus couvrent de nombreux raccourcis.

5voto

Billy McCloskey Points 1615

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

La première façon suppose que vous êtes propriétaire du fichier, mais le fichier est READONLY.

Il suffit d'utiliser le suffixe point d'exclamation de vi à la commande write (:w !) pour forcer l'écrasement de votre propre fichier READONLY. Cela suppose bien sûr que vous ayez la permission d'écrire et d'exécuter dans le dossier actuel.

:w!

fera en sorte que vi écrase le fichier READONLY d'origine.

La deuxième méthode suppose que quelqu'un d'autre possède le fichier et que vous souhaitez enregistrer vos modifications dans ce fichier.

Une façon d'y parvenir est d'enregistrer les modifications apportées au fichier original en tant que ed script à partir de vi. Ce ed script peut être appliqué au fichier original (ou à d'autres fichiers similaires) ultérieurement en dehors de vi avec l'éditeur de ligne ed.

Une façon d'enregistrer la session d'édition en cours comme un ed script est de passer le nom du fichier original et le vi buffer édité comme entrée standard à l'utilitaire diff avec le commutateur de ligne de commande --ed c'est-à-dire afficher les différences comme un ed script.

Donc, en supposant que le tampon vi a été édité, effectuez les opérations suivantes

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

Cela remplace toutes les lignes du Tampon actuel (.,$ !) par le diff généré ed script (diff --ed [fichier_original] -) nécessaire pour convertir le fichier original en contenu du Tampon actuel. Nous voulons ensuite sauvegarder ce ed script dans un endroit sûr, et appliquer le script à une version du fichier original sur laquelle nous pouvons écrire. Donc, enregistrez le script à un endroit où l'on peut écrire, par exemple, votre dossier de connexion :

:w ~/my_ed_script

Maintenant, quittez vi, et utilisez ce ed script pour obtenir le fichier édité qui n'a pas pu être sauvegardé en premier lieu. Voici comment accomplir cela depuis 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 commandes fait en mots est de caténiser le script que nous avons généré avec diff et de renvoyer la commande d'écriture de ed, 'w', vers l'entrée standard de ed. Ed applique ensuite ce script à la copie inscriptible du fichier d'origine, et réécrit ces modifications du buffer dans le fichier.

Il s'agit donc d'un moyen de sauvegarder le travail effectué en vi dans un fichier qui appartenait à l'origine à quelqu'un d'autre en utilisant vi, diff et ed.

1voto

Peter Points 11

Je veux juste couvrir le cas où il n'y a pas de droits d'écriture sur les fichiers.

:!chmod +w %
:w!

Entre-temps, vim se plaindra des changements dans le fichier (à cause des changements de drapeaux) - il est évidemment prudent de les ignorer.

0voto

Rob Charlton Points 368

Une autre possibilité, pour le cas où vous n'avez pas les privilèges sudo, est d'utiliser :w /somewhere/where/i/have/permissions/foo.txt et s'occuper plus tard du problème des autorisations, comme indiqué dans le document Ryan Fox .

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