web-dev-qa-db-fra.com

Ouvrir un fichier via SSH et Sudo avec Emacs

Je veux ouvrir un fichier dans Emacs qui se trouve sur un serveur distant, avec Sudo sous tension sur le serveur. Je peux ouvrir des fichiers locaux avec Sudo via Tramp comme ceci:

C-x C-f /Sudo::/home/user/file

Mais je veux utiliser Sudo sur le serveur:

C-x C-f /Sudo::user@server/home/user/file

Mais cela me donne des pouvoirs Sudo sur ma machine locale, il demande mon mot de passe Sudo sur la machine locale. Existe-t-il un moyen d'utiliser Sudo sur le serveur?

BTW: Emacs n'est pas installé sur le serveur

107
Fernando Briano

Depuis Emacs 24.3, un analogue de l'ancien multi: la syntaxe a été superposée au _ tramp-default-proxies-alist, ce qui signifie que vous pouvez à nouveau effectuer plusieurs sauts sans configuration préalable. Pour plus de détails, voir:

C-hig (tramp) Ad-hoc multi-Hops RET

Avec la nouvelle syntaxe, chaque 'saut' est séparé par |. L'exemple dans le manuel est:

C-xC-f /ssh:bird@bastion|ssh:you@remotehost:/path RET

Qui se connecte d'abord comme bird@bastion, et de là à you@remotehost:/path

/ su: ou/Sudo: sur des hôtes distants

Vous pouvez également utiliser cette syntaxe pour Sudo/su pour rooter (ou bien sûr tout autre utilisateur) sur un hôte distant:

C-xC-f /ssh:you@remotehost|Sudo:remotehost:/path/to/file RET

Important: veillez à spécifier explicitement le nom d'hôte: Sudo:remotehost: plutôt que Sudo:: (voir ci-dessous).

Comme cela utilise toujours le mécanisme de proxy en dessous, tramp-default-proxies-alist devrait maintenant inclure la valeur ("remotehost" "root" "/ssh:you@remotehost:")

Cela signifie que le proxy /ssh:you@remotehost: va être utilisé chaque fois que vous demandez un fichier en tant que root@remotehost.

root est l'utilisateur par défaut pour ces méthodes, mais vous pouvez bien sûr également passer à un utilisateur non root avec:

C-xC-f /ssh:you@remotehost|Sudo:them@remotehost:/path/to/file RET

Spécifiez toujours le nom d'hôte distant de manière explicite

Vous êtes probablement habitué à utiliser Sudo:: ou su:: et en omettant le nom d'hôte. Si vous restez sur l'hôte local, cela est toujours correct, mais si vous passez à un serveur distant, vous doit spécifier le nom d'hôte pour chaque saut - même s'il est le même que pour le saut précédent. Utilisez toujours Sudo:hostname: ou su:hostname: avec des hôtes distants.

Le piège ici est que Sudo:: est-ce que semble réellement fonctionner - cependant quand vous faites cela l'hôte de l'entrée de proxy dynamique sera le nom d'hôte dont vous êtes originaire plutôt que l'hôte auquel vous vous êtes connecté. Cela semblera non seulement déroutant (car le mauvais hôte sera affiché dans les chemins d'accès aux fichiers), mais cela signifiera également que toute tentative ultérieure d'utiliser Sudo:: sur votre hôte local sera à la place proxy sur le serveur distant! (et le proxy serait également vraisemblablement encombré si vous faisiez la même chose sur un deuxième serveur, provoquant d'autres problèmes).

En bref, n'utilisez pas :: lorsque vous multi-hop!

171
phils

Mise à jour : Bien que cette réponse ait résolu le problème d'origine, elle a été écrite pour emacs 20 ou 21. Pour emacs 24, je vous recommande d'utiliser phils's réponse car il offre plus d'explications et est à jour.


Je pense que noms de fichiers multi-sauts in tramp est ce que vous recherchez.

Le premier saut serait ssh et le second serait Sudo.


Mise à jour: les versions récentes d'emacs prennent en charge plusieurs sauts à l'aide de procurations:

(add-to-list 'tramp-default-proxies-alist ("my-Sudo-alias" nil "/ssh:user@ssh-Host"))

Appelez ensuite en ouvrant:

/Sudo:my-Sudo-alias:file-on-ssh-Host
21
Dave Bacher

J'ai eu quelques problèmes avec la réponse sélectionnée. Cependant, cela a fonctionné lorsque j'ai ajouté cette ligne à .emacs:

(add-to-list 'tramp-default-proxies-alist '(".*" "\\`root\\'" "/ssh:%h:"))

Et puis exécuté ce qui suit:

/Sudo:ssh-Host:file-on-ssh-Host

C'était un peu déroutant car à un moment donné, on m'a demandé le mot de passe "root", mais la saisie du mot de passe de mon utilisateur m'a permis d'y accéder. Il fonctionne également universellement sur tous les hôtes du réseau. De plus, je peux toujours le faire pour ne pas être root:

/ssh:ssh-Host:file-on-ssh-Host

7
User1

Depuis la page Web de configuration de tramp multi-sauts

 (add-to-list 'tramp-default-proxies-alist
                   '(nil "\\`root\\'" "/ssh:%h:"))
      (add-to-list 'tramp-default-proxies-alist
                   '((regexp-quote (system-name)) nil nil))

Alors tout

C-x C-f /Sudo:remote-Host:/file

ouvrira le fichier en utilisant Sudo après s'être connecté avec le même nom d'utilisateur que l'utilisateur exécutant emacs mais sur la machine distante.

3
vampolo