在 Emacs 中使用 su/sudo 打开文件

问题描述 投票:0回答:11

假设我想使用

su
sudo
在现有 Emacs 会话中打开文件,而不需要进入 shell 并执行
sudoedit
sudo emacs
。一种方法是

C-x C-f /sudo::/path/to/file

但这需要通过 SSH 进行昂贵的往返。有没有更直接的方法?

[编辑] @JBB 是对的。我希望能够调用

su

/
sudo
 来保存和打开。保存时重新授权就可以了(但不理想)。我正在寻找的是 
find-file
save-buffer
 的变体,可以通过 
su
/
sudo
“管道”。

emacs file-permissions sudo
11个回答
70
投票
Tramp 的好处是,您只需在打开第一个文件时支付 SSH 的往返费用。 然后,Sudo 会缓存您的凭据,Emacs 会保存句柄,以便后续 sudo 打开的文件花费更少的时间。

我也没有找到额外的时间来减轻负担。 IMO,它足够快了。


70
投票
Tramp

通过 SSH 来回 sudo,它使用 subshell。 请参阅手册:https://www.gnu.org/software/tramp/#Inline-methods

因此,我建议您坚持使用 TRAMP。


19
投票
如果您使用

helm

helm-find-files
 支持使用 
C-c r
 以 root 身份打开文件。


18
投票
这并不是原始问题的答案,但这里有一个帮助函数,可以使执行 trap/sudo 路线变得更容易:

(defun sudo-find-file (file-name) "Like find file, but opens the file as root." (interactive "FSudo Find File: ") (let ((tramp-file-name (concat "/sudo::" (expand-file-name file-name)))) (find-file tramp-file-name)))
    

5
投票
您的示例根本不启动 ssh,至少在我的 TRAMP 版本(“2.1.13-pre”)中不启动。 查找文件和保存缓冲区都很好用。


5
投票
至少为了保存,专门为此类问题编写了

sudo-save 包。


3
投票

(defadvice ido-find-file (after find-file-sudo activate) "Find file as root if necessary." (unless (and buffer-file-name (file-writable-p buffer-file-name)) (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))



1
投票

稍微扩展一下伯顿的答案:

(defun sudo-find-file (file-name) "Like find file, but opens the file as root." (interactive "FSudo Find File: ") (let ((tramp-file-name (concat "/sudo::" (expand-file-name file-name)))) (find-file tramp-file-name))) (add-hook 'dired-mode-hook (lambda () ;; open current file as sudo (local-set-key (kbd "C-x <M-S-return>") (lambda() (interactive) (message "!!! SUDO opening %s" (dired-file-name-at-point)) (sudo-find-file (dired-file-name-at-point)) )) ) )



0
投票

问题是您可能不仅仅想打开该文件。您希望以后能够保存它。因此,您需要保留根权限,而不仅仅是为了打开文件而存在。

听起来您希望 Emacs 成为您的窗口管理器。没有那个就够臃肿了。 :)


0
投票
sudo edit

功能对此非常有用。打开文件后,按

s-e
即可使用 sudo 访问权限来编辑/保存文件。
    


0
投票
这篇博文中

Bozhidar Batsov 解释了三种使用升级权限打开文件的简单方法。我认为最优雅的是下面的。我只是做了一个小小的修改,使其更兼容 Emacs 默认生态系统,以便它可以自动完成 Vertico 和其他补全平台: (defun er-sudo-edit (&optional arg) "Edit currently visited file as root. With a prefix ARG prompt for a file to visit. Will also prompt for a file to visit if current buffer is not visiting a file." (interactive "P") (if (or arg (not buffer-file-name)) (find-file (concat "/sudo:root@localhost:" (read-file-name "Find file(as root): "))) (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))

	
© www.soinside.com 2019 - 2024. All rights reserved.