Devenir racine de Vim

72

Parfois, je commence à éditer des fichiers de configuration en /etcutilisant Vim, mais j'oublie de l'utiliser sudopour démarrer Vim. Le résultat inévitable est donc qu'après avoir terminé mes modifications, je reçois le constat redouté que je n'ai pas la permission de sauvegarder le fichier.

La plupart du temps, les modifications sont suffisamment petites pour que je quitte Vim et que je refasse le tout en tant que root. Je pourrais bien sûr sauvegarder dans un endroit où je pourrais écrire puis copier en tant que root, mais c'est aussi un peu gênant.

Mais je suis certain qu’il existe un moyen plus simple de devenir root ou d’utiliser sudoVim sans avoir à ignorer les modifications. Si la méthode ne repose pas sur sudoune configuration pour l'utilisateur, ce serait encore mieux.

Scientifique fou
la source
1
J'ai pris l'habitude d'utiliser sudoeditau lieu de vimpour toutes les éditions d'administrateur. C'est un moyen de ne plus jamais rencontrer ce problème :). +1 pour la réponse de Gilles .
jw013
Ces questions et réponses de SO sont utiles, vous pouvez donc les lier ici: Obtenir les autorisations root sur un fichier dans vi? & Comment fonctionne le truc vim «write with sudo»? .
slm

Réponses:

46

sudo ne peut pas changer l'utilisateur effectif d'un processus existant, il crée toujours un nouveau processus avec les privilèges élevés et le shell d'origine n'est pas affecté. C’est l’un des fondements de la conception UNIX. Le plus souvent, je ne fais que sauvegarder le fichier dans / tmp en guise de solution de contournement. Si vous voulez vraiment le sauvegarder directement, essayez d’utiliser une fonctionnalité de Vim qui permet de diriger un fichier vers un autre processus. Essayez de sauvegarder avec cette commande:

:w !sudo dd of=%

Testé et fonctionne. Vim vous demandera alors de recharger le fichier, mais c'est inutile: vous pouvez simplement appuyer sur opour éviter de recharger et de perdre votre historique d'annulation. Vous pouvez même sauvegarder ceci dans une commande / fonction Vim ou même le lier à une clé pour un accès facile, mais je laisserai cela au lecteur.

pingouin359
la source
2
C'est une solution intéressante, mais vous pouvez remplacer le chemin par %, qui dans vim sera le chemin du fichier que vous êtes en train de modifier.
Reid
Vous devez mettre les %guillemets au cas où le nom du fichier contient un espace.
Intuition le
Aussi: cela ne réinitialisera pas le 'modified'réglage; vous pouvez le faire manuellement avec set nomodified.
Intuition le
2
En fait, si vous voulez vraiment faire attention, vous devriez le faire exec 'w !sudo dd of=' . shellescape(expand('%'))dans le cas où le nom du fichier contient des guillemets, antislashs, dollar-signes, etc.
intuited
En quoi cela diffère-t-il de la commande Commandlinefu par plaes?
36

Enregistrer le fichier en tant que root:

: w! sudo tee%

plaes
la source
13

Appelez sudoeditpour éditer les fichiers en tant que root.

Lorsque vous appelez vimdirectement, pensez à la gêne occasionnée pour vous avertir que vous faites trop occasionnellement pour faire quelque chose de dangereux.

Gilles, arrête de faire le mal
la source
8

Vous pouvez mettre cela dans votre .vimrc

cmap w!! %!sudo tee > /dev/null %

Vous le déclenchez en agissant :w!!- le fichier sera inséré dans sudo teele nom de fichier actuel ( %).

De https://stackoverflow.com/questions/95072/what-are-your-favorite-vim-tricks

Hamish Downer
la source
Et si vous avez installé moreutils, utilisez-les à la !sudo sponge %place.
Towo
3

Cela fonctionne aussi bien:

:w !sudo sh -c "cat > %"

Ceci est inspiré par le commentaire de @Nathan Long dans cette réponse .

AVIS :

"doit être utilisé à la place de 'parce que nous voulons %être étendus avant de passer à shell.

Feihu
la source