Ouvrez un fichier avec su / sudo dans Emacs

174

Supposons que je veuille ouvrir un fichier dans une session Emacs existante en utilisant suou sudo, sans passer à un shell et faire sudoeditou sudo emacs. Une façon de faire est

C-x C-f /sudo::/path/to/file

mais cela nécessite un aller-retour coûteux via SSH . Y a-t-il un moyen plus direct?

[EDIT] @JBB a raison. Je veux pouvoir invoquer su/ sudoenregistrer et ouvrir. Ce serait OK (mais pas idéal) de ré-autoriser lors de l'enregistrement. Ce que je recherche, ce sont des variantes de find-fileet save-bufferqui peuvent être "canalisées" via su/ sudo.

Chris Conway
la source
5
Je voulais juste noter que tramp est installé par défaut depuis emacs22, donc la plupart des gens peuvent simplement faire le fichier Cc Cf / sudo :: / path-to / sans problème.
labyrinthe
1
Merci pour la sudoeditmention. Très utile.
tshepang
6
Cc Cf devrait être Cx Cf?
James.Xu

Réponses:

64

L'avantage de Tramp est que vous ne payez que pour cet aller-retour vers SSH lorsque vous ouvrez le premier fichier. Sudo met ensuite en cache vos informations d'identification et Emacs enregistre une poignée, de sorte que les fichiers ouverts par sudo prennent beaucoup moins de temps.

Je n'ai pas non plus trouvé le temps supplémentaire nécessaire pour éviter le fardeau. C'est assez rapide, OMI.

EfForEffort
la source
3
Attendez une seconde ... À quelle fréquence le cache expire-t-il?
Chris Conway
20
Tramp ne fait pas d' aller-retour via SSH, il utilise un sous - shell .
Teddy
Ce que je voulais dire, c'est que vous payez le coût du premier fichier ouvert, et non des autres.
EfForEffort
18

Si vous utilisez helm, helm-find-filesprend en charge l'ouverture d'un fichier en tant que root avec C-c r.

Qudit
la source
Cela fonctionne, mais cela semble persister dans une session, chaque fichier est ensuite ouvert et enregistré en tant que root. Il n'y a rien dans la documentation M-x helm-find-files C-c ?qui indique comment revenir au mode normal d'ouverture en tant qu'utilisateur. Refaire C-c rne l'arrête pas.
Liam
@Liam Je peux toujours ouvrir le fichier en tant qu'utilisateur normal lorsque j'utilise cette fonctionnalité.
Qudit
C'est très étrange - certains fichiers vont bien, d'autres essaient d'ouvrir en tant que root. J'ai tué le mot de passe root avec les commandes emacs sudo -ket puis il demande le mot de passe. J'ai redémarré Emacs et cela n'a pas éliminé le problème. J'ai fouillé et j'ai .emacs.dtrouvé des références à clochard, alors j'ai supprimé celles-ci. Maintenant ça semble mieux mais je ne sais pas si j'en suis libéré.
Liam
15

Ce n'est pas vraiment une réponse à la question d'origine, mais voici une fonction d'aide pour rendre la route tramp / sudo un peu plus facile:

(defun sudo-find-file (nom-de-fichier)
  "Comme find file, mais ouvre le fichier en tant que root."
  ("FSudo Find File:" interactif)
  (let ((tramp-file-name (concat "/ sudo ::" (expand-file-name file-name))))
    (trouver-fichier nom-fichier-clochard)))
Burton Samograd
la source
Je pense que le kit de démarrage Emacs a quelque chose de similaire esk-sudo-edit.
mrmagooey
4

Votre exemple ne démarre pas du tout ssh, du moins pas avec ma version de TRAMP ("2.1.13-pre"). Les deux find-file et save-buffer fonctionnent très bien.

jfm3
la source
Vos informations d'identification peuvent être mises en cache. Lorsque TRAMP démarre pour la première fois, il passe par 10 à 15 secondes de truc SSH. (J'ai aussi 2.1.13-pre.)
Chris Conway
Êtes-vous sûr? Je veux dire, cela devrait démarrer un sous-shell, mais pas une session SSH vers localhost. Prend environ 5 secondes pour exécuter tout le reniflage automatique TRAMP la première fois.
jfm3 le
Eh bien, non, je ne suis pas sûr. Je devrais dire qu'il y a 10 à 15 secondes de trucs TRAMP (peut-être SSH). Je ne suis pas préoccupé par SSH en soi, mais par le retard dans le démarrage. Combien de temps ces trucs de démarrage persistent-ils?
Chris Conway
Cela ne devrait prendre que plus d'une seconde la première fois que vous le faites. Autrement dit, même si vous enregistrez / sudo :: file, supprimez le tampon et ouvrez / sudo :: file2, file2 devrait s'ouvrir rapidement. et Il garde le shell ouvert et met en cache les résultats de tous ses reniflements.
jfm3
Mais les informations d'identification sont-elles mises en cache: (1) pour ce processus Emacs ou (2) pour tous les processus Emacs? Et expirent-ils: (a) à la fermeture d'Emacs, (b) après une période de temps fixe (heures? Jours? Semaines?), Ou (c) après un redémarrage du système?
Chris Conway
3

Je vous recommande d'utiliser des commandes de conseil. Mettez cette fonction dans votre ~ / .emacs

(defadvice ido-find-file (after find-file-sudo activate)
  "Find file as root if necessary."
  (unless (and buffer-file-name
               (file-writable-p buffer-file-name))
    (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))
anquegi
la source
Juste pour souligner l'évidence, cela nécessite que vous utilisiez ido-find-filepour rechercher des fichiers.
tripleee
1

(fonctionne uniquement localement. A besoin d'être mis à jour pour fonctionner correctement via tramp)

Un peu plus longue réponse de Burton:

(defun sudo-find-file (file-name)
"Like find file, but opens the file as root."
(interactive "FSudo Find File: ")
(let ((tramp-file-name (concat "/sudo::" (expand-file-name file-name))))
(find-file tramp-file-name)))


(add-hook 'dired-mode-hook
    (lambda ()
      ;; open current file as sudo 
      (local-set-key (kbd "C-x <M-S-return>") (lambda()
        (interactive)
        (message "!!! SUDO opening %s" (dired-file-name-at-point))
        (sudo-find-file (dired-file-name-at-point))
      ))
    )
)
alex_1948511
la source
0

Pouah. Vous pourriez peut-être ouvrir un shell dans Emacs et exécuter sudo emacs.

Le problème est que vous ne voulez probablement pas simplement ouvrir le fichier. Vous voulez pouvoir l'enregistrer plus tard. Ainsi, vous avez besoin que vos privilèges root persistent, pas seulement pour ouvrir le fichier.

On dirait que vous voulez qu'Emacs devienne votre gestionnaire de fenêtres. C'est assez gonflé sans ça. :)

JBB
la source
11
Ha ha tu as dit ballonnement. Emacs paraissait énorme. Maintenant, en comparaison avec les empreintes d'exécution de Java, Ruby et probablement un tas d'autres choses, cela semble assez mince. Quoi qu'il en soit, je pense que la question de Chris porte sur une utilisation parfaitement légitime d'Emacs.
jfm3
1
Vous m'avez battu. J'utilise ce modèle de manière cohérente. Lors de la connexion, je lance une session Emacs pour les choses générales, une pour l'accès SU (en tant que root) et une ou plusieurs pour le développement logiciel (généralement par projet mais pas toujours). Je le fais depuis des années. Fonctionne juste.
pajato0
pouvez-vous clarifier comment faire ceci: "ouvrir un shell dans Emacs et exécuter sudo emacs"
johnbakers
1
@OpenLearner Sérieusement, vous ne voulez pas vraiment faire ça.
tripleee