写入文件/保存文件时要root?

时间:2013-09-22 16:32:31

标签: emacs root privileges

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

我知道Tramp,但无法理解它。

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

我是这样做的:

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

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

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

答案 2 :(得分:2)

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

以root身份打开文件:

C-x C-f打开迷你缓冲区中的find-file对话框。

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

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

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

答案 3 :(得分:0)

我想有办法打开根文件,所以我想出了这个替换了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警告弹出窗口结合起来。