55

(start-server)既存の Emacs セッション内で呼び出した後emacsclient -c、(同じコンピューター上で) を使用して、そのサーバーに接続する新しいフレームを作成できることを知っていemacsclientます。 )。

私が見つけたドキュメントのほとんどは、「ローカルの Emacs にすばやくアクセスできるようにする」ユースケースに焦点を当てているため、まだ詳細を見ていないことが 2 つあります。

  1. 他のemacsclient -cユーザーが開始した Emacs サーバーにアクセスできますか? それとも、自分のユーザーが開始したセッションのみを検出するように組み込まれていますか?

  2. 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 を実行します。:-) これにより、ユーザーのなりすましに関する疑問がいくつか生じますが、少なくともホストは、ゲストが行っているすべてのことを確認できます。

4

4 に答える 4

15

これはあなたが望むものの出発点を提供するはずです。

情報ノード(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

于 2012-09-23T04:31:30.860 に答える
11

リモートユーザーにEmacsへの無制限のアクセスを許可すると、リモートユーザーにssh経由でシェルにアクセスさせるのと同じくらい「ユーザースプーフィング」になるため、あなたが求めていることは定義上不可能だと思います。つまり、セキュリティの観点から、これはおそらく悪い考えです。

また、2 人のユーザーが 1 つの Emacs にアクセスできるようにした場合の結果は、期待するほど良くありません。同時アクセスを考慮して設計されていません。試してから何年も経っているので、少し進んだかもしれませんが、控えめに言っても風変わりでした.

それでも、私はあなたの質問に答えようとします。

直感に反して、ネットワークの用語では、X11 ディスプレイがサーバーであり、X11 アプリケーションがクライアントであるため、このバックツーフロントについて考えているように思えます。通常、ディスプレイはユーザーに対してローカルであり、アプリケーションはリモート サーバーで実行されているため、これは驚くべきことです。

実行中の emacs に、リモート ディスプレイに接続して新しいウィンドウを開くように指示できますM-x make-frame-on-display。これが機能するには、そのディスプレイの所有者がアクセスを許可する必要があります。

host-lEmacs を実行しているコンピューターであり、 のディスプレイ 0 のユーザーがアクセスできるようにしたいとしますhost-r。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

これは事実上、ディスプレイの「パスワード」です。で、 Emacshost-lが見つけられる場所に置きます:

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

ここで入力するM-x make-frame-on-display host-r:0と、Emacs ウィンドウがリモート ディスプレイに表示されます。

于 2013-05-01T20:00:46.777 に答える
4

人々がファイルをリモートで編集できるようにするためにこれを行っている場合は、「トランプモード」を確認することをお勧めします

http://emacswiki.org/emacs/TrampMode

于 2012-09-23T04:39:25.660 に答える