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