vim rééditer en tant que root

28

J'ouvre souvent un fichier dans vim, fais quelques changements et quand il est temps de sauvegarder le fichier est en lecture seule .. (appartenant à un autre utilisateur). Je cherche des conseils sur la façon de rouvrir le fichier en tant que root et de conserver mes modifications sans d'abord l'enregistrer dans un fichier temporaire pour le copier ou le rééditer en tant que root.

rkthkr
la source

Réponses:

42

De cette réponse stackoverflow , par skinp

:w !sudo tee %

J'oublie souvent sudo avant d'éditer un fichier sur lequel je n'ai pas de droits d'écriture. Lorsque je viens d'enregistrer ce fichier et d'obtenir une erreur d'autorisation, je lance simplement cette commande vim afin d'enregistrer le fichier sans avoir besoin de l'enregistrer dans un fichier temporaire, puis de le recopier.

dbr
la source
C'est presque ça .. Mais ce serait bien d'avoir redémarré vim et de l'exécuter en tant que root .. C'est mon préféré jusqu'à présent :)
rkthkr
@rkthkr, si "vim redémarré et exécuté en tant que root", vous ne pourrez pas enregistrer les modifications que vous avez apportées et perdre votre historique d'annulation. Mais si c'est ce que vous voulez ... [Ran out of characters.] Voir la "réponse" que je m'apprête à écrire.
Bruno Bronosky
2
@dbr, je pense qu'il vaut la peine de mentionner qu'après avoir écrasé le fichier (avec tee comme sudo), vous serez invité avec [O] k ou [L] oad. La dernière option effacera votre historique d'annulation et réinitialisera le «drapeau modifié» vous permettant de quitter sans être averti d'enregistrer les modifications. L'ancienne option, que je préfère, préservera votre historique d'annulation, mais vous avertira lorsque vous tenterez de quitter. Vous devez utiliser: q! de quitter dans ce cas. Je le fais pour que je puisse valider (par exemple:! Sudo /etc/init.d/httpd configtest) et annuler / rééditer si j'en ai besoin.
Bruno Bronosky
15

S'il vous plaît, ne me votez pas pour cela. Je ne recommande pas d'implémenter cette réponse, mais c'est la réponse que le rkthkr demande.

rkthkr a dit:
Mais ce serait bien d'avoir redémarré vim et de l'exécuter en tant que root

La façon de le faire est avec :!sudo vim %
Comme je l'ai mentionné à ipozgaj, un% en tant qu'argument (même un sous-argument) est remplacé par le chemin d'accès au tampon actuel. (Vous pouvez être invité à entrer votre mot de passe.) Vous vous retrouvez avec un nouveau processus vim, détenu par root, qui est un processus enfant du processus vim d'origine. Ça a l'air maladroit, non? Voici à quoi ça ressemble en ps:

~# ps afo pid,ppid,user,stat,comm
  PID  PPID USER         STAT COMMAND
16187 30478 rbronosky    Ss   bash
16510 16187 rbronosky    R+    \_ ps
30482 30478 rbronosky    Ss   bash
16244 30482 rbronosky    S+    \_ vim
16318 16244 root         S+        \_ vim

Si vous disposez d'autorisations d'écriture dans le répertoire contenant le fichier et que vous y avez apporté des modifications, vous pouvez être averti qu'un fichier d'échange se ferme. Le choix de [R] ecover, reflétera la plupart * des modifications apportées par le processus parent vim. (* Je pense que la mise à jour du swap est peut-être chronométrée ou a un seuil delta. J'ai déjà consacré trop de temps à cela et je ne me soucie pas de le rechercher.) Lorsque vous quittez Vim, ne vous inquiétez pas lorsque vous êtes toujours dans vim ... vous avez ouvert un 2ème processus vim. Rappelles toi?

Maintenant, avec tout cela dit ... Je ne ferais presque jamais ça. Peut-être, si je n'ai pas eu assez ou beaucoup trop de café, et j'ai réalisé que j'allais avoir besoin d'éditer plusieurs fichiers supplémentaires en tant que root ... Je pourrais essayer cela. En 14 ans d'administration de systèmes, je ne l'ai jamais fait. Mais, jusqu'à ce que vous exprimiez votre mécontentement à l'égard de ma solution préférée (qui est exactement celle proposée par dbr), je n'y avais jamais pensé.

Bruno Bronosky
la source
Merci Richard! Très instructif, je vous donnerai +1 pour cela :)
rkthkr
Il s'agit d'une réponse de très haute qualité: pourquoi voter contre? +1 de moi aussi.
Mei
1
Merci @Richard Bronosky, dans mon gvim il n'est pas possible de taper le mot de passe sudo :w !sudo tee %donc je pense que c'est une bonne réponse.
Eric Fortis
1

Je l'enregistre généralement dans un fichier temporaire dans $ HOME / tmp / apache.conf (par exemple) puis

sudo vimdiff $HOME/tmp/apache.conf /etc/apache2/apache.conf

c'est un travail supplémentaire pour fusionner les changements, mais cela a payé. Je trouve que c'est un bon moyen entre la commodité et les mesures contre les changements indésirables

Avant cela, je pensais à des listes de contrôle d'accès ou à l'attribution de groupes correspondants aux fichiers, mais cela ne fonctionnait pas trop souvent, j'oubliais de changer les propriétaires ou je changeais des fichiers là où je ne voulais pas le faire.

Cela ne vaut que pour les fichiers qui ne sont pas gérés jusqu'à présent. La solution globale que nous utilisons est une marionnette avec un référentiel git où les gens modifient localement les fichiers et testent les modifications sur les serveurs appropriés, si la configuration fonctionne comme souhaité, les modifications sont repoussées vers le référentiel central où notre moteur de configuration extrait les modifications à intervalles réguliers.

serveurhorreur
la source
0

Ce que je fais normalement - pas nécessairement le plus rapide, mais certainement sûr - est de faire quelque chose comme ça (en utilisant nsswitch.conf comme exemple):

:w! ~/%

Quittez vim, puis faites:

sudo vim nsswitch.conf
1GdG
:r ~/%

Cela supprimera toutes les lignes et lira votre version modifiée et mise à jour à modifier à sa place. L'utilisation de votre répertoire personnel signifie que vous n'avez pas à vous demander si vous y avez accès ou non - et c'est plus privé que / tmp. Notez bien qu'il s'agit d'un remplacement de fichier entier: si vous ne voulez pas ajouter toutes les modifications, vous devrez choisir.

Malgré les maux de tête impliqués dans l'une de ces réponses, il n'y a aucune raison de perdre vos modifications.

Mei
la source