Emacs - Lỗi khi gọi (khởi động máy chủ)


82

Tôi hiện đang sử dụng GNU Emacs 23.0.93.1 trong Windows Vista SP1. Trong tệp .emacs của tôi, tôi thực hiện cuộc gọi đến (server-start)và điều đó gây ra lỗi với thông báo Thư mục ~ / .emacs.d / server không an toàn . Có ai nhìn thấy điều này và biết một bản sửa lỗi hoặc giải pháp thay thế? ... ngoài việc tắt máy chủ;)

Đây là dấu vết ngăn xếp:

Debugger entered--Lisp error: (error "The directory ~/.emacs.d/server is unsafe")
  signal(error ("The directory ~/.emacs.d/server is unsafe"))
  error("The directory %s is unsafe" "~/.emacs.d/server")
  server-ensure-safe-dir("~\\.emacs.d\\server\\")
  server-start(nil)
  call-interactively(server-start t nil)
  execute-extended-command(nil)
  call-interactively(execute-extended-command nil nil)

1
Tôi đã gặp lỗi tương tự khi khởi động Emacs trên hộp Unix; điều này hóa ra là do tôi giữ ~ / .emacs.d của mình trong Subversion và khi kiểm tra, svnmáy khách đã đặt ~ / .emacs.d / server thành 0755 cho mỗi umask của tôi. Thay vì gói svntrong một tập lệnh shell, điều này làm mất đi mục đích có mọi thứ tôi cần để tùy chỉnh Emacs sống trong Subversion, tôi chỉ yêu cầu Emacs buộc các quyền chính xác khi nó khởi động, bằng cách thêm phần sau vào ~/.emacs.d/init.el:(set-file-modes (expand-file-name "~/.emacs.d/server") #o700)
Aaron Miller

Câu trả lời:


151

Tôi đã tìm thấy giải pháp này trên EmacsWiki:

"Vấn đề là quyền sở hữu thư mục ~ / .emacs.d / server khi bạn cũng có quyền" Quản trị viên "trên tài khoản của mình. Tạo thư mục ~ / .emacs.d / server và đặt chủ sở hữu thư mục này thành thông tin đăng nhập của bạn tên và sự cố đã biến mất. Vì tôi có phiên bản “Hà Lan” của Windows 7, tôi không biết chính xác các thuật ngữ tiếng Anh nhưng đây là quy trình:

Nhấp chuột R vào ~ / .emacs.d / server và chọn “Thuộc tính” (mục cuối cùng trong menu). Từ Thuộc tính, chọn Tab “Bảo mật” và sau đó chọn nút “Nâng cao”. Sau đó chọn Tab “Chủ sở hữu” và thay đổi chủ sở hữu từ Administrators (<your-pc-name>\Administrators)thành <your-login-name> (<your-pc-name>\<your-login-name>. Bây giờ mã máy chủ sẽ chấp nhận thư mục này là an toàn vì bạn là chủ sở hữu.

Hy vọng điều này sẽ giúp ích cho tất cả các bạn, nó đã giải quyết được vấn đề cho tôi.

WKR Reutefleut "

Nó chắc chắn hoạt động trên Vista, với Emacs 23.2.1.


3
Đã sửa nó! Tôi ước gì nhận xét này có thứ hạng google cao hơn và nó cũng phải là câu trả lời cho câu hỏi này.
Drew

Đã khắc phục sự cố trên Windows 7. Từ bash, $ chown -R "$ {USER}" ~ / .emacs.d
luke h

Nó hoạt động trên spacemacs 0.200.1@25.1.1 (do đó nó cũng hoạt động trên emacs thuần túy 25.1.1).
gemantzu

chmod 700 cũng được.
netawater

29

Tôi thích anwer of larsreed, nhưng mã phàn nàn đã sẵn sàng để sử dụng:

(yêu cầu 'máy chủ)
(khi (và (> = emacs-major-version 23)
           (hệ thống cửa sổ bằng nhau 'w32))
  (defun server-ensure-safe-dir (dir) "Noop" t)); Thư mục "Suppress error"
                                                 ; ~ / .emacs.d / máy chủ không an toàn "
                                                 ; trên cửa sổ.
(khởi động máy chủ)

Tôi tiết lộ vấn đề này trong bài viết trên blog của mình http://brain-break.blogspot.com/2009/08/when-moving-from-gnu-emacs-22.html

Cũng lưu ý rằng trong năm 2009-09-19 đã sửa lỗi # 4197 về máy chủ-đảm bảo-an toàn-dir, vì vậy trong Emacs 23.2 sắp tới, cách giải quyết này không cần thiết.

Theo Emacs 23.2 được phát hành gần đây, tôi có cảnh báo như vậy:

Cảnh báo (máy chủ): Sử dụng ~/.emacs.d/serverđể lưu trữ tệp xác thực máy chủ-Emacs. Các thư mục trên hệ thống tệp FAT32 KHÔNG an toàn trước sự giả mạo. Xem biến server-auth-dirđể biết chi tiết.

Để khắc phục điều này như đã nói cảnh báo, bạn có thể trỏ server-auth-dir đến phân vùng NTFS ( %APPDATA%thường được đặt trong Windows %SYSTEMDRIVE%và người dùng thường định dạng ổ đĩa hệ thống thành phân vùng NTFS):

(yêu cầu 'máy chủ)
(khi (và (eq window-system 'w32) (tệp-tồn tại-p (getenv "APPDATA")))
  (setq server-auth-dir (concat (getenv "APPDATA") "/.emacs.d/server"))
  (make-directory server-auth-dir))
(khởi động máy chủ)

1
sử dụng emacs23 và windows vista 64b, điều này đã sửa nó cho tôi. Không có yêu cầu máy chủ không hoạt động.
Mario F

1
Cảm ơn, điều này phù hợp với tôi trên Win7-64. Lưu ý với EmacsW32, bạn có thể bỏ qua phần khởi động máy chủ vì nó sẽ thực hiện điều đó sau đó.
harpo

1
Điều này vẫn xảy ra trong Emacs 23.3.1 nên tôi đã thay đổi điều kiện thành <code> (= emacs-major-version 23) (> = emacs-minor-version 1) (<= emacs-minor-version 3) </code> nhưng điều đó sẽ cần cập nhật nếu điều này không cố định ở 23,4 .... Vì vậy, xem các bình luận dưới đây bởi @ user160983 mà bỏ qua các emacs-nhỏ-phiên bản
DJB

1
như tôi nhận xét về câu trả lời trước các vấn đề tồn tại trong emacs 24 nên có điều kiện nên được (> = emacs-major-phiên bản 24)
mcheema

1
@mcheema Tôi sửa thành (>= emacs-major-version 23). Cảm ơn +1
gavenkoa

14

Đây là một lỗi Emacs đã biết trên Windows. Một cách giải quyết là nhận xét dòng này trong server-đảm bảo-an toàn-dir trong server.el bạn sẽ muốn biên dịch lại byte sau khi thay đổi:

;; FIXME: Busted on Windows. 
;; (eql (nth 2 attrs) (user-uid)) 

3
Giải pháp của bạn khắc phục sự cố của tôi. Tôi sẽ điều tra thêm vấn đề này sau và thêm những phát hiện của tôi ở đây. Cảm ơn!
λ Jonas Gorauskas

10

Để tránh bị hack trong thư mục lisp, bạn chỉ cần thêm phần sau vào .emacs của mình:

(require 'server) (and (>= emacs-major-version 23) (defun server-ensure-safe-dir (dir) "Noop" t))


Tôi đã gặp sự cố ở trên với Emacs trong Cygwin và lệnh trên đã hoạt động.
MikeHoss

1
vấn đề cũng xảy ra trong emacs 24 như vậy có lẽ một (> = emacs-major-phiên bản 23) sẽ là thích hợp
mcheema

đối với tôi trên Windows 7 với Emacs 24, điều này không hoạt động cho đến khi tôi thêm dòng (require 'server)phía trên mã
MostlyHarmless

Điều này đã làm việc với tôi trong nhiều năm cho đến khi tôi sử dụng điều này trên MacOS 10.14 (Mojave) tại thời điểm đó, nó bị hỏng (tôi chia sẻ các tệp init của mình trên tất cả các nền tảng). Sử dụng câu trả lời của gavenkoa ở trên cũng bao gồm ràng buộc để hạn chế thay đổi đối với Windows.
Steve Broberg

7

Ngoài ra, bạn không muốn máy chủ được khởi động ở chế độ hàng loạt. Trong .emac của tôi, do đó tôi sử dụng

(defconst --batch-mode 
  (or noninteractive (member "--batch-mode" command-line-args))
  "True when running in batch-mode (--batch-mode command-line switch set).")

và sau đó

(unless --batch-mode
  (require 'server)
  (when (and (= emacs-major-version 23)
         (= emacs-minor-version 1)
         (equal window-system 'w32))
    ;; Suppress error "directory ~/.emacs.d/server is unsafe" on Windows.
    (defun server-ensure-safe-dir (dir) "Noop" t))
  (server-start))

Vẫn còn tính năng máy chủ thất thường: server-startném khi thư mục % HOME% /. Emacs.d / server không tồn tại. Liên tiếp Emacs sẽ không khởi động lại! Giải pháp rõ ràng là tạo thư mục bị thiếu và thử lại; Tôi đã tìm thấy giải pháp ở đâu đó trên mạng nhưng thực sự không thể nhớ ở đâu. Đoạn mã sau chạy thành công trong nhiều năm nay trên một số máy Windows của tôi:

(unless --batch-mode
  (require 'server)
  (when (and (= emacs-major-version 23)
         (= emacs-minor-version 1)
         (equal window-system 'w32))
    ;; Suppress error "directory ~/.emacs.d/server is unsafe" on Windows.
    (defun server-ensure-safe-dir (dir) "Noop" t))
  (condition-case nil
      (server-start)
    (error
     (let* ((server-dir (if server-use-tcp server-auth-dir server-socket-dir)))
       (when (and server-use-tcp
          (not (file-accessible-directory-p server-dir)))
     (display-warning
      'server (format "Creating %S" server-dir) :warning)
     (make-directory server-dir t)
     (server-start))))
    )
  )

Mã này cũng hoạt động khi chạy Emacs từ một thanh.

Hi vọng điêu nay co ich.


Xin chào! Điều này không hoạt động trên Linux. command-line-args không bao giờ bao gồm đối số --batch của tôi. Công trình này:(if (not noninteractive) (progn (require 'server) (server-start)))
Gaizka

Được rồi cảm ơn. Vì vậy, sau đó chúng ta nên tinh chỉnh --batch-modenhư (defconst --batch-mode (or noninteractive (member "--batch-mode" command-line-args))). Tôi sửa nó ở trên.
Andreas Spindler

6

Không hoạt động đối với tôi trong Windows 7.

Thay vào đó, tôi đọc các nhận xét trong server-ensure-safe-dir và tiếp tục giành quyền sở hữu cho% APPDATA% cho các thư mục con và thư mục cũ hơn. Chúng thuộc sở hữu của Quản trị viên địa phương, không phải của tôi.

Điều đó đã giúp!


1
Nói rõ hơn: Đảm bảo rằng thư mục% HOME% \. Emacs.d \ server thuộc sở hữu của bạn, không phải bởi nhóm Quản trị viên cục bộ.
Kristopher Johnson

3

Câu trả lời rất hữu ích từ gavenkoa. Tôi đang gặp sự cố này trên Emacs 24.1, Windows 2003.

Rất tiếc, việc ghi đè server-ensure-safe-dir để trở thành noop, như được đề xuất trong đoạn mã đầu tiên của bạn, không phù hợp với tôi trong mọi tình huống. Cụ thể, nó không hoạt động khi được áp dụng trước đó (server-start) đã thực thi ít nhất một lần, vì quá trình thực thi ban đầu cũng sẽ tạo ra thư mục , nếu nó không tồn tại. Với phiên bản noop, thư mục sẽ hoàn toàn không được tạo.

Cách giải quyết phù hợp với tôi theo nghĩa nó loại bỏ thông báo lỗi, trong khi vẫn tạo thư mục đúng cách, là đoạn mã sau, đặt trước (server-start) trong tệp khởi tạo Emacs của tôi. Nó đưa ra một lời khuyên xung quanh máy chủ-đảm bảo-an toàn-dir để bỏ qua bất kỳ lỗi nào phát sinh từ đó. Không giải quyết được nguyên nhân gốc rễ của vấn đề, nhưng đủ tốt cho tôi.

(defadvice server-ensure-safe-dir (around
                                   my-around-server-ensure-safe-dir
                                   activate)
  "Ignores any errors raised from server-ensure-safe-dir"
  (ignore-errors ad-do-it))

2

Bước dưới đây phù hợp với tôi: 1. Thực thi mã bên dưới dưới dạng tệp .reg. Phiên bản win của Emacs sẽ coi mọi giá trị trong sổ đăng ký là Env Var.

[HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs]
"HOME"="C:/<your_emacs_home>"
"EMACS_SERVER_FILE"="C:/<your_emacs_home>/server/main_server"
"ALTERNATE_EDITOR"="C:/<your_emacs_loc>/bin/runemacs.exe"
  1. Thêm mã bên dưới vào .emacs / init.el của bạn. Khóa ở đây phải là "server-auth-dir".
(require 'server)
(setq server-auth-dir "~/server")  ;;Server file location
(setq server-name "main_server")   ;;Server mutex file name
(server-start)

Theo các bước trên, chế độ máy chủ hoạt động đối với tôi một cách chính xác và hoàn hảo.


1

Trong trường hợp điều này thỉnh thoảng xảy ra với mọi người, máy trạm của tôi vừa trải qua một "quá trình di chuyển miền", điều này đã thêm một quyền khác vào mọi tệp trên hộp, sau đó tôi bắt đầu gặp lỗi này. Sau khi tôi thêm biểu thức vào giả "server-đảm bảo-an toàn-dir", điều này không thành công nữa.

(Nếu bạn đang thắc mắc, quá trình di chuyển sẽ diễn ra trong 2-3 bước. Bước đầu tiên thêm quyền cho tôi trong miền mục tiêu, sau đó tôi được chuyển đến miền mục tiêu, sau đó họ có thể (Tôi không chắc về điều này ) xóa quyền cho miền cũ. Đó là một công ty lớn và nhiều người dùng, vì vậy họ sẽ thực hiện theo các bước riêng biệt.)


1

lần cuối cùng tôi đã thử, tiện ích mở rộng shell "Lấy quyền sở hữu" đã thực hiện công việc


1

Nếu đó là vấn đề quyền sở hữu thư mục máy chủ mà RealityMonster đã xác định, thì bạn có thể chạy điều này tại dấu nhắc lệnh của windows để khắc phục:

takeown /f %USERPROFILE%\.emacs.d\server /r /d y

Đây là câu trả lời duy nhất thực sự phù hợp với tôi (Windows 10 và Emacs 27.0.50). Cảm ơn.
gsl
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.