linux - Obtenir les autorisations root sur un fichier à l'intérieur de vi?

Translate

Souvent, lors de l'édition des fichiers de configuration, j'en ouvrirai un avec vi puis quand je vais l'enregistrer, je me rends compte que je n'ai pas tapé

sudo vi filename

Existe-t-il un moyen d'accorder des privilèges à vi sudo pour enregistrer le fichier? Il semble que je me souvienne d'avoir vu quelque chose à ce sujet en recherchant des trucs sur vi il y a quelque temps, mais maintenant je ne peux pas le trouver.

This question and all comments follow the "Attribution Required."

Toutes les réponses

Donahue Lee
Translate

%est remplacé par le nom du fichier actuel, vous pouvez donc utiliser:

:w !sudo tee %

(vimdétectera que le fichier a été modifié et vous demandera si vous souhaitez qu'il soit rechargé. Dites oui en choisissant[L]plutôt que OK.)

En tant que raccourci, vous pouvez définir votre propre commande. Mettez ce qui suit dans votre.vimrc:

command W w !sudo tee % >/dev/null

Avec ce qui précède, vous pouvez taper:W<Enter>pour enregistrer le fichier. Depuis que j'ai écrit ceci, j'ai trouvé un moyen plus agréable (à mon avis) de le faire:

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

De cette façon, vous pouvez taper:w!!et il sera étendu à la ligne de commande complète, laissant le curseur à la fin, afin que vous puissiez remplacer le%avec votre propre nom de fichier, si vous le souhaitez.

La source
Translate

En général, vous ne pouvez pas modifier l'ID utilisateur effectif du processus vi, mais vous pouvez le faire:

:w !sudo tee myfile
La source
Translate

Mises en garde courantes

La méthode la plus courante pour contourner le problème de fichier en lecture seule consiste à ouvrir un canal vers le fichier actuel en tant que super-utilisateur à l'aide d'unesudo tee. Cependant, toutes les solutions les plus populaires que j'ai trouvées sur Internet ont une combinaison de plusieurs mises en garde potentielles:

  • Le fichier entier est écrit sur le terminal, ainsi que le fichier. Cela peut être lent pour les fichiers volumineux, en particulier sur les connexions réseau lentes.
  • Le fichier perd ses modes et attributs similaires.
  • Les chemins de fichiers avec des caractères ou des espaces inhabituels peuvent ne pas être gérés correctement.

Solutions

Pour contourner tous ces problèmes, vous pouvez utiliser la commande suivante:

" On POSIX (Linux/Mac/BSD):
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

" Depending on the implementation, you might need this on Windows:
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >NUL'

Ceux-ci peuvent être raccourcis, respectueusement:

:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >NUL'

Explication

:commence la commande; vous devrez taper ce caractère en mode normal pour commencer à entrer une commande. Il doit être omis dans les scripts.

sil[ent]supprime la sortie de la commande. Dans ce cas, nous voulons arrêter lePress any key to continue-like invite qui apparaît après l'exécution de:!commander.

exec[ute]exécute une chaîne en tant que commande. Nous ne pouvons pas simplement courir:writecar il ne traitera pas l'appel de fonction nécessaire.

!représente le:!commande: la seule commande qui:writeaccepte. Normalement,:writeaccepte un chemin de fichier dans lequel écrire.:!exécute seule une commande dans un shell (par exemple, en utilisantbash -c). Avec:write, il exécutera la commande dans le shell, puis écrira le fichier entier dansstdin.

sudodevrait être évident, puisque c'est pourquoi vous êtes ici. Exécutez la commande en tant que super-utilisateur. Il y a beaucoup d'informations sur le net sur la façon dont cela fonctionne.

teetuyauxstdinau fichier donné.:writeécrira àstdin, puis le super-utilisateurteerecevra le contenu du fichier et écrira le fichier. Il ne créera pas de nouveau fichier - écrasera simplement le contenu - donc les modes de fichier et les attributs seront préservés.

shellescape()échappe les caractères spéciaux dans le chemin de fichier donné comme approprié pour le shell actuel. Avec un seul paramètre, il suffit généralement de mettre le chemin entre guillemets si nécessaire. Puisque nous envoyons à une ligne de commande shell complète, nous voudrons passer une valeur différente de zéro comme second argument pour activer l'échappement par barre oblique inverse d'autres caractères spéciaux qui pourraient autrement déclencher le shell.

@%lit le contenu du%register, qui contient le nom de fichier du tampon actuel. Ce n'est pas nécessairement un chemin absolu, alors assurez-vous que vous n'avez pas changé le répertoire actuel. Dans certaines solutions, vous verrez le symbole commercial-at omis. En fonction de l'emplacement,%est une expression valide et a le même effet que la lecture de%S'inscrire. Cependant, imbriqué dans une autre expression, le raccourci est généralement interdit: comme dans ce cas.

>NULet>/dev/nullréorienterstdoutau périphérique nul de la plate-forme. Même si nous avons réduit au silence la commande, nous ne voulons pas que tous les frais généraux soient associés à la tuyauteriestdinretour à vim - mieux vaut le vider le plus tôt possible.NULest le périphérique nul sous DOS, MS-DOS et Windows, pas un fichier valide. À partir de Windows 8, les redirections vers NUL n'entraînent pas l'écriture d'un fichier nommé NUL. Essayez de créer un fichier sur votre bureau nommé NUL, avec ou sans extension de fichier: vous ne pourrez pas le faire. (Il existe plusieurs autres noms de périphériques dans Windows qui pourraient valoir la peine d'être connus.)

~ / .vimrc

Dépendant de la plate-forme

Bien sûr, vous ne voulez toujours pas les mémoriser et les taper à chaque fois. Il est beaucoup plus facile de mapper la commande appropriée à une commande utilisateur plus simple. Pour ce faire sur POSIX, vous pouvez ajouter la ligne suivante à votre~/.vimrcfichier, en le créant s'il n'existe pas déjà:

command W silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

Cela vous permettra de taper la commande: W (sensible à la casse) pour écrire le fichier actuel avec des autorisations de super-utilisateur - beaucoup plus facile.

Indépendant de la plateforme

J'utilise une plateforme indépendante~/.vimrcfichier qui se synchronise entre les ordinateurs, j'ai donc ajouté une fonctionnalité multi-plateforme à la mienne. Voici un~/.vimrcavec uniquement les paramètres appropriés:

#!vim
" Use za (not a command; the keys) in normal mode to toggle a fold.
" META_COMMENT Modeline Definition: {{{1
" vim: ts=4 sw=4 sr sts=4 fdm=marker ff=unix fenc=utf-8
"   ts:     Actual tab character stops.
"   sw:     Indentation commands shift by this much.
"   sr:     Round existing indentation when using shift commands.
"   sts:    Virtual tab stops while using tab key.
"   fdm:    Folds are manually defined in file syntax.
"   ff:     Line endings should always be <NL> (line feed #09).
"   fenc:   Should always be UTF-8; #! must be first bytes, so no BOM.


" General Commands: User Ex commands. {{{1
    command W call WriteAsSuperUser(@%)         " Write file as super-user.


" Helper Functions: Used by user Ex commands. {{{1
    function GetNullDevice() " Gets the path to the null device. {{{2
        if filewritable('/dev/null')
            return '/dev/null'
        else
            return 'NUL'
        endif
    endfunction

    function WriteAsSuperUser(file) " Write buffer to a:file as the super user (on POSIX, root). {{{2
        exec '%write !sudo tee ' . shellescape(a:file, 1) . ' >' . GetNullDevice()
    endfunction


" }}}1
" EOF
La source
Translate

Si vous utilisezVigueur, il existe un script disponible nommésudo.vim. Si vous constatez que vous avez ouvert un fichier que vous avez besoin d'un accès root pour lire, tapez

:e sudo:%
Vim replaces the % with the name of the current file, and sudo: instructs the sudo.vim script to take over for reading and writing.

La source
Translate

Le conseil de Ryan est généralement bon, cependant, si vous suivez l'étape 3, ne déplacez pas le fichier temporaire; il aura la mauvaise propriété et les autorisations. Au lieu,sudoeditle fichier correct et lisez le contenu (en utilisant:rou similaire) du fichier temporaire.

Si vous suivez l'étape 2, utilisez:w!pour forcer l'écriture du fichier.

La source
dbr
Translate

Lorsque vous passez en mode insertion sur un fichier dont vous avez besoin d'un accès sudo pour le modifier, vous recevez un message d'état indiquant

-- INSERT -- W10: Warning: Changing a readonly file

Si ça me manque, généralement je le fais

:w ~/edited_blah.tmp
:q

..puis..

sudo "cat edited_blah.tmp > /etc/blah"

..ou..

sudo mv edited_blah.tmp /etc/blah

Il y a probablement une façon moins détournée de le faire, mais cela fonctionne.

La source
Translate

Un rapide Google semble donner ce conseil:

  1. N'essayez pas de modifier s'il est en lecture seule.
  2. Vous pourrez peut-être modifier les autorisations sur le fichier. (Qu'il vous permette ou non d'économiser, cela dépend de l'expérimentation.)
  3. Si vous avez quand même effectué des modifications, enregistrez-le dans un fichier temporaire, puis déplacez-le.

http://ubuntuforums.org/showthread.php?t=782136

La source
Translate

En voici un autre qui est apparu depuis que cette question a été répondue, un plugin appelé SudoEdit qui fournit les fonctions SudoRead et SudoWrite, qui essaiera par défaut d'utiliser sudo en premier et su si cela échoue:http://www.vim.org/scripts/script.php?script_id=2709

La source
Translate

J'ai ceci dans mon ~ / .bashrc:

alias svim='sudo vim'

Maintenant, chaque fois que j'ai besoin de modifier un fichier de configuration, je l'ouvre simplement avec svim.

La source
Translate

Un hack rapide que vous pouvez envisager est de faire un chmod sur le fichier que vous éditez, de l'enregistrer avec vim, puis de revenir au chmod à ce que le fichier était à l'origine.

ls -l test.file (to see the permissions of the file)
chmod 777 test.file
[This is where you save in vim]
chmod xxx test.file (restore the permissions you found in the first step)

Bien sûr, je ne recommande pas cette approche dans un système où vous vous inquiétez de la sécurité, car pendant quelques secondes, n'importe qui peut lire / modifier le fichier sans que vous vous en rendiez compte.

La source