Emacs-呼び出し時のエラー(server-start)


82

私は現在、Windows VistaSP1でGNUEmacs23.0.93.1を使用しています。.emacsファイルで呼び出しを行う(server-start)と、「ディレクトリ〜/ .emacs.d / server isunsafe」というメッセージでエラーが発生します。誰かがこれを見て、修正または回避策を知っていますか?...サーバーをオフのままにする以外;)

スタックトレースは次のとおりです。

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
UnixボックスでEmacsを起動すると同様のエラーが発生しました。これは、〜/ .emacs.dをSubversionに保持し、チェックアウト時にsvnクライアントが〜/ .emacs.d / serverをumaskごとに0755に設定したためであることが判明しました。svnEmacsをカスタマイズするために必要なすべてのものをSubversionでライブにするという目的を損なうシェルスクリプトでラップする代わりに、以下を追加することで、Emacsに起動時に正しい権限を強制させるだけ~/.emacs.d/init.elです:(set-file-modes (expand-file-name "~/.emacs.d/server") #o700)
Aaron Miller

回答:


151

私はEmacsWikiでこの解決策を見つけました:

「問題は、アカウントに「管理者」権限もある場合のディレクトリ〜/ .emacs.d / serverの所有権です。ディレクトリ〜/ .emacs.d / serverを作成し、このディレクトリの所有者をログインに設定します名前と問題はなくなりました。Windows7の「オランダ語」バージョンを使用しているため、英語の用語が正確にわかりませんが、手順は次のとおりです。

〜/ .emacs.d / serverでR-mouseをクリックし、「プロパティ」(メニューの最後の項目)を選択します。[プロパティ]から[セキュリティ]タブを選択し、[詳細]ボタンを選択します。次に、[所有者]タブを選択し、所有者をからAdministrators (<your-pc-name>\Administrators)に変更し<your-login-name> (<your-pc-name>\<your-login-name>ます。これで、所有者であるため、サーバーコードはこのディレクトリを安全なものとして受け入れます。

これが皆さんのお役に立てば幸いです、とにかく私にとっては問題が解決しました。

WKRロイトフルート」

それは間違いなくVista、Emacs23.2.1で動作します。


3
修正しました!私はこのコメントがより高いグーグルランキングを持っていて、それがこの質問への答えでもあることを望みます。
ドリュー

Windows7でも問題を修正しました。bashから、$ chown -R "$ {USER}"〜/ .emacs.d
h

spacemacs 0.200.1@25.1.1で動作します(したがって、プレーンなemacs 25.1.1でも動作するはずです)。
gemantzu 2016年

chmod700もOKです。
netawater 2017年

29

私はlarsreedの答えを楽しんでいますが、すぐに使える複雑なコードです。

( 'サーバーが必要)
(when(and(> = 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が修正されたため、着信Emacs23.2ではこの回避策は必要ありません。

最近リリースされたEmacs23.2では、次のような警告があります。

警告(サーバー):~/.emacs.d/serverEmacsサーバー認証ファイルの保存に使用します。FAT32ファイルシステム上のディレクトリは、改ざんに対して安全ではありません。詳細については、変数server-auth-dirを参照してください。

警告としてこれを修正するには、server-auth-dirをNTFSパーティション(%APPDATA%通常はWindowsに%SYSTEMDRIVE%あり、ユーザーは通常システムドライブをNTFSパーティションとしてフォーマットします)を指すことができます。

( 'サーバーが必要)
(when(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))
(サーバー開始)

1
emacs23とwindowsvista 64bを使用して、これで修正されました。requireサーバーがないと機能しませんでした。
マリオF

1
おかげで、これはWin7-64で私のために働きます。EmacsW32では、後で行うため、サーバーの起動を省略できます。
harpo 2011

1
これはEmacs23.3.1でも引き続き発生するため、条件を<code>(= emacs-major-version 23)(> = emacs-minor-version 1)(<= emacs-minor-version 3)</ code>に変更しました。しかし、これが23.4で修正されていない場合は、更新する必要があります....したがって、emacs-minor-version
djb

1
以前の回答でコメントしたように、問題はemacs 24に存在するため、条件は(> = emacs-major-version 24)
mcheema 2013

1
@mcheemaに修正し(>= emacs-major-version 23)ます。おかげで1
gavenkoa

14

これはWindowsでの既知のEmacsバグです。回避策は、server.elのserver-ensure-safe-dirでこの行をコメントアウトすることです。変更後にバイトを再コンパイルする必要があります。

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

3
あなたの解決策は私の問題を解決します。これについては後でさらに調査し、ここに調査結果を追加します。ありがとう!
λジョナスGorauskas

10

lispディレクトリでのハッキングを回避するには、.emacsに以下を追加するだけです。

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


CygwinのEmacsで上記の問題が発生し、上記のコマンドが機能しました。
MikeHoss 2009

1
この問題は
emacs24

(require 'server)
Emacs24

これは、MacOS 10.14(Mojave)でこれを使用するまで何年も機能し、その時点でmagitが壊れました(すべてのプラットフォームでinitファイルを共有しています)。Windowsへの変更を制限する制約も含まれている上記のgivenkoaによる回答を使用してください。
SteveBroberg19年

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とき投げる。%ホーム%/ emacs.d /サーバーのディレクトリが存在しません。連続して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を実行するときにも機能します。

お役に立てれば。


こんにちは!これはLinuxでは機能しません。command-line-argsに--batch引数が含まれることはありません。これは機能します:(if (not noninteractive) (progn (require 'server) (server-start)))
gaizka 2012

わかりました、ありがとう。したがって、--batch-modeとして洗練する必要があり (defconst --batch-mode (or noninteractive (member "--batch-mode" command-line-args)))ます。上で修正します。
アンドレアススピンドラー2012

6

Windows7では動作しませんでした。

代わりに、server-ensure-safe-dirのコメントを読み、%APPDATA%forlderとsubfoldersの所有権を取得しました。それらは私ではなく、ローカル管理者によって所有されていました。

それは助けになりました!


1
詳細については、ディレクトリ%HOME%\。emacs.d \ serverが、ローカルのAdministratorsグループではなく、自分が所有していることを確認してください。
クリストファージョンソン2010

3

Givenkoaからの非常に役立つ回答。Emacs 24.1、Windows2003でこの問題が発生しています。

残念ながら、最初のスニペットで提案されているように、server-ensure-safe-dirをオーバーライドしてnoopになると、すべての状況で機能するわけではありませんでした。具体的には、(server-start)が少なくとも1回実行される前に適用された場合は機能しませんでした。これは、ディレクトリが存在しない場合、最初の実行でディレクトリが作成されるためです。noopバージョンでは、ディレクトリはまったく作成されません。

ディレクトリを適切に作成しながらエラーメッセージを排除するという意味で私にとってうまくいった回避策は、Emacs初期化ファイルの前(server-start)に置かれた次のコードでした。そこから発生したエラーを無視するように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))

2

以下の手順は私にとってはうまくいきます:1。以下のコードを.regファイルとして実行します。Emacs winバージョンは、レジストリ内のすべての値をEnvVarとして扱います。

[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. 以下のコードを.emacs / init.elに追加します。ここでのキーは「server-auth-dir」である必要があります。
(require 'server)
(setq server-auth-dir "~/server")  ;;Server file location
(setq server-name "main_server")   ;;Server mutex file name
(server-start)

上記の手順により、サーバーモードは正しく完璧に機能します。


1

これがときどき人々を襲う場合に備えて、私のワークステーションは「ドメイン移行」を通過し、ボックス上のすべてのファイルに別のアクセス許可が追加され、このエラーが発生し始めました。「server-ensure-safe-dir」をダミーアウトする式を追加した後、これは失敗しなくなりました。

(不思議に思うなら、移行は2〜3ステップで行われます。最初のステップでターゲットドメインにアクセス許可が追加され、次にターゲットドメインに移動します。その後、移行する可能性があります(これについてはよくわかりません)。 )古いドメインの権限を削除します。これは大企業であり、多くのユーザーがいるため、別々の手順で実行しています。)


1

前回試したとき、「Takeownership」シェル拡張機能が機能しました


1

RealityMonsterが特定したのがサーバーフォルダーの所有権の問題である場合は、Windowsのコマンドプロンプトでこれを実行して修正できます。

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

これは私にとって本当にうまくいった唯一の答えです(Windows10とEmacs27.0.50)。ありがとう。
GSL
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.