82

我目前在 Windows Vista SP1 中使用 GNU Emacs 23.0.93.1。在我的 .emacs 文件中,我调用(server-start)并导致消息错误The directory ~/.emacs.d/server is unsafe。有没有人看到这个并知道修复或解决方法?...除了关闭服务器;)

这是堆栈跟踪:

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

11 回答 11

151

我在 EmacsWiki 上找到了这个解决方案:

“问题是目录的所有权 ~/.emacs.d/server 当您对您的帐户还拥有“管理员”权限时。创建目录 ~/.emacs.d/server 并将该目录的所有者设置为您的登录名名称,问题就消失了。因为我有一个“荷兰”版本的 Windows 7,我不知道确切的英文术语,但这里是过程:

在 ~/.emacs.d/server 上单击 R 鼠标并选择“属性”(菜单中的最后一项)。从“属性”中选择“安全”选项卡,然后选择“高级”按钮。然后选择选项卡“所有者”并将所有者从更改Administrators (<your-pc-name>\Administrators)<your-login-name> (<your-pc-name>\<your-login-name>. 现在服务器代码将接受此目录作为安全目录,因为您是所有者。

希望这对你们所有人都有帮助,无论如何它为我解决了问题。

WKR 罗伊特弗勒特"

它绝对适用于带有 Emacs 23.2.1 的 Vista。

于 2010-05-31T14:37:48.297 回答
29

我喜欢回答 larsreed,但可以使用的复杂代码:

(需要'服务器)
(当(和(> = emacs-major-version 23)
           (等于窗口系统'w32))
  (defun server-ensure-safe-dir (dir) "Noop" t)) ; 抑制错误“目录
                                                 ; ~/.emacs.d/server 不安全”
                                                 ; 在窗户上。
(服务器启动)

我在我的博客文章http://brain-break.blogspot.com/2009/08/when-moving-from-gnu-emacs-22.html中讨论了这个问题

另请注意,在 2009-09-19 中修复了关于 server-ensure-safe-dir 的错误 #4197,因此在传入的 Emacs 23.2 中不需要此解决方法。

在最近发布的 Emacs 23.2 下,我有这样的警告:

警告(服务器):~/.emacs.d/server用于存储 Emacs 服务器身份验证文件。FAT32 文件系统上的目录不能防止篡改。有关详细信息,请参阅变量server-auth-dir

要解决此问题,您可以将 server-auth-dir 指向 NTFS 分区(%APPDATA%通常位于 Windows%SYSTEMDRIVE%和用户通常将系统驱动器格式化为 NTFS 分区):

(需要'服务器)
(当 (and (eq window-system 'w32) (file-exists-p (getenv "APPDATA")))
  (setq server-auth-dir (concat (getenv "APPDATA") "/.emacs.d/server"))
  (make-directory server-auth-dir))
(服务器启动)
于 2009-10-14T14:25:01.077 回答
14

这是 Windows 上已知的 Emacs 错误。一种解决方法是在 server.el 中的 server-ensure-safe-dir 中注释掉这一行,您需要在更改后重新编译字节:

;; FIXME: Busted on Windows. 
;; (eql (nth 2 attrs) (user-uid)) 
于 2009-05-20T01:56:20.587 回答
10

为避免在 lisp 目录中被黑客入侵,您只需将以下内容添加到您的 .emacs 中:

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

于 2009-08-21T18:32:54.467 回答
7

此外,您不希望服务器以批处理模式启动。因此,在我的.emacs中,我使用

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

接着

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

服务器功能仍然反复无常:server-start%HOME%/.emacs.d/server目录不存在时抛出。连续 Emacs 不会再启动了!显而易见的解决方案是创建丢失的目录并重试;我在网上的某个地方找到了解决方案,但真的不记得在哪里。以下代码在我的几台 Windows 机器上成功运行多年:

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

此代码在从棒上运行 Emacs 时也有效。

希望这可以帮助。

于 2011-08-10T11:20:24.833 回答
6

在 Windows 7 中对我不起作用。

相反,我阅读了 server-ensure-safe-dir 中的注释并继续获取 %APPDATA% forlder 和子文件夹的所有权。它们归本地管理员所有,而不是我。

这有帮助!

于 2010-03-29T06:39:44.997 回答
3

来自 givenkoa 的非常有帮助的回答。我在 Emacs 24.1、Windows 2003 上遇到了这个问题。

不幸的是,正如您在第一个代码段中所建议的那样,覆盖 server-ensure-safe-dir 以成为一个 noop 并不适用于所有情况。具体来说,在 (server-start) 至少执行一次之前应用时它不起作用,因为初始执行也会创建 directory,如果它不存在的话。使用 noop 版本,根本不会创建目录。

对我有用的解决方法是消除错误消息,同时仍然正确创建目录,是以下代码,放在我的 Emacs 初始化文件中的(服务器启动)之前。它提出了一个关于 server-ensure-safe-dir 的建议,以忽略从那里引发的任何错误。不能解决问题的根本原因,但对我来说已经足够了。

(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))
于 2013-06-12T15:21:58.517 回答
3

如果是 RealityMonster 发现的服务器文件夹所有权问题,那么您可以在 Windows 命令提示符下运行它来修复它:

takeown /f %USERPROFILE%\.emacs.d\server /r /d y
于 2017-09-01T14:24:57.067 回答
2

Below step works for me: 1. Execute code below as .reg file. Emacs win version will treat any values in registry as 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. Add code below to your .emacs/init.el. The key here should be "server-auth-dir".
(require 'server)
(setq server-auth-dir "~/server")  ;;Server file location
(setq server-name "main_server")   ;;Server mutex file name
(server-start)

By steps above server mode works for me correctly and perfect.

于 2015-01-02T16:51:32.580 回答
1

last time I tried, the "Take ownership" shell extension did the job

于 2011-07-03T22:17:13.213 回答
1

万一这偶尔打到人,我的工作站刚刚经历了“域迁移”,它为盒子上的每个文件添加了另一个权限,然后我开始收到这个错误。在我将表达式添加到虚拟“server-ensure-safe-dir”之后,这停止了失败。

(如果您想知道,迁移将分 2-3 步进行。第一个在目标域中为我添加权限,然后我被移动到目标域,然后他们可能会(我不确定) 删除旧域的权限。这是一家大公司,有很多用户,所以他们分步进行。)

于 2010-08-09T23:15:06.707 回答