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
.
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.
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.
Si vous utilisez helm
, helm-find-files
supporte l’ouverture d’un fichier en tant que root avec C-c r
.
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))) )
Au moins pour la sauvegarde, un paquet Sudo-save a été écrit exactement pour ce genre de problème.
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.
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))))
(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))
))
)
)
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. :)