(start-server)
既存の Emacs セッション内で呼び出した後emacsclient -c
、(同じコンピューター上で) を使用して、そのサーバーに接続する新しいフレームを作成できることを知っていemacsclient
ます。 )。
私が見つけたドキュメントのほとんどは、「ローカルの Emacs にすばやくアクセスできるようにする」ユースケースに焦点を当てているため、まだ詳細を見ていないことが 2 つあります。
他の
emacsclient -c
ユーザーが開始した Emacs サーバーにアクセスできますか? それとも、自分のユーザーが開始したセッションのみを検出するように組み込まれていますか?Emacs サーバーは (直接的または間接的に) リモート接続をサポートしていますか?
emacsclient -c
つまり、リモートマシンでの呼び出しがEmacs サーバーのローカル状態にアクセスできるようにする Emacs (おそらく SSH を含む) をセットアップする方法はありますか?
(まだ想像していない方のために説明すると、私が最終的にやりたいのは、上記の 2 つの手法を組み合わせて、基本的な共同編集サポートを提供することです。)
これは現実の問題なので、私が取り組んでいることは次のとおりです。
- 必要な機能はすでに Emacs に組み込まれているはずです (23.3.1、64 ビット)。標準の Ubuntu リポジトリから Emacs 拡張機能に拡張することはできますが、そうしないほうがよいと思います。(悲しいことに、これはRudelを除外すると私は信じています。)
- 新しいユーザーやユーザーのなりすましはありません。ソリューションは既存のユーザー アカウントのセットで動作する必要があり、ユーザーは他のユーザーになりすましてはなりません (たとえば、
su
またはを介してssh
)。
違いがある場合、マシンはプライベート LAN 上にあり、OpenSSH クライアントとサーバーがインストール (および実行) されており、すべてのユーザーが (自分のアカウントで) すべてのマシンに接続できますが、共有ファイルシステムはありません。
それで、Emacsサーバーができるかどうか知っている人はいますか
- 他のユーザーにアクセスを許可する、または
- リモートアクセスを提供しますか?
編集
rwb の回答でコメントされているように、実行によってローカルで開かれている新しいウィンドウが、リモートのEmacs サーバー プロセスemacsclient -c
によって実際に作成されていることは明らかです。つまり、サーバーで関連する動作をトリガーするだけです。通常、サーバーはローカル デスクトップにアクセスできないため、ディスプレイ設定が正しくないという問題が発生します (以下を参照)。ただし、次の一連のコマンドを使用すると、リモートの Emacs セッションに接続できるようになりました。emacsclient
1 つの端末で、1.22.333.44
は次の IP アドレスですremotehost
。
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
ます。したがってDISPLAY=:10
、(経由で)渡されたemacsclient
により、ローカルデスクトップでウィンドウが開かれます。
上記のアプローチは「リモート マシンで 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/103350の投稿('25 Oct 14:50' の投稿から始まり、半分ほど下)を読んで、これがこれは、Emacs ができない (つまり、不可能です ;-) ) というまれなことの 1 つです。
ただし、上記のパーミッションエラーなしでリモート X ディスプレイへのアクセスを提供する方法を誰かが持っている場合、私はまだ説得の余地があります....
TL;DR
rwb の回答で指摘されているように、Emacs がリモート アクセスを許可できるかどうかに関する上記の私の質問は、物事が逆になっています。Emacs が他のユーザーにアクセス権を付与することには実際の問題はありません (server-use-tcp
そして適切server-file
にこれを処理します): むしろ問題は、あるマシン上のプロセスが他のユーザーの X ディスプレイ(具体的には実行中の Emacs)で新しい X ウィンドウを開くことを許可する方法です。(start-server)
経由で要求するユーザーのためにウィンドウを開く必要がありますemacsclient -c
)。その答えは、この質問の範囲を超えています。
代替ソリューション
回避策として、以下を使用します。
- マシン0:
tmux -S /tmp/shared-tmux-socket new-session
- machine1..machineN:
ssh -t machine0 tmux -S /tmp/shared-tmux-socket attach
に対する適切なファイル権限を持つ/tmp/shared-tmux-socket
。
次に、共有ターミナルでテキストモードの Emacs を実行します。:-) これにより、ユーザーのなりすましに関する疑問がいくつか生じますが、少なくともホストは、ゲストが行っているすべてのことを確認できます。