既存のEmacsセッション内で(start-server)
を呼び出した後、emacsclient -c
(同じコンピューター上で)を使用して、そのサーバーに接続する新しいフレームを作成できるため、emacsclient
は、共有状態(バッファなど)の同じセットにアクセスできます。
私が見つけたドキュメントのほとんどは、「ローカルのEmacsにすばやくアクセスできるようにする」ユースケースに焦点を当てているため、まだ詳細を確認していない2つのことがあります。
emacsclient -c
はotherユーザーによって開始されたEmacsサーバーにアクセスできますか、それとも自分のユーザーによって開始されたセッションのみを検出するように配線されていますか?
Emacsサーバーは(直接的または間接的に)リモート接続をサポートしていますか?つまり、リモートマシンでemacsclient -c
への呼び出しがlocal状態にアクセスできるようにするEmacs(おそらくSSHを含む)を設定する方法があります私のEmacsサーバー?
(あなたがまだ推測していない場合、私が最終的にやりたいのは、基本的な共同編集サポートを提供するために上記の2つのテクニックを組み合わせることです。)
これは現実の問題なので、私が取り組んでいるのは次のとおりです。
su
またはssh
を使用)。違いがある場合、マシンはプライベートLAN上にあり、OpenSSHクライアントとサーバーがインストール(および実行)されており、すべてのユーザーはすべてのマシンに(自分のアカウントで)接続できますが、共有ファイルシステムはありません。
だから、Emacsサーバーができるかどうか誰もが知っていますか
編集
Rwbの回答でコメントされているように、emacsclient -c
を実行することでローカルに開かれている新しいウィンドウは、実際にはremote Emacsサーバープロセスによって作成されていることが明らかです。つまり、emacsclient
はサーバーで関連する動作をトリガーするだけです。サーバーは通常ローカルデスクトップにアクセスできないため、これにより、誤ったディスプレイ設定に関する問題が発生します(以下を参照)。ただし、次の一連のコマンドを使用すると、リモートEmacsセッションに接続できます。
1つの端末で、1.22.333.44
はremotehost
のIPアドレスです:
ssh -t -X remotehost \
"emacs -nw --eval
'(progn (setq server-Host \"1.22.333.44\" server-use-tcp t) (server-start))'"
次に、別の(同じマシン上で):
scp remotehost:.emacs.d/server/server /tmp/server-file
DISPLAY=localhost:10 emacsclient -c -f /tmp/server-file
emacsclient
コマンドにより、リモートEmacsサーバー(/tmp/server-file
で詳細を検出)が、リモートホスト上のEmacsセッションと状態を共有するグラフィカルEmacsウィンドウ(ローカルディスプレイ上)を開きます。 。
リモートEmacsサーバーはssh -X
を介して起動されたため、SSHは「偽」の:10
ディスプレイを介してローカルディスプレイへのアクセスを提供します。 (emacsclient
経由で)渡されたDISPLAY=:10
により、ローカルデスクトップでウィンドウが開かれます。
上記のアプローチは「Emacsサーバーをリモートマシンで実行し、emacsclient
ローカルで接続する」ボックスにチェックを入れますが、非常に制限されています。実際、サーバーとクライアントをすべて1人のユーザーとしてローカルで実行することとそれほど違いはありません。唯一の違いは、サーバーがリモートになり、異なるシステムリソースにアクセスできることです。
残念ながら、ssh -X
を介して起動することが、別のマシンのXサーバーでウィンドウを正常に開くことができる唯一の方法です。
基本的なDISPLAY=remote:0
を指定しても何も取得されません(Ubuntu Xサーバーは-nolisten tcp
オプションで起動されるため)。
SSH経由で接続してからDISPLAY=:0
を使用することも失敗しますが、今回は適切な認証資格情報がないためです。 (とにかくそうだと思います:エラーメッセージはNo protocol specified
/Can't open display
と不可解に言います。)
2番目の問題を回避する方法を見つければ、おそらく解決策にかなり近づくことができると思います。
http://comments.gmane.org/gmane.emacs.devel/10335 (「25 Oct 14:50」の投稿から始まり、半分ほど下がった)で投稿を読んだこれがEmacsができない稀なことの1つかもしれないと疑問に思い始めました(つまり不可能です;-))。
ただし、上記のアクセス許可エラーなしでリモートXディスプレイへのアクセスを提供する方法があれば、まだ説得力があります。..
TL; DR
Rwbの答えで指摘されているように、Emacsがリモートアクセスを許可できるかどうかについての上記の質問には、物事が遅れています。 Emacsが他のユーザーにアクセスを許可することに本当の問題はありません(server-use-tcp
および適切なserver-file
がこれを処理します):むしろ問題はプロセスを許可する方法です他のユーザーのXディスプレイで新しいXウィンドウを開くマシン(具体的には、(start-server)
を実行しているEmacsは、emacsclient -c
経由でそれを要求するユーザーのためにウィンドウを開く必要があります) 。その答えはこの質問の範囲を超えています。
代替案
回避策として、次を使用します。
tmux -S /tmp/shared-tmux-socket new-session
ssh -t machine0 tmux -S /tmp/shared-tmux-socket attach
/tmp/shared-tmux-socket
に適切なファイル許可があります。
次に、共有ターミナルでテキストモードのEmacsを実行します。 :-)これにより、ユーザーのなりすましの質問がいくつか発生しますが、少なくともホストはゲストが行っていることすべてを見ることができます。
リモートユーザーにEmacsへの無制限のアクセス権を与えると、これはそのリモートユーザーがsshを介してシェルにアクセスできるのと同じくらい「ユーザースプーフィング」であるため、あなたが求めていることは定義上不可能です。正確に言うと、セキュリティの観点から、これはおそらく悪い考えです。
また、2人のユーザーに1つのEmacsにアクセスさせる結果は、期待するほど良くありません。同時アクセスを念頭に置いて設計されていません。試してから何年も経ちましたので、少しは動いたかもしれませんが、やったときには控えめに言っても風変わりでした。
それでも、私はあなたの質問に答えようとします。
直感に反して、ネットワーク用語では、X11ディスプレイがサーバーであり、X11アプリケーションがクライアントであるため、このバックツーフロントについて考えているように聞こえます。通常、表示はユーザーのローカルにあり、アプリケーションはリモートサーバーで実行されているため、これは驚くべきことです。
実行中のemacsに指示して、リモートディスプレイに接続し、新しいウィンドウを開くことができます。 M-x make-frame-on-display。これが機能するためには、そのディスプレイの所有者がアクセスを許可する必要があります。
Host-l
はEmacsを実行しているコンピューターであり、Host-r
のディスプレイ0のユーザーがアクセスできるようにしたいと仮定します。 SSH転送を使用したくないと言っていることに注意してください。したがって、この方法に従うと、すべてのトラフィックが暗号化されずにネットワークを通過します。
まず、ディスプレイHost-r:0
がTCP接続を受け入れていることを確認してください。オペレーティングシステムについては言及しませんが、これはおそらくUnixのデフォルトであり、おそらくLinuxではありません。セキュリティ上の理由から)。たとえば、以下が-nolisten tcp
に言及している場合、この設定を変更する必要があります。
Host-r$ ps -ef | grep X
次に、Host-rのユーザーに以下を実行させ、出力を送信します。選択すると、現在のデスクトップセッションを完全に制御できるようになることを必ず警告してください。
Host-r$ xauth list $DISPLAY
Host-r/unix:0 MIT-MAGIC-COOKIE-1 01234567890abcdef0123456789abcd
これは、事実上、ディスプレイの「パスワード」です。 Host-l
で、Emacsが見つけられる場所にそれを置きます:
Host-l$ xauth add Host-r:0 MIT-MAGIC-COOKIE-1 01234567890abcdef0123456789abcd
今入る M-x make-frame-on-display Host-r:0 そして、Emacsウィンドウがリモートディスプレイにポップアップするはずです。
これは、あなたが望むものの出発点を提供するはずです。
情報ノードから(emacs)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.)
また、変数server-auth-dir
、server-auth-key
およびserver-port
アーロン・ギャラガーはソリューションを実装しました: http://blog.habnab.it/blog/2013/06/25/emacsclient-and-tramp/
次のように機能します(AFAIU):
このアイデアをemacs-develで議論し、強化することを提案する彼のブログ投稿にコメントを追加しました。
ユーザーがファイルをリモートで編集できるようにするためにこれを行っている場合は、「トランプモード」をご覧ください。