emacsclientはリモートemacsサーバーにアクセスします


8

リモートホストからemacsclientセッションを開こうとしています。trampのWebサイトで次の手順を実行しました。TRAMPを使用してリモートEmacsセッションに接続するにはどうすればよいですか。

ステップを説明します

  1. リモートホスト上に.emacsファイルを配置

    (require 'server)
    (setq server-host "<IP ADDRESS of remoteHost>"
          server-use-tcp t)
    (server-start)
    
  2. リモートホストでemacsセッションを開始する

  3. 〜/ emacs.d / server / serverをremoteHostからlocalHostにコピーし、同じパスを維持します。(localHost:〜/ emacs.d / server / server)

  4. ローカルホストのemacsシェル

    emacsclient /ssh:test@remoteHost:/tmp/test.py

しかし、私のlocalHostで次のエラーが発生しました

;; emacsclient: can't find socket; have you started the server?
;; To start the server in Emacs, type "M-x server-start".
;; emacsclient: connected to remote socket at `Remotehost`
;; emacsclient: connect: No route to host
;; emacsclient: No socket or alternate editor.  Please use:

    ;; --socket-name
    ;; --server-file      (or environment variable EMACS_SERVER_FILE)
    ;; --alternate-editor (or environment variable ALTERNATE_EDITOR)

したがって、それはremoteHostに接続しているように見えますが、ルートを見つけることができません。同様の質問がSOでも行われています。 ここここ。〜/ .emacs.d / server / serverをremoteHostからlocalHostに直接コピーするためのコードもここにあります

どんな助けでも大歓迎です。

更新 この件についてさらに情報を集めました。多くの人がこのタスクを試みたようで、一部は成功したようですが、私の特定の問題の解決策を見つけることができました。 他のユーザーとして他のマシンでEmacsサーバーとemacsclientを使用する

同様の質問は、how-do-i-use-emacsclient-to-connect-to-a-remote-emacs-instanceのようなemacs.stack.exchangeでも行われてい ます。

Update1

興味深い記事があり、ここで sshでグラフィックスを転送するには。実装は簡単で、接続が十分であれば問題なく動作しますが、trampを利用しません。


質問1:リモートサーバーはUNIXまたはLinuxであり、SSHデーモンが実行されますか?質問2:すべてのリモートemacsclientsのバージョンはローカルemacsバージョンと互換性がありますか?私は正常にセットアップし、リモートemacsclientsを使用して、デーモン/サーバーモードで実行されているローカルemacsに接続し直しました。
Melioratus、2015年

はい、あなたの両方の質問に。
DJJ 2015年

回答:


8

FAQから不明確なことの1つは、サーバーとクライアントの両方が互いに解決可能である必要があることだと思います。2009年からこのスレッドを見ることができます。結局のところ、私はそれを機能させることができましたが、今はOPと同じように見えます。これは私が試したものです:

setup.el:

(require 'server)

(setq server-name "sx-test"       ; name of the server
      server-host "192.168.2.198" ; server ip
      server-use-tcp t)

(server-start)                    ; comment out when using --daemon

私はこのようにサーバーを起動しました:

$ emacs -Q -l setup.el

Emacsウィンドウが表示されます。それを望まない場合は、その(server-start)行をコメント化して、次のようにEmacsを起動してください:

$ emacs -Q -l setup.el --daemon

次に、リモートマシンで、FAQの指示に従ってCookieをコピーし、次のようにクライアントを起動しようとしました。

$ emacsclient -f ~/.emacs.d/server/sx-test /ssh:user@192.168.2.200:/path/to/foo

192.168.2.200はリモートクライアントのIPです。これが、双方向の名前解決が必要な理由です。基本的に、/ssh:user@192.168.2.200:/path/to/fooリモートで編集するためにサーバーに与えるトランプパスです。

OPと同じように障害が発生します。私はemacsclientgdbの下で実行し、問題をトレースしてソケットへの接続の失敗を突き止めました。

emacsclient.cから:

  /* Set up the socket.  */
  if (connect (s, (struct sockaddr *) &server, sizeof server) < 0) /* <-- fails here */
    {
#ifdef WINDOWSNT
      if(!(w32_window_app () && alternate_editor))
#endif
      sock_err_message ("connect");
      return INVALID_SOCKET;
    }

次に、それをで実行したところstrace、次のように表示されました。

write(1, "emacsclient: connected to remote"..., 57emacsclient: connected to remote socket at 192.168.2.198
) = 57
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(40266), sin_addr=inet_addr("192.168.2.198")}, 16) = -1 EHOSTUNREACH (No route to host)
write(2, "emacsclient: connect: No route t"..., 39emacsclient: connect: No route to host
) = 39
write(2, "emacsclient: error accessing ser"..., 80emacsclient: error accessing server file "/home/jallad/.emacs.d/server/sx-test"
) = 80
exit_group(1)                           = ?
+++ exited with 1 +++

この時点では、サーバーにpingおよびsshを実行できるため、何が問題なのかわかりません。


テストが少し不正確だったようです。他にもいくつかのサーバーが稼働していて、誤った結論に至りました。私が見つけたものですぐに答えを更新します。
Quarky、2015

あなたの答えを@suvayuに感謝します。それは私の質問に対する正確な答えではありませんが、問題のサイドステップを投稿しました。しかし、あなたの答えはこれまでのところ最も近い解決策のようです。私は質問をする場合にだけ開いてみましょうよ
DJJ

@DJJ公正だと思います。解決策が見つかれば、回答を更新します。
Quarky

3

それは私の質問への答えではありませんが、SOの投稿からこのソリューションを使用して問題を回避することができました。まだこれで苦労している人とソリューションを共有したいだけです。

重要なのは、サーバーとの接続が切断された場合でも、リモートホストでプロセスを存続させるために、dtachをtrampとともに使用することです。

サーバーでRを起動するコマンドは次のとおりです。リモートサーバーで作成されたグラフィックスを表示するためにポート転送を有効にすることを除いて、SOの同じコードです。

(defvar R-remote-host "remotehost")
(defvar R-remote-session "R")

(defun R-remote (&optional remote-host session)
  "Connect to the remote-host's dtach session running R."
  (interactive (list
        (read-from-minibuffer "R remote host: " R-remote-host)
        (read-from-minibuffer "R remote session: " R-remote-session)))
  (pop-to-buffer (make-comint (concat "remote-" session)
              "ssh" nil "-X"  "-t" "-t" remote-host
              "dtach" "-A" (concat ".dtach-" session)
              "-z" "-E"  "-r" "none"
              inferior-R-program-name "--no-readline"
              inferior-R-args))
  (ess-remote (process-name (get-buffer-process (current-buffer))) "R")
  (setq comint-process-echoes t))

意図的にプロセスを強制終了しないか、サーバーが再起動しない限り、好きなように切断して、再度接続したときにプロセスを取り戻すことができます。

他のリモートプロセスにも簡単に拡張できます。ここに私が例えばPythonに使用するものがあります

(defvar remote-host "remotehost")
(defvar remote-session "python")
(defun python-remote (&optional remote-host session)
  "Connect to the remote-host's dtach session running python."
  (interactive (list
        (read-from-minibuffer "R remote host: " remote-host)
        (read-from-minibuffer "R remote session: " remote-session)))
  (pop-to-buffer (make-comint (concat "remote-" session)
              "ssh" nil "-t" "-t" remote-host
              "dtach" "-A" (concat ".dtach-" session)
              "-z" "-E" "-r" "none"
             "python" )
         )
  (setq comint-process-echoes t))

さらに簡潔にするために、両方の機能を一緒に使用する必要があります。しかし、それでうまくいくかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.