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

在Emacs中使用su/sudo打开文件,emacs,file-permissions,sudo,Emacs,File Permissions,Sudo,假设我想使用su或sudo在现有的Emacs会话中打开一个文件,而不需要下拉到shell并执行sudoedit或sudo Emacs。一种方法是 C-x C-f /sudo::/path/to/file 但这需要昂贵的成本。有没有更直接的方法 [编辑]@JBB是对的。我希望能够调用su/sudo来保存和打开。保存时重新授权是可以的(但不理想)。我正在寻找的是find file和save buffer的变体,它们可以通过su/sudo

假设我想使用
su
sudo
在现有的Emacs会话中打开一个文件,而不需要下拉到shell并执行
sudoedit
sudo Emacs
。一种方法是

C-x C-f /sudo::/path/to/file
但这需要昂贵的成本。有没有更直接的方法


[编辑]@JBB是对的。我希望能够调用
su
/
sudo
来保存和打开。保存时重新授权是可以的(但不理想)。我正在寻找的是
find file
save buffer
的变体,它们可以通过
su
/
sudo

<。也许您可以在Emacs和exec sudo Emacs中打开一个shell

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


听起来你想让Emacs成为你的窗口管理器。没有这个,它已经足够膨胀了。:)

Tramp的好处在于,当您打开第一个文件时,您只需支付到SSH的往返费用。然后Sudo缓存您的凭证,Emacs保存一个句柄,这样后续Sudo打开的文件所需的时间就会少得多


我也没有找到节省负担所需的额外时间。它足够快了,我想。

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

Tramp不通过SSH执行往返sudo,它使用子shell。请参阅手册:


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

至少为了节省时间,a完全是针对这类问题编写的。

并不是对原始问题的回答,但这里有一个帮助函数,可以使执行TRAMP/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))) (defun sudo find file(文件名) 与查找文件类似,但以root用户身份打开文件 (交互式“FSudo查找文件:”) (let((tramp文件名(concat)/sudo::“(展开文件名文件名))) (查找文件(文件名)))
我建议您使用建议命令。将此函数放在~/.emacs中

(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))))

如果您使用
helm
helm find files
支持使用
C-C r
以root用户身份打开文件(仅在本地工作。需要通过tramp更新才能正常工作)

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

(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))
      ))
    )
)
(defun sudo find file(文件名)
与查找文件类似,但以root用户身份打开文件
(交互式“FSudo查找文件:”)
(let((tramp文件名(concat)/sudo::“(展开文件名文件名)))
(查找文件(文件名)))
(添加挂钩'直接模式挂钩
(lambda()
;以sudo的形式打开当前文件
(本地设置键(kbd“C-x”)(lambda()
(互动)
(消息“!!!SUDO正在打开%s”(指向该点的目录文件名))
(sudo查找文件(点处的dired文件名))
))
)
)


等一下。。。缓存多长时间过期一次?Tramp不是通过SSH往返的,它使用子shell。我的观点是,第一个打开的文件的费用由您支付,而不是其他任何文件的费用。您可以缓存您的凭据。当TRAMP第一次启动时,它需要经过10-15秒的SSH操作。(我还有2.1.13-pre)你确定吗?我的意思是,它应该启动一个子shell,而不是到localhost的SSH会话。第一次运行所有流浪汉自动嗅探大约需要5秒钟。哦,不,我不确定。我应该说有10-15秒的流浪汉(可能是SSH)的东西。我并不关心SSH本身,而是关心启动的滞后性。这种创业的东西能坚持多久?你第一次创业时应该只需要一秒钟以上。也就是说,即使保存/sudo::file、删除缓冲区并打开/sudo::file2,file2也会快速打开。它使shell保持打开状态,并缓存其所有嗅探的结果。但是凭据是缓存的:(1)用于该Emacs进程还是(2)用于所有Emacs进程?它们是否会过期:(a)当Emacs关闭时,(b)在某个固定时间段(小时?天?周?)后,或(c)在系统重新启动后?哈哈,你说膨胀了。Emacs过去看起来很大。现在,与Java、Ruby和其他一堆东西的运行时足迹相比,它看起来相当精简。不管怎样,我认为Chris的问题是对Emacs的一个完全合理的使用。我一贯使用这种模式。在登录时,我启动了一个Emacs会话,用于一般的东西,一个用于SU访问(作为根用户),一个或多个用于软件开发(通常是每个项目,但并不总是)。我已经做了很多年了。你能解释一下怎么做吗:“在Emacs和exec sudo Emacs中打开一个shell”@OpenLearner说真的,你不是真的想这么做。我想在
esk sudo edit
中有一个类似的东西。我只是想指出,tramp是从Emacs2开始默认安装的,因此,大多数人只需执行C-C C-f/sudo::/path to/file就可以了。感谢
sudoedit
的介绍。非常有用。C-C-f应该是C-x C-f?哪里有
C-x C-f/sudo::/path/to/file
文档?只是要指出一点,这需要使用
ido find file
来查找文件。这是可行的,但在会话中似乎是持久的,随后每个文件都会打开并保存为root。文档
M-x helm find files C-C?
中没有告诉用户如何返回到正常打开模式。再次执行
C-C r
并不能阻止它。@Liam当我使用该功能时,我仍然能够以普通用户的身份打开该文件。这很奇怪-有些文件很好,有些文件试图以root用户的身份打开。我用emacs命令和
sudo-k
终止了根密码,然后它提示输入密码。我重新启动了Emacs,但这并没有消除问题。我在
.emacs.d
中翻了翻,找到了一些对tramp的引用,所以我把它们删除了。现在看起来好多了,但不确定我是否摆脱了它。