是否可以在 Emacs 中以非 root 用户身份打开文件(在 root 位置),对其进行编辑,然后在保存时提供密码,以便 Emacs 可以写入文件?更好地提供具有不同用户权限的不同缓冲区?
我知道Tramp
但无法理解它。
是否可以在 Emacs 中以非 root 用户身份打开文件(在 root 位置),对其进行编辑,然后在保存时提供密码,以便 Emacs 可以写入文件?更好地提供具有不同用户权限的不同缓冲区?
我知道Tramp
但无法理解它。
这是我的做法:
(require 'tramp)
(defun sudired ()
(interactive)
(dired "/sudo::/"))
您将获得一个dired
具有 root 权限的缓冲区。您从此处打开的任何后续目录或文件都将使用 root。
任何其他dired
缓冲区都不会受到影响。
更新:我现在使用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)
您不需要任何特殊功能,它是 Emacs 内置的(至少它适用于 24 版)。
以 root 身份打开文件:
C-x C-f
在 minibuffer中打开find-file
对话框。
然后/su::/
添加到文件路径:
/su::/path/to/root/file
系统将提示您输入 root 密码。之后,您可以像 root 一样打开文件。其余的缓冲区将不受影响。但是,如果您从同一个缓冲区打开另一个文件,您将自动以 root 身份打开它。
我也想有一种方法来打开根文件,所以我想出了这个替换 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 警告弹出窗口结合使用。