web-dev-qa-db-fra.com

Ouvrir un fichier avec su / Sudo dans Emacs

Supposons que je veuille ouvrir un fichier dans une session Emacs existante en utilisant su ou Sudo, sans passer par un shell ni faire sudoedit ou Sudo emacs. Une façon de faire est

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

mais cela nécessite un cher aller-retour à travers SSH . Y a-t-il un moyen plus direct?

[EDIT] @JBB a raison. Je veux pouvoir invoquer su/Sudo pour enregistrer et ouvrir. Ce serait OK (mais pas idéal) de ré-autoriser lors de la sauvegarde. Ce que je recherche, ce sont des variations de find-file et save-buffer qui peut être "canalisé" via su/Sudo.

170
Chris Conway

La bonne chose à propos de Tramp est que vous ne payez que cet aller-retour vers SSH lorsque vous ouvrez le premier fichier. Sudo met ensuite vos informations d'identification en mémoire cache et Emacs enregistre un descripteur afin que les fichiers ouverts par Sudo prennent beaucoup moins de temps.

Je n'ai pas trouvé le temps supplémentaire qu'il faut pour économiser de la charge, non plus. C'est assez rapide, IMO.

62
EfForEffort

Tramp ne fait pas aller-retour Sudo via SSH, il utilise un sous-shell. Voir le manuel: https://www.gnu.org/software/tramp/#Inline-methods

Par conséquent, je vous recommande de vous en tenir à TRAMP.

62
Teddy

Si vous utilisez helm, helm-find-files supporte l’ouverture d’un fichier en tant que root avec C-c r.

17
Qudit

Ce n'est pas vraiment une réponse à la question initiale, mais voici une fonction d'aide qui facilite un peu la route tramp/Sudo:

 (defun Sudo-find-file (nom-fichier) 
 "Comme trouver un fichier, mais ouvre le fichier en tant que root." 
 (interactif "FSudo Find File:") 
 (let ((nom-fichier-tramp (concat "/ Sudo ::" (nom-fichier-extension))))) 
 (nom-fichier tramp-nom-fichier))) ) 
15
Burton Samograd

Au moins pour la sauvegarde, un paquet Sudo-save a été écrit exactement pour ce genre de problème.

5
huitseeker

Votre exemple ne commence pas du tout avec ssh, du moins pas avec ma version de TRAMP ("2.1.13-pre"). Find-file et save-buffer fonctionnent très bien.

4
jfm3

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))))
2
anquegi

(fonctionne uniquement localement. Nécessite une mise à jour pour fonctionner correctement via tramp)

Un peu étendu la 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))
      ))
    )
)
1
alex_1948511

Pouah. Peut-être pourriez-vous ouvrir un shell à Emacs et exécuter Sudo emacs.

Le problème est que vous ne voulez probablement pas simplement ouvrir le fichier. Vous voulez pouvoir le sauvegarder plus tard. Ainsi, vous devez faire en sorte que vos droits racine persistent, et non pas simplement pour ouvrir le fichier.

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

0
JBB