web-dev-qa-db-ja.com

他のユーザーとして他のマシンでEmacsサーバーとemacsclientを使用する

既存のEmacsセッション内で(start-server)を呼び出した後、emacsclient -c(同じコンピューター上で)を使用して、そのサーバーに接続する新しいフレームを作成できるため、emacsclientは、共有状態(バッファなど)の同じセットにアクセスできます。

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

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

  2. Emacsサーバーは(直接的または間接的に)リモート接続をサポートしていますか?つまり、リモートマシンでemacsclient -cへの呼び出しがlocal状態にアクセスできるようにするEmacs(おそらくSSHを含む)を設定する方法があります私のEmacsサーバー?

(あなたがまだ推測していない場合、私が最終的にやりたいのは、基本的な共同編集サポートを提供するために上記の2つのテクニックを組み合わせることです。)


これは現実の問題なので、私が取り組んでいるのは次のとおりです。

  • 必要な機能は、すでにEmacsに組み込まれている必要があります(23.3.1、64ビット)。標準のUbuntuリポジトリからEmacs拡張機能まで拡張できますが、そうしないことを望みます。 (私はRudelを除外していると思いますが、悲しいことに)
  • 新しいユーザーやユーザーのなりすましはありません。ソリューションは既存のユーザーアカウントのセットで動作する必要があり、ユーザーは他のユーザーのふりをしてはいけません(例:suまたはsshを使用)。

違いがある場合、マシンはプライベートLAN上にあり、OpenSSHクライアントとサーバーがインストール(および実行)されており、すべてのユーザーはすべてのマシンに(自分のアカウントで)接続できますが、共有ファイルシステムはありません。


だから、Emacsサーバーができるかどうか誰もが知っていますか

  • 他のユーザーにアクセスを許可する、または
  • リモートアクセスを提供しますか?

編集

Rwbの回答でコメントされているように、emacsclient -cを実行することでローカルに開かれている新しいウィンドウは、実際にはremote Emacsサーバープロセスによって作成されていることが明らかです。つまり、emacsclientはサーバーで関連する動作をトリガーするだけです。サーバーは通常ローカルデスクトップにアクセスできないため、これにより、誤ったディスプレイ設定に関する問題が発生します(以下を参照)。ただし、次の一連のコマンドを使用すると、リモートEmacsセッションに接続できます。

1つの端末で、1.22.333.44remotehostの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経由でそれを要求するユーザーのためにウィンドウを開く必要があります) 。その答えはこの質問の範囲を超えています。

代替案

回避策として、次を使用します。

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

48
Paul Whittaker

リモートユーザーに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ウィンドウがリモートディスプレイにポップアップするはずです。

11
mavit

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

情報ノードから(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-dirserver-auth-keyおよびserver-port

14
rwb

アーロン・ギャラガーはソリューションを実装しました: http://blog.habnab.it/blog/2013/06/25/emacsclient-and-tramp/

次のように機能します(AFAIU):

  • emacsサーバーはtcpで開始されます
  • 彼はtramp-shを使用してリモートシステムへの接続を開き、フォワードポート(「バックチャネル」)を開きます。
  • tramp-shは、拡張認証Cookieファイルをリモートシステムにコピーすることをお勧めします
  • リモートシステムで、彼はemacsclientをエミュレートする特殊なemacsclient.shシェルスクリプトを呼び出しますが、ファイル名の前に、拡張認証Cookieにある対応するtrampプレフィックスを付けます

このアイデアをemacs-develで議論し、強化することを提案する彼のブログ投稿にコメントを追加しました。

7
Thomas Koch

ユーザーがファイルをリモートで編集できるようにするためにこれを行っている場合は、「トランプモード」をご覧ください。

http://emacswiki.org/emacs/TrampMode

4
sean_m