Connecté à vi, apporté des modifications, oublié d'abord sudo - maintenant quoi

11

J'ai apporté de longues modifications à un fichier de configuration sur un ordinateur Linux Ubuntu avec l'éditeur vi. Malheureusement, j'ai d'abord oublié sudo, alors maintenant je suis dans l'éditeur, mais je ne peux pas enregistrer mes modifications en raison de droits manquants. Puis-je envoyer un message rétroactif à l'utilisateur sur ce terminal, ou quelle serait la meilleure mesure à prendre?

Simon
la source

Réponses:

11

Dans ce cas, j'écris le fichier avec :w /tmp/tmpfile. Ensuite, je sors et je passe /tmp/tmpfileà mon ancien fichier avec les droits sudo.

Dom
la source
c'est ce que je finis par faire, mais j'aime la réponse de wfaulk .. si je ne m'en souviens que la prochaine fois que je fais ça! :)
Quack Quichote
J'espère que vous copiez le fichier plutôt que de le déplacer . Le déplacement remplace le mode du fichier (autorisations) par vidéfaut (qui est probablement 666, ET avec l'inverse de votre «umask»), remplace le propriétaire du fichier par votre UID (c'était «root», n'est-ce pas?), et brise les liens durs.
Scott
Quelques problèmes: (1) Si le fichier est censé être confidentiel et que votre «umask» est 22 (au lieu de 66), cette procédure expose le contenu du fichier à d'autres utilisateurs qui pourraient surveiller le /tmprépertoire. (2) Si vous avez des utilisateurs vraiment mauvais sur votre système, ils pourraient remplacer votre /tmp/tmpfileentre lorsque vous l'écrivez (depuis vi) et lorsque vous le copiez sur le fichier de configuration du système que vous éditiez. Il est plus sûr de placer le fichier temporaire dans un répertoire auquel vous seul avez accès.
Scott
40

De SO :

:w !sudo tee %

En fait, je me retrouve à utiliser cette façon de le faire plus fréquemment maintenant:

:%!sudo tee %

Je pense que c'est un peu plus intuitif, car je sais ce :%!que ça fait, alors que je n'ai pas une compréhension viscérale de :w !. De plus, il est facile de rater l'espace très important entre le wet le !.

wfaulk
la source
3
Si cela aide votre intuition, rappelez-vous que les vicommandes peuvent être de plusieurs lettres, donc il pourrait théoriquement y avoir une wfoocommande " ", donc si vous voulez écrire dans un fichier appelé " foo", vous devez dire " :w foo". C'est à dire, vous avez besoin d'un espace après " :w". En ce qui concerne « :w !», vous savez ce qu'est « :!», n'est-ce pas? « :!date» Exécute une datecommande « ». Ainsi " :w !xyz" écrit le tampon, mais dans une commande plutôt que dans un fichier.
Scott
Cela devrait être considéré comme la réponse acceptée, car la réponse actuelle est un travail assez long, alors qu'il s'agit d'une solution immédiate. OP?
bschlueter
@Scott merci pour l'explication! Qu'est-ce que le tee et %bien?
CodyBugstein Il y a
@CodyBugstein: Bonjour. (1) Pinger les auteurs de commentaires de six ans ne vous mène souvent nulle part, car les gens partent parfois et ne reviennent jamais. Mais je suis enchaîné à mon ordinateur; Je serai probablement ici pour toujours. (Ou peut-être pas.) (2) Avez-vous essayé de faire des recherches? Il devrait être facile de trouver des informations sur «tee». ( % peut être plus difficile.) (3) OK, je vais vous aider un peu.  teeest un programme qui vous permet d'écrire des informations à plusieurs endroits. Par exemple, date | tee codyécrira la date et l'heure actuelles dans un fichier appelé cody … (Suite)
Scott Il y a
(Suite)… et aussi à l'écran du terminal.  date | tee cody > bugsteinécrira la date et l'heure actuelles dans un fichier appelé codyainsi que dans un fichier appelé bugstein. - Tu comprends sudo? Il vous permet d'exécuter une commande avec les privilèges d'un autre utilisateur (généralement root). Par exemple, ls /rootéchouera généralement, car vous n'y avez pas accès  /root. Mais sudo ls /rootça marchera. - Un effet secondaire malheureux du fonctionnement d'Unix est qu'il sudo ls /root > /root/codyéchouera, car vous n'y avez pas accès  /rootet vous ne pouvez donc pas y écrire /root/cody. … (Suite)
Scott Il y a
-2

Impossible d'ouvrir un autre terminal et de modifier temporairement les droits d'accès au fichier?

Terje Mikal
la source
1
C'est une mauvaise idée. Il ne sera probablement jamais un gros problème de sécurité, mais il pourrait l'être, et il existe des solutions meilleures et plus simples (comme écrire dans un fichier temporaire, ou mieux, le :w !sudo tee % solutionwfaulk a posté
dbr