Obtenir les permissions root sur un fichier à l'intérieur de vi?

voix
227

Souvent, lors de l'édition des fichiers de configuration, je vais ouvrir un avec vi puis quand je vais l'enregistrer réaliser que je ne saisis

sudo vi filename

Est-il possible de donner vi privilèges sudo pour enregistrer le fichier? Je me souviens avoir vu quelque chose à ce sujet tout en regardant des trucs sur vi il y a un certain temps, mais maintenant je ne peux pas le trouver.

Créé 04/08/2008 à 04:34
source utilisateur
Dans d'autres langues...                            


11 réponses

voix
276

% est remplacé par le nom du fichier en cours, vous pouvez ainsi utiliser:

:w !sudo tee %

( vimDétecte que le fichier a été modifié et demander si vous voulez qu'il soit rechargé.)

Comme un 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 je l' ai écrit, je l' ai trouvé un moyen plus agréable (à mon avis) pour ce 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, de sorte que vous pouvez remplacer le %avec un nom de fichier de votre propre, si vous le souhaitez.

Créé 31/08/2008 à 20:23
source utilisateur

voix
29

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

:w !sudo tee myfile
Créé 04/08/2008 à 07:52
source utilisateur

voix
13

Mises en garde communes

La méthode la plus courante de contourner le problème de fichiers en lecture seule est d'ouvrir un tuyau dans le fichier actuel comme super-utilisateur en utilisant une implémentation de sudo tee. Cependant, toutes les solutions les plus populaires que j'ai trouvé autour de l'Internet ont une combinaison de plusieurs mises en garde possibles:

  • L'ensemble du dossier sont écrites sur le terminal, ainsi que le fichier. Cela peut être lent pour les gros fichiers, 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 traitées correctement.

Solutions

Pour contourner toutes ces questions, 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 raccourcies, respectueusement:

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

Explication

:commence la commande; vous devez saisir 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 le Press any key to continuemessage -comme qui apparaît après l' exécution de la :!commande.

exec[ute]exécute une chaîne de caractères comme une commande. Nous ne pouvons pas courir tout simplement :writeparce qu'il ne traitera pas l'appel de fonction nécessaire.

!représente la :!commande: la seule commande qui :writeaccepte. Normalement, :writeaccepte un chemin de fichier dans lequel écrire. :!lui - même exécute une commande dans un shell (par exemple, en utilisant bash -c). Avec :write, il exécutera la commande dans le shell, puis écrire le fichier entier stdin.

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

teedes tuyaux stdindans le fichier donné. :writeva écrire stdin, le super-utilisateur teerecevra le contenu du fichier et écrire le fichier. Il ne va pas créer un nouveau fichier - il suffit d' écraser le contenu - si les modes et les attributs de fichier sera conservé.

shellescape()échappe des caractères spéciaux dans le chemin du fichier donné en fonction de l'enveloppe actuelle. Avec un seul paramètre, il serait généralement juste placer le chemin entre guillemets si nécessaire. Depuis que nous envoyons à une ligne complète de commande shell, nous voulons transmettre une valeur non nulle comme second argument pour permettre-escaping backslash d'autres caractères spéciaux qui pourraient autrement faire trébucher la coquille.

@%lit le contenu du %registre, qui contient le nom de fichier du tampon courant. Ce n'est pas nécessairement un chemin absolu, alors assurez -vous que vous n'avez pas changé le répertoire courant. Dans certaines solutions, vous verrez le symbole commerciale à omis. En fonction de l'emplacement, %est une expression valide, et a le même effet que la lecture du %registre. Dans une autre expression emboîtés le raccourci est généralement rejeté, cependant: comme dans ce cas.

>NULet >/dev/nullrediriger stdoutvers le dispositif null de la plate - forme. Même si nous avons réduit au silence la commande, nous ne voulons pas tous les frais généraux associés à la tuyauterie de stdinretour à vim - mieux pour le jeter le plus tôt possible. NULest le périphérique null sous DOS, MS-DOS et Windows, pas un fichier valide. Comme de Windows 8 à NUL ne redirections donnent pas lieu à un fichier nommé NUL en cours d' écriture. Essayez de créer un fichier sur votre bureau nommé NUL, avec ou sans extension de fichier: vous ne pourrez pas le faire. (Il y a plusieurs autres noms de périphériques dans Windows qui pourrait être utile de faire savoir.)

~ / .vimrc

Dépendant de la plateforme

Bien sûr, vous ne voulez toujours pas à mémoriser les et saisissez - les à chaque fois. Il est beaucoup plus facile de cartographier la commande appropriée à une commande utilisateur plus simple. Pour ce faire sur POSIX, vous pouvez ajouter la ligne suivante dans votre ~/.vimrcfichier, la création si elle n'existe pas:

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

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

Plate-forme indépendante

J'utilise une plate - forme indépendante ~/.vimrcfichier qui synchronise sur les ordinateurs, alors j'ai ajouté des fonctionnalités multi-plateforme à la mienne. Voici un ~/.vimrcavec uniquement les paramètres pertinents:

#!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
Créé 13/10/2012 à 07:54
source utilisateur

voix
10

Si vous utilisez Vim , il y a un script disponible nommé sudo.vim . Si vous trouvez que vous avez ouvert un fichier que vous avez besoin un accès root à lire, le type

: E sudo:%
Vim remplace le% avec le nom du fichier en cours, et sudo:indique le script sudo.vim de prendre en charge pour la lecture et l' écriture.

Créé 24/09/2008 à 05:12
source utilisateur

voix
7

Les conseils de Ryan est généralement bonne, mais, si , après l' étape 3, ne pas déplacer le fichier temporaire; il aura la mauvaise propriété et les autorisations. Au lieu de cela, sudoeditle fichier correct et lu dans le contenu ( en utilisant :rou similaire) du fichier temporaire.

Si , après l' étape 2, utilisez :w!pour forcer le fichier à écrire.

Créé 04/08/2008 à 05:04
source utilisateur

voix
3

Lorsque vous passez en mode d'insertion sur un fichier que vous avez besoin d'un accès sudo pour modifier, vous obtenez un message d'état en disant

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

Si je manque que, en général, je 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 rond-point de le faire, mais il fonctionne.

Créé 12/08/2008 à 19:37
source utilisateur

voix
1

Voici une autre qui est apparu depuis cette question a été répondu, un plugin appelé sudoedit qui fournit des fonctions SudoRead et SudoWrite, qui par défaut essayer d'utiliser sudo premier et su si cela échoue: http://www.vim.org/scripts/ script.php? SCRIPT_ID = 2709

Créé 29/01/2010 à 18:21
source utilisateur

voix
1

Un rapide Google semble donner ce conseil:

  1. Ne pas essayer de modifier si elle est en lecture seule.
  2. Vous pourriez être en mesure de modifier les autorisations sur le fichier. (Si oui ou non, il vous permettra de sauvegarder est à l'expérimentation.)
  3. Si vous avez encore modifié de toute façon, enregistrer dans un fichier temporaire et puis déplacez-le.

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

Créé 04/08/2008 à 04:39
source utilisateur

voix
0

J'ai dans mon ~ / .bashrc:

alias svim='sudo vim'

Maintenant, chaque fois que je dois modifier un fichier de configuration j'ouvre juste avec SVIM.

Créé 19/03/2009 à 13:51
source utilisateur

voix
-2

Un hack vous pouvez envisager est en train de faire un chmod sur le fichier que vous modifiez, enregistrez avec vim, puis chmod revenir à 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 êtes préoccupé par la sécurité, comme pendant quelques secondes tout le monde peut lire / modifier le fichier sans vous rendre compte.

Créé 05/08/2008 à 23:20
source utilisateur

voix
-7

utiliser gksudo au lieu de sudo pour GVim -à- dire

cmap w!! w !gksudo tee >/dev/null %
Créé 30/11/2010 à 07:33
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more