4

是否可以在 Emacs 中以非 root 用户身份打开文件(在 root 位置),对其进行编辑,然后在保存时提供密码,以便 Emacs 可以写入文件?更好地提供具有不同用户权限的不同缓冲区?

我知道Tramp但无法理解它。

4

4 回答 4

3

这是我的做法:

(require 'tramp)
(defun sudired ()
  (interactive)
  (dired "/sudo::/"))

您将获得一个dired具有 root 权限的缓冲区。您从此处打开的任何后续目录或文件都将使用 root。

任何其他dired缓冲区都不会受到影响。

于 2013-09-22T16:35:33.953 回答
3

更新:我现在使用sudo-edit(可在 Melpa 或https://github.com/nflath/sudo-edit上获得),它具有标题警告并且比此功能更强大。


这就是我使用的。您可以以普通用户的身份打开文件(甚至是尚不存在的文件)或目录,然后运行此函数以获取 root 权限。

(defun find-alternative-file-with-sudo ()
  (interactive)
  (let ((bname (expand-file-name (or buffer-file-name
                                     default-directory)))
        (pt (point)))
    (setq bname (or (file-remote-p bname 'localname)
                    (concat "/sudo::" bname)))
    (cl-flet ((server-buffer-done
               (buffer &optional for-killing)
               nil))
      (find-alternate-file bname))
    (goto-char pt)))

我也有这个,它在缓冲区顶部制作了一个大红色横幅,告诉我它已以 root 身份打开。

(defface find-file-root-header-face
  '((t (:foreground "white" :background "red3")))
  "*Face use to display header-lines for files opened as root.")

(defun find-file-root-header-warning ()
  "*Display a warning in header line of the current buffer.
This function is suitable to add to `find-file-hook'."
  (when (string-equal
         (file-remote-p (or buffer-file-name default-directory) 'user)
         "root")
    (let* ((warning "WARNING: EDITING FILE AS ROOT!")
           (space (+ 6 (- (window-width) (length warning))))
           (bracket (make-string (/ space 2) ?-))
           (warning (concat bracket warning bracket)))
      (setq header-line-format
            (propertize  warning 'face 'find-file-root-header-face)))))

(add-hook 'find-file-hook 'find-file-root-header-warning)
(add-hook 'dired-mode-hook 'find-file-root-header-warning)
于 2013-09-23T04:42:03.107 回答
2

您不需要任何特殊功能,它是 Emacs 内置的(至少它适用于 24 版)。

以 root 身份打开文件:

C-x C-f在 minibuffer中打开find-file对话框。

然后/su::/添加到文件路径:

/su::/path/to/root/file

系统将提示您输入 root 密码。之后,您可以像 root 一样打开文件。其余的缓冲区将不受影响。但是,如果您从同一个缓冲区打开另一个文件,您将自动以 root 身份打开它。

于 2013-09-23T21:10:10.960 回答
0

我也想有一种方法来打开根文件,所以我想出了这个替换 build in 的函数find-file,现在我的 .emacs 中有这个:

(defun test (&rest args)
  (with-temp-buffer
    (eq (apply 'call-process "test" nil (current-buffer) nil args) 0)))

(defun have-permission (filename)
  ;; only bash expand ~ with home directory
  (let ((expanded (replace-regexp-in-string "~"
                                            (concat "/home/" (user-real-login-name))
                                            filename)))
    (if (not (file-exists-p expanded))
        (let ((directory (file-name-directory expanded)))
          (and (test "-r" directory) (test "-x" directory) (test "-w" directory)))
      (and (test "-r" expanded) (test "-w" expanded)))))


(defun find-every-file (filename &optional wildcards)
  "Open file use sudo:: if user have no permissions to open the file"
  (interactive
   (find-file-read-args "Find All Files: "
                        (confirm-nonexistent-file-or-buffer)))
  (find-file (if (have-permission filename)
                 filename
               ;; you can replace that with /su:: if you don't have sudo access
               (concat "/sudo::" (file-truename filename)))))

(global-set-key (kbd "C-x C-f") 'find-every-file)

如果您尝试在您没有写入权限的目录中打开不存在的文件或不存在的文件,它也可以工作。

您可以将它与@jpkotta 警告弹出窗口结合使用。

于 2017-08-17T16:24:51.283 回答