Ouvrir le fichier via SSH et Sudo avec Emacs

114

Je veux ouvrir un fichier dans Emacs qui se trouve sur un serveur distant, avec des puissances sudo 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

Fernando Briano
la source
ne pouvez-vous pas commander en tant que root directement sur le serveur?
Chmouel Boudjnah
2
J'ai un utilisateur avec les privilèges sudo, mais pas le mot de passe root.
Fernando Briano

Réponses:

186

Depuis Emacs 24.3, un analogue de l'ancienne multi:syntaxe a été superposé à l' tramp-default-proxies-alistapproche moderne , ce qui signifie que vous pouvez à nouveau effectuer des multi-sauts sans aucune configuration préalable. Pour plus de détails, consultez:

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

Avec la nouvelle syntaxe, chaque «saut» est séparé par |. L'exemple du 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 les hôtes distants

Vous pouvez également utiliser cette syntaxe pour sudo / su vers root (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 : assurez-vous de 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-alistdevrait maintenant inclure la valeur("remotehost" "root" "/ssh:you@remotehost:")

Cela signifie que le proxy /ssh:you@remotehost:sera utilisé chaque fois que vous demanderez 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 explicitement le nom d'hôte distant

Vous avez probablement l'habitude d'utiliser sudo::ou su::et d'omettre le nom d'hôte. Si vous restez sur l'hôte local, c'est toujours bien, mais si vous sautez vers un serveur distant, vous devez 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:: cela semble réellement fonctionner - cependant, lorsque 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 ne semblera pas seulement déroutant (car le mauvais hôte sera affiché dans les chemins de fichiers), mais cela signifiera également que toute tentative d'utilisation ultérieure sudo::sur votre hôte local sera à la place envoyée par proxy au serveur distant! (et le proxy serait également vraisemblablement écrasé si vous faisiez la même chose sur un deuxième serveur, causant d'autres problèmes).

Bref, ne l'utilisez pas ::lorsque vous multi-hop!

phils
la source
4
et maintenant ajouté aux wikemacs ainsi qu'à wikemacs.org/index.php/TRAMP . Merci phils, cela fonctionne très bien.
Ehvince
1
Je viens de trouver cette réponse, et cela fonctionne très bien ... sauf que j'ai un nom d'hôte défini dans un fichier .ssh / config. Lorsque je tape /sudo:hostname:/etc/hosts, j'obtiens ce à quoi vous vous attendez, mais lorsque je tape /sudo:abbrev:/etc/hosts, j'obtiens le message "L'abréviation de l'hôte ressemble à un hôte distant, sudo ne peut utiliser que l'hôte local". Est-ce réparable?
rogerl
2
rogerl: J'ai aussi des .ssh/configentrées, et je n'ai aucun problème à utiliser /ssh:abbrev|sudo:abbrev:/etc/hostsles abréviations de mon nom d'hôte. Il semble que vous ne sautiez pas d'abord vers l'hôte.
phils
@phils Je devrais peut-être publier ceci comme une nouvelle question. Cependant: mon fichier de configuration ressemble à Host r User rlipsett Hostname odlinux IdentityFile ~ / .ssh / id-rsa.pub et mon tramp-default-proxies-alistsemble être correct. Pourtant, le comportement que j'ai décrit ci-dessus persiste. Mon fichier de configuration est-il erroné?
rogerl
Je ne sais toujours pas si vous essayez réellement d'utiliser /sudo:abbrev:/etc/hostscomme vous l'avez dit dans votre commentaire précédent (ce qui est faux, comme mentionné), ou si vous utilisez le bon /ssh:abbrev|sudo:abbrev:/etc/hosts. Votre fichier de configuration ssh est probablement correct, car vous pouvez évidemment l'utiliser autrement.
phils
21

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 la réponse de phils car elle offre plus d'explications et est à jour.


Je pense que les noms de fichiers multi-hop dans clochard sont 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 en utilisant des proxies:

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

Puis invoquez en ouvrant:

/sudo:my-sudo-alias:file-on-ssh-host
Dave Bacher
la source
Cela semble être la solution, mais j'obtiens: "la méthode multi n'est plus prise en charge" Pouvez-vous m'indiquer un manuel mis à jour?
Fernando Briano le
Mx info, Cs tramp :) Vous devrez peut-être définir un faux hôte comme cible de votre sudo et l'ajouter à tramp-default-proxy-alist.
Dave Bacher le
2
Je n'ai pas pu le faire fonctionner dans ma configuration (erreur 255?), Mais la ligne suivante dans .emacs fonctionne: (set-default 'tramp-default-proxies-alist (quote (("my-sudo-alias" nil " / ssh: user @ ssh-host: "))))
ang mo
La réponse mise à jour ne définit pas «récent», a elisp invalide et ne fonctionne pas même lorsque vous la corrigez. Je suis sur une version stable d'emacs publiée plus d'un an après la mise à jour de la réponse.
Michael Wolf
1
La vraie réponse à partir de 2014 / 24.3 est la réponse suivante, en utilisant "ad-hoc multi-sauts"
TomRoche
7

J'ai eu quelques problèmes avec la réponse choisie. 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 donné accès. Il fonctionne également universellement sur tous les hôtes du réseau. Aussi, je peux toujours faire ceci pour ne pas être root:

/ssh:ssh-host:file-on-ssh-host

Utilisateur1
la source
3
Cela ne fonctionnait pas pour moi. Il semble que dans Ubuntu, au moins avec la version 23.2.1 d'Emacs et la version 2.1.18-23.2 de tramp, cela ne fonctionne pas. Cela fonctionne, cependant: info.solomonson.com/content/…
gaizka
(set-default 'tramp-default-proxies-alist (quote ((". *" "\` root \\' "" / ssh:% h: "))))
gaizka
1
Je ne parviens pas à faire fonctionner l'une des solutions ci-dessus (ajouter à la liste ou définir par défaut). Le premier amène Emacs à s'étouffer au démarrage et le second me donne "L'hôte abc.xyz.com' looks like a remote host, sudo 'ne peut utiliser l'hôte local" que dès que j'entre le deuxième deux-points dans "/sudo:abc.xyz.com:". Des idées? Emacs 23.1.1 sur Ubuntu 10.04 LTS.
SabreWolfy
3

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

Puis 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.

vampolo
la source
-12

Vous devez d'abord ssh dans le serveur, puis vous devez exécuter emacs localement.

Ou vous pouvez utiliser NFS avec no_root_squash, ou vous pouvez essayer avec le serveur / client emacs, même si je n'ai aucune idée de ce qui peut arriver (n'utilisez pas emacs moi-même)

Dan Andreatta
la source
J'ai essayé, mais je ne peux pas accéder aux fichiers en tant que root avec sshfs, lors du montage en tant qu'utilisateur régulier. Je suppose que c'est un problème de configuration.
Dan Andreatta
Comme Hassan l'a noté, no_root_squash doit être utilisé avec précaution.
Dan Andreatta
6
-1 pour ne pas avoir répondu à la question. -1 pour avoir suggéré NFS au lieu de SSH. -1 pour avoir suggéré no_root_squash. -1 pour avoir suggéré le client Emacs, qui utilise généralement des sockets de domaine Unix, pour un problème de communication à distance. -1 pour blethering sur Emacs sans l'utiliser.
ceving