Souvent, lors de l'édition des fichiers de configuration, j'en ouvrirai un avec vi, puis lorsque je l'enregistrerai, je me rendrai compte que je n'ai pas tapé
sudo vi filename
Existe-t-il un moyen de donner des privilèges à vi sudo pour enregistrer le fichier? Je semble me rappeler avoir vu quelque chose à ce sujet tout en recherchant des informations sur vi il y a quelque temps, mais maintenant je ne peux pas le trouver.
Réponses:
%
est remplacé par le nom du fichier actuel, vous pouvez donc utiliser:(
vim
dé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
:Avec ce qui précède, vous pouvez taper
:W<Enter>
pour enregistrer le fichier. Depuis que j'ai écrit ceci, j'ai trouvé une meilleure façon (à mon avis) de le faire:De cette façon, vous pouvez taper
:w!!
et il sera étendu à la ligne de commande complète, en laissant le curseur à la fin, afin que vous puissiez remplacer le%
par un nom de fichier de votre choix, si vous le souhaitez.la source
sudo: 1 incorrect password attempt
/etc/sudoers
fichier, ajouteryour_username ALL=(ALL) ALL
sous la ligneroot ALL=(ALL) ALL
, quitter et enregistrer.visudo
.En général, vous ne pouvez pas modifier l'ID utilisateur effectif du processus vi, mais vous pouvez le faire:
la source
:w !sudo tee % >/dev/null
ou:w !sudo dd of=%
évitez d'avoir le contenu du fichier renvoyé en écho lors de l'enregistrement du fichier.tee
et je vois que c'est une commande de canal Unix et!
insère une commande shell. L':w
écriture est-elle standard, qui est acheminéetee
?Avertissements courants
La méthode la plus courante pour contourner le problème des fichiers en lecture seule consiste à ouvrir un canal vers le fichier actuel en tant que super-utilisateur à l'aide d'une implémentation de
sudo tee
. Cependant, toutes les solutions les plus populaires que j'ai trouvées sur Internet ont une combinaison de plusieurs mises en garde potentielles:Solutions
Pour contourner tous ces problèmes, vous pouvez utiliser la commande suivante:
Ceux-ci peuvent être raccourcis, respectueusement:
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 l'Press any key to continue
invite -like qui apparaît après l'exécution de la:!
commande.exec[ute]
exécute une chaîne en tant que commande. Nous ne pouvons pas simplement exécuter:write
car il ne traitera pas l'appel de fonction nécessaire.!
représente la:!
commande: la seule commande qui:write
accepte. Normalement,:write
accepte un chemin de fichier dans lequel écrire.:!
seule exécute 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
.sudo
devrait être évident, car 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.tee
tuyauxstdin
vers le fichier donné.:write
va écrire dansstdin
, puis le super-utilisateurtee
recevra le contenu du fichier et écrit le fichier. Il ne créera pas de nouveau fichier - juste écraser le contenu - ainsi les modes et attributs de fichier seront préservés.shellescape()
échappe les caractères spéciaux dans le chemin d'accès au fichier donné, comme approprié pour le shell actuel. Avec un seul paramètre, il suffit généralement de placer le chemin entre guillemets si nécessaire. Puisque nous envoyons vers une ligne de commande complète du shell, nous souhaitons passer une valeur non nulle comme deuxième argument pour permettre l'échappement de barre oblique inverse d'autres caractères spéciaux qui pourraient autrement déclencher le shell.@%
lit le contenu du%
registre, qui contient le nom de fichier du tampon actuel. Ce n'est pas nécessairement un chemin absolu, assurez-vous donc que vous n'avez pas changé le répertoire courant. Dans certaines solutions, le symbole commercial-at sera omis. Selon l'emplacement,%
est une expression valide et a le même effet que la lecture du%
registre. Cependant, imbriqué dans une autre expression, le raccourci est généralement interdit: comme dans ce cas.>NUL
et>/dev/null
redirigezstdout
vers le périphérique nul de la plate-forme. Même si nous avons réduit la commande au silence, nous ne voulons pas que tous les frais généraux associés à la tuyauterie soientstdin
renvoyés à vim - le mieux est de la vider le plus tôt possible.NUL
est le périphérique nul sous DOS, MS-DOS et Windows, pas un fichier valide. Depuis 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 être utiles.)~ / .vimrc
Dépendant de la plateforme
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
~/.vimrc
fichier, en la créant si elle n'existe pas déjà: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 un
~/.vimrc
fichier indépendant de la plate-forme qui se synchronise entre les ordinateurs, j'ai donc ajouté une fonctionnalité multi-plate-forme au mien. Voici un~/.vimrc
avec uniquement les paramètres pertinents:la source
sudo
existe, mais pas/dev/null
, vous devez donc devenir plus sophistiqué si vous souhaitez une véritable prise en charge multiplateforme. C'est plus une introduction - matière à réflexion. :)Si vous utilisez Vim , un script disponible est nommé sudo.vim . Si vous trouvez que vous avez ouvert un fichier dont vous avez besoin d'un accès root pour lire, tapez
Vim remplace le% par le nom du fichier actuel etsudo:
demande au script sudo.vim de prendre le relais pour la lecture et l'écriture.la source
Les conseils de Ryan sont généralement bons, cependant, si après l'étape 3, ne déplacez pas le fichier temporaire; il aura la mauvaise propriété et les mauvaises autorisations. Au lieu de cela,
sudoedit
le fichier correct et lire le contenu (en utilisant:r
ou similaire) du fichier temporaire.Si vous suivez l'étape 2, utilisez
:w!
pour forcer l'écriture du fichier.la source
Lorsque vous passez en mode insertion sur un fichier dont vous avez besoin de l'accès sudo pour le modifier, vous obtenez un message d'état indiquant
Si ça me manque, en général je le fais
..puis..
..ou..
Il y a probablement une façon moins détournée de le faire, mais cela fonctionne.
la source
Un rapide Google semble donner ce conseil:
http://ubuntuforums.org/showthread.php?t=782136
la source
Voici un autre qui est apparu depuis la réponse à cette question, un plugin appelé SudoEdit qui fournit les fonctions SudoRead et SudoWrite, qui tentera par défaut d'utiliser sudo en premier et en cas d'échec: http://www.vim.org/scripts/ script.php? script_id = 2709
la source
J'ai ceci dans mon ~ / .bashrc:
Maintenant, chaque fois que j'ai besoin de modifier un fichier de configuration, je l'ouvre avec svim.
la source
sudoedit
commande doit être préférée car elle ne nécessite pas d'exécuter vim en tant que root.Un hack rapide que vous pouvez envisager consiste à faire un chmod sur le fichier que vous modifiez, à enregistrer avec vim, puis à revenir à ce que le fichier était à l'origine.
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