是否可以在Emacs中以非root用户身份打开文件(在根位置),编辑它,然后在保存时提供密码,以便Emacs可以写入文件?更好的是还提供具有不同用户权限的不同缓冲区?
我知道Tramp
,但无法理解它。
答案 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警告弹出窗口结合起来。