50 votes

Utiliser le serveur Emacs et emacsclient sur d'autres machines en tant qu'autres utilisateurs

Je sais qu'après avoir appelé (start-server) dans une session Emacs existante, je peux alors utiliser emacsclient -c (sur le même ordinateur) pour créer de nouvelles trames qui se connectent à ce serveur, de sorte que chaque nouvelle trame créée par emacsclient a accès au même ensemble d'états partagés (par exemple, les tampons).

La plupart de la documentation que j'ai trouvée se concentre sur le cas d'utilisation "donnez-moi un accès rapide à mon Emacs local", et il y a donc deux choses sur lesquelles je n'ai pas encore vu de détails :

  1. Can emacsclient -c accéder aux serveurs Emacs démarrés par autre ou est-il câblé pour ne détecter que les sessions lancées par mon propre utilisateur ?

  2. Le serveur Emacs supporte-t-il (directement ou indirectement) les connexions à distance ? En d'autres termes, existe-t-il un moyen de configurer Emacs (en utilisant éventuellement SSH) qui permette d'appeler le serveur Emacs à distance ? emacsclient -c sur à distance pour avoir accès au local l'état de mon serveur Emacs ?

(Au cas où vous ne l'auriez pas déjà deviné, ce que j'aimerais faire en définitive, c'est combiner les deux techniques ci-dessus pour fournir un support rudimentaire d'édition collaborative).


Il s'agit d'un problème du monde réel, alors voici ce avec quoi je travaille :

  • La fonctionnalité nécessaire devrait être déjà intégrée dans Emacs (23.3.1, 64 bits). Je peux m'étirer vers des extensions d'Emacs à partir des dépôts standards d'Ubuntu, mais je préfère ne pas le faire. (Ce qui, je crois, exclut Rudel triste.)
  • Pas de nouveaux utilisateurs ou d'usurpation d'identité. Les solutions doivent fonctionner avec l'ensemble des comptes d'utilisateurs existants, et les utilisateurs ne doivent pas se faire passer pour d'autres utilisateurs (par exemple, par le biais de su ou ssh ).

Si cela fait une différence, les machines se trouvent sur un réseau local privé, des clients et des serveurs OpenSSH sont installés (et fonctionnent), et tous les utilisateurs peuvent se connecter à (leur propre compte sur) toutes les machines, mais elles n'ont pas de système de fichiers partagé.


Alors, quelqu'un sait-il si le serveur Emacs peut

  • accorder l'accès à d'autres utilisateurs, ou
  • fournir un accès à distance ?

EDIT

Comme commenté dans la réponse de rwb, il est clair que le nouveau Windows est ouvert localement en exécutant emacsclient -c sont en fait créés par le à distance Processus du serveur Emacs. C'est-à-dire, emacsclient ne fait que déclencher le comportement approprié dans le serveur. Cela pose quelques problèmes avec les paramètres d'affichage incorrects, puisque le serveur n'a normalement pas accès au bureau local (voir ci-dessous). Cependant, je peux maintenant me connecter à une session Emacs distante si j'utilise la séquence de commandes suivante :

Dans un terminal, où 1.22.333.44 est l'adresse IP de remotehost :

ssh -t -X remotehost \
  "emacs -nw --eval
   '(progn (setq server-host \"1.22.333.44\" server-use-tcp t) (server-start))'"

Puis dans un autre (sur la même machine) :

scp remotehost:.emacs.d/server/server /tmp/server-file
DISPLAY=localhost:10 emacsclient -c -f /tmp/server-file

Le site emacsclient fait en sorte que le serveur Emacs distant (dont il trouve les détails dans le fichier /tmp/server-file ) pour ouvrir une fenêtre graphique Emacs (sur l'écran local) qui partage l'état avec la session Emacs sur l'hôte distant.

Puisque le serveur Emacs distant a été lancé via ssh -X SSH lui permet d'accéder à mon écran local via une "fausse" adresse. :10 affichage. Le site DISPLAY=:10 qui lui est transmis (via emacsclient ) provoque ainsi l'ouverture d'une fenêtre sur mon bureau local.


Bien que l'approche ci-dessus permette de cocher la case "Exécuter le serveur Emacs sur une machine distante, s'y connecter en utilisant la fonction emacsclient localement", c'est très limité. En fait, ce n'est pas très différent de faire tourner le serveur et les clients en local comme un seul utilisateur : la seule différence est que le serveur est maintenant distant et a donc accès à des ressources système différentes.

Malheureusement, le lancement via ssh -X est le seul moyen que j'ai trouvé pour ouvrir une fenêtre sur le serveur X d'une autre machine :

  • Spécifier une base DISPLAY=remote:0 n'aboutit à rien (puisque les serveurs X d'Ubuntu sont démarrés avec la commande -nolisten tcp option).

  • Se connecter via SSH puis utiliser DISPLAY=:0 échoue également, mais cette fois-ci uniquement en raison de l'absence d'informations d'authentification appropriées. (Je pense que c'est le cas, de toute façon : le message d'erreur dit de manière cryptée No protocol specified / Can't open display .)

Je pense que trouver un moyen de contourner le deuxième problème me rapprocherait probablement beaucoup d'une solution.


Après avoir lu les messages à http://comments.gmane.org/gmane.emacs.devel/103350 (à partir du message '25 Oct 14:50', à peu près à la moitié) Je commence à me demander si ce n'est pas l'une des rares choses qu'Emacs ne peut pas faire (c'est-à-dire qu'il est impossible ;-) ).

Cependant, si quelqu'un a un moyen de fournir un accès aux écrans X distants sans l'erreur de permissions ci-dessus, je suis toujours ouvert à la persuasion.....

14voto

rwb Points 443

Cela devrait fournir un point de départ pour ce que vous voulez.

Depuis le nœud d'information (emacs) emacsclient Options

`--server-file=SERVER-FILE'
     Specify a "server file" for connecting to an Emacs server via TCP.

     An Emacs server usually uses an operating system feature called a
     "local socket" to listen for connections.  Some operating systems,
     such as Microsoft Windows, do not support local sockets; in that
     case, Emacs uses TCP instead.  When you start the Emacs server,
     Emacs creates a server file containing some TCP information that
     `emacsclient' needs for making the connection.  By default, the
     server file is in `~/.emacs.d/server/'.  On Microsoft Windows, if
     `emacsclient' does not find the server file there, it looks in the
     `.emacs.d/server/' subdirectory of the directory pointed to by the
     `APPDATA' environment variable.  You can tell `emacsclient' to use
     a specific server file with the `-f' or `--server-file' option, or
     by setting the `EMACS_SERVER_FILE' environment variable.

     Even if local sockets are available, you can tell Emacs to use TCP
     by setting the variable `server-use-tcp' to `t'.  One advantage of
     TCP is that the server can accept connections from remote machines.
     For this to work, you must (i) set the variable `server-host' to
     the hostname or IP address of the machine on which the Emacs server
     runs, and (ii) provide `emacsclient' with the server file.  (One
     convenient way to do the latter is to put the server file on a
     networked file system such as NFS.)

Vous pouvez également examiner les variables server-auth-dir , server-auth-key et server-port

11voto

mavit Points 332

Je pense que ce que vous demandez est impossible par définition, car si vous donnez à un utilisateur distant un accès illimité à votre Emacs, il s'agit tout autant d'une "usurpation d'utilisateur" que de laisser cet utilisateur distant accéder à un shell via ssh. Pour résumer, du point de vue de la sécurité, c'est probablement une mauvaise idée.

De plus, les résultats de l'accès de deux utilisateurs à un seul Emacs ne sont pas aussi bons que vous pourriez l'espérer. Il n'a pas été conçu avec l'accès simultané en tête. Cela fait des années que je n'ai pas essayé, donc les choses ont peut-être un peu évolué, mais quand je l'ai fait, c'était pour le moins bizarre.

Je vais quand même essayer de répondre à votre question.

Il semble que vous pensiez à cette question de l'arrière vers l'avant, car, contre-intuitivement, en termes de réseau, l'affichage X11 est le serveur et l'application X11 est le client. C'est surprenant car, en général, l'affichage est local pour l'utilisateur et l'application est exécutée sur un serveur distant.

Vous pouvez demander à un emacs en cours d'exécution de se connecter à un écran distant et d'ouvrir une nouvelle fenêtre avec M-x make-frame-on-display . Pour que cela fonctionne, le propriétaire de cet écran devra vous en accorder l'accès.

Nous supposerons host-l est l'ordinateur qui exécute Emacs, et que vous voulez le rendre accessible à un utilisateur de l'affichage 0 sur host-r . Sachez que vous avez dit que vous ne vouliez pas utiliser le transfert SSH, donc en suivant cette méthode, tout le trafic passera sur le réseau sans être crypté.

Tout d'abord, assurez-vous que l'affichage host-r:0 accepte les connexions TCP. Vous ne mentionnez pas votre système d'exploitation, mais c'est probablement la valeur par défaut sous Unix et probablement pas sous Linux (pour des raisons de sécurité). Si, par exemple, on mentionne -nolisten tcp alors vous devrez modifier cette configuration.

host-r$ ps -ef | grep X

Ensuite, demandez à l'utilisateur de host-r d'exécuter la commande suivante et de vous envoyer le résultat. N'oubliez pas de les prévenir que cela vous permettra de prendre le contrôle total de leur session de bureau actuelle, si vous le souhaitez.

host-r$ xauth list $DISPLAY
host-r/unix:0  MIT-MAGIC-COOKIE-1  01234567890abcdef0123456789abcd

Il s'agit, en fait, du "mot de passe" de l'écran. Sur host-l , mettez-le là où Emacs pourra le trouver avec :

host-l$ xauth add host-r:0 MIT-MAGIC-COOKIE-1  01234567890abcdef0123456789abcd

Maintenant, entrez M-x make-frame-on-display host-r:0 et une fenêtre Emacs devrait apparaître sur l'écran distant.

7voto

Thomas Koch Points 1034

Aaron Gallagher a mis en place une solution : http://blog.habnab.it/blog/2013/06/25/emacsclient-and-tramp/

Cela fonctionne (AFAIU) comme :

  • le serveur emacs est démarré avec tcp
  • Il ouvre une connexion à un système distant avec tramp-sh, en ouvrant un port forward ("back channel")
  • Il est conseillé à tramp-sh de copier un fichier cookie d'authentification étendu sur le système distant.
  • Sur le système distant, il appelle un shell spécial emacsclient.sh script qui émule emacsclient mais préfixe les noms de fichiers avec le préfixe tramp correspondant qui se trouve dans le cookie auth étendu

J'ai ajouté un commentaire à son billet de blog proposant que cette idée soit discutée et améliorée sur emacs-devel.

4voto

sean_m Points 553

Si vous faites cela pour permettre à des personnes de modifier des fichiers à distance, vous pouvez envisager le "mode tramp".

http://emacswiki.org/emacs/TrampMode

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X