Domanda Utilizzo del server Emacs ed emacsclient su altri computer come altri utenti


Lo so dopo aver chiamato (start-server) all'interno di una sessione esistente di Emacs posso quindi usarla emacsclient -c (sullo stesso computer) per creare nuovi frame che si connettono a quel server, in modo che ogni nuovo frame creato da emacsclient ha accesso allo stesso gruppo di stati condivisi (ad esempio i buffer).

La maggior parte della documentazione che ho trovato si concentra sul caso d'uso "dammi un accesso veloce al mio Emacs locale", e quindi ci sono due cose che non ho ancora visto in dettaglio:

  1. Può emacsclient -c accedere ai server Emacs avviati da altro utenti, o è cablato per rilevare solo le sessioni avviate dal mio stesso utente?

  2. Il server Emacs (direttamente o indirettamente) supporta le connessioni remote? Cioè, c'è un modo per configurare Emacs (possibilmente coinvolgendo SSH) che consente le chiamate a emacsclient -c sopra a distanza macchine per accedere a Locale stato del mio server Emacs?

(Nel caso in cui non abbiate già indovinato, ciò che alla fine vorrei fare è combinare le due tecniche di cui sopra per fornire un supporto di editing collaborativo rudimentale.)


Questo è un problema del mondo reale, quindi ecco cosa sto lavorando con:

  • Le funzionalità necessarie dovrebbero essere già incorporate in Emacs (23.3.1, 64-bit). Posso estendere le estensioni di Emacs dai repository standard di Ubuntu, ma preferirei non farlo. (Che credo escluda Rudel, purtroppo.)
  • Nessun nuovo utente o spoofing dell'utente. Le soluzioni dovrebbero funzionare con il set esistente di account utente e gli utenti non devono fingere di essere altri utenti (ad es. Via su o ssh).

Se fa alcuna differenza, le macchine sono su una LAN privata, hanno client e server OpenSSH installati (e in esecuzione) e tutti gli utenti possono connettersi a (il proprio account su) tutte le macchine, ma non hanno un filesystem condiviso.


Quindi, qualcuno sa se il server Emacs può

  • concedere l'accesso ad altri utenti, o
  • fornire l'accesso remoto?

MODIFICARE

Come commentato nella risposta di rwb, è chiaro che le nuove finestre vengono aperte localmente eseguendo emacsclient -c vengono effettivamente creati dal a distanza Processo del server Emacs. Questo è, emacsclient sta semplicemente attivando il comportamento rilevante nel server. Ciò causa alcuni problemi con impostazioni di visualizzazione errate, poiché il server normalmente non ha accesso al desktop locale (vedi sotto). Tuttavia, ora posso connettermi a una sessione di Emacs remota se utilizzo la seguente sequenza di comandi:

In un terminale, dove 1.22.333.44 è l'indirizzo IP di remotehost:

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

Quindi in un altro (sulla stessa macchina):

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

Il emacsclient comando causa il server Emacs remoto (in cui trova i dettagli di /tmp/server-file) per aprire una finestra grafica di Emacs (sul display locale) che condivide lo stato con la sessione di Emacs sull'host remoto.

Da quando il server Emacs remoto è stato avviato tramite ssh -X, SSH fornisce l'accesso al mio display locale tramite un "falso" :10 display. Il DISPLAY=:10passato ad esso (via emacsclientquindi provoca l'apertura di una finestra sul desktop locale.


Sebbene l'approccio sopra indicato segni "Esegui il server Emacs sulla macchina remota, connettiti usando" emacsclient localmente "box, è molto limitato, infatti non è molto diverso dall'esecuzione locale del server e dei client come singolo utente: l'unica differenza è che il server è ora remoto, quindi ha accesso a diverse risorse di sistema.

Sfortunatamente, lanciando via ssh -X è l'unico modo in cui sono riuscito a aprire una finestra sul server X di una macchina diversa:

  • Specifica di base DISPLAY=remote:0 non va da nessuna parte (dal momento che i server di Ubuntu X sono avviati con il -nolisten tcp opzione).

  • Connessione tramite SSH e quindi utilizzo DISPLAY=:0 fallisce anche, ma questa volta solo a causa della mancanza di credenziali di autenticazione adeguate. (Credo che sia il caso, comunque: il messaggio di errore dice criptico No protocol specified / Can't open display.)

Penso che trovare un modo per aggirare il secondo problema mi porterebbe probabilmente molto più vicino a una soluzione.


Dopo aver letto i post su http://comments.gmane.org/gmane.emacs.devel/103350 (a partire dal post "25 Ott 14:50", a circa metà strada) comincio a chiedermi se questa potrebbe essere una delle rare cose che Emacs non può fare (cioè impossibile ;-)).

Tuttavia, se qualcuno ha un modo per fornire l'accesso ai display X remoti senza l'errore delle autorizzazioni di cui sopra, sono comunque aperto alla persuasione ....

TL; DR

Come sottolineato dalla risposta di rwb, le mie domande sopra se Emacs può garantire l'accesso remoto hanno fatto le cose all'indietro. Non c'è alcun problema con Emacs che concede l'accesso ad altri utenti (server-use-tcp e un adatto server-file prenditi cura di questo): piuttosto il problema è come consentire a un processo su una macchina di aprire nuove finestre X sugli schermi X degli altri utenti (in particolare, Emacs in esecuzione (start-server) ha bisogno di aprire windows per gli utenti che lo chiedono via emacsclient -c). Questa risposta va oltre lo scopo di questa domanda.

Soluzione alternativa

Come soluzione, usiamo il seguente:

  • machine0: tmux -S /tmp/shared-tmux-socket new-session
  • machine1..machineN: ssh -t machine0 tmux -S /tmp/shared-tmux-socket attach

con permessi file adeguati su /tmp/shared-tmux-socket.

Quindi eseguiamo un Emacs in modalità testo nel terminale condiviso. :-) Questo solleva alcune domande di spoofing degli utenti, ma almeno l'host può vedere tutto ciò che gli ospiti stanno facendo.


47
2017-09-22 18:48


origine


risposte:


Penso che ciò che stai chiedendo sia impossibile per definizione, perché se offri a un utente remoto un accesso illimitato a Emacs, questo è altrettanto "spoofing dell'utente" quanto permettere all'utente remoto di accedere a una shell tramite ssh. Per scriverlo, da un punto di vista della sicurezza questa è probabilmente una cattiva idea.

Inoltre, il risultato di consentire a due utenti di accedere a un Emacs non è buono come si potrebbe sperare. Non è progettato per l'accesso simultaneo. Sono passati anni da quando l'ho provato, quindi le cose sarebbero potute andare un po ', ma quando l'ho fatto è stato a dir poco eccentrico.

Comunque, proverò a rispondere alla tua domanda.

Sembra che tu stia pensando a questo back-to-front, perché, in modo intuitivo, in termini di rete, il display X11 è il server e l'applicazione X11 è il client. Ciò è sorprendente perché in genere il display è locale per l'utente e l'applicazione è in esecuzione su qualche server remoto.

Puoi istruire un emacs in esecuzione per connettersi a un display remoto e aprire una nuova finestra con M-x make-frame-on-display. Affinché ciò funzioni, il proprietario di tale display dovrà concederti l'accesso.

Assumeremo host-l è il computer su cui è in esecuzione Emacs e che desideri renderlo accessibile a un utente con display 0 acceso host-r. Tieni presente che hai detto che non vuoi utilizzare l'inoltro SSH, quindi seguire questo metodo farà sì che tutto il traffico vada attraverso la rete non crittografato.

Innanzitutto, assicurati che il display host-r:0 sta accettando connessioni TCP. Non si menziona il proprio sistema operativo, ma questo è probabilmente il default su Unix e probabilmente non è su Linux (per ragioni di sicurezza). Se, per esempio, le seguenti menzioni -nolisten tcp allora dovrai cambiare questa configurazione.

host-r$ ps -ef | grep X

Quindi, ottenere l'utente di host-r per eseguire quanto segue e inviare l'output. Assicurati di avvertirli che questo ti consentirà di assumere il controllo completo della loro sessione desktop attuale, se lo desideri.

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

Questa è, in effetti, la "password" per il display. Sopra host-l, mettilo dove Emacs sarà in grado di trovarlo con:

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

Ora entra M-x make-frame-on-display host-r: 0 e una finestra di Emacs dovrebbe apparire sul display remoto.


10
2018-05-01 20:00



Questo dovrebbe fornire un punto di partenza per ciò che desideri.

Dal nodo informazioni (emacs) Opzioni emacsclient 

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

Potresti anche voler esaminare le variabili server-auth-dir, server-auth-key e server-port


12
2017-09-23 04:31



Aaron Gallagher ha implementato una soluzione: http://blog.habnab.it/blog/2013/06/25/emacsclient-and-tramp/

Funziona (AFAIU) come:

  • Il server emacs è avviato con tcp
  • Apre una connessione a un sistema remoto con tramp-sh, aprendo una porta anteriore ("canale posteriore")
  • si consiglia a tramp-sh di copiare un file cookie di autenticazione estesa sul sistema remoto
  • Sul sistema remoto chiama uno script speciale emacsclient.sh che emula emacsclient ma prefissa i nomi dei file con il prefisso tramp corrispondente che si trova nel cookie di autenticazione estesa

Ho aggiunto un commento al suo post sul blog proponendo che questa idea venga discussa e migliorata su emacs-devel.


7
2017-09-19 16:47



Se stai facendo questo per consentire alle persone di modificare da remoto i file, potresti voler guardare la 'modalità tramp'

http://emacswiki.org/emacs/TrampMode


4
2017-09-23 04:39