emacsclient để truy cập máy chủ emacs từ xa


8

Tôi đang cố gắng mở một phiên emacsclient từ một máy chủ từ xa. Tôi đã thực hiện các bước sau trên trang web của tramp Làm cách nào tôi có thể sử dụng TRAMP để kết nối với phiên Emacs từ xa?.

Tôi sẽ hướng dẫn bạn qua bước

  1. trên máy chủ từ xa đặt tập tin .emacs

    (require 'server)
    (setq server-host "<IP ADDRESS of remoteHost>"
          server-use-tcp t)
    (server-start)
    
  2. bắt đầu phiên emacs trên máy chủ từ xa

  3. sao chép ~ / emacs.d / server / server từ remotehost sang localhost giữ nguyên đường dẫn. (localhost: ~ / emacs.d / máy chủ / máy chủ)

  4. trên vỏ máy chủ địa phương emacs

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

Nhưng đã gặp lỗi sau trên localhost của tôi

;; 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)

Vì vậy, nó dường như kết nối với remotehost nhưng không thể tìm thấy một tuyến đường. Các câu hỏi tương tự đã được hỏi về SO. Đâyđây . Ngoài ra còn có một số mã hay về việc sao chép trực tiếp ~ / .emacs.d / server / server từ remotehost sang localhost tại đây .

Chúng tôi rất trân trọng bất kỳ sự giúp đỡ nào.

Cập nhật Tôi đã thu thập thêm một số thông tin về vấn đề này. Có vẻ như một số người đã thử thực hiện nhiệm vụ này và một số người dường như đã thành công nhưng tôi có thể tìm thấy bất kỳ giải pháp nào cho vấn đề cụ thể của mình. Sử dụng máy chủ Emacs và emacsclient trên các máy khác như những người dùng khác

Các câu hỏi tương tự cũng đã được đặt ra trên emacs.stack.exchange như how-do-i-use-emacsclient-to-connect-to-a-remote-emacs-dụ

Cập nhật1

Có một bài viết thú vị ở đây chuyển tiếp đồ họa với ssh. Thật dễ dàng để thực hiện và hoạt động khá tốt nếu kết nối của bạn đủ tốt nhưng nó không sử dụng tramp.


Câu hỏi 1: Các máy chủ từ xa sẽ là UNIX hay Linux và có một trình nền SSH đang chạy? Câu hỏi 2: Các phiên bản của tất cả các emacscl từ xa có tương thích với phiên bản emacs cục bộ không? Tôi đã thiết lập thành công và sử dụng các emacscl từ xa để kết nối lại với các emacs cục bộ của tôi đang chạy ở chế độ daemon / máy chủ.
Melioratus 1/10/2015

có cho cả hai câu hỏi của bạn
DJJ

Câu trả lời:


8

Tôi nghĩ một trong những điều không rõ ràng từ FAQ là sự cần thiết mà cả máy chủ và máy khách đều có thể giải quyết được lẫn nhau. Bạn có thể thấy chủ đề này từ năm 2009. Cuối cùng, hồi đó tôi đã làm cho nó hoạt động, nhưng bây giờ tôi thấy giống như OP. Đây là những gì tôi đã cố gắng:

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

Tôi đã khởi động máy chủ như thế này:

$ emacs -Q -l setup.el

Điều này sẽ cung cấp cho bạn một cửa sổ Emacs mặc dù. Nếu bạn không muốn điều đó, hãy bình luận (server-start)và bắt đầu Emacs như thế này:

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

Bây giờ trên máy từ xa, tôi đã sao chép cookie theo hướng dẫn trong Câu hỏi thường gặp và cố gắng khởi động ứng dụng khách như thế này:

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

192.168.2.200 là ip của máy khách từ xa. Đây là lý do tại sao độ phân giải tên cả hai chiều là cần thiết. Về cơ bản, /ssh:user@192.168.2.200:/path/to/foolà đường dẫn tramp bạn sẽ cung cấp cho máy chủ để chỉnh sửa từ xa.

Tôi thấy một thất bại giống như OP. Tôi đã chạy emacsclienttheo gdb và tìm ra sự cố khi kết nối với ổ cắm.

từ 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;
    }

Sau đó tôi chạy nó xuống stracevà thấy như sau:

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 +++

Tại thời điểm này tôi không chắc chắn điều gì đang xảy ra, vì tôi có thể ping và ssh vào máy chủ.


Có vẻ như thử nghiệm của tôi là một chút không chính xác. Có một số máy chủ khác đang chạy dẫn đến kết luận sai. Tôi sẽ cập nhật câu trả lời sớm với những gì tôi tìm thấy.
Quarky

Cảm ơn @suvayu cho câu trả lời của bạn. Mặc dù đó không phải là câu trả lời chính xác cho câu hỏi của tôi, tôi đã đăng một bước bên lề cho vấn đề. Nhưng dường như câu trả lời của bạn là giải pháp gần nhất cho đến nay. Tôi sẽ để câu hỏi mở trong trường hợp
DJJ

@DJJ Tôi nghĩ đó là công bằng. Nếu tôi tìm thấy một giải pháp, tôi sẽ cập nhật câu trả lời.
Quarky

3

Đó không chính xác là câu trả lời cho câu hỏi của tôi nhưng tôi đã xoay sở để khắc phục vấn đề bằng cách sử dụng giải pháp này từ một bài đăng trong SO . Chỉ muốn chia sẻ giải pháp với người vẫn đang vật lộn với điều này.

Chìa khóa đang sử dụng dtach với tramp để giữ cho tiến trình tồn tại trên máy chủ từ xa ngay cả khi bạn ngắt kết nối với máy chủ.

Đây là lệnh để khởi chạy R trên máy chủ. Đó là cùng một mã trên SO ngoại trừ tôi cho phép chuyển tiếp cổng để xem đồ họa được tạo trên máy chủ từ xa

(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))

Miễn là bạn không giết quá trình trên mục đích hoặc máy chủ không khởi động lại, bạn có thể ngắt kết nối theo ý muốn và lấy lại quy trình khi bạn kết nối lại.

Thật dễ dàng để mở rộng đến các quy trình từ xa khác. Đây là cái tôi dùng cho python chẳng hạn

(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))

Tôi vẫn cần sử dụng để kéo cả hai chức năng lại với nhau để ngắn gọn hơn. Nhưng nó có thể giúp bạn đi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.