使用 Emacs 通过 SSH 和 Sudo 打开文件
我想在 Emacs 中打开一个位于远程服务器上的文件,并在服务器上使用 sudo 权限。我可以通过 Tramp 使用 sudo 打开本地文件,如下所示:
C-x C-f /sudo::/home/user/file
但我想在服务器上使用 sudo:
C-x C-f /sudo::user@server/home/user/file
但这给了我在本地计算机上的 sudo 权限,它要求我在本地计算机上提供 sudo 密码。有没有办法在服务器上使用 sudo?
BTW:服务器上未安装 Emacs
I want to open a file inside Emacs which is located on a remote server, with sudo powers on the server. I can open local files with sudo via Tramp like this:
C-x C-f /sudo::/home/user/file
But I want to use sudo on the server:
C-x C-f /sudo::user@server/home/user/file
But this gives me sudo powers on my local machine, it asks for my sudo password on the local machine. Is there a way to use sudo on the server?
BTW: Emacs is not installed on the server
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
从 Emacs 24.3 开始,旧的
multi:
语法的模拟已经分层在现代tramp-default-proxies-alist
方法之上,这意味着您可以再次无需任何事先配置即可执行多跳。有关详细信息,请参阅:Chig
(tramp)Ad-hoc 多跳
RET< /kbd>使用新语法,每个“跃点”由
|
分隔。手册中的示例为:CxCf
/ssh:bird@bastion|ssh:you@remotehost:/path
RET< /kbd>首先作为
bird@bastion
连接,然后从那里连接到远程主机上的
you@remotehost:/path
/su: 或 /sudo:你也可以使用这个sudo/su 到远程主机上的 root(当然还有任何其他用户)的语法:
CxCf
/ssh:you@remotehost|sudo:remotehost: /path/to/file
RET重要:请务必明确指定主机名:
sudo:remotehost:
而不是sudo::
(见下文)。由于这仍然使用底层的代理机制,
tramp-default-proxies-alist
现在应该包含值("remotehost" "root" "/ssh:you@remotehost:")
意味着每当您以
root@remotehost
请求文件时,都会使用代理/ssh:you@remotehost:
。root
是这些方法的默认用户,但您当然也可以使用以下命令更改为非 root 用户:CxCf
/ssh:you@remotehost|sudo:them@remotehost:/path/to/file
RET始终显式指定远程主机名
您可能习惯使用
sudo::< /code> 或
su::
并省略主机名。如果您停留在本地主机上,那么这仍然没问题,但如果您要跳到远程服务器,那么您必须为每个跃点指定主机名 - 即使它与前一跳相同。始终对远程主机使用sudo:hostname:
或su:hostname:
。这里的陷阱是,
sudo::
确实实际上似乎可以工作 - 但是当您这样做时,动态代理条目的主机将是您源自的主机名,而不是您连接到的主机名。这不仅看起来令人困惑(因为错误的主机将显示在文件路径中),而且还意味着任何后续在本地主机上使用 sudo:: 的尝试都将被代理到远程服务器! (如果您在第二台服务器上执行相同的操作,代理也可能会被破坏,从而导致进一步的问题)。简而言之,多跳时不要使用
::
!Emacs 27+
从 Emacs 27.1(或 TRAMP 2.4.2,如果使用 GNU ELPA 软件包)开始,
::
大小写直观地工作,例如/ssh:you@remotehost|sudo::
将重用remotehost
而不是您自己的本地主机,因此您不会最终得到错误的代理条目。此外,还会检测到
/ssh:you@remotehost|sudo:localhost:
之类的内容并将其标记为用户错误。如果您可能会混合使用 Emacs 版本,包括早于 27 的版本(或者您建议其他可能使用旧版本的人),那么继续处理
::
是最安全的多跳时不安全,以避免潜在的事故。 (即,如果 TRAMP 版本未知,则明确指定正确的远程主机将仍然是最安全的方法。)As of Emacs 24.3, an analog of the old
multi:
syntax has been layered on top of the moderntramp-default-proxies-alist
approach, meaning that you can once again perform multi-hops without any prior configuration. For details, see:C-hig
(tramp)Ad-hoc multi-hops
RETWith the new syntax, each 'hop' is separated by
|
. The example in the manual is:C-xC-f
/ssh:bird@bastion|ssh:you@remotehost:/path
RETWhich connects firstly as
bird@bastion
, and from there toyou@remotehost:/path
/su: or /sudo: on remote hosts
You can also use this syntax to sudo/su to root (or of course any other user) on a remote host:
C-xC-f
/ssh:you@remotehost|sudo:remotehost:/path/to/file
RETImportant: be sure to specify the hostname explicitly:
sudo:remotehost:
rather thansudo::
(see below).As this still uses the proxy mechanism underneath,
tramp-default-proxies-alist
should now include the value("remotehost" "root" "/ssh:you@remotehost:")
Meaning that the proxy
/ssh:you@remotehost:
is going to be used whenever you request a file asroot@remotehost
.root
is the default user for these methods, but you can of course also change to a non-root user with:C-xC-f
/ssh:you@remotehost|sudo:them@remotehost:/path/to/file
RETAlways specify the remote hostname explicitly
You are probably used to using
sudo::
orsu::
and omitting the hostname. If you are staying on the localhost then this is still fine, but if you are hopping to a remote server then you must specify the hostname for every hop -- even if it is the same as for the previous hop. Always usesudo:hostname:
orsu:hostname:
with remote hosts.The trap here is that
sudo::
does actually appear to work -- however when you do that the HOST for the dynamic proxy entry will be the hostname you originated from rather than the host you connected to. This will not only look confusing (as the wrong host will be displayed in the file paths), but it will also mean that any subsequent attempt to usesudo::
on your localhost will instead be proxied to the remote server! (and the proxy would also presumably be clobbered if you did the same thing on a second server, causing further issues).In short, don't use
::
when you multi-hop!Emacs 27+
Starting from Emacs 27.1 (or Tramp 2.4.2, if using the GNU ELPA package) the
::
case works intuitively, such that/ssh:you@remotehost|sudo::
will re-useremotehost
rather than your own local host, and so you won't end up with a bad proxy entry.In addition, the likes of
/ssh:you@remotehost|sudo:localhost:
are detected and flagged as user errors.If you are liable to use a mixture of Emacs versions including versions earlier than 27 (or you are advising someone else who may be using an older version), then it would be safest to continue to treat
::
as unsafe when multi-hopping, to avoid potential mishap. (I.e. specifying the correct remote host explicitly will remain the safest approach if the Tramp version is unknown.)更新:虽然这个答案解决了最初的问题,但它是为 emacs 20 或 21 编写的。对于 emacs 24,我建议您使用 phils 的回答,因为它提供了更多解释并且是最新的。
我认为 多跳文件名 是您正在寻找的。
第一个跃点是 ssh,第二个跃点是 sudo。
更新:最新版本的 emacs 支持使用代理进行多跳:
然后通过打开调用:
Update: Although this answer solved the original problem, it was written for emacs 20 or 21. For emacs 24, I recommend you use phils's answer because it offers more explanation and is up to date.
I think multi-hop filenames in tramp is what you're looking for.
The first hop would be ssh and the second would be sudo.
Update: Recent versions of emacs support multiple hops using proxies:
Then invoke by opening:
我对所选答案有一些疑问。但是,当我将这一行添加到 .emacs 中时,它起作用了:
然后执行以下命令:
/sudo:ssh-host:file-on-ssh-host
这有点令人困惑,因为在某一时刻我提示输入“root”密码,但输入我的用户密码授予我访问权限。它也普遍适用于网络上的所有主机。另外,我仍然可以这样做而不是root:
/ssh:ssh-host:file-on-ssh-host
I had some troubles with the selected answer. However, it worked when I added this line to .emacs:
And then executed the following:
/sudo:ssh-host:file-on-ssh-host
It was slightly confusing because at one point I was prompted for the "root" password, but entering my user's password granted me access. It also universally works on all hosts on the network. Also, I can still do this to not be root:
/ssh:ssh-host:file-on-ssh-host
从tramp多跳配置网页
然后任何
将使用与远程计算机上运行 emacs 的用户相同的用户名登录后,使用 sudo 打开文件。
From the tramp multi-hops configuration webpage
Then any
will open file using sudo after logged with the same username of the user running emacs but on the remote machine.
您必须首先通过 ssh 连接到服务器,然后必须在本地运行 emacs。
或者你可以使用带有 no_root_squash 的 NFS,或者你可以尝试使用 emacs 服务器/客户端,尽管我不知道会发生什么(我自己不使用 emacs)
You have to ssh into the server first, then you have to run emacs locally.
Or you can use NFS with no_root_squash, or you can try with emacs server/client, although I have no idea of what may happen (do not use emacs myself)