Emacs-호출시 오류 (서버 시작)


82

현재 Windows Vista SP1에서 GNU Emacs 23.0.93.1을 사용하고 있습니다. 내 .emacs 파일 에서을 호출하면 The directory ~ / .emacs.d / server is unsafe(server-start) 메시지와 함께 오류가 발생합니다 . 누구든지 이것을 보았고 수정 또는 해결 방법을 알고 있습니까? ... 서버를 끄는 것 외에는;)

다음은 스택 추적입니다.

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를 시작하면 비슷한 오류가 발생했습니다. 이것은 Subversion에서 ~ / .emacs.d를 유지하고 체크 아웃 할 때 svn클라이언트가 내 umask 당 ~ / .emacs.d / server를 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 디렉토리를 만들고이 디렉토리의 소유자를 로그인으로 설정합니다. "네덜란드어"버전의 Windows 7을 사용하고 있으므로 영어 용어를 정확히 모르지만 절차는 다음과 같습니다.

~ / .emacs.d / server에서 R-mouse를 클릭하고 "속성"(메뉴의 마지막 항목)을 선택합니다. 속성에서 "보안"탭을 선택한 다음 "고급"버튼을 선택합니다. 그런 다음 "소유자"탭을 선택하고 소유자를에서 Administrators (<your-pc-name>\Administrators)로 변경합니다 <your-login-name> (<your-pc-name>\<your-login-name>. 이제 서버 코드는 사용자가 소유자이므로이 디렉토리를 안전한 것으로 승인합니다.

이것이 여러분 모두에게 도움이되기를 바랍니다. 어쨌든 문제가 해결되었습니다.

WKR Reutefleut "

Emacs 23.2.1과 함께 Vista에서 확실히 작동합니다.


3
고쳤다! 이 의견이 Google 순위가 높았 으면 좋으며이 질문에 대한 답이되어야합니다.
Drew

Windows 7에서도 문제가 수정되었습니다. bash에서, $ chown -R "$ {USER}"~ / .emacs.d
luke h

이것은 spacemacs 0.200.1@25.1.1에서 작동합니다 (따라서 일반 emacs 25.1.1에서도 작동해야합니다).
gemantzu

chmod 700도 괜찮습니다.
netawater

29

나는 larsreed에 대해 좋아하지만 사용할 준비가 된 complite 코드 :

( '서버 필요)
(그리고 (> = emacs-major-version 23)
           (동일한 윈도우 시스템 'w32))
  (defun server-ensure-safe-dir (dir) "Noop"t)); 오류 "디렉토리 표시 안함
                                                 ; ~ / .emacs.d / server is unsafe "
                                                 ; 창문에.
(서버 시작)

내 블로그 기사 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/serverEmacs-server 인증 파일을 저장하는 데 사용 합니다. FAT32 파일 시스템의 디렉토리는 변조로부터 안전하지 않습니다. 자세한 내용은 변수 server-auth-dir를 참조하십시오.

경고로이 문제를 해결하려면 server-auth-dir을 NTFS 파티션 %APPDATA%으로 지정할 수 있습니다 ( 일반적으로 Windows에 %SYSTEMDRIVE%있으며 사용자는 일반적으로 시스템 드라이브를 NTFS 파티션으로 포맷).

( '서버 필요)
(및 (eq window-system 'w32) (file-exists-p (getenv "APPDATA")))
  (setq server-auth-dir (concat (getenv "APPDATA") "/.emacs.d/server"))
  (메이크 디렉토리 서버 인증 디렉토리))
(서버 시작)

1
emacs23 및 Windows Vista 64b를 사용하여이 문제를 해결했습니다. 서버가 필요하지 않으면 작동하지 않았습니다.
Mario F

1
감사합니다. 이것은 Win7-64에서 저에게 효과적입니다. EmacsW32를 사용하면 나중에 서버 시작을 생략 할 수 있습니다.
harpo

1
이것은 Emacs 23.3.1에서 여전히 발생하므로 조건을 <code> (= emacs-major-version 23) (> = emacs-minor-version 1) (<= emacs-minor-version 3) </ code>로 변경했습니다. 그러나 이것이 23.4에서 수정되지 않으면 업데이트가 필요합니다 .... 따라서 아래의 @ user160983에 의해 emacs-minor-version을 무시하는 주석을 참조하십시오
djb

1
이전 답변에 대해 언급했듯이 문제는 emacs 24에 존재하므로 조건은 (> = emacs-major-version 24)
mcheema

1
@mcheema 나는 (>= emacs-major-version 23). 감사합니다 +1
gavenkoa 2013-04-02

14

이것은 Windows에서 알려진 Emacs 버그입니다. 해결 방법은 server.el의 server-ensure-safe-dir에서이 줄을 주석 처리하는 것입니다. 변경 후 바이트 재 컴파일을 원할 것입니다.

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

3
귀하의 솔루션이 내 문제를 해결합니다. 나중에 이것을 더 조사하고 여기에 내 결과를 추가 할 것입니다. 감사!
λ Jonas Gorauskas

10

lisp 디렉토리에서 해킹을 방지하려면 .emacs에 다음을 추가하면됩니다.

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


Cygwin의 Emacs에 위의 문제가 있었고 위의 명령이 작동했습니다.
MikeHoss 2009

1
문제는 emacs 24에서도 발생하므로 (> = emacs-major-version 23)이 적절할 수 있습니다
mcheema 2013

내가 라인에 추가 할 때까지 나를 위해 이맥스 (24)와 윈도우 7이 작동하지 않았다 (require 'server)코드 위
MostlyHarmless

이것은 내가 MacOS 10.14 (Mojave)에서 이것을 사용할 때까지 몇 년 동안 저에게 효과적이었습니다. 변경 사항을 Windows로 제한하는 제약 조건도 포함하는 위의 gavenkoa의 답변을 사용하십시오.
Steve Broberg

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에서 작동하지 않습니다. 명령 줄 인수에는 내 --batch 인수가 포함되지 않습니다. 이 작동합니다 :(if (not noninteractive) (progn (require 'server) (server-start)))
gaizka

알았어 고마워. 그래서 우리는 수정해야 --batch-mode으로 (defconst --batch-mode (or noninteractive (member "--batch-mode" command-line-args))). 위에서 수정했습니다.
Andreas Spindler 2012 년

6

Windows 7에서 나를 위해 작동하지 않았습니다.

대신 server-ensure-safe-dir의 주석을 읽고 % APPDATA % forlder 및 하위 폴더에 대한 소유권을 가져 왔습니다. 그들은 내가 아닌 로컬 관리자가 소유했습니다.

도움이되었습니다!


1
자세히 설명하려면 다음을 수행하십시오. % HOME % \. emacs.d \ server 디렉토리가 로컬 관리자 그룹이 아닌 사용자 소유인지 확인하십시오.
Kristopher Johnson

3

gavenkoa의 매우 유용한 답변입니다. Emacs 24.1, Windows 2003에서이 문제가 발생합니다.

불행히도 첫 번째 스 니펫에서 제안한 것처럼 server-ensure-safe-dir을 noop로 재정의하는 것이 모든 상황에서 작동하지 않았습니다. 특히, (server-start)가 적어도 한 번 실행되기 전에 적용하면 작동하지 않았습니다. 왜냐하면 초기 실행 이 존재하지 않는 경우 디렉토리생성 되기 때문 입니다. 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 버전은 레지스트리의 모든 값을 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. .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

마지막으로 시도했을 때 "Take Ownership"쉘 확장이 작업을 수행했습니다.


1

RealityMonster가 식별 한 서버 폴더 소유권 문제인 경우 Windows 명령 프롬프트에서이를 실행하여 해결할 수 있습니다.

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

이것은 실제로 나를 위해 일한 유일한 대답입니다 (Windows 10 및 Emacs 27.0.50). 감사.
gsl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.